DEFINE_ACTION_FUNCTION(AActor, A_NoBlocking) { PARAM_SELF_PROLOGUE(AActor); PARAM_BOOL_DEF(drop); A_Unblock(self, drop); return 0; }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PainDie) { if (self->target != NULL && self->IsFriend (self->target)) { // And I thought you were my friend! self->flags &= ~MF_FRIENDLY; } const PClass *spawntype = GetSpawnType(PUSH_PARAMINFO); A_Unblock(self, true); A_PainShootSkull (self, self->angle + ANG90, spawntype); A_PainShootSkull (self, self->angle + ANG180, spawntype); A_PainShootSkull (self, self->angle + ANG270, spawntype); }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PainDie) { PARAM_ACTION_PROLOGUE; if (self->target != NULL && self->IsFriend(self->target)) { // And I thought you were my friend! self->flags &= ~MF_FRIENDLY; } PClassActor *spawntype = GetSpawnType(numparam > NAP ? ¶m[NAP] : NULL); A_Unblock(self, true); A_PainShootSkull (self, self->angle + ANG90, spawntype); A_PainShootSkull (self, self->angle + ANG180, spawntype); A_PainShootSkull (self, self->angle + ANG270, spawntype); return 0; }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_KeenDie) { PARAM_ACTION_PROLOGUE; PARAM_INT_OPT(doortag) { doortag = 666; } A_Unblock(self, false); // scan the remaining thinkers to see if all Keens are dead AActor *other; TThinkerIterator<AActor> iterator; const PClass *matchClass = self->GetClass (); while ( (other = iterator.Next ()) ) { if (other != self && other->health > 0 && other->IsA (matchClass)) { // other Keen not dead return 0; } } EV_DoDoor (DDoor::doorOpen, NULL, NULL, doortag, 2*FRACUNIT, 0, 0, 0); return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_AlienSpectreDeath) { AActor *player; char voc[32]; int log; int i; A_Unblock(self, true); // [RH] Need this for Sigil rewarding if (!CheckBossDeath (self)) { return; } for (i = 0, player = NULL; i < MAXPLAYERS; ++i) { if (playeringame[i] && players[i].health > 0) { player = players[i].mo; break; } } if (player == NULL) { return; } switch (self->GetClass()->TypeName) { case NAME_AlienSpectre1: EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false); log = 95; break; case NAME_AlienSpectre2: C_MidPrint(SmallFont, GStrings("TXT_KILLED_BISHOP")); log = 74; player->GiveInventoryType (QuestItemClasses[20]); break; case NAME_AlienSpectre3: { C_MidPrint(SmallFont, GStrings("TXT_KILLED_ORACLE")); // If there are any Oracles still alive, kill them. TThinkerIterator<AActor> it(NAME_Oracle); AActor *oracle; while ( (oracle = it.Next()) != NULL) { if (oracle->health > 0) { oracle->health = 0; oracle->Die (self, self); } } player->GiveInventoryType (QuestItemClasses[22]); if (player->FindInventory (QuestItemClasses[20])) { // If the Bishop is dead, set quest item 22 player->GiveInventoryType (QuestItemClasses[21]); } if (player->FindInventory (QuestItemClasses[23]) == NULL) { // Macil is calling us back... log = 87; } else { // You wield the power of the complete Sigil. log = 85; } EV_DoDoor (DDoor::doorOpen, NULL, NULL, 222, 8*FRACUNIT, 0, 0, 0); break; } case NAME_AlienSpectre4: C_MidPrint(SmallFont, GStrings("TXT_KILLED_MACIL")); player->GiveInventoryType (QuestItemClasses[23]); if (player->FindInventory (QuestItemClasses[24]) == NULL) { // Richter has taken over. Macil is a snake. log = 79; } else { // Back to the factory for another Sigil! log = 106; } break; case NAME_AlienSpectre5: C_MidPrint(SmallFont, GStrings("TXT_KILLED_LOREMASTER")); ASigil *sigil; player->GiveInventoryType (QuestItemClasses[25]); if ( NETWORK_GetState( ) == NETSTATE_SINGLE ) { player->GiveInventoryType (RUNTIME_CLASS(AUpgradeStamina)); player->GiveInventoryType (RUNTIME_CLASS(AUpgradeAccuracy)); } sigil = player->FindInventory<ASigil>(); if (sigil != NULL && sigil->NumPieces == 5) { // You wield the power of the complete Sigil. log = 85; } else { // Another Sigil piece. Woohoo! log = 83; } EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false); break; default: return; } mysnprintf (voc, countof(voc), "svox/voc%d", log); S_Sound (CHAN_VOICE, voc, 1, ATTN_NORM); player->player->SetLogNumber (log); }
DEFINE_ACTION_FUNCTION(AActor, A_Fall) { A_Unblock(self, true); }