2 //**************************************************************************
4 //** p_things.c : Heretic 2 : Raven Software, Corp.
11 //**************************************************************************
13 // HEADER FILES ------------------------------------------------------------
19 // MACROS ------------------------------------------------------------------
21 // TYPES -------------------------------------------------------------------
23 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
25 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
27 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
29 static boolean ActivateThing(mobj_t *mobj);
30 static boolean DeactivateThing(mobj_t *mobj);
32 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
34 // PUBLIC DATA DEFINITIONS -------------------------------------------------
36 mobjtype_t TranslateThingType[] =
39 MT_CENTAUR, // T_CENTAUR
40 MT_CENTAURLEADER, // T_CENTAURLEADER
43 MT_FIREDEMON, // T_FIREGARGOYLE
44 MT_SERPENT, // T_WATERLURKER
45 MT_SERPENTLEADER, // T_WATERLURKERLEADER
46 MT_WRAITH, // T_WRAITH
47 MT_WRAITHB, // T_WRAITHBURIED
48 MT_FIREBALL1, // T_FIREBALL1
51 MT_SPEEDBOOTS, // T_ITEMBOOTS
52 MT_ARTIEGG, // T_ITEMEGG
53 MT_ARTIFLY, // T_ITEMFLIGHT
54 MT_SUMMONMAULATOR, // T_ITEMSUMMON
55 MT_TELEPORTOTHER, // T_ITEMTPORTOTHER
56 MT_ARTITELEPORT, // T_ITEMTELEPORT
57 MT_BISHOP, // T_BISHOP
58 MT_ICEGUY, // T_ICEGOLEM
59 MT_BRIDGE, // T_BRIDGE
60 MT_BOOSTARMOR, // T_DRAGONSKINBRACERS
61 MT_HEALINGBOTTLE, // T_ITEMHEALTHPOTION
62 MT_HEALTHFLASK, // T_ITEMHEALTHFLASK
63 MT_ARTISUPERHEAL, // T_ITEMHEALTHFULL
64 MT_BOOSTMANA, // T_ITEMBOOSTMANA
65 MT_FW_AXE, // T_FIGHTERAXE
66 MT_FW_HAMMER, // T_FIGHTERHAMMER
67 MT_FW_SWORD1, // T_FIGHTERSWORD1
68 MT_FW_SWORD2, // T_FIGHTERSWORD2
69 MT_FW_SWORD3, // T_FIGHTERSWORD3
70 MT_CW_SERPSTAFF, // T_CLERICSTAFF
71 MT_CW_HOLY1, // T_CLERICHOLY1
72 MT_CW_HOLY2, // T_CLERICHOLY2
73 MT_CW_HOLY3, // T_CLERICHOLY3
74 MT_MW_CONE, // T_MAGESHARDS
75 MT_MW_STAFF1, // T_MAGESTAFF1
76 MT_MW_STAFF2, // T_MAGESTAFF2
77 MT_MW_STAFF3, // T_MAGESTAFF3
78 MT_EGGFX, // T_MORPHBLAST
90 MT_POISONDART, // T_POISONDART
91 MT_RIPPERBALL, // T_RIPPERBALL
92 MT_SGSHARD1, // T_STAINEDGLASS1
93 MT_SGSHARD2, // T_STAINEDGLASS2
94 MT_SGSHARD3, // T_STAINEDGLASS3
95 MT_SGSHARD4, // T_STAINEDGLASS4
96 MT_SGSHARD5, // T_STAINEDGLASS5
97 MT_SGSHARD6, // T_STAINEDGLASS6
98 MT_SGSHARD7, // T_STAINEDGLASS7
99 MT_SGSHARD8, // T_STAINEDGLASS8
100 MT_SGSHARD9, // T_STAINEDGLASS9
101 MT_SGSHARD0, // T_STAINEDGLASS0
102 MT_PROJECTILE_BLADE, // T_BLADE
103 MT_ICESHARD, // T_ICESHARD
104 MT_FLAME_SMALL, // T_FLAME_SMALL
105 MT_FLAME_LARGE, // T_FLAME_LARGE
106 MT_ARMOR_1, // T_MESHARMOR
107 MT_ARMOR_2, // T_FALCONSHIELD
108 MT_ARMOR_3, // T_PLATINUMHELM
109 MT_ARMOR_4, // T_AMULETOFWARDING
110 MT_ARTIPOISONBAG, // T_ITEMFLECHETTE
111 MT_ARTITORCH, // T_ITEMTORCH
112 MT_BLASTRADIUS, // T_ITEMREPULSION
114 MT_ARTIPUZZSKULL, // T_PUZZSKULL
115 MT_ARTIPUZZGEMBIG, // T_PUZZGEMBIG
116 MT_ARTIPUZZGEMRED, // T_PUZZGEMRED
117 MT_ARTIPUZZGEMGREEN1, // T_PUZZGEMGREEN1
118 MT_ARTIPUZZGEMGREEN2, // T_PUZZGEMGREEN2
119 MT_ARTIPUZZGEMBLUE1, // T_PUZZGEMBLUE1
120 MT_ARTIPUZZGEMBLUE2, // T_PUZZGEMBLUE2
121 MT_ARTIPUZZBOOK1, // T_PUZZBOOK1
122 MT_ARTIPUZZBOOK2, // T_PUZZBOOK2
123 MT_KEY1, // T_METALKEY
124 MT_KEY2, // T_SMALLMETALKEY
126 MT_KEY4, // T_FIREKEY
127 MT_KEY5, // T_GREENKEY
128 MT_KEY6, // T_MACEKEY
129 MT_KEY7, // T_SILVERKEY
130 MT_KEY8, // T_RUSTYKEY
131 MT_KEY9, // T_HORNKEY
132 MT_KEYA, // T_SERPENTKEY
133 MT_WATER_DRIP, // T_WATERDRIP
134 MT_FLAME_SMALL_TEMP, // T_TEMPSMALLFLAME
135 MT_FLAME_SMALL, // T_PERMSMALLFLAME
136 MT_FLAME_LARGE_TEMP, // T_TEMPLARGEFLAME
137 MT_FLAME_LARGE, // T_PERMLARGEFLAME
138 MT_DEMON_MASH, // T_DEMON_MASH
139 MT_DEMON2_MASH, // T_DEMON2_MASH
140 MT_ETTIN_MASH, // T_ETTIN_MASH
141 MT_CENTAUR_MASH, // T_CENTAUR_MASH
142 MT_THRUSTFLOOR_UP, // T_THRUSTSPIKEUP
143 MT_THRUSTFLOOR_DOWN, // T_THRUSTSPIKEDOWN
144 MT_WRAITHFX4, // T_FLESH_DRIP1
145 MT_WRAITHFX5, // T_FLESH_DRIP2
146 MT_WRAITHFX2 // T_SPARK_DRIP
149 // PRIVATE DATA DEFINITIONS ------------------------------------------------
151 // CODE --------------------------------------------------------------------
153 //==========================================================================
155 // EV_ThingProjectile
157 //==========================================================================
159 boolean EV_ThingProjectile(byte *args, boolean gravity)
175 moType = TranslateThingType[args[1]];
176 if(nomonsters && (mobjinfo[moType].flags&MF_COUNTKILL))
177 { // Don't spawn monsters if -nomonsters
180 angle = (int)args[2]<<24;
181 fineAngle = angle>>ANGLETOFINESHIFT;
182 speed = (int)args[3]<<13;
183 vspeed = (int)args[4]<<13;
184 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
186 newMobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, moType);
187 if(newMobj->info->seesound)
189 S_StartSound(newMobj, newMobj->info->seesound);
191 newMobj->target = mobj; // Originator
192 newMobj->angle = angle;
193 newMobj->momx = FixedMul(speed, finecosine[fineAngle]);
194 newMobj->momy = FixedMul(speed, finesine[fineAngle]);
195 newMobj->momz = vspeed;
196 newMobj->flags2 |= MF2_DROPPED; // Don't respawn
199 newMobj->flags &= ~MF_NOGRAVITY;
200 newMobj->flags2 |= MF2_LOGRAV;
202 if(P_CheckMissileSpawn(newMobj) == true)
210 //==========================================================================
214 //==========================================================================
216 boolean EV_ThingSpawn(byte *args, boolean fog)
231 moType = TranslateThingType[args[1]];
232 if(nomonsters && (mobjinfo[moType].flags&MF_COUNTKILL))
233 { // Don't spawn monsters if -nomonsters
236 angle = (int)args[2]<<24;
237 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
239 if (mobjinfo[moType].flags2&MF2_FLOATBOB)
241 z = mobj->z - mobj->floorz;
247 newMobj = P_SpawnMobj(mobj->x, mobj->y, z, moType);
248 if(P_TestMobjLocation(newMobj) == false)
250 P_RemoveMobj(newMobj);
254 newMobj->angle = angle;
257 fogMobj = P_SpawnMobj(mobj->x, mobj->y,
258 mobj->z+TELEFOGHEIGHT, MT_TFOG);
259 S_StartSound(fogMobj, SFX_TELEPORT);
261 newMobj->flags2 |= MF2_DROPPED; // Don't respawn
262 if (newMobj->flags2&MF2_FLOATBOB)
264 newMobj->special1 = newMobj->z - newMobj->floorz;
272 //==========================================================================
276 //==========================================================================
278 boolean EV_ThingActivate(int tid)
286 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
288 if(ActivateThing(mobj) == true)
296 //==========================================================================
298 // EV_ThingDeactivate
300 //==========================================================================
302 boolean EV_ThingDeactivate(int tid)
310 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
312 if(DeactivateThing(mobj) == true)
320 //==========================================================================
324 //==========================================================================
326 boolean EV_ThingRemove(int tid)
334 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
336 if (mobj->type == MT_BRIDGE)
338 A_BridgeRemove(mobj);
347 //==========================================================================
351 //==========================================================================
353 boolean EV_ThingDestroy(int tid)
361 while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
363 if(mobj->flags&MF_SHOOTABLE)
365 P_DamageMobj(mobj, NULL, NULL, 10000);
372 //==========================================================================
378 // arg[2] = angle (255 = use mobj angle)
379 // arg[3] = distance (pixels>>2)
381 //==========================================================================
384 boolean EV_ThingMove(byte *args)
390 //==========================================================================
394 //==========================================================================
396 static boolean ActivateThing(mobj_t *mobj)
398 if(mobj->flags&MF_COUNTKILL)
400 if(mobj->flags2&MF2_DORMANT)
402 mobj->flags2 &= ~MF2_DORMANT;
410 case MT_ZTWINEDTORCH:
411 case MT_ZTWINEDTORCH_UNLIT:
412 P_SetMobjState(mobj, S_ZTWINEDTORCH_1);
413 S_StartSound(mobj, SFX_IGNITE);
416 case MT_ZWALLTORCH_UNLIT:
417 P_SetMobjState(mobj, S_ZWALLTORCH1);
418 S_StartSound(mobj, SFX_IGNITE);
420 case MT_ZGEMPEDESTAL:
421 P_SetMobjState(mobj, S_ZGEMPEDESTAL2);
423 case MT_ZWINGEDSTATUENOSKULL:
424 P_SetMobjState(mobj, S_ZWINGEDSTATUENOSKULL2);
426 case MT_THRUSTFLOOR_UP:
427 case MT_THRUSTFLOOR_DOWN:
428 if (mobj->args[0]==0)
430 S_StartSound(mobj, SFX_THRUSTSPIKE_LOWER);
431 mobj->flags2 &= ~MF2_DONTDRAW;
433 P_SetMobjState(mobj, S_BTHRUSTRAISE1);
435 P_SetMobjState(mobj, S_THRUSTRAISE1);
439 case MT_ZFIREBULL_UNLIT:
440 P_SetMobjState(mobj, S_ZFIREBULL_BIRTH);
441 S_StartSound(mobj, SFX_IGNITE);
446 P_DamageMobj(mobj, NULL, NULL, 10); // 'ring' the bell
450 case MT_ZCAULDRON_UNLIT:
451 P_SetMobjState(mobj, S_ZCAULDRON1);
452 S_StartSound(mobj, SFX_IGNITE);
455 S_StartSound(mobj, SFX_IGNITE);
456 P_SetMobjState(mobj, S_FLAME_SMALL1);
459 S_StartSound(mobj, SFX_IGNITE);
460 P_SetMobjState(mobj, S_FLAME_LARGE1);
463 P_SetMobjState(mobj, S_SPAWNBATS1);
472 //==========================================================================
476 //==========================================================================
478 static boolean DeactivateThing(mobj_t *mobj)
480 if(mobj->flags&MF_COUNTKILL)
482 if(!(mobj->flags2&MF2_DORMANT))
484 mobj->flags2 |= MF2_DORMANT;
492 case MT_ZTWINEDTORCH:
493 case MT_ZTWINEDTORCH_UNLIT:
494 P_SetMobjState(mobj, S_ZTWINEDTORCH_UNLIT);
497 case MT_ZWALLTORCH_UNLIT:
498 P_SetMobjState(mobj, S_ZWALLTORCH_U);
500 case MT_THRUSTFLOOR_UP:
501 case MT_THRUSTFLOOR_DOWN:
502 if (mobj->args[0]==1)
504 S_StartSound(mobj, SFX_THRUSTSPIKE_RAISE);
506 P_SetMobjState(mobj, S_BTHRUSTLOWER);
508 P_SetMobjState(mobj, S_THRUSTLOWER);
512 case MT_ZFIREBULL_UNLIT:
513 P_SetMobjState(mobj, S_ZFIREBULL_DEATH);
516 case MT_ZCAULDRON_UNLIT:
517 P_SetMobjState(mobj, S_ZCAULDRON_U);
520 P_SetMobjState(mobj, S_FLAME_SDORM1);
523 P_SetMobjState(mobj, S_FLAME_LDORM1);
526 P_SetMobjState(mobj, S_SPAWNBATS_OFF);