DEFINE_ACTION_FUNCTION(AInventory, A_Raise) { PARAM_ACTION_PROLOGUE; if (self == nullptr) { return 0; } player_t *player = self->player; DPSprite *psp; if (nullptr == player) { return 0; } if (player->PendingWeapon != WP_NOCHANGE) { P_DropWeapon(player); return 0; } if (player->ReadyWeapon == nullptr) { return 0; } psp = player->GetPSprite(PSP_WEAPON); psp->y -= RAISESPEED; if (psp->y > WEAPONTOP) { // Not raised all the way yet return 0; } psp->y = WEAPONTOP; psp->SetState(player->ReadyWeapon->GetReadyState()); return 0; }
void AWeapon::PostMorphWeapon () { DPSprite *pspr; if (Owner == nullptr) { return; } Owner->player->PendingWeapon = WP_NOCHANGE; Owner->player->ReadyWeapon = this; Owner->player->refire = 0; pspr = Owner->player->GetPSprite(PSP_WEAPON); pspr->y = WEAPONBOTTOM; pspr->SetState(GetUpState()); }
DEFINE_ACTION_FUNCTION(AActor, A_SelectSigilAttack) { PARAM_ACTION_PROLOGUE; DPSprite *pspr; int pieces; if (self->player == nullptr) { return 0; } pieces = static_cast<ASigil*>(self->player->ReadyWeapon)->NumPieces; pspr = self->player->GetPSprite(PSP_WEAPON); pspr->SetState(pspr->GetState() + 4*pieces - 3); return 0; }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Overlay) { PARAM_ACTION_PROLOGUE; PARAM_INT (layer); PARAM_STATE_OPT (state) { state = nullptr; } PARAM_BOOL_OPT (dontoverride) { dontoverride = false; } player_t *player = self->player; if (player == nullptr || (dontoverride && (player->FindPSprite(layer) != nullptr))) { ACTION_RETURN_BOOL(false); } DPSprite *pspr; pspr = new DPSprite(player, stateowner, layer); pspr->SetState(state); ACTION_RETURN_BOOL(true); }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_ClearOverlays) { PARAM_ACTION_PROLOGUE; PARAM_INT_OPT(start) { start = 0; } PARAM_INT_OPT(stop) { stop = 0; } PARAM_BOOL_OPT(safety) { safety = true; } if (self->player == nullptr) ACTION_RETURN_INT(0); if (!start && !stop) { start = INT_MIN; stop = safety ? PSP_TARGETCENTER - 1 : INT_MAX; } unsigned int count = 0; int id; for (DPSprite *pspr = self->player->psprites; pspr != nullptr; pspr = pspr->GetNext()) { id = pspr->GetID(); if (id < start || id == 0) continue; else if (id > stop) break; if (safety) { if (id >= PSP_TARGETCENTER) break; else if (id == PSP_STRIFEHANDS || id == PSP_WEAPON || id == PSP_FLASH) continue; } pspr->SetState(nullptr); count++; } ACTION_RETURN_INT(count); }
DEFINE_ACTION_FUNCTION(AInventory, A_Lower) { PARAM_ACTION_PROLOGUE; player_t *player = self->player; DPSprite *psp; if (nullptr == player) { return 0; } if (nullptr == player->ReadyWeapon) { P_BringUpWeapon(player); return 0; } psp = player->GetPSprite(PSP_WEAPON); if (player->morphTics || player->cheats & CF_INSTANTWEAPSWITCH) { psp->y = WEAPONBOTTOM; } else { psp->y += LOWERSPEED; } if (psp->y < WEAPONBOTTOM) { // Not lowered all the way yet return 0; } if (player->playerstate == PST_DEAD) { // Player is dead, so don't bring up a pending weapon // Player is dead, so keep the weapon off screen P_SetPsprite(player, PSP_FLASH, nullptr); psp->SetState(player->ReadyWeapon->FindState(NAME_DeadLowered)); return 0; } // [RH] Clear the flash state. Only needed for Strife. P_SetPsprite(player, PSP_FLASH, nullptr); P_BringUpWeapon (player); return 0; }