dd_bool P_TakePower(player_t *player, powertype_t powerType) { DENG_ASSERT(player != 0); DENG_ASSERT(powerType >= PT_FIRST && powerType < NUM_POWER_TYPES); if(!player->powers[powerType]) return false; // Dont got it. switch(powerType) { case PT_ALLMAP: ST_RevealAutomap(player - players, false); break; case PT_FLIGHT: { mobj_t *plrmo = player->plr->mo; if(plrmo->origin[VZ] != plrmo->floorZ && cfg.lookSpring) { player->centering = true; } plrmo->flags2 &= ~MF2_FLY; plrmo->flags &= ~MF_NOGRAVITY; break; } default: break; } player->powers[powerType] = 0; player->update |= PSF_POWERS; return true; }
dd_bool P_GivePower(player_t* player, int power) { player->update |= PSF_POWERS; switch(power) { case PT_INVULNERABILITY: player->powers[power] = INVULNTICS; break; case PT_INVISIBILITY: player->powers[power] = INVISTICS; player->plr->mo->flags |= MF_SHADOW;; break; case PT_FLIGHT: player->powers[power] = 1; player->plr->mo->flags2 |= MF2_FLY; player->plr->mo->flags |= MF_NOGRAVITY; if(player->plr->mo->origin[VZ] <= player->plr->mo->floorZ) { player->flyHeight = 10; // Thrust the player in the air a bit. player->plr->mo->flags |= DDPF_FIXMOM; } break; case PT_INFRARED: player->powers[power] = INFRATICS; break; case PT_IRONFEET: player->powers[power] = IRONTICS; break; case PT_STRENGTH: P_GiveBody(player, maxHealth); player->powers[power] = 1; break; default: if(player->powers[power]) return false; // Already got it. player->powers[power] = 1; break; } if(power == PT_ALLMAP) ST_RevealAutomap(player - players, true); // Maybe unhide the HUD? ST_HUDUnHide(player - players, HUE_ON_PICKUP_POWER); return true; }
static void SV_v13_ReadPlayer(player_t* pl) { int i, plrnum = pl - players; ddplayer_t* ddpl = pl->plr; byte temp[12]; Reader_ReadInt32(svReader); // mo pl->playerState = Reader_ReadInt32(svReader); Reader_Read(svReader, temp, 10); // ticcmd_t pl->viewZ = FIX2FLT(Reader_ReadInt32(svReader)); pl->viewHeight = FIX2FLT(Reader_ReadInt32(svReader)); pl->viewHeightDelta = FIX2FLT(Reader_ReadInt32(svReader)); pl->bob = FIX2FLT(Reader_ReadInt32(svReader)); pl->flyHeight = Reader_ReadInt32(svReader); ddpl->lookDir = Reader_ReadInt32(svReader); pl->centering = Reader_ReadInt32(svReader); pl->health = Reader_ReadInt32(svReader); pl->armorPoints = Reader_ReadInt32(svReader); pl->armorType = Reader_ReadInt32(svReader); P_InventoryEmpty(plrnum); for(i = 0; i < 14; ++i) { inventoryitemtype_t type = Reader_ReadInt32(svReader); int j, count = Reader_ReadInt32(svReader); for(j = 0; j < count; ++j) P_InventoryGive(plrnum, type, true); } P_InventorySetReadyItem(plrnum, (inventoryitemtype_t) Reader_ReadInt32(svReader)); Hu_InventorySelect(plrnum, P_InventoryReadyItem(plrnum)); Reader_ReadInt32(svReader); // current inventory item count? /*pl->inventorySlotNum =*/ Reader_ReadInt32(svReader); memset(pl->powers, 0, sizeof(pl->powers)); pl->powers[PT_INVULNERABILITY] = !!Reader_ReadInt32(svReader); pl->powers[PT_INVISIBILITY] = !!Reader_ReadInt32(svReader); pl->powers[PT_ALLMAP] = !!Reader_ReadInt32(svReader); if(pl->powers[PT_ALLMAP]) { ST_RevealAutomap(pl - players, true); } pl->powers[PT_INFRARED] = !!Reader_ReadInt32(svReader); pl->powers[PT_WEAPONLEVEL2] = !!Reader_ReadInt32(svReader); pl->powers[PT_FLIGHT] = !!Reader_ReadInt32(svReader); pl->powers[PT_SHIELD] = !!Reader_ReadInt32(svReader); pl->powers[PT_HEALTH2] = !!Reader_ReadInt32(svReader); memset(pl->keys, 0, sizeof(pl->keys)); pl->keys[KT_YELLOW] = !!Reader_ReadInt32(svReader); pl->keys[KT_GREEN] = !!Reader_ReadInt32(svReader); pl->keys[KT_BLUE] = !!Reader_ReadInt32(svReader); pl->backpack = Reader_ReadInt32(svReader); memset(pl->frags, 0, sizeof(pl->frags)); pl->frags[0] = Reader_ReadInt32(svReader); pl->frags[1] = Reader_ReadInt32(svReader); pl->frags[2] = Reader_ReadInt32(svReader); pl->frags[3] = Reader_ReadInt32(svReader); pl->readyWeapon = Reader_ReadInt32(svReader); pl->pendingWeapon = Reader_ReadInt32(svReader); // Owned weapons. memset(pl->weapons, 0, sizeof(pl->weapons)); pl->weapons[WT_FIRST ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_SECOND ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_THIRD ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_FOURTH ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_FIFTH ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_SIXTH ].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_SEVENTH].owned = !!Reader_ReadInt32(svReader); pl->weapons[WT_EIGHTH ].owned = !!Reader_ReadInt32(svReader); memset(pl->ammo, 0, sizeof(pl->ammo)); pl->ammo[AT_CRYSTAL].owned = Reader_ReadInt32(svReader); pl->ammo[AT_ARROW ].owned = Reader_ReadInt32(svReader); pl->ammo[AT_ORB ].owned = Reader_ReadInt32(svReader); pl->ammo[AT_RUNE ].owned = Reader_ReadInt32(svReader); pl->ammo[AT_FIREORB].owned = Reader_ReadInt32(svReader); pl->ammo[AT_MSPHERE].owned = Reader_ReadInt32(svReader); pl->ammo[AT_CRYSTAL].max = Reader_ReadInt32(svReader); pl->ammo[AT_ARROW ].max = Reader_ReadInt32(svReader); pl->ammo[AT_ORB ].max = Reader_ReadInt32(svReader); pl->ammo[AT_RUNE ].max = Reader_ReadInt32(svReader); pl->ammo[AT_FIREORB].max = Reader_ReadInt32(svReader); pl->ammo[AT_MSPHERE].max = Reader_ReadInt32(svReader); pl->attackDown = Reader_ReadInt32(svReader); pl->useDown = Reader_ReadInt32(svReader); pl->cheats = Reader_ReadInt32(svReader); pl->refire = Reader_ReadInt32(svReader); pl->killCount = Reader_ReadInt32(svReader); pl->itemCount = Reader_ReadInt32(svReader); pl->secretCount = Reader_ReadInt32(svReader); Reader_ReadInt32(svReader); // message, char* pl->damageCount = Reader_ReadInt32(svReader); pl->bonusCount = Reader_ReadInt32(svReader); pl->flameCount = Reader_ReadInt32(svReader); Reader_ReadInt32(svReader); // attacker ddpl->extraLight = Reader_ReadInt32(svReader); ddpl->fixedColorMap = Reader_ReadInt32(svReader); pl->colorMap = Reader_ReadInt32(svReader); for(i = 0; i < 2; ++i) { pspdef_t* psp = &pl->pSprites[i]; psp->state = INT2PTR(state_t, Reader_ReadInt32(svReader)); psp->pos[VX] = Reader_ReadInt32(svReader); psp->pos[VY] = Reader_ReadInt32(svReader); psp->tics = Reader_ReadInt32(svReader); } pl->didSecret = Reader_ReadInt32(svReader); pl->morphTics = Reader_ReadInt32(svReader); pl->chickenPeck = Reader_ReadInt32(svReader); Reader_ReadInt32(svReader); // rain1 Reader_ReadInt32(svReader); // rain2 }
dd_bool P_GivePower(player_t *player, powertype_t powerType) { DENG_ASSERT(player != 0); DENG_ASSERT(powerType >= PT_FIRST && powerType < NUM_POWER_TYPES); // Powers cannot be given to dead players. if(player->health <= 0) return false; player->update |= PSF_POWERS; switch(powerType) { case PT_INVULNERABILITY: player->powers[powerType] = INVULNTICS; break; case PT_INVISIBILITY: player->powers[powerType] = INVISTICS; player->plr->mo->flags |= MF_SHADOW; break; case PT_FLIGHT: player->powers[powerType] = 1; player->plr->mo->flags2 |= MF2_FLY; player->plr->mo->flags |= MF_NOGRAVITY; if(player->plr->mo->origin[VZ] <= player->plr->mo->floorZ) { player->flyHeight = 10; // Thrust the player in the air a bit. player->plr->mo->flags |= DDPF_FIXMOM; } break; case PT_INFRARED: player->powers[powerType] = INFRATICS; break; case PT_IRONFEET: player->powers[powerType] = IRONTICS; break; case PT_STRENGTH: P_GiveHealth(player, maxHealth); player->powers[powerType] = 1; break; default: if(player->powers[powerType]) return false; // Already got it. player->powers[powerType] = 1; break; } if(powerType == PT_ALLMAP) ST_RevealAutomap(player - players, true); // Maybe unhide the HUD? ST_HUDUnHide(player - players, HUE_ON_PICKUP_POWER); return true; }