ref: 3d45d8152fe040341e7b5083305c4cc7a2032a2f
parent: 520918e4714ba3e22d3a9dc847290dfce0848340
author: James Haley <haleyjd@hotmail.com>
date: Mon Sep 6 15:23:56 EDT 2010
Started some second-hand verification and added more comments to p_pspr. Significant work done on making enemies functional, including allied units, Acolytes, Templars, Reavers, Sentinels, Stalkers, Inquisitors, and Spectres. A few action functions and thingtypes were renamed. Subversion-branch: /branches/strife-branch Subversion-revision: 2018
--- a/src/strife/info.c
+++ b/src/strife/info.c
@@ -85,7 +85,7 @@
void A_Chase();
void A_FaceTarget();
void A_PeasantPunch();
-void A_ReavShoot();
+void A_ReaverAttack();
void A_BulletAttack();
void A_CheckTargetVisible();
void A_SentinelAttack();
@@ -94,7 +94,7 @@
void A_StalkerDrop();
void A_StalkerScratch();
void A_FloatWeave();
-void A_ReavAttack();
+void A_RobotMelee();
void A_TemplarMauler();
void A_CrusaderAttack();
void A_CrusaderLeft();
@@ -776,10 +776,10 @@
/*S_ROB1_08*/ { SPR_ROB1, 4, 3, { A_Chase }, S_ROB1_09 }, //575
/*S_ROB1_09*/ { SPR_ROB1, 4, 3, { A_Chase }, S_ROB1_02 }, //576
/*S_ROB1_10*/ { SPR_ROB1, 7, 6, { A_FaceTarget }, S_ROB1_11 }, //577
-/*S_ROB1_11*/ { SPR_ROB1, 8, 8, { A_ReavAttack }, S_ROB1_12 }, //578
+/*S_ROB1_11*/ { SPR_ROB1, 8, 8, { A_RobotMelee }, S_ROB1_12 }, //578
/*S_ROB1_12*/ { SPR_ROB1, 7, 6, { NULL }, S_ROB1_02 }, //579
/*S_ROB1_13*/ { SPR_ROB1, 5, 8, { A_FaceTarget }, S_ROB1_14 }, //580
-/*S_ROB1_14*/ { SPR_ROB1, 32774, 11, { A_ReavShoot }, S_ROB1_02 }, //581
+/*S_ROB1_14*/ { SPR_ROB1, 32774, 11, { A_ReaverAttack }, S_ROB1_02 }, //581
/*S_ROB1_15*/ { SPR_ROB1, 0, 2, { NULL }, S_ROB1_16 }, //582
/*S_ROB1_16*/ { SPR_ROB1, 0, 2, { A_Pain }, S_ROB1_02 }, //583
/*S_ROB1_17*/ { SPR_ROB1, 32777, 6, { NULL }, S_ROB1_18 }, //584
@@ -854,7 +854,7 @@
/*S_PGRD_10*/ { SPR_PGRD, 3, 3, { A_Chase }, S_PGRD_11 }, //653
/*S_PGRD_11*/ { SPR_PGRD, 3, 3, { A_Chase }, S_PGRD_04 }, //654
/*S_PGRD_12*/ { SPR_PGRD, 4, 8, { A_FaceTarget }, S_PGRD_13 }, //655
-/*S_PGRD_13*/ { SPR_PGRD, 5, 8, { A_ReavAttack }, S_PGRD_04 }, //656
+/*S_PGRD_13*/ { SPR_PGRD, 5, 8, { A_RobotMelee }, S_PGRD_04 }, //656
/*S_PGRD_14*/ { SPR_PGRD, 32774, 8, { A_FaceTarget }, S_PGRD_15 }, //657
/*S_PGRD_15*/ { SPR_PGRD, 32775, 8, { A_TemplarMauler }, S_PGRD_04 }, //658
/*S_PGRD_16*/ { SPR_PGRD, 0, 2, { NULL }, S_PGRD_17 }, //659
@@ -1257,8 +1257,8 @@
/*S_ROB3_09*/ { SPR_ROB3, 4, 3, { A_InqFlyCheck }, S_ROB3_02 }, //1056
/*S_ROB3_10*/ { SPR_ROB3, 0, 2, { A_InqFlyCheck }, S_ROB3_11 }, //1057
/*S_ROB3_11*/ { SPR_ROB3, 5, 6, { A_FaceTarget }, S_ROB3_12 }, //1058
-/*S_ROB3_12*/ { SPR_ROB3, 32774, 8, { A_ReavShoot }, S_ROB3_13 }, //1059
-/*S_ROB3_13*/ { SPR_ROB3, 6, 8, { A_ReavShoot }, S_ROB3_02 }, //1060
+/*S_ROB3_12*/ { SPR_ROB3, 32774, 8, { A_ReaverAttack }, S_ROB3_13 }, //1059
+/*S_ROB3_13*/ { SPR_ROB3, 6, 8, { A_ReaverAttack }, S_ROB3_02 }, //1060
/*S_ROB3_14*/ { SPR_ROB3, 10, 12, { A_FaceTarget }, S_ROB3_15 }, //1061
/*S_ROB3_15*/ { SPR_ROB3, 32777, 6, { A_InqGrenade }, S_ROB3_16 }, //1062
/*S_ROB3_16*/ { SPR_ROB3, 10, 12, { NULL }, S_ROB3_02 }, //1063
@@ -3545,7 +3545,7 @@
"priest", //namepointer
},
- { /*MT_SPECTURE_A*/
+ { /*MT_SPECTRE_A*/
129, //doomednum
S_ALN1_00, //spawnstate
1000, //spawnhealth
@@ -3601,7 +3601,7 @@
NULL, //namepointer
},
- { /*MT_SPECTUREHEAD*/
+ { /*MT_SPECTREHEAD*/
-1, //doomednum
S_MTHD_00, //spawnstate
1000, //spawnhealth
@@ -3628,7 +3628,7 @@
NULL, //namepointer
},
- { /*MT_SPECTURE_B*/
+ { /*MT_SPECTRE_B*/
75, //doomednum
S_ALN1_00, //spawnstate
1200, //spawnhealth
@@ -3657,7 +3657,7 @@
NULL, //namepointer
},
- { /*MT_SPECTURE_C*/
+ { /*MT_SPECTRE_C*/
76, //doomednum
S_ALN1_23, //spawnstate
1500, //spawnhealth
@@ -3686,7 +3686,7 @@
NULL, //namepointer
},
- { /*MT_SPECTURE_D*/
+ { /*MT_SPECTRE_D*/
167, //doomednum
S_ALN1_00, //spawnstate
1700, //spawnhealth
@@ -3715,7 +3715,7 @@
NULL, //namepointer
},
- { /*MT_SPECTURE_E*/
+ { /*MT_SPECTRE_E*/
168, //doomednum
S_ALN1_00, //spawnstate
2000, //spawnhealth
--- a/src/strife/info.h
+++ b/src/strife/info.h
@@ -1912,13 +1912,13 @@
MT_BISHOP, //064
MT_ORACLE, //065
MT_PRIEST, //066
- MT_SPECTURE_A, //067
+ MT_SPECTRE_A, //067
MT_NODE, //068
- MT_SPECTUREHEAD, //069
- MT_SPECTURE_B, //070
- MT_SPECTURE_C, //071
- MT_SPECTURE_D, //072
- MT_SPECTURE_E, //073
+ MT_SPECTREHEAD, //069
+ MT_SPECTRE_B, //070
+ MT_SPECTRE_C, //071
+ MT_SPECTRE_D, //072
+ MT_SPECTRE_E, //073
MT_ENTITY, //074
MT_SUBENTITY, //075
MT_NEST, //076
--- a/src/strife/p_enemy.c
+++ b/src/strife/p_enemy.c
@@ -46,11 +46,14 @@
// Data.
#include "sounds.h"
-
// Forward Declarations:
void A_RandomWalk(mobj_t *);
+void A_ProgrammerAttack(mobj_t* actor);
+void A_FireSigilEOffshoot(mobj_t *actor);
+void A_SpectreCAttack(mobj_t *actor);
+void A_SpectreDAttack(mobj_t *actor);
+void A_SpectreEAttack(mobj_t *actor);
-
typedef enum
{
DI_EAST,
@@ -735,12 +738,13 @@
}
else
{
+ // haleyjd 09/06/10: Note that this sets actor->target in Strife!
P_BulletSlope(actor);
// Clear target if nothing is visible, or if the target is a
// friendly Rebel or the allied player.
if(!linetarget ||
- actor->target->target == MT_REBEL1 &&
+ actor->target->type == MT_REBEL1 &&
actor->target->allegiance == actor->allegiance ||
actor->target == master)
{
@@ -758,6 +762,7 @@
return true;
}
+ // haleyjd 09/06/10: Note that this sets actor->target in Strife!
P_BulletSlope(actor);
// Clear target if nothing is visible, or if the target is an ally.
@@ -1131,7 +1136,7 @@
S_StartSound(actor, sfx_agrac1 + P_Random() % 4);
}
else
- S_StartSound (actor, actor->info->activesound);
+ S_StartSound(actor, actor->info->activesound);
}
}
@@ -1140,8 +1145,7 @@
// A_FaceTarget
//
// [STRIFE]
-// haleyjd 09/05/10: Modified handling for various visibility
-// modifying flags.
+// haleyjd 09/05/10: Handling for visibility-modifying flags.
//
void A_FaceTarget (mobj_t* actor)
{
@@ -1169,769 +1173,713 @@
}
}
-
//
-// A_PosAttack
+// A_PeasantPunch
//
-void A_PosAttack (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/05/10: Attack used by Peasants as a one-time retaliation
+// when the player or a monster injures them. Weak doesn't begin to
+// describe it :P
+//
+void A_PeasantPunch(mobj_t* actor)
{
- int angle;
- int damage;
- int slope;
-
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- angle = actor->angle;
- slope = P_AimLineAttack (actor, angle, MISSILERANGE);
+ if(!actor->target)
+ return;
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- angle += (P_Random()-P_Random())<<20;
- damage = ((P_Random()%5)+1)*3;
- P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
+ A_FaceTarget(actor);
+ if(P_CheckMeleeRange(actor))
+ P_DamageMobj(actor->target, actor, actor, 2 * (P_Random() % 5) + 2);
}
-void A_SPosAttack (mobj_t* actor)
+//
+// A_ReaverAttack
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action routine used by Reavers to fire bullets.
+// Also apparently used by Inquistors, though they don't seem to use
+// it too often, as they're content to blow your face off with their
+// HE grenades instead.
+//
+void A_ReaverAttack(mobj_t* actor)
{
- int i;
- int angle;
- int bangle;
- int damage;
- int slope;
-
- if (!actor->target)
- return;
+ int i = 0;
+ fixed_t slope;
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_FaceTarget (actor);
- bangle = actor->angle;
- slope = P_AimLineAttack (actor, bangle, MISSILERANGE);
+ if(!actor->target)
+ return;
- for (i=0 ; i<3 ; i++)
+ S_StartSound(actor, sfx_reavat);
+ A_FaceTarget(actor);
+
+ slope = P_AimLineAttack(actor, actor->angle, 2048*FRACUNIT);
+
+ do
{
- angle = bangle + ((P_Random()-P_Random())<<20);
- damage = ((P_Random()%5)+1)*3;
- P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
+ int t = P_Random();
+ angle_t shootangle = actor->angle + ((t - P_Random()) << 20);
+ int damage = (P_Random() & 7) + 1;
+
+ P_LineAttack(actor, shootangle, 2048*FRACUNIT, slope, damage);
+ ++i;
}
+ while(i < 3);
}
-void A_CPosAttack (mobj_t* actor)
+//
+// A_BulletAttack
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for generic bullet attacks. Used by
+// a lot of different characters, including Acolytes, Rebels, and Macil.
+//
+void A_BulletAttack(mobj_t* actor)
{
- int angle;
- int bangle;
- int damage;
- int slope;
-
- if (!actor->target)
- return;
+ int t, damage;
+ fixed_t slope;
+ angle_t shootangle;
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_FaceTarget (actor);
- bangle = actor->angle;
- slope = P_AimLineAttack (actor, bangle, MISSILERANGE);
+ if(!actor->target)
+ return;
- angle = bangle + ((P_Random()-P_Random())<<20);
- damage = ((P_Random()%5)+1)*3;
- P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
-}
+ S_StartSound(actor, sfx_rifle);
+ A_FaceTarget(actor);
+
+ slope = P_AimLineAttack(actor, actor->angle, 2048*FRACUNIT);
+ t = P_Random();
+ shootangle = ((t - P_Random()) << 19) + actor->angle;
+ damage = 3 * (P_Random() % 5 + 1);
-void A_CPosRefire (mobj_t* actor)
-{
- // keep firing unless target got out of sight
- A_FaceTarget (actor);
-
- if (P_Random () < 40)
- return;
-
- if (!actor->target
- || actor->target->health <= 0
- || !P_CheckSight (actor, actor->target) )
- {
- P_SetMobjState (actor, actor->info->seestate);
- }
+ P_LineAttack(actor, shootangle, 2048*FRACUNIT, slope, damage);
}
+//
+// A_CheckTargetVisible
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action routine which sets a thing back to its
+// seestate at random, or if it cannot see its target, or its target
+// is dead. Used by diverse actors.
+//
+void A_CheckTargetVisible(mobj_t* actor)
+{
+ A_FaceTarget(actor);
-void A_SpidRefire (mobj_t* actor)
-{
- // keep firing unless target got out of sight
- A_FaceTarget (actor);
-
- if (P_Random () < 10)
- return;
-
- if (!actor->target
- || actor->target->health <= 0
- || !P_CheckSight (actor, actor->target) )
+ if(P_Random() >= 30)
{
- P_SetMobjState (actor, actor->info->seestate);
+ mobj_t *target = actor->target;
+
+ if(!target || target->health <= 0 || !P_CheckSight(actor, target) ||
+ P_Random() < 40)
+ {
+ P_SetMobjState(actor, actor->info->seestate);
+ }
}
}
-void A_BspiAttack (mobj_t *actor)
-{
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
-
- // launch a missile
- // villsa [STRIFE] unused
- //P_SpawnMissile (actor, actor->target, MT_ARACHPLAZ);
+//
+// A_SentinelAttack
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function implementing the Sentinel's laser attack
+//
+void A_SentinelAttack(mobj_t* actor)
+{
+ // STRIFE-TODO
}
-
//
-// A_TroopAttack
+// A_StalkerThink
//
-void A_TroopAttack (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function to drive Stalker logic.
+//
+void A_StalkerThink(mobj_t* actor)
{
- int damage;
-
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- if (P_CheckMeleeRange (actor))
+ statenum_t statenum;
+
+ if(actor->flags & MF_NOGRAVITY)
{
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- damage = (P_Random()%8+1)*3;
- P_DamageMobj (actor->target, actor, actor, damage);
- return;
+ if(actor->ceilingz - actor->info->height <= actor->z)
+ return;
+ statenum = S_SPID_11; // 1020
}
+ else
+ statenum = S_SPID_18; // 1027
-
- // launch a missile
- // villsa [STRIFE] unused
- //P_SpawnMissile (actor, actor->target, MT_TROOPSHOT);
+ P_SetMobjState(actor, statenum);
}
-
-void A_SargAttack (mobj_t* actor)
+//
+// A_StalkerSetLook
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function to marshall transitions to the
+// Sentinel's spawnstate.
+//
+void A_StalkerSetLook(mobj_t* actor)
{
- int damage;
+ statenum_t statenum;
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- if (P_CheckMeleeRange (actor))
+ if(!actor) // weird; totally unnecessary.
+ return;
+
+ if(actor->flags & MF_NOGRAVITY)
{
- damage = ((P_Random()%10)+1)*4;
- P_DamageMobj (actor->target, actor, actor, damage);
+ if(actor->state->nextstate == S_SPID_01) // 1010
+ return;
+ statenum = S_SPID_01; // 1010
}
-}
-
-void A_HeadAttack (mobj_t* actor)
-{
- int damage;
-
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- if (P_CheckMeleeRange (actor))
+ else
{
- damage = (P_Random()%6+1)*10;
- P_DamageMobj (actor->target, actor, actor, damage);
- return;
+ if(actor->state->nextstate == S_SPID_02) // 1011
+ return;
+ statenum = S_SPID_02; // 1011
}
-
- // launch a missile
- // villsa [STRIFE] unused
- //P_SpawnMissile (actor, actor->target, MT_HEADSHOT);
+
+ P_SetMobjState(actor, statenum);
}
-void A_CyberAttack (mobj_t* actor)
-{
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- // villsa [STRIFE] unused
- //P_SpawnMissile (actor, actor->target, MT_ROCKET);
+//
+// A_StalkerDrop
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Dead simple: removes NOGRAVITY status.
+//
+void A_StalkerDrop(mobj_t* actor)
+{
+ actor->flags &= ~MF_NOGRAVITY;
}
-
-void A_BruisAttack (mobj_t* actor)
+//
+// A_StalkerScratch
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for Stalker's attack.
+//
+void A_StalkerScratch(mobj_t* actor)
{
- int damage;
-
- if (!actor->target)
- return;
-
- if (P_CheckMeleeRange (actor))
+ if(actor->flags & MF_NOGRAVITY)
{
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- damage = (P_Random()%8+1)*10;
- P_DamageMobj (actor->target, actor, actor, damage);
- return;
+ // Drop him down before he can attack
+ P_SetMobjState(actor, S_SPID_11); // 1020
+ return;
}
-
- // launch a missile
- // villsa [STRIFE] unused
- //P_SpawnMissile (actor, actor->target, MT_BRUISERSHOT);
-}
+ if(!actor->target)
+ return;
+ A_FaceTarget(actor);
+ if(P_CheckMeleeRange(actor))
+ P_DamageMobj(actor->target, actor, actor, 2 * (P_Random() % 8) + 2);
+}
+
//
-// A_SkelMissile
+// A_FloatWeave
//
-void A_SkelMissile (mobj_t* actor)
-{
- // villsa [STRIFE] unused
- /* mobj_t* mo;
-
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
- actor->z += 16*FRACUNIT; // so missile spawns higher
- mo = P_SpawnMissile (actor, actor->target, MT_TRACER);
- actor->z -= 16*FRACUNIT; // back to normal
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function which is responsible for floating
+// actors' constant upward and downward movement. Probably a really bad
+// idea in retrospect given how dodgy the 3D clipping implementation is.
+//
+void A_FloatWeave(mobj_t* actor)
+{
+ fixed_t height;
+ fixed_t z;
- mo->x += mo->momx;
- mo->y += mo->momy;
- mo->tracer = actor->target;*/
-}
+ if(actor->threshold)
+ return;
-int TRACEANGLE = 0xc000000;
+ if(actor->flags & MF_INFLOAT)
+ return;
-void A_Tracer (mobj_t* actor)
-{
- // villsa [STRIFE] TODO - update with strife version
-/* angle_t exact;
- fixed_t dist;
- fixed_t slope;
- mobj_t* dest;
- mobj_t* th;
-
- if (gametic & 3)
- return;
-
- // spawn a puff of smoke behind the rocket
- P_SpawnPuff (actor->x, actor->y, actor->z);
-
- th = P_SpawnMobj (actor->x-actor->momx,
- actor->y-actor->momy,
- actor->z, MT_SMOKE);
-
- th->momz = FRACUNIT;
- th->tics -= P_Random()&3;
- if (th->tics < 1)
- th->tics = 1;
-
- // adjust direction
- dest = actor->tracer;
-
- if (!dest || dest->health <= 0)
- return;
-
- // change angle
- exact = R_PointToAngle2 (actor->x,
- actor->y,
- dest->x,
- dest->y);
+ height = actor->info->height; // v2
+ z = actor->floorz + 96*FRACUNIT; // v1
- if (exact != actor->angle)
- {
- if (exact - actor->angle > 0x80000000)
- {
- actor->angle -= TRACEANGLE;
- if (exact - actor->angle < 0x80000000)
- actor->angle = exact;
- }
- else
- {
- actor->angle += TRACEANGLE;
- if (exact - actor->angle > 0x80000000)
- actor->angle = exact;
- }
- }
-
- exact = actor->angle>>ANGLETOFINESHIFT;
- actor->momx = FixedMul (actor->info->speed, finecosine[exact]);
- actor->momy = FixedMul (actor->info->speed, finesine[exact]);
-
- // change slope
- dist = P_AproxDistance (dest->x - actor->x,
- dest->y - actor->y);
-
- dist = dist / actor->info->speed;
+ if ( z > actor->ceilingz - height - 16*FRACUNIT )
+ z = actor->ceilingz - height - 16*FRACUNIT;
- if (dist < 1)
- dist = 1;
- slope = (dest->z+40*FRACUNIT - actor->z) / dist;
+ if ( z >= actor->z )
+ actor->momz += FRACUNIT;
+ else
+ actor->momz -= FRACUNIT;
- if (slope < actor->momz)
- actor->momz -= FRACUNIT/8;
+ if ( z == actor->z )
+ actor->threshold = 4;
else
- actor->momz += FRACUNIT/8;*/
+ actor->threshold = 8;
}
-
-void A_SkelWhoosh (mobj_t* actor)
+//
+// A_RobotMelee
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for Reaver and Templar melee attacks.
+//
+void A_RobotMelee(mobj_t* actor)
{
- if (!actor->target)
- return;
- A_FaceTarget (actor);
- S_StartSound (actor,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ if(!actor->target)
+ return;
+
+ A_FaceTarget(actor);
+ if(P_CheckMeleeRange(actor))
+ {
+ S_StartSound(actor, sfx_revbld);
+ P_DamageMobj(actor->target, actor, actor, 3 * (P_Random() % 8 + 1));
+ }
}
-void A_SkelFist (mobj_t* actor)
+//
+// A_TemplarMauler
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Exactly what it sounds like. Kicks your ass.
+//
+void A_TemplarMauler(mobj_t* actor)
{
- int damage;
+ int i, t;
+ int angle;
+ int bangle;
+ int damage;
+ int slope;
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
-
- if (P_CheckMeleeRange (actor))
+ if(!actor->target)
+ return;
+
+ S_StartSound(actor, sfx_pgrdat);
+ A_FaceTarget(actor);
+ bangle = actor->angle;
+ slope = P_AimLineAttack(actor, bangle, 2048*FRACUNIT);
+
+ for(i = 0; i < 10; i++)
{
- damage = ((P_Random()%10)+1)*6;
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- P_DamageMobj (actor->target, actor, actor, damage);
+ // haleyjd 09/06/10: Very carefully preserved order of P_Random calls
+ damage = (P_Random() & 4) * 2;
+ t = P_Random();
+ angle = bangle + ((t - P_Random()) << 19);
+ t = P_Random();
+ slope = ((t - P_Random()) << 5) + slope;
+ P_LineAttack(actor, angle, 2112*FRACUNIT, slope, damage);
}
}
+void A_CrusaderAttack(mobj_t* actor)
+{
+ // STRIFE-TODO
+}
+void A_CrusaderLeft(mobj_t* actor)
+{
+ // STRIFE-TODO
+}
+void A_CrusaderRight(mobj_t* actor)
+{
+ // STRIFE-TODO
+}
+
//
-// PIT_VileCheck
-// Detect a corpse that could be raised.
+// A_CheckTargetVisible2
//
-mobj_t* corpsehit;
-mobj_t* vileobj;
-fixed_t viletryx;
-fixed_t viletryy;
-
-boolean PIT_VileCheck (mobj_t* thing)
+// [STRIFE] New function
+// haleyjd 09/06/10: Mostly the same as CheckTargetVisible, except without
+// the randomness.
+//
+void A_CheckTargetVisible2(mobj_t* actor)
{
- // villsa [STRIFE] unused
-/* int maxdist;
- boolean check;
-
- if (!(thing->flags & MF_CORPSE) )
- return true; // not a monster
-
- if (thing->tics != -1)
- return true; // not lying still yet
-
- // villsa [STRIFE] unused
- //if (thing->info->raisestate == S_NULL)
- //return true; // monster doesn't have a raise state
-
- maxdist = thing->info->radius + mobjinfo[MT_VILE].radius;
-
- if ( abs(thing->x - viletryx) > maxdist
- || abs(thing->y - viletryy) > maxdist )
- return true; // not actually touching
-
- corpsehit = thing;
- corpsehit->momx = corpsehit->momy = 0;
- corpsehit->height <<= 2;
- check = P_CheckPosition (corpsehit, corpsehit->x, corpsehit->y);
- corpsehit->height >>= 2;
-
- if (!check)
- return true; // doesn't fit here*/
-
- return false; // got one, so stop checking
+ if(!actor->target || actor->target->health <= 0 ||
+ !P_CheckSight(actor, actor->target))
+ {
+ P_SetMobjState(actor, actor->info->seestate);
+ }
}
-
-
//
-// A_VileChase
-// Check for ressurecting a body
+// A_InqFlyCheck
//
-// villsa [STRIFE] TODO depcricate this later
-void A_VileChase (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function to check if an Inquisitor wishes
+// to take to flight.
+//
+void A_InqFlyCheck(mobj_t* actor)
{
-/* int xl;
- int xh;
- int yl;
- int yh;
-
- int bx;
- int by;
+ if(!actor->target)
+ return;
- mobjinfo_t* info;
- mobj_t* temp;
-
- if (actor->movedir != DI_NODIR)
- {
- // check for corpses to raise
- viletryx =
- actor->x + actor->info->speed*xspeed[actor->movedir];
- viletryy =
- actor->y + actor->info->speed*yspeed[actor->movedir];
+ A_FaceTarget(actor);
- xl = (viletryx - bmaporgx - MAXRADIUS*2)>>MAPBLOCKSHIFT;
- xh = (viletryx - bmaporgx + MAXRADIUS*2)>>MAPBLOCKSHIFT;
- yl = (viletryy - bmaporgy - MAXRADIUS*2)>>MAPBLOCKSHIFT;
- yh = (viletryy - bmaporgy + MAXRADIUS*2)>>MAPBLOCKSHIFT;
-
- vileobj = actor;
- for (bx=xl ; bx<=xh ; bx++)
- {
- for (by=yl ; by<=yh ; by++)
- {
- // Call PIT_VileCheck to check
- // whether object is a corpse
- // that canbe raised.
- if (!P_BlockThingsIterator(bx,by,PIT_VileCheck))
- {
- // got one!
- temp = actor->target;
- actor->target = corpsehit;
- A_FaceTarget (actor);
- actor->target = temp;
-
- P_SetMobjState (actor, S_VILE_HEAL1);
- S_StartSound (corpsehit, sfx_slop);
- info = corpsehit->info;
-
- P_SetMobjState (corpsehit,info->raisestate);
- corpsehit->height <<= 2;
- corpsehit->flags = info->flags;
- corpsehit->health = info->spawnhealth;
- corpsehit->target = NULL;
+ // if not in "robot" range, shoot grenades.
+ if(!P_CheckRobotRange(actor))
+ P_SetMobjState(actor, S_ROB3_14); // 1061
- return;
- }
- }
- }
+ if(actor->z != actor->target->z)
+ {
+ // Take off all zig!
+ if(actor->z + actor->height + 54*FRACUNIT < actor->ceilingz)
+ P_SetMobjState(actor, S_ROB3_17); // 1064
}
-
- // Return to normal attack.
- A_Chase (actor);*/
}
-
//
-// A_VileStart
+// A_InqGrenade
//
-void A_VileStart (mobj_t* actor)
+void A_InqGrenade(mobj_t* actor)
{
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ // STRIFE-TODO
}
-
//
-// A_Fire
-// Keep fire in front of player unless out of sight
+// A_InqTakeOff
//
-void A_Fire (mobj_t* actor);
-
-void A_StartFire (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/06/10: Makes an Inquisitor start flying.
+//
+void A_InqTakeOff(mobj_t* actor)
{
- S_StartSound(actor,sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_Fire(actor);
-}
+ angle_t an;
+ fixed_t speed = actor->info->speed * (2 * FRACUNIT / 3);
+ fixed_t dist;
-void A_FireCrackle (mobj_t* actor)
-{
- S_StartSound(actor,sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_Fire(actor);
-}
+ if(!actor->target)
+ return;
-void A_Fire (mobj_t* actor)
-{
- mobj_t* dest;
- mobj_t* target;
- unsigned an;
-
- dest = actor->tracer;
- if (!dest)
- return;
+ S_StartSound(actor, sfx_inqjmp);
- target = P_SubstNullMobj(actor->target);
-
- // don't move it if the vile lost sight
- if (!P_CheckSight (target, dest) )
- return;
+ actor->z += 64 * FRACUNIT;
- an = dest->angle >> ANGLETOFINESHIFT;
+ A_FaceTarget(actor);
- P_UnsetThingPosition (actor);
- actor->x = dest->x + FixedMul (24*FRACUNIT, finecosine[an]);
- actor->y = dest->y + FixedMul (24*FRACUNIT, finesine[an]);
- actor->z = dest->z;
- P_SetThingPosition (actor);
-}
+ an = actor->angle >> ANGLETOFINESHIFT;
+ actor->momx = FixedMul(finecosine[an], speed);
+ actor->momy = FixedMul(finesine[an], speed);
+ dist = P_AproxDistance(actor->target->x - actor->x,
+ actor->target->y - actor->y);
+ dist /= speed;
+ if(dist < 1)
+ dist = 1;
+
+ actor->momz = (actor->target->z - actor->z) / dist;
+ actor->reactiontime = 60;
+ actor->flags |= MF_NOGRAVITY;
+}
+
//
-// A_VileTarget
-// Spawn the hellfire
+// A_InqFly
//
-void A_VileTarget (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/06/10: Handles an Inquisitor in flight.
+//
+void A_InqFly(mobj_t* actor)
{
- // villsa [STRIFE] unused
- /* mobj_t* fog;
-
- if (!actor->target)
- return;
+ if(!(leveltime & 7))
+ S_StartSound(actor, sfx_inqjmp);
- A_FaceTarget (actor);
+ if(--actor->reactiontime < 0 || !actor->momx || !actor->momy ||
+ actor->z <= actor->floorz)
+ {
+ // Come in for a landing.
+ P_SetMobjState(actor, actor->info->seestate);
+ actor->reactiontime = 0;
+ actor->flags &= ~MF_NOGRAVITY;
+ }
+}
- fog = P_SpawnMobj (actor->target->x,
- actor->target->x,
- actor->target->z, MT_FIRE);
-
- actor->tracer = fog;
- fog->target = actor;
- fog->tracer = actor->target;
- A_Fire (fog);*/
+//
+// A_FireSigilWeapon
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for the Entity's attack.
+//
+void A_FireSigilWeapon(mobj_t* actor)
+{
+ int choice = P_Random() % 5;
+
+ // STRIFE-TODO: Needs verification. This switch is just weird.
+ switch(choice)
+ {
+ case 0:
+ A_ProgrammerAttack(actor);
+ break;
+ // ain't not seen no case 1, bub...
+ case 2:
+ A_FireSigilEOffshoot(actor);
+ break;
+ case 3:
+ A_SpectreCAttack(actor);
+ break;
+ case 4:
+ A_SpectreDAttack(actor);
+ break;
+ case 5: // BUG: never used? wtf were they thinking?
+ A_SpectreEAttack(actor);
+ break;
+ default:
+ break;
+ }
}
+//
+// A_ProgrammerAttack
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for the Programmer's main
+// attack; equivalent to the player's first Sigil.
+//
+void A_ProgrammerAttack(mobj_t* actor)
+{
+ mobj_t *mo;
+ if(!actor->target)
+ return;
+ mo = P_SpawnMobj(actor->x, actor->y, ONFLOORZ, MT_SIGIL_A_GROUND);
+ mo->threshold = 25;
+ mo->target = actor;
+ mo->health = -2;
+ mo->tracer = actor->target;
+}
//
-// A_VileAttack
+// A_Sigil_A_Action
//
-void A_VileAttack (mobj_t* actor)
-{
- mobj_t* fire;
- int an;
-
- if (!actor->target)
- return;
-
- A_FaceTarget (actor);
+// [STRIFE] New function
+// haleyjd 09/06/10: Called by MT_SIGIL_A_GROUND to zot anyone nearby with
+// corny looking lightning bolts.
+//
+void A_Sigil_A_Action(mobj_t* actor)
+{
+ int t, x, y, type;
+ mobj_t *mo;
- if (!P_CheckSight (actor, actor->target) )
- return;
+ if(actor->threshold)
+ actor->threshold--;
- S_StartSound (actor, sfx_barexp);
- P_DamageMobj (actor->target, actor, actor, 20);
- actor->target->momz = 1000*FRACUNIT/actor->target->info->mass;
-
- an = actor->angle >> ANGLETOFINESHIFT;
+ t = P_Random();
+ actor->momx += ((t & 3) - (P_Random() & 3)) << FRACBITS;
+ t = P_Random();
+ actor->momy += ((t & 3) - (P_Random() & 3)) << FRACBITS;
- fire = actor->tracer;
+ t = P_Random();
+ x = 50*FRACUNIT * ((t & 3) - (P_Random() & 3)) + actor->x;
+ t = P_Random();
+ y = 50*FRACUNIT * ((t & 3) - (P_Random() & 3)) + actor->y;
- if (!fire)
- return;
-
- // move the fire between the vile and the player
- fire->x = actor->target->x - FixedMul (24*FRACUNIT, finecosine[an]);
- fire->y = actor->target->y - FixedMul (24*FRACUNIT, finesine[an]);
- P_RadiusAttack (fire, actor, 70 );
-}
+ if(actor->threshold <= 25)
+ type = MT_SIGIL_A_ZAP_LEFT;
+ else
+ type = MT_SIGIL_A_ZAP_RIGHT;
+ mo = P_SpawnMobj(x, y, ONCEILINGZ, type);
+ mo->momz = -18 * FRACUNIT;
+ mo->target = actor->target;
+ mo->health = actor->health;
+ mo = P_SpawnMobj(actor->x, actor->y, ONCEILINGZ, MT_SIGIL_A_ZAP_RIGHT);
+ mo->momz = -18 * FRACUNIT;
+ mo->target = actor->target;
+ mo->health = actor->health;
+}
-
//
-// Mancubus attack,
-// firing three missiles (bruisers)
-// in three different directions?
-// Doesn't look like it.
+// A_SpectreEAttack
//
-#define FATSPREAD (ANG90/8)
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for the Loremaster's Spectre.
+// Equivalent to the player's final Sigil attack.
+//
+void A_SpectreEAttack(mobj_t* actor)
+{
+ mobj_t *mo;
-void A_FatRaise (mobj_t *actor)
+ if(!actor->target)
+ return;
+
+ mo = P_SpawnMissile(actor, actor->target, MT_SIGIL_SE_SHOT);
+ mo->health = -2;
+}
+
+void A_SpectreCAttack(mobj_t* actor)
{
- A_FaceTarget (actor);
- S_StartSound (actor, sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ // STRIFE-TODO
}
-
-void A_FatAttack1 (mobj_t* actor)
+//
+// A_AlertSpectreC
+//
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function called by the Oracle when it is
+// killed. Finds an MT_SPECTRE_C anywhere on the map and awakens it.
+//
+void A_AlertSpectreC(mobj_t* actor)
{
- // villsa [STRIFE] unused
-/* mobj_t* mo;
- mobj_t* target;
- int an;
+ thinker_t *th;
- A_FaceTarget (actor);
+ for(th = thinkercap.next; th != &thinkercap; th = th->next)
+ {
+ if(th->function.acp1 == (actionf_p1)P_MobjThinker)
+ {
+ mobj_t *mo = (mobj_t *)th;
- // Change direction to ...
- actor->angle += FATSPREAD;
- target = P_SubstNullMobj(actor->target);
- P_SpawnMissile (actor, target, MT_FATSHOT);
-
- mo = P_SpawnMissile (actor, target, MT_FATSHOT);
- mo->angle += FATSPREAD;
- an = mo->angle >> ANGLETOFINESHIFT;
- mo->momx = FixedMul (mo->info->speed, finecosine[an]);
- mo->momy = FixedMul (mo->info->speed, finesine[an]);*/
+ if(mo->type == MT_SPECTRE_C)
+ {
+ P_SetMobjState(mo, mo->info->seestate);
+ mo->target = actor->target;
+ return;
+ }
+ }
+ }
}
-void A_FatAttack2 (mobj_t* actor)
+void A_Sigil_E_Action(mobj_t* actor)
{
- // villsa [STRIFE] unused
-/* mobj_t* mo;
- mobj_t* target;
- int an;
- A_FaceTarget (actor);
- // Now here choose opposite deviation.
- actor->angle -= FATSPREAD;
- target = P_SubstNullMobj(actor->target);
- P_SpawnMissile (actor, target, MT_FATSHOT);
-
- mo = P_SpawnMissile (actor, target, MT_FATSHOT);
- mo->angle -= FATSPREAD*2;
- an = mo->angle >> ANGLETOFINESHIFT;
- mo->momx = FixedMul (mo->info->speed, finecosine[an]);
- mo->momy = FixedMul (mo->info->speed, finesine[an]);*/
}
-void A_FatAttack3 (mobj_t* actor)
+void A_SigilTrail(mobj_t* actor)
{
- // villsa [STRIFE] unused
- /* mobj_t* mo;
- mobj_t* target;
- int an;
- A_FaceTarget (actor);
-
- target = P_SubstNullMobj(actor->target);
-
- mo = P_SpawnMissile (actor, target, MT_FATSHOT);
- mo->angle -= FATSPREAD/2;
- an = mo->angle >> ANGLETOFINESHIFT;
- mo->momx = FixedMul (mo->info->speed, finecosine[an]);
- mo->momy = FixedMul (mo->info->speed, finesine[an]);
-
- mo = P_SpawnMissile (actor, target, MT_FATSHOT);
- mo->angle += FATSPREAD/2;
- an = mo->angle >> ANGLETOFINESHIFT;
- mo->momx = FixedMul (mo->info->speed, finecosine[an]);
- mo->momy = FixedMul (mo->info->speed, finesine[an]);*/
}
-
//
-// SkullAttack
-// Fly at the player like a missile.
+// A_SpectreDAttack
//
-#define SKULLSPEED (20*FRACUNIT)
-
-void A_SkullAttack (mobj_t* actor)
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function for Macil's Spectre.
+// Equivalent of the player's fourth Sigil attack.
+//
+void A_SpectreDAttack(mobj_t* actor)
{
-/* mobj_t* dest;
- angle_t an;
- int dist;
+ mobj_t *mo;
- if (!actor->target)
- return;
-
- dest = actor->target;
- actor->flags |= MF_SKULLFLY;
+ if(!actor->target)
+ return;
- S_StartSound (actor, actor->info->attacksound);
- A_FaceTarget (actor);
- an = actor->angle >> ANGLETOFINESHIFT;
- actor->momx = FixedMul (SKULLSPEED, finecosine[an]);
- actor->momy = FixedMul (SKULLSPEED, finesine[an]);
- dist = P_AproxDistance (dest->x - actor->x, dest->y - actor->y);
- dist = dist / SKULLSPEED;
-
- if (dist < 1)
- dist = 1;
- actor->momz = (dest->z+(dest->height>>1) - actor->z) / dist;*/
+ mo = P_SpawnMissile(actor, actor->target, MT_SIGIL_SD_SHOT);
+ mo->health = -2;
+ mo->tracer = actor->target;
}
-
//
-// A_PainShootSkull
-// Spawn a lost soul and launch it at the target
+// A_FireSigilEOffshoot
//
-void
-A_PainShootSkull
-( mobj_t* actor,
- angle_t angle )
+// [STRIFE] New function
+// haleyjd 09/06/10: Action function to fire part of a Sigil E
+// attack. Used at least by the Entity.
+//
+void A_FireSigilEOffshoot(mobj_t* actor)
{
- // villsa [STRIFE] unused
- /* fixed_t x;
- fixed_t y;
- fixed_t z;
-
- mobj_t* newmobj;
- angle_t an;
- int prestep;
- int count;
- thinker_t* currentthinker;
+ mobj_t *mo;
- // count total number of skull currently on the level
- count = 0;
+ if(!actor->target)
+ return;
- currentthinker = thinkercap.next;
- while (currentthinker != &thinkercap)
- {
- if ( (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker)
- && ((mobj_t *)currentthinker)->type == MT_SKULL)
- count++;
- currentthinker = currentthinker->next;
- }
+ mo = P_SpawnMissile(actor, actor->target, MT_SIGIL_E_OFFSHOOT);
+ mo->health = -2;
+}
- // if there are allready 20 skulls on the level,
- // don't spit another one
- if (count > 20)
- return;
+void A_ShadowOff(mobj_t* actor)
+{
+}
- // okay, there's playe for another one
- an = angle >> ANGLETOFINESHIFT;
-
- prestep =
- 4*FRACUNIT
- + 3*(actor->info->radius + mobjinfo[MT_SKULL].radius)/2;
-
- x = actor->x + FixedMul (prestep, finecosine[an]);
- y = actor->y + FixedMul (prestep, finesine[an]);
- z = actor->z + 8*FRACUNIT;
-
- newmobj = P_SpawnMobj (x , y, z, MT_SKULL);
+void A_ModifyVisibility(mobj_t* actor)
+{
- // Check for movements.
- if (!P_TryMove (newmobj, newmobj->x, newmobj->y))
- {
- // kill it immediately
- P_DamageMobj (newmobj,actor,actor,10000);
- return;
- }
-
- newmobj->target = actor->target;
- A_SkullAttack (newmobj);*/
}
-
-//
-// A_PainAttack
-// Spawn a lost soul and launch it at the target
-//
-void A_PainAttack (mobj_t* actor)
+void A_ShadowOn(mobj_t* actor)
{
- if (!actor->target)
- return;
- A_FaceTarget (actor);
- A_PainShootSkull (actor, actor->angle);
}
-void A_PainDie (mobj_t* actor)
-{
- A_Fall (actor);
- A_PainShootSkull (actor, actor->angle+ANG90);
- A_PainShootSkull (actor, actor->angle+ANG180);
- A_PainShootSkull (actor, actor->angle+ANG270);
-}
+// haleyjd 09/05/10: [STRIFE] Removed:
+// A_PosAttack, A_SPosAttack, A_CPosAttack, A_CPosRefire, A_SpidRefire,
+// A_BspiAttack, A_TroopAttack, A_SargAttack, A_HeadAttack, A_CyberAttack,
+// A_BruisAttack, A_SkelMissile
+int TRACEANGLE = 0xc000000;
+void A_Tracer (mobj_t* actor)
+{
+ // villsa [STRIFE] TODO - update with strife version
+/* angle_t exact;
+ fixed_t dist;
+ fixed_t slope;
+ mobj_t* dest;
+ mobj_t* th;
+
+ if (gametic & 3)
+ return;
+
+ // spawn a puff of smoke behind the rocket
+ P_SpawnPuff (actor->x, actor->y, actor->z);
+
+ th = P_SpawnMobj (actor->x-actor->momx,
+ actor->y-actor->momy,
+ actor->z, MT_SMOKE);
+
+ th->momz = FRACUNIT;
+ th->tics -= P_Random()&3;
+ if (th->tics < 1)
+ th->tics = 1;
+
+ // adjust direction
+ dest = actor->tracer;
+
+ if (!dest || dest->health <= 0)
+ return;
+
+ // change angle
+ exact = R_PointToAngle2 (actor->x,
+ actor->y,
+ dest->x,
+ dest->y);
+ if (exact != actor->angle)
+ {
+ if (exact - actor->angle > 0x80000000)
+ {
+ actor->angle -= TRACEANGLE;
+ if (exact - actor->angle < 0x80000000)
+ actor->angle = exact;
+ }
+ else
+ {
+ actor->angle += TRACEANGLE;
+ if (exact - actor->angle > 0x80000000)
+ actor->angle = exact;
+ }
+ }
+
+ exact = actor->angle>>ANGLETOFINESHIFT;
+ actor->momx = FixedMul (actor->info->speed, finecosine[exact]);
+ actor->momy = FixedMul (actor->info->speed, finesine[exact]);
+
+ // change slope
+ dist = P_AproxDistance (dest->x - actor->x,
+ dest->y - actor->y);
+
+ dist = dist / actor->info->speed;
+ if (dist < 1)
+ dist = 1;
+ slope = (dest->z+40*FRACUNIT - actor->z) / dist;
+ if (slope < actor->momz)
+ actor->momz -= FRACUNIT/8;
+ else
+ actor->momz += FRACUNIT/8;*/
+}
+// haleyjd 09/05/10: [STRIFE] Removed:
+// A_SkelWhoosh, A_SkelFist, PIT_VileCheck, A_VileChase, A_VileStart,
+// A_StartFire, A_FireCrackle, A_Fire, A_VileTarget, A_VileAttack
+// A_FatRaise, A_FatAttack1, A_FatAttack2, A_FatAttack3, A_SkullAttack,
+// A_PainShootSkull, A_PainAttack, A_PainDie
+
void A_Scream (mobj_t* actor)
{
int sound;
@@ -1964,7 +1912,6 @@
S_StartSound (actor, sound);
}
-
void A_XScream (mobj_t* actor)
{
S_StartSound (actor, sfx_slop);
@@ -1976,8 +1923,6 @@
S_StartSound (actor, actor->info->painsound);
}
-
-
void A_Fall (mobj_t *actor)
{
// actor is on ground, it can be walked over
@@ -1987,7 +1932,6 @@
// are meant to be obstacles.
}
-
//
// A_Explode
//
@@ -1996,60 +1940,8 @@
P_RadiusAttack(thingy, thingy->target, 128);
}
-// Check whether the death of the specified monster type is allowed
-// to trigger the end of episode special action.
-//
-// This behavior changed in v1.9, the most notable effect of which
-// was to break uac_dead.wad
+// haleyjd 09/05/10: Removed unused CheckBossEnd Choco routine.
-static boolean CheckBossEnd(mobjtype_t motype)
-{
- // villsa [STRIFE] TODO - update to strife version
- return 0;
- /* if (gameversion < exe_ultimate)
- {
- if (gamemap != 8)
- {
- return false;
- }
-
- // Baron death on later episodes is nothing special.
-
- if (motype == MT_BRUISER && gameepisode != 1)
- {
- return false;
- }
-
- return true;
- }
- else
- {
- // New logic that appeared in Ultimate Doom.
- // Looks like the logic was overhauled while adding in the
- // episode 4 support. Now bosses only trigger on their
- // specific episode.
-
- switch(gameepisode)
- {
- case 1:
- return gamemap == 8 && motype == MT_BRUISER;
-
- case 2:
- return gamemap == 8 && motype == MT_CYBORG;
-
- case 3:
- return gamemap == 8 && motype == MT_SPIDER;
-
- case 4:
- return (gamemap == 6 && motype == MT_CYBORG)
- || (gamemap == 8 && motype == MT_SPIDER);
-
- default:
- return gamemap == 8;
- }
- }*/
-}
-
//
// A_BossDeath
// Possibly trigger special effects
@@ -2057,345 +1949,14 @@
//
void A_BossDeath (mobj_t* mo)
{
- thinker_t* th;
- mobj_t* mo2;
- line_t junk;
- int i;
-
// villsa [STRIFE] TODO - update to strife version
- /* if ( gamemode == commercial)
- {
- if (gamemap != 7)
- return;
-
- if ((mo->type != MT_FATSO)
- && (mo->type != MT_BABY))
- return;
- }
- else
- {
- if (!CheckBossEnd(mo->type))
- {
- return;
- }
- }
-
- // make sure there is a player alive for victory
- for (i=0 ; i<MAXPLAYERS ; i++)
- if (playeringame[i] && players[i].health > 0)
- break;
-
- if (i==MAXPLAYERS)
- return; // no one left alive, so do not end game
-
- // scan the remaining thinkers to see
- // if all bosses are dead
- for (th = thinkercap.next ; th != &thinkercap ; th=th->next)
- {
- if (th->function.acp1 != (actionf_p1)P_MobjThinker)
- continue;
-
- mo2 = (mobj_t *)th;
- if (mo2 != mo
- && mo2->type == mo->type
- && mo2->health > 0)
- {
- // other boss not dead
- return;
- }
- }
-
- // victory!
- if ( gamemode == commercial)
- {
- if (gamemap == 7)
- {
- if (mo->type == MT_FATSO)
- {
- junk.tag = 666;
- EV_DoFloor(&junk,lowerFloorToLowest);
- return;
- }
-
- if (mo->type == MT_BABY)
- {
- junk.tag = 667;
- EV_DoFloor(&junk,raiseToTexture);
- return;
- }
- }
- }
- else
- {
- switch(gameepisode)
- {
- case 1:
- junk.tag = 666;
- EV_DoFloor (&junk, lowerFloorToLowest);
- return;
- break;
-
- case 4:
- switch(gamemap)
- {
- case 6:
- junk.tag = 666;
- EV_DoDoor (&junk, blazeOpen);
- return;
- break;
-
- case 8:
- junk.tag = 666;
- EV_DoFloor (&junk, lowerFloorToLowest);
- return;
- break;
- }
- }
- }
-
- G_ExitLevel (0);*/
}
+// haleyjd 09/05/10: [STRIFE] Removed:
+// A_Hoof, A_Metal, A_BabyMetal, A_OpenShotgun2, A_LoadShotgun2,
+// A_CloseShotgun2, A_BrainAwake, A_BrainPain, A_BrainScream, A_BrainExplode,
+// A_BrainDie, A_BrainSpit, A_SpawnSound, A_SpawnFly
-void A_Hoof (mobj_t* mo)
-{
- S_StartSound (mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_Chase (mo);
-}
-
-void A_Metal (mobj_t* mo)
-{
- S_StartSound (mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_Chase (mo);
-}
-
-void A_BabyMetal (mobj_t* mo)
-{
- S_StartSound (mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_Chase (mo);
-}
-
-void
-A_OpenShotgun2
-( player_t* player,
- pspdef_t* psp )
-{
- S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
-}
-
-void
-A_LoadShotgun2
-( player_t* player,
- pspdef_t* psp )
-{
- S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
-}
-
-void
-A_ReFire
-( player_t* player,
- pspdef_t* psp );
-
-void
-A_CloseShotgun2
-( player_t* player,
- pspdef_t* psp )
-{
- S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_ReFire(player,psp);
-}
-
-
-
-mobj_t* braintargets[32];
-int numbraintargets;
-int braintargeton = 0;
-
-void A_BrainAwake (mobj_t* mo)
-{
- // villsa [STRIFE] unused
- /* thinker_t* thinker;
- mobj_t* m;
-
- // find all the target spots
- numbraintargets = 0;
- braintargeton = 0;
-
- thinker = thinkercap.next;
- for (thinker = thinkercap.next ;
- thinker != &thinkercap ;
- thinker = thinker->next)
- {
- if (thinker->function.acp1 != (actionf_p1)P_MobjThinker)
- continue; // not a mobj
-
- m = (mobj_t *)thinker;
-
- if (m->type == MT_BOSSTARGET )
- {
- braintargets[numbraintargets] = m;
- numbraintargets++;
- }
- }
-
- S_StartSound (NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds*/
-}
-
-
-void A_BrainPain (mobj_t* mo)
-{
- S_StartSound (NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
-}
-
-
-// villsa [STRIFE] TODO - depcricate this later
-void A_BrainScream (mobj_t* mo)
-{
-/* int x;
- int y;
- int z;
- mobj_t* th;
-
- for (x=mo->x - 196*FRACUNIT ; x< mo->x + 320*FRACUNIT ; x+= FRACUNIT*8)
- {
- y = mo->y - 320*FRACUNIT;
- z = 128 + P_Random()*2*FRACUNIT;
- th = P_SpawnMobj (x,y,z, MT_ROCKET);
- th->momz = P_Random()*512;
-
- P_SetMobjState (th, S_BRAINEXPLODE1);
-
- th->tics -= P_Random()&7;
- if (th->tics < 1)
- th->tics = 1;
- }
-
- S_StartSound (NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds*/
-}
-
-
-// villsa [STRIFE] TODO - depcricate this later
-void A_BrainExplode (mobj_t* mo)
-{
-/* int x;
- int y;
- int z;
- mobj_t* th;
-
- x = mo->x + (P_Random () - P_Random ())*2048;
- y = mo->y;
- z = 128 + P_Random()*2*FRACUNIT;
- th = P_SpawnMobj (x,y,z, MT_ROCKET);
- th->momz = P_Random()*512;
-
- P_SetMobjState (th, S_BRAINEXPLODE1);
-
- th->tics -= P_Random()&7;
- if (th->tics < 1)
- th->tics = 1;*/
-}
-
-
-void A_BrainDie (mobj_t* mo)
-{
- G_ExitLevel (0);
-}
-
-void A_BrainSpit (mobj_t* mo)
-{
- // villsa [STRIFE] unused
- /* mobj_t* targ;
- mobj_t* newmobj;
-
- static int easy = 0;
-
- easy ^= 1;
- if (gameskill <= sk_easy && (!easy))
- return;
-
- // shoot a cube at current target
- targ = braintargets[braintargeton];
- braintargeton = (braintargeton+1)%numbraintargets;
-
- // spawn brain missile
- newmobj = P_SpawnMissile (mo, targ, MT_SPAWNSHOT);
- newmobj->target = targ;
- newmobj->reactiontime =
- ((targ->y - mo->y)/newmobj->momy) / newmobj->state->tics;
-
- S_StartSound(NULL, sfx_swish); // villsa [STRIFE] TODO - fix sounds*/
-}
-
-
-
-void A_SpawnFly (mobj_t* mo);
-
-// travelling cube sound
-void A_SpawnSound (mobj_t* mo)
-{
- S_StartSound (mo,sfx_swish); // villsa [STRIFE] TODO - fix sounds
- A_SpawnFly(mo);
-}
-
-void A_SpawnFly (mobj_t* mo)
-{
- // villsa [STRIFE] unused
-/* mobj_t* newmobj;
- mobj_t* fog;
- mobj_t* targ;
- int r;
- mobjtype_t type;
-
- if (--mo->reactiontime)
- return; // still flying
-
- targ = P_SubstNullMobj(mo->target);
-
- // First spawn teleport fog.
- fog = P_SpawnMobj (targ->x, targ->y, targ->z, MT_SPAWNFIRE);
- S_StartSound (fog, sfx_telept);
-
- // Randomly select monster to spawn.
- r = P_Random ();
-
- // Probability distribution (kind of :),
- // decreasing likelihood.
- if ( r<50 )
- type = MT_TROOP;
- else if (r<90)
- type = MT_SERGEANT;
- else if (r<120)
- type = MT_SHADOWS;
- else if (r<130)
- type = MT_PAIN;
- else if (r<160)
- type = MT_HEAD;
- else if (r<162)
- type = MT_VILE;
- else if (r<172)
- type = MT_UNDEAD;
- else if (r<192)
- type = MT_BABY;
- else if (r<222)
- type = MT_FATSO;
- else if (r<246)
- type = MT_KNIGHT;
- else
- type = MT_BRUISER;
-
- newmobj = P_SpawnMobj (targ->x, targ->y, targ->z, type);
- if (P_LookForPlayers (newmobj, true) )
- P_SetMobjState (newmobj, newmobj->info->seestate);
-
- // telefrag anything in this spot
- P_TeleportMove (newmobj, newmobj->x, newmobj->y);
-
- // remove self (i.e., cube).
- P_RemoveMobj (mo);*/
-}
-
-
-
void A_PlayerScream (mobj_t* mo)
{
// Default death sound.
@@ -2413,171 +1974,7 @@
}
-void A_PeasantPunch(mobj_t* actor)
-{
-}
-
-void A_ReavShoot(mobj_t* actor)
-{
-
-}
-
-void A_BulletAttack(mobj_t* actor)
-{
-
-}
-
-void A_CheckTargetVisible(mobj_t* actor)
-{
-
-}
-
-void A_SentinelAttack(mobj_t* actor)
-{
-
-}
-
-void A_StalkerThink(mobj_t* actor)
-{
-
-}
-
-void A_StalkerSetLook(mobj_t* actor)
-{
-
-}
-
-void A_StalkerDrop(mobj_t* actor)
-{
-
-}
-
-void A_StalkerScratch(mobj_t* actor)
-{
-
-}
-
-void A_FloatWeave(mobj_t* actor)
-{
-
-}
-
-void A_ReavAttack(mobj_t* actor)
-{
-
-}
-
-void A_TemplarMauler(mobj_t* actor)
-{
-
-}
-
-void A_CrusaderAttack(mobj_t* actor)
-{
-
-}
-
-void A_CrusaderLeft(mobj_t* actor)
-{
-
-}
-
-void A_CrusaderRight(mobj_t* actor)
-{
-
-}
-
-void A_CheckTargetVisible2(mobj_t* actor)
-{
-
-}
-
-void A_InqFlyCheck(mobj_t* actor)
-{
-
-}
-
-void A_InqGrenade(mobj_t* actor)
-{
-
-}
-
-void A_InqTakeOff(mobj_t* actor)
-{
-
-}
-
-void A_InqFly(mobj_t* actor)
-{
-
-}
-
-void A_FireSigilWeapon(mobj_t* actor)
-{
-
-}
-
-void A_ProgrammerAttack(mobj_t* actor)
-{
-
-}
-
-void A_Sigil_A_Action(mobj_t* actor)
-{
-
-}
-
-void A_SpectreEAttack(mobj_t* actor)
-{
-
-}
-
-void A_SpectreCAttack(mobj_t* actor)
-{
-
-}
-
-void A_AlertSpectreC(mobj_t* actor)
-{
-
-}
-
-void A_Sigil_E_Action(mobj_t* actor)
-{
-
-}
-
-void A_SigilTrail(mobj_t* actor)
-{
-
-}
-
-void A_SpectreDAttack(mobj_t* actor)
-{
-
-}
-
-void A_FireSigilEOffshoot(mobj_t* actor)
-{
-
-}
-
-void A_ShadowOff(mobj_t* actor)
-{
-
-}
-
-void A_ModifyVisibility(mobj_t* actor)
-{
-
-}
-
-void A_ShadowOn(mobj_t* actor)
-{
-
-}
-
void A_SetTLOptions(mobj_t* actor)
{
@@ -2812,4 +2209,5 @@
void A_ClearForceField(mobj_t* actor)
{
-}
\ No newline at end of file
+}
+
--- a/src/strife/p_pspr.c
+++ b/src/strife/p_pspr.c
@@ -54,6 +54,9 @@
//
// P_SetPsprite
//
+// [STRIFE]
+// villsa: Removed psprite sx, sy modification via misc1/2
+//
void
P_SetPsprite
( player_t* player,
@@ -62,73 +65,47 @@
{
pspdef_t* psp;
state_t* state;
-
+
psp = &player->psprites[position];
-
+
do
{
- if (!stnum)
- {
- // object removed itself
- psp->state = NULL;
- break;
- }
-
- state = &states[stnum];
- psp->state = state;
- psp->tics = state->tics; // could be 0
+ if (!stnum)
+ {
+ // object removed itself
+ psp->state = NULL;
+ break;
+ }
+ state = &states[stnum];
+ psp->state = state;
+ psp->tics = state->tics; // could be 0
+
// villsa [STRIFE] unused
- /*if (state->misc1)
- {
- // coordinate set
- psp->sx = state->misc1 << FRACBITS;
- psp->sy = state->misc2 << FRACBITS;
- }*/
-
- // Call action routine.
- // Modified handling.
- if (state->action.acp2)
- {
- state->action.acp2(player, psp);
- if (!psp->state)
- break;
- }
-
- stnum = psp->state->nextstate;
-
- } while (!psp->tics);
- // an initial state of 0 could cycle through
-}
+ /*if (state->misc1)
+ {
+ // coordinate set
+ psp->sx = state->misc1 << FRACBITS;
+ psp->sy = state->misc2 << FRACBITS;
+ }*/
+ // Call action routine.
+ // Modified handling.
+ if (state->action.acp2)
+ {
+ state->action.acp2(player, psp);
+ if (!psp->state)
+ break;
+ }
+ stnum = psp->state->nextstate;
-//
-// P_CalcSwing
-//
-fixed_t swingx;
-fixed_t swingy;
-
-void P_CalcSwing (player_t* player)
-{
- fixed_t swing;
- int angle;
-
- // OPTIMIZE: tablify this.
- // A LUT would allow for different modes,
- // and add flexibility.
-
- swing = player->bob;
-
- angle = (FINEANGLES/70*leveltime)&FINEMASK;
- swingx = FixedMul ( swing, finesine[angle]);
-
- angle = (FINEANGLES/70*leveltime+FINEANGLES/2)&FINEMASK;
- swingy = -FixedMul ( swingx, finesine[angle]);
+ } while (!psp->tics);
+ // an initial state of 0 could cycle through
}
+// haleyjd 09/06/10: [STRIFE] Removed P_CalcSwing
-
//
// P_BringUpWeapon
// Starts bringing the pending weapon up
@@ -135,17 +112,18 @@
// from the bottom of the screen.
// Uses player
//
+// villsa [STRIFE] Modifications for Strife weapons
+//
void P_BringUpWeapon (player_t* player)
{
statenum_t newstate;
-
+
if (player->pendingweapon == wp_nochange)
- player->pendingweapon = player->readyweapon;
-
- // villsa [STRIFE] unused
+ player->pendingweapon = player->readyweapon;
+
if (player->pendingweapon == wp_flame)
- S_StartSound (player->mo, sfx_flidl); // villsa [STRIFE] flame sounds
-
+ S_StartSound (player->mo, sfx_flidl); // villsa [STRIFE] flame sounds
+
newstate = weaponinfo[player->pendingweapon].upstate;
player->psprites[ps_weapon].sy = WEAPONBOTTOM;
@@ -153,9 +131,9 @@
// villsa [STRIFE] set various flash states
if(player->pendingweapon == wp_elecbow)
- P_SetPsprite(player, ps_flash, S_XBOW_10);
+ P_SetPsprite(player, ps_flash, S_XBOW_10); // 31
else if(player->pendingweapon == wp_sigil && player->sigiltype)
- P_SetPsprite(player, ps_flash, S_SIGH_00 + player->sigiltype);
+ P_SetPsprite(player, ps_flash, S_SIGH_00 + player->sigiltype); // 117
else
P_SetPsprite(player, ps_flash, S_NULL);
@@ -167,61 +145,65 @@
// Returns true if there is enough ammo to shoot.
// If not, selects the next weapon to use.
//
+// villsa [STRIFE] Changes to handle Strife weapons
+//
boolean P_CheckAmmo (player_t* player)
{
- ammotype_t ammo;
- int count;
+ ammotype_t ammo;
+ int count;
ammo = weaponinfo[player->readyweapon].ammo;
// Minimal amount for one shot varies.
if (player->readyweapon == wp_torpedo)
- count = 30;
+ count = 30;
else if (player->readyweapon == wp_mauler)
- count = 20;
+ count = 20;
else
- count = 1; // Regular.
+ count = 1; // Regular.
// Some do not need ammunition anyway.
// Return if current ammunition sufficient.
if (ammo == am_noammo || player->ammo[ammo] >= count)
- return true;
-
+ return true;
+
// Out of ammo, pick a weapon to change to.
// Preferences are set here.
// villsa [STRIFE] new weapon preferences
- if (player->weaponowned[wp_mauler] && player->ammo[am_cell] >= 20)
- player->pendingweapon = wp_mauler;
+ if (player->weaponowned[wp_mauler] && player->ammo[am_cell] >= 20)
+ player->pendingweapon = wp_mauler;
- else if(player->weaponowned[wp_rifle] && player->ammo[am_bullets])
- player->pendingweapon = wp_rifle;
+ else if(player->weaponowned[wp_rifle] && player->ammo[am_bullets])
+ player->pendingweapon = wp_rifle;
- else if (player->weaponowned[wp_elecbow] && player->ammo[am_elecbolts])
- player->pendingweapon = wp_elecbow;
+ else if (player->weaponowned[wp_elecbow] && player->ammo[am_elecbolts])
+ player->pendingweapon = wp_elecbow;
- else if (player->weaponowned[wp_missile] && player->ammo[am_missiles])
- player->pendingweapon = wp_missile;
+ else if (player->weaponowned[wp_missile] && player->ammo[am_missiles])
+ player->pendingweapon = wp_missile;
- else if (player->weaponowned[wp_flame] && player->ammo[am_cell])
- player->pendingweapon = wp_flame;
+ else if (player->weaponowned[wp_flame] && player->ammo[am_cell])
+ player->pendingweapon = wp_flame;
- else if (player->weaponowned[wp_hegrenade] && player->ammo[am_hegrenades])
- player->pendingweapon = wp_hegrenade;
-
- else if (player->weaponowned[wp_poisonbow] && player->ammo[am_poisonbolts])
- player->pendingweapon = wp_poisonbow;
+ else if (player->weaponowned[wp_hegrenade] && player->ammo[am_hegrenades])
+ player->pendingweapon = wp_hegrenade;
- else if (player->weaponowned[wp_wpgrenade] && player->ammo[am_wpgrenades])
- player->pendingweapon = wp_wpgrenade;
+ else if (player->weaponowned[wp_poisonbow] && player->ammo[am_poisonbolts])
+ player->pendingweapon = wp_poisonbow;
- else if (player->weaponowned[wp_torpedo] && player->ammo[am_cell] >= 30)
- player->pendingweapon = wp_torpedo;
+ else if (player->weaponowned[wp_wpgrenade] && player->ammo[am_wpgrenades])
+ player->pendingweapon = wp_wpgrenade;
- else
- player->pendingweapon = wp_fist;
+ // BUG: This will *never* be selected for an automatic switch because the
+ // normal Mauler is higher priority and uses less ammo.
+ else if (player->weaponowned[wp_torpedo] && player->ammo[am_cell] >= 30)
+ player->pendingweapon = wp_torpedo;
+ else
+ player->pendingweapon = wp_fist;
+
// Now set appropriate weapon overlay.
P_SetPsprite(player, ps_weapon, weaponinfo[player->readyweapon].downstate);
@@ -232,14 +214,16 @@
//
// P_FireWeapon.
//
+// villsa [STRIFE] Changes for player state and weapons
+//
void P_FireWeapon (player_t* player)
{
- statenum_t newstate;
-
+ statenum_t newstate;
+
if (!P_CheckAmmo (player))
- return;
-
- P_SetMobjState (player->mo, S_PLAY_05);
+ return;
+
+ P_SetMobjState (player->mo, S_PLAY_05); // 292
newstate = weaponinfo[player->readyweapon].atkstate;
P_SetPsprite (player, ps_weapon, newstate);
@@ -276,15 +260,16 @@
int angle;
// get out of attack state
- if (player->mo->state == &states[S_PLAY_05]
- || player->mo->state == &states[S_PLAY_06])
+ if (player->mo->state == &states[S_PLAY_05] || // 292
+ player->mo->state == &states[S_PLAY_06]) // 293
{
- P_SetMobjState (player->mo, S_PLAY_00);
+ P_SetMobjState (player->mo, S_PLAY_00); // 287
}
- // villsa [STRIFE] check for wp_flame instead of chainsaw
+ // villsa [STRIFE] check for wp_flame instead of chainsaw
+ // haleyjd 09/06/10: fixed state (00 rather than 01)
if (player->readyweapon == wp_flame
- && psp->state == &states[S_FLMT_01])
+ && psp->state == &states[S_FLMT_00]) // 62
{
S_StartSound (player->mo, sfx_flidl);
}
@@ -293,29 +278,29 @@
// if player is dead, put the weapon away
if (player->pendingweapon != wp_nochange || !player->health)
{
- // change weapon
- // (pending weapon should allready be validated)
- newstate = weaponinfo[player->readyweapon].downstate;
- P_SetPsprite (player, ps_weapon, newstate);
- return;
+ // change weapon
+ // (pending weapon should allready be validated)
+ newstate = weaponinfo[player->readyweapon].downstate;
+ P_SetPsprite (player, ps_weapon, newstate);
+ return;
}
// check for fire
- // the missile launcher and bfg do not auto fire
+ // the missile launcher and torpedo do not auto fire
if (player->cmd.buttons & BT_ATTACK)
{
-
- if ( !player->attackdown
- || (player->readyweapon != wp_missile
- && player->readyweapon != wp_torpedo)) // villsa [STRIFE] replace bfg with torpedo
- {
- player->attackdown = true;
- P_FireWeapon (player);
- return;
- }
+
+ if ( !player->attackdown
+ || (player->readyweapon != wp_missile
+ && player->readyweapon != wp_torpedo)) // villsa [STRIFE] replace bfg with torpedo
+ {
+ player->attackdown = true;
+ P_FireWeapon (player);
+ return;
+ }
}
else
- player->attackdown = false;
+ player->attackdown = false;
// bob the weapon based on movement speed
angle = (128*leveltime)&FINEMASK;
@@ -641,6 +626,8 @@
// Sets a slope so a near miss is at aproximately
// the height of the intended target
//
+// haleyjd 09/06/10 [STRIFE] Modified with a little target hack...
+//
fixed_t bulletslope;
@@ -662,6 +649,11 @@
bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT);
}
}
+
+ // haleyjd 09/06/10: [STRIFE] Somebody added this here, and without it, you
+ // will get spurious crashing in routines such as P_LookForPlayers!
+ if(linetarget)
+ mo->target = linetarget;
}