void APowerCoupling::Die (AActor *source, AActor *inflictor, int dmgflags) { Super::Die (source, inflictor, dmgflags); int i; for (i = 0; i < MAXPLAYERS; ++i) if (playeringame[i] && players[i].health > 0) break; if (i == MAXPLAYERS) return; // [RH] In case the player broke it with the dagger, alert the guards now. if (LastHeard != source) { P_NoiseAlert (source, this); } EV_DoDoor (DDoor::doorClose, NULL, players[i].mo, 225, 2*FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToHighest, NULL, 44, FRACUNIT, 0, -1, 0, false); players[i].mo->GiveInventoryType (QuestItemClasses[5]); S_Sound (CHAN_VOICE, "svox/voc13", 1, ATTN_NORM); players[i].SetLogNumber (13); P_DropItem (this, PClass::FindClass("BrokenPowerCoupling"), -1, 256); Destroy (); }
bool APrisonPass::TryPickup (AActor *&toucher) { Super::TryPickup (toucher); EV_DoDoor (DDoor::doorOpen, NULL, toucher, 223, 2., 0, 0, 0); toucher->GiveInventoryType (QuestItemClasses[9]); return true; }
void P_ShootSpecialLine(mobj_t *thing, line_t *line) { if(!thing->player) { // Check if trigger allowed by non-player mobj switch(line->special) { case 46: // Impact_OpenDoor break; default: return; break; } } switch(line->special) { case 24: // Impact_RaiseFloor EV_DoFloor(line, raiseFloor); P_ChangeSwitchTexture(line, 0); break; case 46: // Impact_OpenDoor EV_DoDoor(line, open, VDOORSPEED); P_ChangeSwitchTexture(line, 1); break; case 47: // Impact_RaiseFloorNear&Change EV_DoPlat(line, raiseToNearestAndChange, 0); P_ChangeSwitchTexture(line, 0); break; } }
DEFINE_ACTION_FUNCTION(AActor, A_HideDecepticon) { EV_DoDoor (DDoor::doorClose, NULL, self, 999, 8*FRACUNIT, 0, 0, 0); if (self->target != NULL && self->target->player != NULL) { P_NoiseAlert (self->target, self); } }
int EV_DoLockedDoor ( line_t* line, vldoor_e type, mobj_t* thing ) { player_t* p; p = thing->player; if (!p) return 0; switch(line->special) { case 99: // Blue Lock case 133: if ( !p ) return 0; if (!p->cards[it_bluecard] && !p->cards[it_blueskull]) { p->message = PD_BLUEO; S_StartSound(NULL,sfx_oof); return 0; } break; case 134: // Red Lock case 135: if ( !p ) return 0; if (!p->cards[it_redcard] && !p->cards[it_redskull]) { p->message = PD_REDO; S_StartSound(NULL,sfx_oof); return 0; } break; case 136: // Yellow Lock case 137: if ( !p ) return 0; if (!p->cards[it_yellowcard] && !p->cards[it_yellowskull]) { p->message = PD_YELLOWO; S_StartSound(NULL,sfx_oof); return 0; } break; } return EV_DoDoor(line,type); }
bool ACloseDoor222::SpecialDropAction (AActor *dropper) { EV_DoDoor (DDoor::doorClose, NULL, dropper, 222, 2*FRACUNIT, 0, 0, 0); if (dropper->target->CheckLocalView (consoleplayer)) { Printf ("You're dead! You set off the alarm.\n"); } P_NoiseAlert (dropper->target, dropper->target); Destroy (); return true; }
// // EV_DoLockedDoor // // Handle opening a tagged locked door // // Passed the line activating the door, the type of door, // and the thing that activated the line // Returns true if a thinker created // int EV_DoLockedDoor ( line_t* line, vldoor_e type, mobj_t* thing ) { player_t* p; // only players can open locked doors p = thing->player; if (!p) return 0; // check type of linedef, and if key is possessed to open it switch(line->special) { case 99: // Blue Lock case 133: if (!p->cards[it_bluecard] && !p->cards[it_blueskull]) { p->message = s_PD_BLUEO; // Ty 03/27/98 - externalized S_StartSound(p->mo,sfx_oof); // killough 3/20/98 return 0; } break; case 134: // Red Lock case 135: if (!p->cards[it_redcard] && !p->cards[it_redskull]) { p->message = s_PD_REDO; // Ty 03/27/98 - externalized S_StartSound(p->mo,sfx_oof); // killough 3/20/98 return 0; } break; case 136: // Yellow Lock case 137: if (!p->cards[it_yellowcard] && !p->cards[it_yellowskull]) { p->message = s_PD_YELLOWO; // Ty 03/27/98 - externalized S_StartSound(p->mo,sfx_oof); // killough 3/20/98 return 0; } break; } // got the key, so open the door return EV_DoDoor(line,type); }
// // P_ShootSpecialLine - IMPACT SPECIALS // Called when a thing shoots a special line. // void P_ShootSpecialLine ( mobj_t* thing, line_t* line ) { int ok; // Impacts that other things can activate. if (!thing->player) { ok = 0; switch(line->special) { case 46: // OPEN DOOR IMPACT ok = 1; break; } if (!ok) return; } switch(line->special) { case 24: // RAISE FLOOR EV_DoFloor(line,raiseFloor); P_ChangeSwitchTexture(line,0); break; case 46: // OPEN DOOR EV_DoDoor(line,vld_open); P_ChangeSwitchTexture(line,1); break; case 47: // RAISE FLOOR NEAR AND CHANGE EV_DoPlat(line,raiseToNearestAndChange,0); P_ChangeSwitchTexture(line,0); break; } }
/** * Called when a thing shoots a special line. */ static void P_ShootSpecialLine(mobj_t *thing, Line *line) { xline_t *xline = P_ToXLine(line); // Impacts that other things can activate. if(!thing->player) { switch(xline->special) { default: return; case 46: ///< OPEN DOOR IMPACT break; } } switch(xline->special) { case 24: ///< RAISE FLOOR EV_DoFloor(line, FT_RAISEFLOOR); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; break; case 46: ///< OPEN DOOR EV_DoDoor(line, DT_OPEN); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 47: ///< RAISE FLOOR NEAR AND CHANGE EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; break; case 191: ///< LOWER FLOOR WAIT RAISE (jd64) EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; } }
// // A_KeenDie // DOOM II special, map 32. // Uses special tag 666. // void A_KeenDie (AActor *self) { A_NoBlocking (self); // 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; } } EV_DoDoor (DDoor::doorOpen, NULL, NULL, 666, 2*FRACUNIT, 0, 0, 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; }
void P_ShootSpecialLine(mobj_t *thing,line_t *line) { /* Impacts that other things can activate */ if (!thing->player) { if (line->special!=46) { /* Open door impact */ return; } } switch(line->special) { case 24: /* RAISE FLOOR */ EV_DoFloor(line,raiseFloor); P_ChangeSwitchTexture(line,FALSE); break; case 46: /* OPEN DOOR */ EV_DoDoor(line,open); P_ChangeSwitchTexture(line,TRUE); break; case 47: /* RAISE FLOOR NEAR AND CHANGE */ EV_DoPlat(line,raiseToNearestAndChange,0); P_ChangeSwitchTexture(line,FALSE); } }
// // P_GiveItemToPlayer // // [STRIFE] New function // haleyjd 09/03/10: Sorts out how to give something to the player. // Not strictly just for inventory items. // villsa 09/09/10: Fleshed out function // boolean P_GiveItemToPlayer(player_t *player, int sprnum, mobjtype_t type) { int i = 0; line_t junk; int sound = sfx_itemup; // haleyjd 09/21/10: different sounds for items // set quest if mf_givequest flag is set if(mobjinfo[type].flags & MF_GIVEQUEST) player->questflags |= 1 << (mobjinfo[type].speed - 1); // check for keys if(type >= MT_KEY_BASE && type <= MT_NEWKEY5) { P_GiveCard(player, type - MT_KEY_BASE); return true; } // check for quest tokens if(type >= MT_TOKEN_QUEST1 && type <= MT_TOKEN_QUEST31) { if(mobjinfo[type].name) { M_StringCopy(pickupstring, DEH_String(mobjinfo[type].name), 39); player->message = pickupstring; } player->questflags |= 1 << (type - MT_TOKEN_QUEST1); if(player == &players[consoleplayer]) S_StartSound(NULL, sound); return true; } // haleyjd 09/22/10: Refactored to give sprites higher priority than // mobjtypes and to implement missing logic. switch(sprnum) { case SPR_HELT: // This is given only by the "DONNYTRUMP" cheat (aka Midas) P_GiveInventoryItem(player, SPR_HELT, MT_TOKEN_TOUGHNESS); P_GiveInventoryItem(player, SPR_GUNT, MT_TOKEN_ACCURACY); // [STRIFE] Bizarre... for(i = 0; i < 5 * player->accuracy + 300; i++) P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); break; case SPR_ARM1: // Armor 1 if(!P_GiveArmor(player, -2)) P_GiveInventoryItem(player, sprnum, type); break; case SPR_ARM2: // Armor 2 if(!P_GiveArmor(player, -1)) P_GiveInventoryItem(player, sprnum, type); break; case SPR_COIN: // 1 Gold P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); break; case SPR_CRED: // 10 Gold for(i = 0; i < 10; i++) P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); break; case SPR_SACK: // 25 gold for(i = 0; i < 25; i++) P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); break; case SPR_CHST: // 50 gold for(i = 0; i < 50; i++) P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); case SPR_BBOX: // Box of Bullets if(!P_GiveAmmo(player, am_bullets, 5)) return false; break; case SPR_BLIT: // Bullet Clip if(!P_GiveAmmo(player, am_bullets, 1)) return false; break; case SPR_PMAP: // Map powerup if(!P_GivePower(player, pw_allmap)) return false; sound = sfx_yeah; // bluh-doop! break; case SPR_COMM: // Communicator if(!P_GivePower(player, pw_communicator)) return false; sound = sfx_yeah; // bluh-doop! break; case SPR_MSSL: // Mini-missile if(!P_GiveAmmo(player, am_missiles, 1)) return false; break; case SPR_ROKT: // Crate of missiles if(!P_GiveAmmo(player, am_missiles, 5)) return false; break; case SPR_BRY1: // Battery cell if(!P_GiveAmmo(player, am_cell, 1)) return false; break; case SPR_CPAC: // Cell pack if(!P_GiveAmmo(player, am_cell, 5)) return false; break; case SPR_PQRL: // Poison bolts if(!P_GiveAmmo(player, am_poisonbolts, 5)) return false; break; case SPR_XQRL: // Electric bolts if(!P_GiveAmmo(player, am_elecbolts, 5)) return false; break; case SPR_GRN1: // HE Grenades if(!P_GiveAmmo(player, am_hegrenades, 1)) return false; break; case SPR_GRN2: // WP Grenades if(!P_GiveAmmo(player, am_wpgrenades, 1)) return false; break; case SPR_BKPK: // Backpack (aka Ammo Satchel) if(!player->backpack) { for(i = 0; i < NUMAMMO; i++) player->maxammo[i] *= 2; player->backpack = true; } for(i = 0; i < NUMAMMO; i++) P_GiveAmmo(player, i, 1); break; case SPR_RIFL: // Assault Rifle if(player->weaponowned[wp_rifle]) return false; if(!P_GiveWeapon(player, wp_rifle, false)) return false; sound = sfx_wpnup; // SHK-CHK! break; case SPR_FLAM: // Flamethrower if(player->weaponowned[wp_flame]) return false; if(!P_GiveWeapon(player, wp_flame, false)) return false; sound = sfx_wpnup; // SHK-CHK! break; case SPR_MMSL: // Mini-missile Launcher if(player->weaponowned[wp_missile]) return false; if(!P_GiveWeapon(player, wp_missile, false)) return false; sound = sfx_wpnup; // SHK-CHK! break; case SPR_TRPD: // Mauler if(player->weaponowned[wp_mauler]) return false; if(!P_GiveWeapon(player, wp_mauler, false)) return false; sound = sfx_wpnup; // SHK-CHK! break; case SPR_CBOW: // Here's a crossbow. Just aim straight, and *SPLAT!* if(player->weaponowned[wp_elecbow]) return false; if(!P_GiveWeapon(player, wp_elecbow, false)) return false; sound = sfx_wpnup; // SHK-CHK! break; case SPR_TOKN: // Miscellaneous items - These are determined by thingtype. switch(type) { case MT_KEY_HAND: // Severed hand P_GiveCard(player, key_SeveredHand); break; case MT_MONY_300: // 300 Gold (this is the only way to get it, in fact) for(i = 0; i < 300; i++) P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1); break; case MT_TOKEN_AMMO: // Ammo token - you get this from the Weapons Trainer if(player->ammo[am_bullets] >= 50) return false; player->ammo[am_bullets] = 50; break; case MT_TOKEN_HEALTH: // Health token - from the Front's doctor if(!P_GiveBody(player, healthamounts[gameskill])) return false; break; case MT_TOKEN_ALARM: // Alarm token - particularly from the Oracle. P_NoiseAlert(player->mo, player->mo); A_AlertSpectreC(dialogtalker); // BUG: assumes in a dialog o_O break; case MT_TOKEN_DOOR1: // Door special 1 junk.tag = 222; EV_DoDoor(&junk, vld_open); break; case MT_TOKEN_PRISON_PASS: // Door special 1 - Prison pass junk.tag = 223; EV_DoDoor(&junk, vld_open); if(gamemap == 2) // If on Tarnhill, give Prison pass object P_GiveInventoryItem(player, sprnum, type); break; case MT_TOKEN_SHOPCLOSE: // Door special 3 - "Shop close" - unused? junk.tag = 222; EV_DoDoor(&junk, vld_close); break; case MT_TOKEN_DOOR3: // Door special 4 (or 3? :P ) junk.tag = 224; EV_DoDoor(&junk, vld_close); break; case MT_TOKEN_STAMINA: // Stamina upgrade if(player->stamina >= 100) return false; player->stamina += 10; P_GiveBody(player, 200); // full healing break; case MT_TOKEN_NEW_ACCURACY: // Accuracy upgrade if(player->accuracy >= 100) return false; player->accuracy += 10; break; case MT_SLIDESHOW: // Slideshow (start a finale) gameaction = ga_victory; if(gamemap == 10) P_GiveItemToPlayer(player, SPR_TOKN, MT_TOKEN_QUEST17); break; default: // The default is to just give it as an inventory item. P_GiveInventoryItem(player, sprnum, type); break; } break; default: // The ultimate default: Give it as an inventory item. if(!P_GiveInventoryItem(player, sprnum, type)) return false; break; } // Play sound. if(player == &players[consoleplayer]) S_StartSound(NULL, sound); return true; }
bool AOpenDoor224::TryPickup (AActor *&toucher) { EV_DoDoor (DDoor::doorOpen, NULL, toucher, 224, 2., 0, 0, 0); GoAwayAndDie (); return true; }
bool AOpenDoor224::SpecialDropAction (AActor *dropper) { EV_DoDoor (DDoor::doorOpen, NULL, dropper, 224, 2., 0, 0, 0); Destroy (); return true; }
bool APrisonPass::SpecialDropAction (AActor *dropper) { EV_DoDoor (DDoor::doorOpen, NULL, dropper, 223, 2., 0, 0, 0); Destroy (); return true; }
bool ACloseDoor222::TryPickup (AActor *&toucher) { EV_DoDoor (DDoor::doorClose, NULL, toucher, 222, 2., 0, 0, 0); GoAwayAndDie (); return true; }
// [crispy] trigger all special lines available on the map static int ST_cheat_spechits() { int i, speciallines = 0; boolean origcards[NUMCARDS]; line_t dummy; // temporarily give all keys for (i = 0; i < NUMCARDS; i++) { origcards[i] = plyr->cards[i]; plyr->cards[i] = true; } for (i = 0; i < numlines; i++) { if (lines[i].special) { // do not trigger level exit switches/lines or teleporters if (lines[i].special == 11 || lines[i].special == 51 || lines[i].special == 52 || lines[i].special == 124 || lines[i].special == 39 || lines[i].special == 97) continue; P_CrossSpecialLine (i, 0, plyr->mo); P_ShootSpecialLine (plyr->mo, &lines[i]); P_UseSpecialLine (plyr->mo, &lines[i], 0); speciallines++; } } for (i = 0; i < NUMCARDS; i++) { plyr->cards[i] = origcards[i]; } // [crispy] trigger tag 666/667 events dummy.tag = 666; if (gamemode == commercial) { if (gamemap == 7) { // Mancubi speciallines += EV_DoFloor(&dummy, lowerFloorToLowest); // Arachnotrons dummy.tag = 667; speciallines += EV_DoFloor(&dummy, raiseToTexture); } } else { if (gameepisode == 1) // Barons of Hell speciallines += EV_DoFloor(&dummy, lowerFloorToLowest); else if (gameepisode == 4) { if (gamemap == 6) // Cyberdemons speciallines += EV_DoDoor(&dummy, vld_blazeOpen); else if (gamemap == 8) // Spider Masterminds speciallines += EV_DoFloor(&dummy, lowerFloorToLowest); } } // Keens (no matter which level they are on) // this call will be ignored if the tagged sector is already moving // so actions triggered in the condition above will have precedence speciallines += EV_DoDoor(&dummy, vld_open); return (speciallines); }
// // EV_DoLockedDoor // Move a locked door up/down // int EV_DoLockedDoor(line_t *line, vldoor_e type, mobj_t *thing) { player_t *player = thing->player; if (!player) return 0; switch (line->special) { case SR_OpenFastDoorStayOpenBlueKeyRequired: case S1_OpenFastDoorStayOpenBlueKeyRequired: if (player->cards[it_bluecard] <= 0 && player->cards[it_blueskull] <= 0) { if (player->cards[it_bluecard] == CARDNOTFOUNDYET) { if (!player->neededcardtics || player->neededcard != it_bluecard) { player->neededcard = it_bluecard; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_BLUEO; } else { if (!player->neededcardtics || player->neededcard != it_blueskull) { player->neededcard = it_blueskull; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_BLUEO2; } S_StartSound(player->mo, sfx_noway); return 0; } break; case SR_OpenFastDoorStayOpenRedKeyRequired: case S1_OpenFastDoorStayOpenRedKeyRequired: if (player->cards[it_redcard] <= 0 && player->cards[it_redskull] <= 0) { if (player->cards[it_redcard] == CARDNOTFOUNDYET) { if (!player->neededcardtics || player->neededcard != it_redcard) { player->neededcard = it_redcard; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_REDO; } else { if (!player->neededcardtics || player->neededcard != it_redskull) { player->neededcard = it_redskull; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_REDO2; } S_StartSound(player->mo, sfx_noway); return 0; } break; case SR_OpenFastDoorStayOpenYellowKeyRequired: case S1_OpenFastDoorStayOpenYellowKeyRequired: if (player->cards[it_yellowcard] <= 0 && player->cards[it_yellowskull] <= 0) { if (player->cards[it_yellowcard] == CARDNOTFOUNDYET) { if (!player->neededcardtics || player->neededcard != it_yellowcard) { player->neededcard = it_yellowcard; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_YELLOWO; } else { if (!player->neededcardtics || player->neededcard != it_yellowskull) { player->neededcard = it_yellowskull; player->neededcardtics = NEEDEDCARDTICS; } player->message = s_PD_YELLOWO2; } S_StartSound(player->mo, sfx_noway); return 0; } break; } return EV_DoDoor(line, type); }
// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // boolean P_UseSpecialLine(mobj_t *thing, line_t *line, int side) { if (side) return false; // Switches that other things can activate. if (!thing->player) { // never open secret doors if (line->flags & ML_SECRET) return false; switch (line->special) { case DR_OpenDoorWait4SecondsClose: case D1_OpenDoorStayOpenBlueKeyRequired: case D1_OpenDoorStayOpenRedKeyRequired: case D1_OpenDoorStayOpenYellowKeyRequired: break; default: return false; } } if (!P_CheckTag(line)) // jff 2/27/98 disallow zero tag on some types return false; // do something switch (line->special) { // MANUALS case DR_OpenDoorWait4SecondsClose: case DR_OpenDoorWait4SecondsCloseBlueKeyRequired: case DR_OpenDoorWait4SecondsCloseYellowKeyRequired: case DR_OpenDoorWait4SecondsCloseRedKeyRequired: case D1_OpenDoorStayOpen: case D1_OpenDoorStayOpenBlueKeyRequired: case D1_OpenDoorStayOpenRedKeyRequired: case D1_OpenDoorStayOpenYellowKeyRequired: case DR_OpenFastDoorWait4SecondsClose: if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); line->flags &= ~ML_TRIGGER666; } case D1_OpenFastDoorStayOpen: EV_VerticalDoor(line, thing); break; // SWITCHES case S1_RaiseStairsHeight8Units: if (EV_BuildStairs(line, build8)) P_ChangeSwitchTexture(line, 0); break; case S1_LowerPillarRaiseDonutChangeDonutFloorTextureAndType: if (EV_DoDonut(line)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevel: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } P_ChangeSwitchTexture(line, 0); G_ExitLevel(); break; case S1_RaiseFloorBy32UnitsChangeFloorTextureAndType: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFloorBy24UnitsChangeFloorTextureAndType: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFloorToNextFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFloorToNextFloorChangeFloorTextureAndType: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_LowerLiftWait3SecondsRise: if (EV_DoPlat(line, downWaitUpStay, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_SetFloorToLowestNeighbouringFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 0); if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); junk.tag = 667; EV_DoFloor(&junk, raiseToTexture); line->flags &= ~ML_TRIGGER666; } break; case S1_OpenDoorWait4SecondsClose: if (EV_DoDoor(line, normal)) P_ChangeSwitchTexture(line, 0); break; case S1_LowerCeilingToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_SetFloorTo8UnitsAboveHighestNeighbouringFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 0); break; case S1_StartSlowCrusher: if (EV_DoCeiling(line, crushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_CloseDoor: if (EV_DoDoor(line, close)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevelAndGoToSecretLevel: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } P_ChangeSwitchTexture(line, 0); G_SecretExitLevel(); break; case S1_SetFloorTo8UnitsUnderLowestNeighbouringCeiling: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 0); break; case S1_SetFloorToLowestNeighbouringCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_SetFloorToHighestNeighbouringFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_OpenDoorStayOpen: if (EV_DoDoor(line, open)) P_ChangeSwitchTexture(line, 0); break; case S1_OpenFastDoorWait4SecondsClose: if (EV_DoDoor(line, blazeRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_OpenFastDoorStayOpen: if (EV_DoDoor(line, blazeOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_CloseFastDoor: if (EV_DoDoor(line, blazeClose)) P_ChangeSwitchTexture(line, 0); break; case S1_LowerFastLiftWait3SecondsRise: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFastStairsHeight16Units: if (EV_BuildStairs(line, turbo16)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFastFloorToNextFloor: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 0); break; case S1_OpenFastDoorStayOpenBlueKeyRequired: case S1_OpenFastDoorStayOpenRedKeyRequired: case S1_OpenFastDoorStayOpenYellowKeyRequired: if (EV_DoLockedDoor(line, blazeOpen, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_RaiseFloorBy512Units: if (EV_DoFloor(line, raiseFloor512)) P_ChangeSwitchTexture(line, 0); break; // BUTTONS case SR_LowerCeilingToFloorCloseDoor: if (EV_DoDoor(line, close)) P_ChangeSwitchTexture(line, 1); break; case SR_LowerCeilingToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_SetFloorToHighestNeighbouringFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_SetFloorToLowestNeighbouringFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_OpenDoorStayOpen: if (EV_DoDoor(line, open)) P_ChangeSwitchTexture(line, 1); break; case SR_LowerLiftWait3SecondsRise: if (EV_DoPlat(line, downWaitUpStay, 1)) P_ChangeSwitchTexture(line, 1); break; case SR_OpenDoorWait4SecondsClose: if (EV_DoDoor(line, normal)) P_ChangeSwitchTexture(line, 1); else if (thing->player) S_StartSound(thing, sfx_oof); break; case SR_SetFloorToLowestNeighbouringCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_RaiseFloorBy24UnitsChangeFloorTextureAndType: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 1); break; case SR_RaiseFloorBy32UnitsChangeFloorTextureAndType: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 1); break; case SR_SetFloorTo8UnitsUnderLowestNeighbouringCeiling: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 1); break; case SR_RaiseFloorToNextFloorChangeFloorTextureAndType: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_RaiseFloorToNextFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 1); break; case SR_SetFloorTo8UnitsAboveHighestNeighbouringFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 1); break; case SR_OpenFastDoorWait4SecondsClose: if (EV_DoDoor(line, blazeRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_OpenFastDoorStayOpen: if (EV_DoDoor(line, blazeOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_CloseFastDoor: if (EV_DoDoor(line, blazeClose)) P_ChangeSwitchTexture(line, 1); break; case SR_LowerFastLiftWait3SecondsRise: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_RaiseFastFloorToNextFloor: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 1); break; case SR_OpenFastDoorStayOpenBlueKeyRequired: case SR_OpenFastDoorStayOpenRedKeyRequired: case SR_OpenFastDoorStayOpenYellowKeyRequired: if (EV_DoLockedDoor(line, blazeOpen, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_LightsTo255: EV_LightTurnOn(line, 255); P_ChangeSwitchTexture(line, 1); break; case SR_LightsTo0: if (canmodify && gamemission == doom2 && gamemap == 4) EV_LightTurnOn(line, 0); else EV_LightTurnOn(line, 35); P_ChangeSwitchTexture(line, 1); break; } return true; }
DEFINE_ACTION_FUNCTION(AActor, A_AlienSpectreDeath) { AActor *player; char voc[32]; int log; int i; CALL_ACTION(A_NoBlocking, self); // [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); }
dd_bool P_UseSpecialLine2(mobj_t *mo, Line *line, int side) { xline_t *xline = P_ToXLine(line); // Err... // Use the back sides of VERY SPECIAL lines... if(side) { switch(xline->special) { case 124: // Sliding door open&close (unused). break; default: return false; } } // Switches that other things can activate. if(!mo->player) { // Never open secret doors. if(xline->flags & ML_SECRET) return false; switch(xline->special) { case 1: // MANUAL DOOR RAISE case 32: // MANUAL BLUE case 33: // MANUAL RED case 34: // MANUAL YELLOW break; default: return false; break; } } // Do something. switch(xline->special) { // MANUALS case 1: // Vertical Door case 26: // Blue Door/Locked case 27: // Yellow Door /Locked case 28: // Red Door /Locked case 31: // Manual door open case 32: // Blue locked door open case 33: // Red locked door open case 34: // Yellow locked door open case 117: // Blazing door raise case 118: // Blazing door open case 525: // jd64 case 526: // jd64 case 527: // jd64 EV_VerticalDoor(line, mo); break; //UNUSED - Door Slide Open&Close // case 124: // EV_SlidingDoor (line, mo); // break; // SWITCHES case 7: // Build Stairs, if(EV_BuildStairs(line, build8)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 9: // Change Donut, if(EV_DoDonut(line)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 11: // Exit level, if(cyclingMaps && mapCycleNoExit) break; // Prevent zombies from exiting levels, if(mo->player && mo->player->health <= 0 && !cfg.zombiesCanExit) { S_StartSound(SFX_NOWAY, mo); return false; } P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_SWTCHX, false, 0); xline->special = 0; G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("next")); break; case 14: // Raise Floor 32 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 32)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 15: // Raise Floor 24 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 24)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 18: // Raise Floor to next highest floor. if(EV_DoFloor(line, FT_RAISEFLOORTONEAREST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 20: // Raise Plat next highest floor and change texture. if(EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 21: // PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 23: // Lower Floor to Lowest. if(EV_DoFloor(line, FT_LOWERTOLOWEST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 29: // Raise Door. if(EV_DoDoor(line, DT_NORMAL)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 41: // Lower Ceiling to Floor. if(EV_DoCeiling(line, CT_LOWERTOFLOOR)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 71: // Turbo Lower Floor. if(EV_DoFloor(line, FT_LOWERTURBO)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 49: // Ceiling Crush And Raise. if(EV_DoCeiling(line, CT_CRUSHANDRAISE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 50: // Close Door. if(EV_DoDoor(line, DT_CLOSE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 51: // Secret EXIT. if(cyclingMaps && mapCycleNoExit) break; // Prevent zombies from exiting levels. if(mo->player && mo->player->health <= 0 && !cfg.zombiesCanExit) { S_StartSound(SFX_NOWAY, mo); return false; } P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("secret"), 0, true); break; case 55: // Raise Floor Crush. if(EV_DoFloor(line, FT_RAISEFLOORCRUSH)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 101: // Raise Floor. if(EV_DoFloor(line, FT_RAISEFLOOR)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 102: // Lower Floor to Surrounding floor height. if(EV_DoFloor(line, FT_LOWER)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 103: // Open Door. if(EV_DoDoor(line, DT_OPEN)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 111: // Blazing Door Raise (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZERAISE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 112: // Blazing Door Open (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZEOPEN)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 113: // Blazing Door Close (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZECLOSE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 122: // Blazing PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 127: // Build Stairs Turbo 16. if(EV_BuildStairs(line, turbo16)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 131: // Raise Floor Turbo. if(EV_DoFloor(line, FT_RAISEFLOORTURBO)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 133: // BlzOpenDoor BLUE. case 135: // BlzOpenDoor RED. case 137: // BlzOpenDoor YELLOW. if(EV_DoLockedDoor(line, DT_BLAZEOPEN, mo)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 140: // Raise Floor 512. if(EV_DoFloor(line, FT_RAISE512)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; // BUTTONS case 42: // Close Door. if(EV_DoDoor(line, DT_CLOSE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 43: // Lower Ceiling to Floor. if(EV_DoCeiling(line, CT_LOWERTOFLOOR)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 45: // Lower Floor to Surrounding floor height. if(EV_DoFloor(line, FT_LOWER)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 60: // Lower Floor to Lowest. if(EV_DoFloor(line, FT_LOWERTOLOWEST)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 61: // Open Door. if(EV_DoDoor(line, DT_OPEN)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 62: // PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAY, 1)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 63: // Raise Door. if(EV_DoDoor(line, DT_NORMAL)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 64: // Raise Floor to ceiling. if(EV_DoFloor(line, FT_RAISEFLOOR)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 66: // Raise Floor 24 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 24)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 67: // Raise Floor 32 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 32)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 65: // Raise Floor Crush. if(EV_DoFloor(line, FT_RAISEFLOORCRUSH)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 68: // Raise Plat to next highest floor and change texture. if(EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 69: // Raise Floor to next highest floor. if(EV_DoFloor(line, FT_RAISEFLOORTONEAREST)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 70: // Turbo Lower Floor. if(EV_DoFloor(line, FT_LOWERTURBO)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 114: // Blazing Door Raise (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZERAISE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 115: // Blazing Door Open (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZEOPEN)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 116: // Blazing Door Close (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZECLOSE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 123: // Blazing PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 132: // Raise Floor Turbo. if(EV_DoFloor(line, FT_RAISEFLOORTURBO)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 99: // BlzOpenDoor BLUE. case 134: // BlzOpenDoor RED. case 136: // BlzOpenDoor YELLOW. if(EV_DoLockedDoor(line, DT_BLAZERAISE, mo)) // jd64 was "DT_BLAZEOPEN" P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 138: // Light Turn On. EV_LightTurnOn(line, 1); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 139: // Light Turn Off. EV_LightTurnOn(line, 35.0f/255.0f); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 343: // jd64 - BlzOpenDoor LaserPowerup 1. case 344: // jd64 - BlzOpenDoor LaserPowerup 2. case 345: // jd64 - BlzOpenDoor LaserPowerup 3. if(EV_DoLockedDoor(line, DT_BLAZEOPEN, mo)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 414: // jd64 if(EV_DoPlat(line, PT_UPWAITDOWNSTAY, 1)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 416: // jd64 if(EV_DoFloorAndCeiling(line, FT_TOHIGHESTPLUS8, CT_RAISETOHIGHEST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 424: // jd64 if(EV_DoCeiling(line, CT_CUSTOM)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 425: // jd64 if(EV_DoCeiling(line, CT_CUSTOM)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 428: // jd64 if(EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 429: // jd64 if(EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; } return true; }
// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // boolean P_UseSpecialLine(mobj_t *thing, line_t *line, int side) { if (side) return false; //jff 02/04/98 add check here for generalized floor/ceil mover { // pointer to line function is NULL by default, set non-null if // line special is push or switch generalized linedef type boolean (*linefunc)(line_t *line) = NULL; // check each range of generalized linedefs if ((unsigned)line->special >= GenFloorBase) { if (!thing->player) if ((line->special & FloorChange) || !(line->special & FloorModel)) return false; // FloorModel is "Allow Monsters" if FloorChange is 0 if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenFloor; } else if ((unsigned)line->special >= GenCeilingBase) { if (!thing->player) if ((line->special & CeilingChange) || !(line->special & CeilingModel)) return false; // CeilingModel is "Allow Monsters" if CeilingChange is 0 if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenCeiling; } else if ((unsigned)line->special >= GenDoorBase) { if (!thing->player) { if (!(line->special & DoorMonster)) return false; // monsters disallowed from this door if (line->flags & ML_SECRET) // they can't open secret doors either return false; } if (!line->tag && ((line->special & 6) != 6)) //jff 3/2/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenDoor; } else if ((unsigned)line->special >= GenLockedBase) { if (!thing->player) return false; // monsters disallowed from unlocking doors if (!P_CanUnlockGenDoor(line, thing->player)) return false; if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenLockedDoor; } else if ((unsigned)line->special >= GenLiftBase) { if (!thing->player) if (!(line->special & LiftMonster)) return false; // monsters disallowed if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenLift; } else if ((unsigned)line->special >= GenStairsBase) { if (!thing->player) if (!(line->special & StairMonster)) return false; // monsters disallowed if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenStairs; } else if ((unsigned)line->special >= GenCrusherBase) { if (!thing->player) if (!(line->special & CrusherMonster)) return false; // monsters disallowed if (!line->tag && ((line->special & 6) != 6)) //jff 2/27/98 all non-manual return false; // generalized types require tag linefunc = EV_DoGenCrusher; } if (linefunc) switch ((line->special & TriggerType) >> TriggerTypeShift) { case PushOnce: if (!side) if (linefunc(line)) line->special = 0; return true; case PushMany: if (!side) linefunc(line); return true; case SwitchOnce: if (linefunc(line)) P_ChangeSwitchTexture(line, 0); return true; case SwitchMany: if (linefunc(line)) P_ChangeSwitchTexture(line, 1); return true; default: // if not a switch/push type, do nothing here return false; } } // Switches that other things can activate. if (!thing->player) { // never open secret doors if (line->flags & ML_SECRET) return false; switch (line->special) { case DR_Door_OpenWaitClose_AlsoMonsters: case D1_Door_Blue_OpenStay: case D1_Door_Red_OpenStay: case D1_Door_Yellow_OpenStay: //jff 3/5/98 add ability to use teleporters for monsters case SR_Teleport_AlsoMonsters: case S1_Teleport_AlsoMonsters: break; default: return false; } } if (!P_CheckTag(line)) // jff 2/27/98 disallow zero tag on some types return false; // do something switch (line->special) { // MANUALS case DR_Door_OpenWaitClose_AlsoMonsters: case DR_Door_Blue_OpenWaitClose: case DR_Door_Yellow_OpenWaitClose: case DR_Door_Red_OpenWaitClose: case D1_Door_OpenStay: case D1_Door_Blue_OpenStay: case D1_Door_Red_OpenStay: case D1_Door_Yellow_OpenStay: case DR_Door_OpenWaitClose_Fast: if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); line->flags &= ~ML_TRIGGER666; } case D1_Door_OpenStay_Fast: EV_VerticalDoor(line, thing); break; // Switches case S1_Stairs_RaiseBy8: if (EV_BuildStairs(line, build8)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseDonut_ChangesTexture: if (EV_DoDonut(line)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevel: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } P_ChangeSwitchTexture(line, 0); G_ExitLevel(); break; case S1_Floor_RaiseBy32_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor_ChangesTexture: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_LowerWaitRaise: if (EV_DoPlat(line, downWaitUpStay, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToLowestFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 0); if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); junk.tag = 667; EV_DoFloor(&junk, raiseToTexture); line->flags &= ~ML_TRIGGER666; } break; case S1_Door_OpenWaitClose: if (EV_DoDoor(line, doorNormal)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerTo8AboveHighestFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerTo8AboveFloor_PerpetualSlowCrusherDamage: if (EV_DoCeiling(line, crushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseStay: if (EV_DoDoor(line, doorClose)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevel_GoesToSecretLevel: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } P_ChangeSwitchTexture(line, 0); G_SecretExitLevel(); break; case S1_Floor_RaiseTo8BelowLowestCeiling_Crushes: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToLowestCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToHighestFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenStay: if (EV_DoDoor(line, doorOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenWaitClose_Fast: if (EV_DoDoor(line, doorBlazeRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenStay_Fast: if (EV_DoDoor(line, doorBlazeOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseStay_Fast: if (EV_DoDoor(line, doorBlazeClose)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_LowerWaitRaise_Fast: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Stairs_RaiseBy16_Fast: if (EV_BuildStairs(line, turbo16)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor_Fast: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_Blue_OpenStay_Fast: case S1_Door_Red_OpenStay_Fast: case S1_Door_Yellow_OpenStay_Fast: if (EV_DoLockedDoor(line, doorBlazeOpen, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy512: if (EV_DoFloor(line, raiseFloor512)) P_ChangeSwitchTexture(line, 0); break; // Extended switches case S1_Floor_RaiseByShortestLowerTexture: if (EV_DoFloor(line, raiseToTexture)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToLowestFloor_ChangesTexture: if (EV_DoFloor(line, lowerAndChange)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24_ChangesTextureAndEffect: if (EV_DoFloor(line, raiseFloor24AndChange)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24: if (EV_DoFloor(line, raiseFloor24)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_PerpetualLowestAndHighestFloors: if (EV_DoPlat(line, perpetualRaise, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_Stop: EV_StopPlat(line); P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Start_Fast: if (EV_DoCeiling(line, fastCrushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Start_Silent: if (EV_DoCeiling(line, silentCrushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_RaiseToHighestCeiling: if (EV_DoCeiling(line, raiseToHighest) || EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerTo8AboveFloor: if (EV_DoCeiling(line, lowerAndCrush)) P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Stop: if (EV_CeilingCrushStop(line)) P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeToBrightestAdjacent: EV_LightTurnOn(line, 0); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeTo35: EV_LightTurnOn(line, 35); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeTo255: EV_LightTurnOn(line, 255); P_ChangeSwitchTexture(line, 0); break; case S1_Light_StartBlinking: EV_StartLightStrobing(line); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeToDarkestAdjacent: EV_TurnTagLightsOff(line); P_ChangeSwitchTexture(line, 0); break; case S1_Teleport_AlsoMonsters: if (EV_Teleport(line, side, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseWaitOpen_30Seconds: if (EV_DoDoor(line, doorClose30ThenOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToLowestCeiling: if (EV_DoCeiling(line, lowerToLowest)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToHighestFloor: if (EV_DoCeiling(line, lowerToMaxFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Teleport_AlsoMonsters_Silent_SameAngle: if (EV_SilentTeleport(line, side, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToNearestFloor: if (EV_DoFloor(line, lowerFloorToNearest)) P_ChangeSwitchTexture(line, 0); break; case SR_Floor_RaiseByShortestLowerTexture: if (EV_DoFloor(line, raiseToTexture)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToLowestFloor_ChangesTexture: if (EV_DoFloor(line, lowerAndChange)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy512: if (EV_DoFloor(line, raiseFloor512)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy512_ChangesTextureAndEffect: if (EV_DoFloor(line, raiseFloor24AndChange)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy24: if (EV_DoFloor(line, raiseFloor24)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_PerpetualLowestAndHighestFloors: EV_DoPlat(line, perpetualRaise, 0); P_ChangeSwitchTexture(line, 1); break; case SR_Lift_Stop: EV_StopPlat(line); P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start_Fast: if (EV_DoCeiling(line, fastCrushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start: if (EV_DoCeiling(line, crushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start_Silent: if (EV_DoCeiling(line, silentCrushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_RaiseToHighestCeiling: if (EV_DoCeiling(line, raiseToHighest) || EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerTo8AboveFloor: if (EV_DoCeiling(line, lowerAndCrush)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Stop: if (EV_CeilingCrushStop(line)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseDonut_ChangesTexture: if (EV_DoDonut(line)) P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeToBrightestAdjacent: EV_LightTurnOn(line, 0); P_ChangeSwitchTexture(line, 1); break; case SR_Light_StartBlinking: EV_StartLightStrobing(line); P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeToDarkestAdjacent: EV_TurnTagLightsOff(line); P_ChangeSwitchTexture(line, 1); break; case SR_Teleport_AlsoMonsters: if (EV_Teleport(line, side, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_CloseWaitOpen_30Seconds: if (EV_DoDoor(line, doorClose30ThenOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToLowestCeiling: if (EV_DoCeiling(line, lowerToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToHighestFloor: if (EV_DoCeiling(line, lowerToMaxFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Teleport_AlsoMonsters_Silent_SameAngle: if (EV_SilentTeleport(line, side, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_RaiseToCeiling_Instantly: if (EV_DoPlat(line, toggleUpDn, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToNearestFloor: if (EV_DoFloor(line, lowerFloorToNearest)) P_ChangeSwitchTexture(line, 1); break; case SR_Stairs_RaiseBy8: if (EV_BuildStairs(line, build8)) P_ChangeSwitchTexture(line, 1); break; case SR_Stairs_RaiseBy16_Fast: if (EV_BuildStairs(line, turbo16)) P_ChangeSwitchTexture(line, 1); break; // Buttons (retriggerable switches) case SR_Door_CloseStay: if (EV_DoDoor(line, doorClose)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToHighestFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToLowestFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenStay: if (EV_DoDoor(line, doorOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_LowerWaitRaise: if (EV_DoPlat(line, downWaitUpStay, 1)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenWaitClose: if (EV_DoDoor(line, doorNormal)) P_ChangeSwitchTexture(line, 1); else if (thing->player) S_StartSound(thing, sfx_oof); break; case SR_Floor_RaiseToLowestCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy24_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy32_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseTo8BelowLowestCeiling_Crushes: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor_ChangesTexture: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerTo8AboveHighestFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenWaitClose_Fast: if (EV_DoDoor(line, doorBlazeRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenStay_Fast: if (EV_DoDoor(line, doorBlazeOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_CloseStay_Fast: if (EV_DoDoor(line, doorBlazeClose)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_LowerWaitRaise_Fast: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor_Fast: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_Blue_OpenStay_Fast: case SR_Door_Red_OpenStay_Fast: case SR_Door_Yellow_OpenStay_Fast: if (EV_DoLockedDoor(line, doorBlazeOpen, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeTo255: EV_LightTurnOn(line, 255); P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeTo35: if (canmodify && gamemission == doom2 && gamemap == 4) EV_LightTurnOn(line, 0); else EV_LightTurnOn(line, 35); P_ChangeSwitchTexture(line, 1); break; } return true; }
// // P_CrossSpecialLine - TRIGGER // Called every time a thing origin is about // to cross a line with a non 0 special. // void P_CrossSpecialLine ( int linenum, int side, mobj_t* thing ) { line_t* line; int ok; line = &lines[linenum]; // Triggers that other things can activate if (!thing->player) { // Things that should NOT trigger specials... switch(thing->type) { case MT_ROCKET: case MT_PLASMA: case MT_BFG: case MT_TROOPSHOT: case MT_HEADSHOT: case MT_BRUISERSHOT: return; break; default: break; } ok = 0; switch(line->special) { case 39: // TELEPORT TRIGGER case 97: // TELEPORT RETRIGGER case 125: // TELEPORT MONSTERONLY TRIGGER case 126: // TELEPORT MONSTERONLY RETRIGGER case 4: // RAISE DOOR case 10: // PLAT DOWN-WAIT-UP-STAY TRIGGER case 88: // PLAT DOWN-WAIT-UP-STAY RETRIGGER ok = 1; break; } if (!ok) return; } // Note: could use some const's here. switch (line->special) { // TRIGGERS. // All from here to RETRIGGERS. case 2: // Open Door EV_DoDoor(line,vld_open); line->special = 0; break; case 3: // Close Door EV_DoDoor(line,vld_close); line->special = 0; break; case 4: // Raise Door EV_DoDoor(line,vld_normal); line->special = 0; break; case 5: // Raise Floor EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: // Build Stairs EV_BuildStairs(line,build8); line->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line,0); line->special = 0; break; case 13: // Light Turn On 255 EV_LightTurnOn(line,255); line->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line,vld_close30ThenOpen); line->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); line->special = 0; break; case 19: // Lower Floor EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line,35); line->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); line->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 39: // TELEPORT! EV_Teleport( line, side, thing ); line->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling( line, raiseToHighest ); EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); line->special = 0; break; case 52: // EXIT! G_ExitLevel (); break; case 53: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: // Platform Stop EV_StopPlat(line); line->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: // Ceiling Crush Stop EV_CeilingCrushStop(line); line->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); line->special = 0; break; case 108: // Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,vld_blazeRaise); line->special = 0; break; case 109: // Blazing Door Open (faster than TURBO!) EV_DoDoor (line,vld_blazeOpen); line->special = 0; break; case 100: // Build Stairs Turbo 16 EV_BuildStairs(line,turbo16); line->special = 0; break; case 110: // Blazing Door Close (faster than TURBO!) EV_DoDoor (line,vld_blazeClose); line->special = 0; break; case 119: // Raise floor to nearest surr. floor EV_DoFloor(line,raiseFloorToNearest); line->special = 0; break; case 121: // Blazing PlatDownWaitUpStay EV_DoPlat(line,blazeDWUS,0); line->special = 0; break; case 124: // Secret EXIT G_SecretExitLevel (); break; case 125: // TELEPORT MonsterONLY if (!thing->player) { EV_Teleport( line, side, thing ); line->special = 0; } break; case 130: // Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); line->special = 0; break; case 141: // Silent Ceiling Crush & Raise EV_DoCeiling(line,silentCrushAndRaise); line->special = 0; break; // RETRIGGERS. All from here till end. case 72: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); break; case 74: // Ceiling Crush Stop EV_CeilingCrushStop(line); break; case 75: // Close Door EV_DoDoor(line,vld_close); break; case 76: // Close Door 30 EV_DoDoor(line,vld_close30ThenOpen); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); break; case 79: // Lights Very Dark EV_LightTurnOn(line,35); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line,0); break; case 81: // Light Turn On 255 EV_LightTurnOn(line,255); break; case 82: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); break; case 83: // Lower Floor EV_DoFloor(line,lowerFloor); break; case 84: // LowerAndChange EV_DoFloor(line,lowerAndChange); break; case 86: // Open Door EV_DoDoor(line,vld_open); break; case 87: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); break; case 88: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); break; case 89: // Platform Stop EV_StopPlat(line); break; case 90: // Raise Door EV_DoDoor(line,vld_normal); break; case 91: // Raise Floor EV_DoFloor(line,raiseFloor); break; case 92: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); break; case 94: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); break; case 95: // Raise floor to nearest height // and change texture. EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line,raiseToTexture); break; case 97: // TELEPORT! EV_Teleport( line, side, thing ); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); break; case 105: // Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,vld_blazeRaise); break; case 106: // Blazing Door Open (faster than TURBO!) EV_DoDoor (line,vld_blazeOpen); break; case 107: // Blazing Door Close (faster than TURBO!) EV_DoDoor (line,vld_blazeClose); break; case 120: // Blazing PlatDownWaitUpStay. EV_DoPlat(line,blazeDWUS,0); break; case 126: // TELEPORT MonsterONLY. if (!thing->player) EV_Teleport( line, side, thing ); break; case 128: // Raise To Nearest Floor EV_DoFloor(line,raiseFloorToNearest); break; case 129: // Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); break; } }
boolean P_ExecuteLineSpecial(int special, byte *args, line_t *line, int side, mobj_t *mo) { boolean buttonSuccess; buttonSuccess = false; switch (special) { case 1: // Poly Start Line break; case 2: // Poly Rotate Left buttonSuccess = EV_RotatePoly(line, args, 1, false); break; case 3: // Poly Rotate Right buttonSuccess = EV_RotatePoly(line, args, -1, false); break; case 4: // Poly Move buttonSuccess = EV_MovePoly(line, args, false, false); break; case 5: // Poly Explicit Line: Only used in initialization break; case 6: // Poly Move Times 8 buttonSuccess = EV_MovePoly(line, args, true, false); break; case 7: // Poly Door Swing buttonSuccess = EV_OpenPolyDoor(line, args, PODOOR_SWING); break; case 8: // Poly Door Slide buttonSuccess = EV_OpenPolyDoor(line, args, PODOOR_SLIDE); break; case 10: // Door Close buttonSuccess = EV_DoDoor(line, args, DREV_CLOSE); break; case 11: // Door Open if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_OPEN); } break; case 12: // Door Raise if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_NORMAL); } break; case 13: // Door Locked_Raise if(CheckedLockedDoor(mo, args[3])) { if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_NORMAL); } } break; case 20: // Floor Lower by Value buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOORBYVALUE); break; case 21: // Floor Lower to Lowest buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOORTOLOWEST); break; case 22: // Floor Lower to Nearest buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOOR); break; case 23: // Floor Raise by Value buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORBYVALUE); break; case 24: // Floor Raise to Highest buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOOR); break; case 25: // Floor Raise to Nearest buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORTONEAREST); break; case 26: // Stairs Build Down Normal buttonSuccess = EV_BuildStairs(line, args, -1, STAIRS_NORMAL); break; case 27: // Build Stairs Up Normal buttonSuccess = EV_BuildStairs(line, args, 1, STAIRS_NORMAL); break; case 28: // Floor Raise and Crush buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORCRUSH); break; case 29: // Build Pillar (no crushing) buttonSuccess = EV_BuildPillar(line, args, false); break; case 30: // Open Pillar buttonSuccess = EV_OpenPillar(line, args); break; case 31: // Stairs Build Down Sync buttonSuccess = EV_BuildStairs(line, args, -1, STAIRS_SYNC); break; case 32: // Build Stairs Up Sync buttonSuccess = EV_BuildStairs(line, args, 1, STAIRS_SYNC); break; case 35: // Raise Floor by Value Times 8 buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEBYVALUETIMES8); break; case 36: // Lower Floor by Value Times 8 buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERBYVALUETIMES8); break; case 40: // Ceiling Lower by Value buttonSuccess = EV_DoCeiling(line, args, CLEV_LOWERBYVALUE); break; case 41: // Ceiling Raise by Value buttonSuccess = EV_DoCeiling(line, args, CLEV_RAISEBYVALUE); break; case 42: // Ceiling Crush and Raise buttonSuccess = EV_DoCeiling(line, args, CLEV_CRUSHANDRAISE); break; case 43: // Ceiling Lower and Crush buttonSuccess = EV_DoCeiling(line, args, CLEV_LOWERANDCRUSH); break; case 44: // Ceiling Crush Stop buttonSuccess = EV_CeilingCrushStop(line, args); break; case 45: // Ceiling Crush Raise and Stay buttonSuccess = EV_DoCeiling(line, args, CLEV_CRUSHRAISEANDSTAY); break; case 46: // Floor Crush Stop buttonSuccess = EV_FloorCrushStop(line, args); break; case 60: // Plat Perpetual Raise buttonSuccess = EV_DoPlat(line, args, PLAT_PERPETUALRAISE, 0); break; case 61: // Plat Stop EV_StopPlat(line, args); break; case 62: // Plat Down-Wait-Up-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_DOWNWAITUPSTAY, 0); break; case 63: // Plat Down-by-Value*8-Wait-Up-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_DOWNBYVALUEWAITUPSTAY, 0); break; case 64: // Plat Up-Wait-Down-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_UPWAITDOWNSTAY, 0); break; case 65: // Plat Up-by-Value*8-Wait-Down-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_UPBYVALUEWAITDOWNSTAY, 0); break; case 66: // Floor Lower Instant * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERTIMES8INSTANT); break; case 67: // Floor Raise Instant * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_RAISETIMES8INSTANT); break; case 68: // Floor Move to Value * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_MOVETOVALUETIMES8); break; case 69: // Ceiling Move to Value * 8 buttonSuccess = EV_DoCeiling(line, args, CLEV_MOVETOVALUETIMES8); break; case 70: // Teleport if(side == 0) { // Only teleport when crossing the front side of a line buttonSuccess = EV_Teleport(args[0], mo, true); } break; case 71: // Teleport, no fog if(side == 0) { // Only teleport when crossing the front side of a line buttonSuccess = EV_Teleport(args[0], mo, false); } break; case 72: // Thrust Mobj if(!side) // Only thrust on side 0 { P_ThrustMobj(mo, args[0] * (ANGLE_90 / 64), args[1] << FRACBITS); buttonSuccess = 1; } break; case 73: // Damage Mobj if(args[0]) { P_DamageMobj(mo, NULL, NULL, args[0]); } else { // If arg1 is zero, then guarantee a kill P_DamageMobj(mo, NULL, NULL, 10000); } buttonSuccess = 1; break; case 74: // Teleport_NewMap if(side == 0) { // Only teleport when crossing the front side of a line if(!(mo && mo->player && mo->player->playerstate == PST_DEAD)) // Players must be alive to teleport { G_Completed(args[0], args[1]); buttonSuccess = true; } } break; case 75: // Teleport_EndGame if(side == 0) { // Only teleport when crossing the front side of a line if(!(mo && mo->player && mo->player->playerstate == PST_DEAD)) // Players must be alive to teleport { buttonSuccess = true; if(deathmatch) { // Winning in deathmatch just goes back to map 1 G_Completed(1, 0); } else { // Passing -1, -1 to G_Completed() starts the Finale G_Completed(-1, -1); } } } break; case 80: // ACS_Execute buttonSuccess = P_StartACS(args[0], args[1], &args[2], mo, line, side); break; case 81: // ACS_Suspend buttonSuccess = P_SuspendACS(args[0], args[1]); break; case 82: // ACS_Terminate buttonSuccess = P_TerminateACS(args[0], args[1]); break; case 83: // ACS_LockedExecute buttonSuccess = P_StartLockedACS(line, args, mo, side); break; case 90: // Poly Rotate Left Override buttonSuccess = EV_RotatePoly(line, args, 1, true); break; case 91: // Poly Rotate Right Override buttonSuccess = EV_RotatePoly(line, args, -1, true); break; case 92: // Poly Move Override buttonSuccess = EV_MovePoly(line, args, false, true); break; case 93: // Poly Move Times 8 Override buttonSuccess = EV_MovePoly(line, args, true, true); break; case 94: // Build Pillar Crush buttonSuccess = EV_BuildPillar(line, args, true); break; case 95: // Lower Floor and Ceiling buttonSuccess = EV_DoFloorAndCeiling(line, args, false); break; case 96: // Raise Floor and Ceiling buttonSuccess = EV_DoFloorAndCeiling(line, args, true); break; case 109: // Force Lightning buttonSuccess = true; P_ForceLightning(); break; case 110: // Light Raise by Value buttonSuccess = EV_SpawnLight(line, args, LITE_RAISEBYVALUE); break; case 111: // Light Lower by Value buttonSuccess = EV_SpawnLight(line, args, LITE_LOWERBYVALUE); break; case 112: // Light Change to Value buttonSuccess = EV_SpawnLight(line, args, LITE_CHANGETOVALUE); break; case 113: // Light Fade buttonSuccess = EV_SpawnLight(line, args, LITE_FADE); break; case 114: // Light Glow buttonSuccess = EV_SpawnLight(line, args, LITE_GLOW); break; case 115: // Light Flicker buttonSuccess = EV_SpawnLight(line, args, LITE_FLICKER); break; case 116: // Light Strobe buttonSuccess = EV_SpawnLight(line, args, LITE_STROBE); break; case 120: // Quake Tremor buttonSuccess = A_LocalQuake(args, mo); break; case 129: // UsePuzzleItem buttonSuccess = EV_LineSearchForPuzzleItem(line, args, mo); break; case 130: // Thing_Activate buttonSuccess = EV_ThingActivate(args[0]); break; case 131: // Thing_Deactivate buttonSuccess = EV_ThingDeactivate(args[0]); break; case 132: // Thing_Remove buttonSuccess = EV_ThingRemove(args[0]); break; case 133: // Thing_Destroy buttonSuccess = EV_ThingDestroy(args[0]); break; case 134: // Thing_Projectile buttonSuccess = EV_ThingProjectile(args, 0); break; case 135: // Thing_Spawn buttonSuccess = EV_ThingSpawn(args, 1); break; case 136: // Thing_ProjectileGravity buttonSuccess = EV_ThingProjectile(args, 1); break; case 137: // Thing_SpawnNoFog buttonSuccess = EV_ThingSpawn(args, 0); break; case 138: // Floor_Waggle buttonSuccess = EV_StartFloorWaggle(args[0], args[1], args[2], args[3], args[4]); break; case 140: // Sector_SoundChange buttonSuccess = EV_SectorSoundChange(args); break; // Line specials only processed during level initialization // 100: Scroll_Texture_Left // 101: Scroll_Texture_Right // 102: Scroll_Texture_Up // 103: Scroll_Texture_Down // 121: Line_SetIdentification // Inert Line specials default: break; } return buttonSuccess; }
void P_CrossSpecialLine(int linenum, int side, mobj_t *thing) { line_t *line; line = &lines[linenum]; if(!thing->player) { // Check if trigger allowed by non-player mobj switch(line->special) { case 39: // Trigger_TELEPORT case 97: // Retrigger_TELEPORT case 4: // Trigger_Raise_Door //case 10: // PLAT DOWN-WAIT-UP-STAY TRIGGER //case 88: // PLAT DOWN-WAIT-UP-STAY RETRIGGER break; default: return; break; } } switch(line->special) { //==================================================== // TRIGGERS //==================================================== case 2: // Open Door EV_DoDoor(line,open,VDOORSPEED); line->special = 0; break; case 3: // Close Door EV_DoDoor(line,close,VDOORSPEED); line->special = 0; break; case 4: // Raise Door EV_DoDoor(line,normal,VDOORSPEED); line->special = 0; break; case 5: // Raise Floor EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: // Trigger_Build_Stairs (8 pixel steps) EV_BuildStairs(line, 8*FRACUNIT); line->special = 0; break; case 106: // Trigger_Build_Stairs_16 (16 pixel steps) EV_BuildStairs(line, 16*FRACUNIT); line->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line,0); line->special = 0; break; case 13: // Light Turn On 255 EV_LightTurnOn(line,255); line->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line,close30ThenOpen,VDOORSPEED); line->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); line->special = 0; break; case 19: // Lower Floor EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line,35); line->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); line->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 39: // TELEPORT! EV_Teleport( line, side, thing ); line->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling( line, raiseToHighest ); EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); line->special = 0; break; case 52: // EXIT! G_ExitLevel (); line->special = 0; break; case 53: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: // Platform Stop EV_StopPlat(line); line->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: // Ceiling Crush Stop EV_CeilingCrushStop(line); line->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); line->special = 0; break; case 105: // Trigger_SecretExit G_SecretExitLevel(); line->special = 0; break; //==================================================== // RE-DOABLE TRIGGERS //==================================================== case 72: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); break; case 74: // Ceiling Crush Stop EV_CeilingCrushStop(line); break; case 75: // Close Door EV_DoDoor(line,close,VDOORSPEED); break; case 76: // Close Door 30 EV_DoDoor(line,close30ThenOpen,VDOORSPEED); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); break; case 79: // Lights Very Dark EV_LightTurnOn(line,35); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line,0); break; case 81: // Light Turn On 255 EV_LightTurnOn(line,255); break; case 82: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); break; case 83: // Lower Floor EV_DoFloor(line,lowerFloor); break; case 84: // LowerAndChange EV_DoFloor(line,lowerAndChange); break; case 86: // Open Door EV_DoDoor(line,open,VDOORSPEED); break; case 87: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); break; case 88: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); break; case 89: // Platform Stop EV_StopPlat(line); break; case 90: // Raise Door EV_DoDoor(line,normal,VDOORSPEED); break; case 100: // Retrigger_Raise_Door_Turbo EV_DoDoor(line, normal, VDOORSPEED*3); break; case 91: // Raise Floor EV_DoFloor(line,raiseFloor); break; case 92: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); break; case 94: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); break; case 95: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: // Raise floor to shortest texture height // on either side of lines EV_DoFloor(line,raiseToTexture); break; case 97: // TELEPORT! EV_Teleport( line, side, thing ); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); break; } }
void P_CrossSpecialLine(line_t *line,mobj_t *thing) { /* Triggers that other things can activate */ if (!thing->player) { /* Not a player? */ switch(line->special) { default: /* None of the above? */ return; /* Exit */ case 39: /* TELEPORT TRIGGER */ case 97: /* TELEPORT RETRIGGER */ case 4: /* RAISE DOOR */ case 10: /* PLAT DOWN-WAIT-UP-STAY TRIGGER */ case 88: /* PLAT DOWN-WAIT-UP-STAY RETRIGGER */ ; /* Null event */ } } /********************************** The first group of triggers all clear line->special so that they can't be triggered again. The second groun leaves line->special alone so triggering can occur at will. **********************************/ switch (line->special) { case 2: /* Open Door */ EV_DoDoor(line,open); line->special = 0; break; case 3: /* Close Door */ EV_DoDoor(line,close); line->special = 0; break; case 4: /* Raise Door */ EV_DoDoor(line,normaldoor); line->special = 0; break; case 5: /* Raise Floor */ EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: /* Fast Ceiling Crush & Raise */ EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: /* Build Stairs */ EV_BuildStairs(line); line->special = 0; break; case 10: /* PlatDownWaitUp */ EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: /* Light Turn On - brightest near */ EV_LightTurnOn(line,0); line->special = 0; break; case 13: /* Light Turn On 255 */ EV_LightTurnOn(line,255); line->special = 0; break; case 16: /* Close Door 30 */ EV_DoDoor(line,close30ThenOpen); line->special = 0; break; case 17: /* Start Light Strobing */ EV_StartLightStrobing(line); line->special = 0; break; case 19: /* Lower Floor */ EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: /* Raise floor to nearest height and change texture */ EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: /* Ceiling Crush and Raise */ EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: /* Raise floor to shortest texture height */ /* on either side of lines */ EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: /* Lights Very Dark */ EV_LightTurnOn(line,35); line->special = 0; break; case 36: /* Lower Floor (TURBO) */ EV_DoFloor(line,turboLower); line->special = 0; break; case 37: /* LowerAndChange */ EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: /* Lower Floor To Lowest */ EV_DoFloor(line,lowerFloorToLowest); line->special = 0; break; case 39: /* TELEPORT! */ EV_Teleport(line,thing); line->special = 0; break; case 40: /* RaiseCeilingLowerFloor */ EV_DoCeiling(line,raiseToHighest); EV_DoFloor(line,lowerFloorToLowest); line->special = 0; break; case 44: /* Ceiling Crush */ EV_DoCeiling(line,lowerAndCrush); line->special = 0; break; case 52: /* EXIT! */ G_ExitLevel(); line->special = 0; break; case 53: /* Perpetual Platform Raise */ EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: /* Platform Stop */ EV_StopPlat(line); line->special = 0; break; case 56: /* Raise Floor Crush */ EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: /* Ceiling Crush Stop */ EV_CeilingCrushStop(line); line->special = 0; break; case 58: /* Raise Floor 24 */ EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: /* Raise Floor 24 And Change */ EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: /* Turn lights off in sector(tag) */ EV_TurnTagLightsOff(line); line->special = 0; break; /* These are restartable, do not affect line->special */ case 72: /* Ceiling Crush */ EV_DoCeiling(line,lowerAndCrush); break; case 73: /* Ceiling Crush and Raise */ EV_DoCeiling(line,crushAndRaise); break; case 74: /* Ceiling Crush Stop */ EV_CeilingCrushStop(line); break; case 75: /* Close Door */ EV_DoDoor(line,close); break; case 76: /* Close Door 30 */ EV_DoDoor(line,close30ThenOpen); break; case 77: /* Fast Ceiling Crush & Raise */ EV_DoCeiling(line,fastCrushAndRaise); break; case 79: /* Lights Very Dark */ EV_LightTurnOn(line,35); break; case 80: /* Light Turn On - brightest near */ EV_LightTurnOn(line,0); break; case 81: /* Light Turn On 255 */ EV_LightTurnOn(line,255); break; case 82: /* Lower Floor To Lowest */ EV_DoFloor(line,lowerFloorToLowest); break; case 83: /* Lower Floor */ EV_DoFloor(line,lowerFloor); break; case 84: /* LowerAndChange */ EV_DoFloor(line,lowerAndChange); break; case 86: /* Open Door */ EV_DoDoor(line,open); break; case 87: /* Perpetual Platform Raise */ EV_DoPlat(line,perpetualRaise,0); break; case 88: /* PlatDownWaitUp */ EV_DoPlat(line,downWaitUpStay,0); break; case 89: /* Platform Stop */ EV_StopPlat(line); break; case 90: /* Raise Door */ EV_DoDoor(line,normaldoor); break; case 91: /* Raise Floor */ EV_DoFloor(line,raiseFloor); break; case 92: /* Raise Floor 24 */ EV_DoFloor(line,raiseFloor24); break; case 93: /* Raise Floor 24 And Change */ EV_DoFloor(line,raiseFloor24AndChange); break; case 94: /* Raise Floor Crush */ EV_DoFloor(line,raiseFloorCrush); break; case 95: /* Raise floor to nearest height and change texture */ EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: /* Raise floor to shortest texture height */ /* on either side of lines */ EV_DoFloor(line,raiseToTexture); break; case 97: /* TELEPORT! */ EV_Teleport(line,thing); break; case 98: /* Lower Floor (TURBO) */ EV_DoFloor(line,turboLower); break; } }
// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // boolean P_UseSpecialLine ( mobj_t* thing, line_t* line, int side ) { // Err... // Use the back sides of VERY SPECIAL lines... if (side) { switch(line->special) { case 124: // Sliding door open&close // UNUSED? break; default: return false; break; } } // Switches that other things can activate. if (!thing->player) { // never open secret doors if (line->flags & ML_SECRET) return false; switch(line->special) { case 1: // MANUAL DOOR RAISE case 32: // MANUAL BLUE case 33: // MANUAL RED case 34: // MANUAL YELLOW break; default: return false; break; } } // do something switch (line->special) { // MANUALS case 1: // Vertical Door case 26: // Blue Door/Locked case 27: // Yellow Door /Locked case 28: // Red Door /Locked case 31: // Manual door open case 32: // Blue locked door open case 33: // Red locked door open case 34: // Yellow locked door open case 117: // Blazing door raise case 118: // Blazing door open EV_VerticalDoor (line, thing); break; //UNUSED - Door Slide Open&Close // case 124: // EV_SlidingDoor (line, thing); // break; // SWITCHES case 7: // Build Stairs if (EV_BuildStairs(line,build8)) P_ChangeSwitchTexture(line,0); break; case 9: // Change Donut if (EV_DoDonut(line)) P_ChangeSwitchTexture(line,0); break; case 11: // Exit level P_ChangeSwitchTexture(line,0); G_ExitLevel (); break; case 14: // Raise Floor 32 and change texture if (EV_DoPlat(line,raiseAndChange,32)) P_ChangeSwitchTexture(line,0); break; case 15: // Raise Floor 24 and change texture if (EV_DoPlat(line,raiseAndChange,24)) P_ChangeSwitchTexture(line,0); break; case 18: // Raise Floor to next highest floor if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line,0); break; case 20: // Raise Plat next highest floor and change texture if (EV_DoPlat(line,raiseToNearestAndChange,0)) P_ChangeSwitchTexture(line,0); break; case 21: // PlatDownWaitUpStay if (EV_DoPlat(line,downWaitUpStay,0)) P_ChangeSwitchTexture(line,0); break; case 23: // Lower Floor to Lowest if (EV_DoFloor(line,lowerFloorToLowest)) P_ChangeSwitchTexture(line,0); break; case 29: // Raise Door if (EV_DoDoor(line,normal)) P_ChangeSwitchTexture(line,0); break; case 41: // Lower Ceiling to Floor if (EV_DoCeiling(line,lowerToFloor)) P_ChangeSwitchTexture(line,0); break; case 71: // Turbo Lower Floor if (EV_DoFloor(line,turboLower)) P_ChangeSwitchTexture(line,0); break; case 49: // Ceiling Crush And Raise if (EV_DoCeiling(line,crushAndRaise)) P_ChangeSwitchTexture(line,0); break; case 50: // Close Door if (EV_DoDoor(line,closeDoor)) P_ChangeSwitchTexture(line,0); break; case 51: // Secret EXIT P_ChangeSwitchTexture(line,0); G_SecretExitLevel (); break; case 55: // Raise Floor Crush if (EV_DoFloor(line,raiseFloorCrush)) P_ChangeSwitchTexture(line,0); break; case 101: // Raise Floor if (EV_DoFloor(line,raiseFloor)) P_ChangeSwitchTexture(line,0); break; case 102: // Lower Floor to Surrounding floor height if (EV_DoFloor(line,lowerFloor)) P_ChangeSwitchTexture(line,0); break; case 103: // Open Door if (EV_DoDoor(line,openDoor)) P_ChangeSwitchTexture(line,0); break; case 111: // Blazing Door Raise (faster than TURBO!) if (EV_DoDoor (line,blazeRaise)) P_ChangeSwitchTexture(line,0); break; case 112: // Blazing Door Open (faster than TURBO!) if (EV_DoDoor (line,blazeOpen)) P_ChangeSwitchTexture(line,0); break; case 113: // Blazing Door Close (faster than TURBO!) if (EV_DoDoor (line,blazeClose)) P_ChangeSwitchTexture(line,0); break; case 122: // Blazing PlatDownWaitUpStay if (EV_DoPlat(line,blazeDWUS,0)) P_ChangeSwitchTexture(line,0); break; case 127: // Build Stairs Turbo 16 if (EV_BuildStairs(line,turbo16)) P_ChangeSwitchTexture(line,0); break; case 131: // Raise Floor Turbo if (EV_DoFloor(line,raiseFloorTurbo)) P_ChangeSwitchTexture(line,0); break; case 133: // BlzOpenDoor BLUE case 135: // BlzOpenDoor RED case 137: // BlzOpenDoor YELLOW if (EV_DoLockedDoor (line,blazeOpen,thing)) P_ChangeSwitchTexture(line,0); break; case 140: // Raise Floor 512 if (EV_DoFloor(line,raiseFloor512)) P_ChangeSwitchTexture(line,0); break; // BUTTONS case 42: // Close Door if (EV_DoDoor(line,closeDoor)) P_ChangeSwitchTexture(line,1); break; case 43: // Lower Ceiling to Floor if (EV_DoCeiling(line,lowerToFloor)) P_ChangeSwitchTexture(line,1); break; case 45: // Lower Floor to Surrounding floor height if (EV_DoFloor(line,lowerFloor)) P_ChangeSwitchTexture(line,1); break; case 60: // Lower Floor to Lowest if (EV_DoFloor(line,lowerFloorToLowest)) P_ChangeSwitchTexture(line,1); break; case 61: // Open Door if (EV_DoDoor(line,openDoor)) P_ChangeSwitchTexture(line,1); break; case 62: // PlatDownWaitUpStay if (EV_DoPlat(line,downWaitUpStay,1)) P_ChangeSwitchTexture(line,1); break; case 63: // Raise Door if (EV_DoDoor(line,normal)) P_ChangeSwitchTexture(line,1); break; case 64: // Raise Floor to ceiling if (EV_DoFloor(line,raiseFloor)) P_ChangeSwitchTexture(line,1); break; case 66: // Raise Floor 24 and change texture if (EV_DoPlat(line,raiseAndChange,24)) P_ChangeSwitchTexture(line,1); break; case 67: // Raise Floor 32 and change texture if (EV_DoPlat(line,raiseAndChange,32)) P_ChangeSwitchTexture(line,1); break; case 65: // Raise Floor Crush if (EV_DoFloor(line,raiseFloorCrush)) P_ChangeSwitchTexture(line,1); break; case 68: // Raise Plat to next highest floor and change texture if (EV_DoPlat(line,raiseToNearestAndChange,0)) P_ChangeSwitchTexture(line,1); break; case 69: // Raise Floor to next highest floor if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line,1); break; case 70: // Turbo Lower Floor if (EV_DoFloor(line,turboLower)) P_ChangeSwitchTexture(line,1); break; case 114: // Blazing Door Raise (faster than TURBO!) if (EV_DoDoor (line,blazeRaise)) P_ChangeSwitchTexture(line,1); break; case 115: // Blazing Door Open (faster than TURBO!) if (EV_DoDoor (line,blazeOpen)) P_ChangeSwitchTexture(line,1); break; case 116: // Blazing Door Close (faster than TURBO!) if (EV_DoDoor (line,blazeClose)) P_ChangeSwitchTexture(line,1); break; case 123: // Blazing PlatDownWaitUpStay if (EV_DoPlat(line,blazeDWUS,0)) P_ChangeSwitchTexture(line,1); break; case 132: // Raise Floor Turbo if (EV_DoFloor(line,raiseFloorTurbo)) P_ChangeSwitchTexture(line,1); break; case 99: // BlzOpenDoor BLUE case 134: // BlzOpenDoor RED case 136: // BlzOpenDoor YELLOW if (EV_DoLockedDoor (line,blazeOpen,thing)) P_ChangeSwitchTexture(line,1); break; case 138: // Light Turn On EV_LightTurnOn(line,255); P_ChangeSwitchTexture(line,1); break; case 139: // Light Turn Off EV_LightTurnOn(line,35); P_ChangeSwitchTexture(line,1); break; } return true; }
/** * Called every time a thing origin is about to cross a line with a non 0 special. */ static void P_CrossSpecialLine(Line *line, int side, mobj_t *thing) { // Extended functionality overrides old. if(XL_CrossLine(line, side, thing)) return; xline_t *xline = P_ToXLine(line); // Triggers that other things can activate if(!thing->player) { dd_bool ok = false; // Things that should NOT trigger specials... switch(thing->type) { case MT_ROCKET: case MT_PLASMA: case MT_BFG: case MT_TROOPSHOT: case MT_HEADSHOT: case MT_BRUISERSHOT: case MT_BRUISERSHOTRED: // jd64 case MT_NTROSHOT: // jd64 return; default: break; } switch(xline->special) { case 39: ///< TELEPORT TRIGGER case 97: ///< TELEPORT RETRIGGER case 993: // jd64 case 125: ///< TELEPORT MONSTERONLY TRIGGER case 126: ///< TELEPORT MONSTERONLY RETRIGGER case 4: ///< RAISE DOOR case 10: ///< PLAT DOWN-WAIT-UP-STAY TRIGGER case 88: ///< PLAT DOWN-WAIT-UP-STAY RETRIGGER case 415: // jd64 ok = true; break; } // Anything can trigger this line! if(xline->flags & ML_ALLTRIGGER) ok = true; if(!ok) return; } // Note: could use some const's here. switch(xline->special) { // TRIGGERS. // All from here to RETRIGGERS. case 2: // Open Door EV_DoDoor(line, DT_OPEN); xline->special = 0; break; case 3: // Close Door EV_DoDoor(line, DT_CLOSE); xline->special = 0; break; case 4: // Raise Door EV_DoDoor(line, DT_NORMAL); xline->special = 0; break; case 5: // Raise Floor EV_DoFloor(line, FT_RAISEFLOOR); xline->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line, CT_CRUSHANDRAISEFAST); xline->special = 0; break; case 8: // Build Stairs EV_BuildStairs(line, build8); xline->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0); xline->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line, 0); xline->special = 0; break; case 13: // Light Turn On - max EV_LightTurnOn(line, 1); xline->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line, DT_CLOSE30THENOPEN); xline->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); xline->special = 0; break; case 19: // Lower Floor EV_DoFloor(line, FT_LOWER); xline->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0); xline->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line, CT_CRUSHANDRAISE); xline->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line, FT_RAISETOTEXTURE); xline->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line, 35.0f/255.0f); xline->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line, FT_LOWERTURBO); xline->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line, FT_LOWERANDCHANGE); xline->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor(line, FT_LOWERTOLOWEST); xline->special = 0; break; case 420: // jd64 EV_DoFloorAndCeiling(line, FT_TOHIGHESTPLUS8, CT_RAISETOHIGHEST); xline->special = 0; break; case 430: // jd64 EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP); break; case 431: // jd64 EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP); xline->special = 0; break; case 426: // jd64 EV_DoCeiling(line, CT_CUSTOM); break; case 427: // jd64 EV_DoCeiling(line, CT_CUSTOM); xline->special = 0; break; case 991: // jd64 // TELEPORT! EV_FadeSpawn(line, thing); xline->special = 0; break; case 993: // jd64 if(!thing->player) EV_FadeSpawn(line, thing); xline->special = 0; break; case 992: // jd64 // Lower Ceiling to Floor if(EV_DoCeiling(line, CT_LOWERTOFLOOR)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 994: // jd64 /// @todo Might as well do this with XG. /// Also, export this text string to DED. P_SetMessage(thing->player, "You've found a secret area!"); thing->player->secretCount++; thing->player->update |= PSF_COUNTERS; xline->special = 0; break; case 995: // jd64 /// @todo Might as well do this with XG. P_SetMessage(thing->player, "You've found a shrine!"); xline->special = 0; break; case 998: // jd64 // BE GONE! EV_FadeAway(line, thing); xline->special = 0; break; case 39: // TELEPORT! EV_Teleport(line, side, thing, true); xline->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling(line, CT_RAISETOHIGHEST); EV_DoFloor(line, FT_LOWERTOLOWEST); xline->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling(line, CT_LOWERANDCRUSH); xline->special = 0; break; case 52: // EXIT! G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("next")); break; case 53: // Perpetual Platform Raise EV_DoPlat(line, PT_PERPETUALRAISE, 0); xline->special = 0; break; case 54: // Platform Stop P_PlatDeactivate(xline->tag); xline->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line, FT_RAISEFLOORCRUSH); xline->special = 0; break; case 57: // Ceiling Crush Stop P_CeilingDeactivate(xline->tag); xline->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line, FT_RAISE24); xline->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line, FT_RAISE24ANDCHANGE); xline->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); xline->special = 0; break; case 108: // Blazing Door Raise (faster than TURBO!) EV_DoDoor(line, DT_BLAZERAISE); xline->special = 0; break; case 109: // Blazing Door Open (faster than TURBO!) EV_DoDoor(line, DT_BLAZEOPEN); xline->special = 0; break; case 100: // Build Stairs Turbo 16 EV_BuildStairs(line, turbo16); xline->special = 0; break; case 110: // Blazing Door Close (faster than TURBO!) EV_DoDoor(line, DT_BLAZECLOSE); xline->special = 0; break; case 119: // Raise floor to nearest surr. floor EV_DoFloor(line, FT_RAISEFLOORTONEAREST); xline->special = 0; break; case 121: // Blazing PlatDownWaitUpStay EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0); xline->special = 0; break; case 124: // Secret EXIT G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("secret"), 0, true); break; case 125: // TELEPORT MonsterONLY if(!thing->player) { EV_Teleport(line, side, thing, true); xline->special = 0; } break; case 130: // Raise Floor Turbo EV_DoFloor(line, FT_RAISEFLOORTURBO); xline->special = 0; break; case 141: // Silent Ceiling Crush & Raise EV_DoCeiling(line, CT_SILENTCRUSHANDRAISE); xline->special = 0; break; // RETRIGGERS. All from here till end. case 72: // Ceiling Crush EV_DoCeiling(line, CT_LOWERANDCRUSH); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line, CT_CRUSHANDRAISE); break; case 74: // Ceiling Crush Stop P_CeilingDeactivate(xline->tag); break; case 75: // Close Door EV_DoDoor(line, DT_CLOSE); break; case 76: // Close Door 30 EV_DoDoor(line, DT_CLOSE30THENOPEN); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line, CT_CRUSHANDRAISEFAST); break; case 79: // Lights Very Dark EV_LightTurnOn(line, 35.0f/255.0f); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line, 0); break; case 81: // Light Turn On - max EV_LightTurnOn(line, 1); break; case 82: // Lower Floor To Lowest EV_DoFloor(line, FT_LOWERTOLOWEST); break; case 83: // Lower Floor EV_DoFloor(line, FT_LOWER); break; case 84: // LowerAndChange EV_DoFloor(line, FT_LOWERANDCHANGE); break; case 86: // Open Door EV_DoDoor(line, DT_OPEN); break; case 87: // Perpetual Platform Raise EV_DoPlat(line, PT_PERPETUALRAISE, 0); break; case 88: // PlatDownWaitUp EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0); break; case 415: // jd64 if(thing->player) EV_DoPlat(line, PT_UPWAITDOWNSTAY, 0); break; case 89: // Platform Stop P_PlatDeactivate(xline->tag); break; case 90: // Raise Door EV_DoDoor(line, DT_NORMAL); break; case 91: // Raise Floor EV_DoFloor(line, FT_RAISEFLOOR); break; case 92: // Raise Floor 24 EV_DoFloor(line, FT_RAISE24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line, FT_RAISE24ANDCHANGE); break; case 94: // Raise Floor Crush EV_DoFloor(line, FT_RAISEFLOORCRUSH); break; case 95: // Raise floor to nearest height // and change texture. EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0); break; case 96: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line, FT_RAISETOTEXTURE); break; case 97: // TELEPORT! EV_Teleport(line, side, thing, true); break; case 423: // jd64 // TELEPORT! (no fog) // FIXME: DJS - might as well do this in XG. EV_Teleport(line, side, thing, false); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line, FT_LOWERTURBO); break; case 105: // Blazing Door Raise (faster than TURBO!) EV_DoDoor(line, DT_BLAZERAISE); break; case 106: // Blazing Door Open (faster than TURBO!) EV_DoDoor(line, DT_BLAZEOPEN); break; case 107: // Blazing Door Close (faster than TURBO!) EV_DoDoor(line, DT_BLAZECLOSE); break; case 120: // Blazing PlatDownWaitUpStay. EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0); break; case 126: // TELEPORT MonsterONLY. if(!thing->player) EV_Teleport(line, side, thing, true); break; case 128: // Raise To Nearest Floor EV_DoFloor(line, FT_RAISEFLOORTONEAREST); break; case 129: // Raise Floor Turbo EV_DoFloor(line, FT_RAISEFLOORTURBO); break; case 155: // jd64 // Raise Floor 512 // FIXME: DJS - again, might as well do this in XG. if(EV_DoFloor(line, FT_RAISE32)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); P_ToXLine(line)->special = 0; } break; } }
// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // boolean P_UseSpecialLine(mobj_t* thing, line_t* line, int side) { // Err... // Use the back sides of VERY SPECIAL lines... if (side) { switch(line->special) { case 148: // haleyjd [STRIFE] break; default: return false; } } // Switches that other things can activate. if (!thing->player) { // never open secret doors if (line->flags & ML_SECRET) return false; switch(line->special) { case 1: // MANUAL DOOR RAISE case 31: // haleyjd [STRIFE] case 144: // haleyjd [STRIFE] Manual sliding door break; default: return false; break; } } // do something switch(line->special) { // MANUALS case 1: // Vertical Door case 26: // DR ID Card case 27: // DR Pass Card case 28: // DR ID Badge case 31: // Manual door open case 32: // D1 ID Card case 33: // D1 ID Badge case 34: // D1 Pass Card case 117: // Blazing door raise case 118: // Blazing door open case 156: // haleyjd [STRIFE] D1 Brass Key case 157: // haleyjd [STRIFE] D1 Silver Key case 158: // haleyjd [STRIFE] D1 Gold Key case 159: // haleyjd [STRIFE] DR Gold Key case 160: // haleyjd [STRIFE] DR Silver Key case 161: // haleyjd [STRIFE] DR Brass Key case 165: // villsa [STRIFE] That doesn't seem to work case 166: // haleyjd [STRIFE] DR Hand Print case 169: // haleyjd [STRIFE] DR Base Key case 170: // haleyjd [STRIFE] DR Gov's Key case 190: // haleyjd [STRIFE] DR Order Key case 205: // villsa [STRIFE] Available in retail only case 213: // haleyjd [STRIFE] DR Chalice case 217: // haleyjd [STRIFE] DR Core Key case 221: // haleyjd [STRIFE] DR Mauler Key case 224: // haleyjd [STRIFE] DR Chapel Key case 225: // haleyjd [STRIFE] DR Catacomb Key case 232: // villsa [STRIFE] DR Oracle Pass EV_VerticalDoor (line, thing); break; // haleyjd: For the sake of our sanity, I have reordered all the line // specials from this point down so that they are strictly in numeric // order, and not divided up in a semi-arbitrary fashion. case 7: // Build Stairs - [STRIFE] Verified unmodified if (EV_BuildStairs(line,build8)) P_ChangeSwitchTexture(line,0); break; case 9: // Change Donut - [STRIFE] Verified unmodified if (EV_DoDonut(line)) P_ChangeSwitchTexture(line,0); break; case 11: // Exit level - [STRIFE] Modified to take tag, etc. P_ChangeSwitchTexture(line, 1); if(levelTimer && levelTimeCount) break; G_ExitLevel(line->tag); break; case 14: // Raise Floor 32 and change texture - [STRIFE] Verified unmodified if (EV_DoPlat(line, raiseAndChange,32)) P_ChangeSwitchTexture(line,0); break; case 15: // Raise Floor 24 and change texture if (EV_DoPlat(line, raiseAndChange,24)) P_ChangeSwitchTexture(line,0); break; case 18: // Raise Floor to next highest floor - [STRIFE] Verified unmodified if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line,0); break; case 20: // Raise Plat next highest floor and change texture - [STRIFE] Verified unmodified if(EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line,0); break; case 21: // PlatDownWaitUpStay - [STRIFE] Verified unmodified if (EV_DoPlat(line, downWaitUpStay,0)) P_ChangeSwitchTexture(line,0); break; case 23: // Lower Floor to Lowest - [STRIFE] Verified unmodified if (EV_DoFloor(line,lowerFloorToLowest)) P_ChangeSwitchTexture(line,0); break; case 29: // Raise Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,normal)) P_ChangeSwitchTexture(line,0); break; case 40: // villsa [STRIFE] Split Open Door if(EV_DoDoor(line, splitOpen)) P_ChangeSwitchTexture(line, 0); break; // haleyjd case 41: // Lower Ceiling to Floor - [STRIFE] Verified unmodified if (EV_DoCeiling(line,lowerToFloor)) P_ChangeSwitchTexture(line,0); break; case 42: // Close Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,close)) P_ChangeSwitchTexture(line,1); break; case 43: // Lower Ceiling to Floor - [STRIFE] Verified unmodified if (EV_DoCeiling(line,lowerToFloor)) P_ChangeSwitchTexture(line,1); break; case 45: // Lower Floor to Surrounding floor height - [STRIFE] Verified unmodified if (EV_DoFloor(line,lowerFloor)) P_ChangeSwitchTexture(line,1); break; case 49: // Ceiling Crush And Raise - [STRIFE] Verified unmodified if (EV_DoCeiling(line,crushAndRaise)) P_ChangeSwitchTexture(line,0); break; case 50: // Close Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,close)) P_ChangeSwitchTexture(line,0); break; case 51: // [STRIFE] Modifed into S1 Start Finale (was Secret Exit) P_ChangeSwitchTexture(line,0); G_StartFinale(); break; case 55: // Raise Floor Crush - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloorCrush)) P_ChangeSwitchTexture(line,0); break; case 60: // Lower Floor to Lowest - [STRIFE] Verified unmodified if (EV_DoFloor(line,lowerFloorToLowest)) P_ChangeSwitchTexture(line,1); break; case 61: // Open Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,open)) P_ChangeSwitchTexture(line,1); break; case 62: // PlatDownWaitUpStay - [STRIFE] Verified unmodified if (EV_DoPlat(line, downWaitUpStay,1)) P_ChangeSwitchTexture(line,1); break; case 63: // Raise Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,normal)) P_ChangeSwitchTexture(line,1); break; case 64: // Raise Floor to ceiling - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloor)) P_ChangeSwitchTexture(line,1); break; case 65: // Raise Floor Crush - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloorCrush)) P_ChangeSwitchTexture(line,1); break; case 66: // Raise Floor 24 and change texture - [STRIFE] Verified unmodified if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line,1); break; case 67: // Raise Floor 32 and change texture - [STRIFE] Verified unmodified if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line,1); break; case 68: // Raise Plat to next highest floor and change texture - [STRIFE] Verified unmodified if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line,1); break; case 69: // Raise Floor to next highest floor - [STRIFE] Verified unmodified if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line,1); break; case 70: // Turbo Lower Floor - [STRIFE] Verified unmodified if (EV_DoFloor(line,turboLower)) P_ChangeSwitchTexture(line,1); break; case 71: // Turbo Lower Floor - [STRIFE] Verified unmodified if (EV_DoFloor(line,turboLower)) P_ChangeSwitchTexture(line,0); break; case 101: // Raise Floor - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloor)) P_ChangeSwitchTexture(line,0); break; case 102: // Lower Floor to Surrounding floor height - [STRIFE] Verified unmodified if (EV_DoFloor(line,lowerFloor)) P_ChangeSwitchTexture(line,0); break; case 103: // Open Door - [STRIFE] Verified unmodified if (EV_DoDoor(line,open)) P_ChangeSwitchTexture(line,0); break; case 111: // Blazing Door Raise (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeRaise)) P_ChangeSwitchTexture(line,0); break; case 112: // Blazing Door Open (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeOpen)) P_ChangeSwitchTexture(line,0); break; case 113: // Blazing Door Close (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeClose)) P_ChangeSwitchTexture(line,0); break; case 114: // Blazing Door Raise (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeRaise)) P_ChangeSwitchTexture(line,1); break; case 115: // Blazing Door Open (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeOpen)) P_ChangeSwitchTexture(line,1); break; case 116: // Blazing Door Close (faster than TURBO!) - [STRIFE] Verified unmodified if (EV_DoDoor (line,blazeClose)) P_ChangeSwitchTexture(line,1); break; case 122: // Blazing PlatDownWaitUpStay - [STRIFE] Verified unmodified if(EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line,0); break; case 123: // Blazing PlatDownWaitUpStay - [STRIFE] Verified unmodified if(EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line,1); break; case 127: // Build Stairs Turbo 16 - [STRIFE] Verified unmodified if (EV_BuildStairs(line,turbo16)) P_ChangeSwitchTexture(line,0); break; case 131: // Raise Floor Turbo - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloorTurbo)) P_ChangeSwitchTexture(line,0); break; case 132: // Raise Floor Turbo - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloorTurbo)) P_ChangeSwitchTexture(line,1); break; case 133: // [STRIFE] TODO - which key is it? case 135: // [STRIFE] TODO - which key is it? case 137: // [STRIFE] TODO - which key is it? if (EV_DoLockedDoor (line,blazeOpen,thing)) P_ChangeSwitchTexture(line,0); break; case 99: // [STRIFE] TODO: which key is it? case 134: // [STRIFE] TODO: which key is it? case 136: // [STRIFE] TODO: which key is it? if (EV_DoLockedDoor (line,blazeOpen,thing)) P_ChangeSwitchTexture(line,1); break; case 138: // Light Turn On - [STRIFE] Verified unmodified EV_LightTurnOn(line,255); P_ChangeSwitchTexture(line,1); break; case 139: // Light Turn Off - [STRIFE] Verified unmodified EV_LightTurnOn(line,35); P_ChangeSwitchTexture(line,1); break; case 140: // Raise Floor 512 - [STRIFE] Verified unmodified if (EV_DoFloor(line,raiseFloor512)) P_ChangeSwitchTexture(line,0); break; case 144: // villsa [STRIFE] manual sliding door EV_SlidingDoor(line, thing); break; case 146: // haleyjd 09/24/10: [STRIFE] S1 Build Stairs Down 16 (new type) if(EV_BuildStairs(line, buildDown16)) P_ChangeSwitchTexture(line, 0); break; case 147: // haleyjd 09/24/10: [STRIFE] S1 Clear Force Fields if(EV_ClearForceFields(line)) P_ChangeSwitchTexture(line, 0); break; case 148: // haleyjd 09/16/10: [STRIFE] using forcefields hurts P_DamageMobj(thing, NULL, NULL, 16); P_Thrust(thing->player, thing->angle + ANG180, 125*FRACUNIT/16); break; case 151: // villsa [STRIFE] BlzOpenDoor Gold key case 152: // [STRIFE] TODO: which key is it? case 153: // [STRIFE] TODO: which key is it? if(EV_DoLockedDoor(line, blazeOpen, thing)) P_ChangeSwitchTexture(line, 1); break; case 154: // villsa [STRIFE] plat lower wait rise if have gold key if(thing->player->cards[key_GoldKey]) { if(EV_DoPlat(line, downWaitUpStay, 0)) P_ChangeSwitchTexture(line, 1); } else { thing->player->message = DEH_String("You need a gold key"); S_StartSound(thing, sfx_oof); } break; case 155: // villsa [STRIFE] raise plat wait lower if(EV_DoPlat(line, upWaitDownStay, 0)) P_ChangeSwitchTexture(line, 1); break; case 162: // [STRIFE] TODO: which key is it? case 163: // [STRIFE] TODO: which key is it? case 164: // villsa [STRIFE] BlzOpenDoor Gold key case 167: // [STRIFE] TODO: which key is it? if(EV_DoLockedDoor(line, blazeOpen, thing)) P_ChangeSwitchTexture(line, 0); break; case 168: // [STRIFE] TODO: which key is it? // haleyjd 09/25/10: [STRIFE] SR Blaze Open Door ???? Key if(EV_DoLockedDoor(line, blazeOpen, thing)) P_ChangeSwitchTexture(line, 1); break; case 171: // [STRIFE] TODO: which key is it? // haleyjd 09/25/10: [STRIFE] S1 Open Door ???? Key if(EV_DoLockedDoor(line, open, thing)) P_ChangeSwitchTexture(line, 0); break; case 172: // [STRIFE] TODO: which key is it? case 173: // [STRIFE] TODO: which key is it? case 176: // [STRIFE] TODO: which key is it? case 191: // [STRIFE] TODO: which key is it? case 192: // [STRIFE] TODO: which key is it? case 223: // [STRIFE] TODO: which key is it? if(EV_DoLockedDoor(line, normal, thing)) P_ChangeSwitchTexture(line, 1); break; case 177: // villsa [STRIFE] plat lower wait rise if have power3 key if(thing->player->cards[key_Power3Key]) { if(EV_DoPlat(line, downWaitUpStay, 0)) P_ChangeSwitchTexture(line, 1); } else { thing->player->message = DEH_String("You don't have the key"); S_StartSound(thing, sfx_oof); } break; case 181: // haleyjd 09/25/10: [STRIFE] S1 Floor Raise 512 & Change if(EV_DoFloor(line, raiseFloor512AndChange)) P_ChangeSwitchTexture(line, 0); break; case 189: // [STRIFE] TODO: which key is it??? // haleyjd 09/25/10: [STRIFE] S1 Split Open Door ???? Key if(EV_DoLockedDoor(line, splitOpen, thing)) P_ChangeSwitchTexture(line, 0); break; case 194: // villsa [STRIFE] S1 Free Prisoners if(EV_DoDoor(line, open)) { P_ChangeSwitchTexture(line, 0); P_FreePrisoners(); } break; case 199: // haleyjd 09/25/10: [STRIFE] S1 Destroy Converter if(EV_DoCeiling(line, lowerAndCrush)) { P_ChangeSwitchTexture(line, 0); P_DestroyConverter(); } break; case 207: // villsa [STRIFE] SR Remote Sliding Door if(EV_RemoteSlidingDoor(line, thing)) P_ChangeSwitchTexture(line, 1); break; // haleyjd case 209: // haleyjd 09/24/10: [STRIFE] S1 Build Stairs Down 16 if Have Chalice if(!P_PlayerHasItem(thing->player, MT_INV_CHALICE)) { DEH_snprintf(usemessage, sizeof(usemessage), "You need the chalice!"); thing->player->message = usemessage; S_StartSound(thing, sfx_oof); break; } else if(EV_BuildStairs(line, buildDown16)) P_ChangeSwitchTexture(line, 0); break; case 211: // villsa [STRIFE] S1 Play VOC## sound if(&players[consoleplayer] == thing->player && thing->player->powers[pw_communicator]) { DEH_snprintf(usemessage, sizeof(usemessage), "voc%i", line->tag); I_StartVoice(usemessage); line->special = 0; } break; case 214: // villsa [STRIFE] S1 slow lift lower wait up stay if(EV_DoPlat(line, slowDWUS, 1)) P_ChangeSwitchTexture(line, 1); break; case 219: // haleyjd 09/25/10: S1 Lower Floor Blue Crystal if(!thing->player->cards[key_BlueCrystalKey]) { thing->player->message = DEH_String("You need the Blue Crystal"); S_StartSound(thing, sfx_oof); } else if(EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 0); break; case 220: // haleyjd 09/25/10: S1 Lower Floor Red Crystal if(!thing->player->cards[key_RedCrystalKey]) { thing->player->message = DEH_String("You need the Red Crystal"); S_StartSound(thing, sfx_oof); } else if(EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 0); break; case 226: // villsa [STRIFE] S1 Complete Training Area if(EV_DoFloor(line, lowerFloor)) { P_GiveItemToPlayer(thing->player, SPR_TOKN, MT_TOKEN_STAMINA); P_GiveItemToPlayer(thing->player, SPR_TOKN, MT_TOKEN_NEW_ACCURACY); P_ChangeSwitchTexture(line, 0); DEH_snprintf(usemessage, sizeof(usemessage), DEH_String("Congratulations! You have completed the training area.")); thing->player->message = usemessage; } break; case 229: // villsa [STRIFE] SR Sigil Sliding Door if(thing->player->sigiltype == 4) { if(EV_RemoteSlidingDoor(line, thing)) P_ChangeSwitchTexture(line, 1); } break; // haleyjd case 233: // villsa [STRIFE] objective given after revealing the computer if(!EV_DoDoor(line, splitOpen)) return true; P_ChangeSwitchTexture(line, 1); GiveVoiceObjective("voc70", "log70", 0); // haleyjd: Strife used sprintf here, not a direct set. DEH_snprintf(usemessage, sizeof(usemessage), "Incoming Message from BlackBird..."); thing->player->message = usemessage; break; case 234: // haleyjd 09/24/10: [STRIFE] SR Raise Door if Quest 3 if(!(thing->player->questflags & QF_QUEST3)) // QUEST3 == Irale { // BUG: doesn't make sfx_oof sound like all other message- // giving door types. I highly doubt this was intentional. DEH_snprintf(usemessage, sizeof(usemessage), "That doesn't seem to work!"); thing->player->message = usemessage; } else if(EV_DoDoor(line, normal)) P_ChangeSwitchTexture(line, 1); break; case 235: // haleyjd 09/25/10: [STRIFE] S1 Split Open Door if Have Sigil 4 if(thing->player->sigiltype == 4) { if(EV_DoDoor(line, splitOpen)) P_ChangeSwitchTexture(line, 0); } break; case 666: // villsa [STRIFE] SR Move Wall P_MoveWall(line, thing); break; } return true; }