mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 17:22:12 +00:00
Merge branch 'eggcolosseum' into 'master'
Egg Colosseum (CEZ3 remaster) See merge request STJr/SRB2Internal!248
This commit is contained in:
commit
63d337211e
12 changed files with 575 additions and 142 deletions
|
@ -4751,15 +4751,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_EGGMOBILE4_RATK6",
|
||||
"S_EGGMOBILE4_RAISE1",
|
||||
"S_EGGMOBILE4_RAISE2",
|
||||
"S_EGGMOBILE4_RAISE3",
|
||||
"S_EGGMOBILE4_RAISE4",
|
||||
"S_EGGMOBILE4_RAISE5",
|
||||
"S_EGGMOBILE4_RAISE6",
|
||||
"S_EGGMOBILE4_RAISE7",
|
||||
"S_EGGMOBILE4_RAISE8",
|
||||
"S_EGGMOBILE4_RAISE9",
|
||||
"S_EGGMOBILE4_RAISE10",
|
||||
"S_EGGMOBILE4_PAIN",
|
||||
"S_EGGMOBILE4_PAIN1",
|
||||
"S_EGGMOBILE4_PAIN2",
|
||||
"S_EGGMOBILE4_DIE1",
|
||||
"S_EGGMOBILE4_DIE2",
|
||||
"S_EGGMOBILE4_DIE3",
|
||||
|
@ -4777,10 +4770,21 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_EGGMOBILE4_FLEE1",
|
||||
"S_EGGMOBILE4_FLEE2",
|
||||
"S_EGGMOBILE4_MACE",
|
||||
"S_EGGMOBILE4_MACE_DIE1",
|
||||
"S_EGGMOBILE4_MACE_DIE2",
|
||||
"S_EGGMOBILE4_MACE_DIE3",
|
||||
|
||||
// Boss 4 jet flame
|
||||
"S_JETFLAME1",
|
||||
"S_JETFLAME2",
|
||||
"S_JETFLAME",
|
||||
|
||||
// Boss 4 Spectator Eggrobo
|
||||
"S_EGGROBO1_IDLE",
|
||||
"S_EGGROBO1_BSLAP1",
|
||||
"S_EGGROBO2_BSLAP2",
|
||||
"S_EGGROBO1_PISSED",
|
||||
|
||||
// Boss 4 Spectator Eggrobo jet flame
|
||||
"S_EGGROBOJET",
|
||||
|
||||
// Boss 5
|
||||
"S_FANG_IDLE1",
|
||||
|
@ -6664,6 +6668,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
|
||||
"S_LOCKON1",
|
||||
"S_LOCKON2",
|
||||
"S_LOCKON3",
|
||||
"S_LOCKON4",
|
||||
"S_LOCKONINF1",
|
||||
"S_LOCKONINF2",
|
||||
"S_LOCKONINF3",
|
||||
"S_LOCKONINF4",
|
||||
|
||||
// Tag Sign
|
||||
"S_TTAG",
|
||||
|
@ -7269,6 +7279,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_EGGMOBILE4",
|
||||
"MT_EGGMOBILE4_MACE",
|
||||
"MT_JETFLAME",
|
||||
"MT_EGGROBO1",
|
||||
"MT_EGGROBO1JET",
|
||||
|
||||
// Boss 5
|
||||
"MT_FANG",
|
||||
|
@ -7745,6 +7757,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_DROWNNUMBERS", // Drowning Timer
|
||||
"MT_GOTEMERALD", // Chaos Emerald (intangible)
|
||||
"MT_LOCKON", // Target
|
||||
"MT_LOCKONINF", // In-level Target
|
||||
"MT_TAG", // Tag Sign
|
||||
"MT_GOTFLAG", // Got Flag sign
|
||||
|
||||
|
|
|
@ -384,7 +384,7 @@ enum {
|
|||
LE_PINCHPHASE = -2, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!)
|
||||
LE_ALLBOSSESDEAD = -3, // All bosses in the map are dead (Egg capsule raise)
|
||||
LE_BOSSDEAD = -4, // A boss in the map died (Chaos mode boss tally)
|
||||
LE_BOSS4DROP = -5, // CEZ boss dropped its cage
|
||||
LE_BOSS4DROP = -5, // CEZ boss dropped its cage (also subtract the number of hitpoints it's lost)
|
||||
LE_BRAKVILEATACK = -6, // Brak's doing his LOS attack, oh noes
|
||||
LE_TURRET = 32000, // THZ turret
|
||||
LE_BRAKPLATFORM = 4200, // v2.0 Black Eggman destroys platform
|
||||
|
|
|
@ -1022,6 +1022,7 @@ static const char *credits[] = {
|
|||
"",
|
||||
"\1Boss Design",
|
||||
"Ben \"Mystic\" Geyer",
|
||||
"Vivian \"toaster\" Grannell",
|
||||
"Thomas \"Shadow Hog\" Igoe",
|
||||
"John \"JTE\" Muniz",
|
||||
"Samuel \"Prime 2.0\" Peters",
|
||||
|
|
|
@ -202,6 +202,7 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
// Boss 4 (Castle Eggman)
|
||||
&lspr[NOLIGHT], // SPR_EGGP
|
||||
&lspr[REDBALL_L], // SPR_EFIR
|
||||
&lspr[NOLIGHT], // SPR_EGR1
|
||||
|
||||
// Boss 5 (Arid Canyon)
|
||||
&lspr[NOLIGHT], //SPR_FANG // replaces EGGQ
|
||||
|
|
129
src/info.c
129
src/info.c
|
@ -90,6 +90,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
// Boss 4 (Castle Eggman)
|
||||
"EGGP",
|
||||
"EFIR", // Boss 4 jet flame
|
||||
"EGR1", // Boss 4 Spectator Eggrobo
|
||||
|
||||
// Boss 5 (Arid Canyon)
|
||||
"FANG", // replaces EGGQ
|
||||
|
@ -1355,16 +1356,9 @@ state_t states[NUMSTATES] =
|
|||
{SPR_EGGP, 9,150, {A_Boss4SpeedUp}, sfx_mswing, 0, S_EGGMOBILE4_RATK6}, // S_EGGMOBILE4_RATK5
|
||||
{SPR_EGGP,10, 2, {NULL}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_RATK6
|
||||
{SPR_EGGP, 0, 20, {A_Boss4Raise}, sfx_doord1, 0, S_EGGMOBILE4_RAISE2}, // S_EGGMOBILE4_RAISE1
|
||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE3}, // S_EGGMOBILE4_RAISE2
|
||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE4}, // S_EGGMOBILE4_RAISE3
|
||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE5}, // S_EGGMOBILE4_RAISE4
|
||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE6}, // S_EGGMOBILE4_RAISE5
|
||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE7}, // S_EGGMOBILE4_RAISE6
|
||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE8}, // S_EGGMOBILE4_RAISE7
|
||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE9}, // S_EGGMOBILE4_RAISE8
|
||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE10},// S_EGGMOBILE4_RAISE9
|
||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_RAISE10
|
||||
{SPR_EGGP,11, 24, {A_Pain}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_PAIN
|
||||
{SPR_EGGP,13|FF_ANIMATE, -1, {NULL}, 1, 10, S_NULL}, // S_EGGMOBILE4_RAISE2
|
||||
{SPR_EGGP,11, 0, {A_Boss4Reverse}, sfx_alarm, sfx_s3k60, S_EGGMOBILE4_PAIN2}, // S_EGGMOBILE4_PAIN1
|
||||
{SPR_EGGP,11, 24, {A_Pain}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_PAIN2
|
||||
{SPR_EGGP,12, 8, {A_Fall}, 0, 0, S_EGGMOBILE4_DIE2}, // S_EGGMOBILE4_DIE1
|
||||
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE3}, // S_EGGMOBILE4_DIE2
|
||||
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE4}, // S_EGGMOBILE4_DIE3
|
||||
|
@ -1382,10 +1376,21 @@ state_t states[NUMSTATES] =
|
|||
{SPR_EGGP,13, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE2}, // S_EGGMOBILE4_FLEE1
|
||||
{SPR_EGGP,14, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE1}, // S_EGGMOBILE4_FLEE2
|
||||
{SPR_BMCE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_MACE
|
||||
{SPR_BMCE, 0, 2, {A_BossScream}, 1, MT_SONIC3KBOSSEXPLODE, S_EGGMOBILE4_MACE_DIE2}, // S_EGGMOBILE4_MACE_DIE1
|
||||
{SPR_NULL, 0, 2, {A_BossScream}, 1, MT_SONIC3KBOSSEXPLODE, S_EGGMOBILE4_MACE_DIE3}, // S_EGGMOBILE4_MACE_DIE2
|
||||
{SPR_NULL, 0, 0, {A_Repeat}, 7, S_EGGMOBILE4_MACE_DIE1, S_BOSSEXPLODE}, // S_EGGMOBILE4_MACE_DIE3
|
||||
|
||||
// Boss 4 Jet flame
|
||||
{SPR_EFIR, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_JETFLAME2}, // S_JETFLAME1
|
||||
{SPR_EFIR, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_JETFLAME1}, // S_JETFLAME2
|
||||
// Boss 4 jet flame
|
||||
{SPR_EFIR, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_JETFLAME
|
||||
|
||||
// Boss 4 Spectator Eggrobo
|
||||
{SPR_EGR1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGROBO1_STND
|
||||
{SPR_EGR1, 5, 2, {NULL}, 0, 0, S_EGGROBO1_BSLAP2}, // S_EGGROBO1_BSLAP1
|
||||
{SPR_EGR1, FF_ANIMATE|6, 35, {NULL}, 1, 2, S_EGGROBO1_STND}, // S_EGGROBO1_BSLAP2
|
||||
{SPR_EGR1, FF_ANIMATE|3, -1, {NULL}, 1, 2, S_NULL}, // S_EGGROBO1_PISSED
|
||||
|
||||
// Boss 4 Spectator Eggrobo jet flame
|
||||
{SPR_EFIR, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_NULL}, // S_EGGROBOJET
|
||||
|
||||
// Boss 5
|
||||
{SPR_FANG, 2, 16, {A_Look}, 1, 0, S_FANG_IDLE2}, // S_FANG_IDLE1
|
||||
|
@ -3311,6 +3316,13 @@ state_t states[NUMSTATES] =
|
|||
|
||||
{SPR_LCKN, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON1
|
||||
{SPR_LCKN, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON2
|
||||
{SPR_LCKN, 2|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON3
|
||||
{SPR_LCKN, 3|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON4
|
||||
|
||||
{SPR_LCKN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF1
|
||||
{SPR_LCKN, 1|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF2
|
||||
{SPR_LCKN, 2|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF3
|
||||
{SPR_LCKN, 3|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF4
|
||||
|
||||
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG
|
||||
|
||||
|
@ -5620,7 +5632,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_EGGMOBILE4_PAIN, // painstate
|
||||
S_EGGMOBILE4_PAIN1,// painstate
|
||||
0, // painchance
|
||||
sfx_dmpain, // painsound
|
||||
S_EGGMOBILE4_LATK1,// meleestate
|
||||
|
@ -5652,9 +5664,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_BOSSEXPLODE, // deathstate
|
||||
S_EGGMOBILE4_MACE_DIE1, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_cybdth, // deathsound
|
||||
sfx_None, // deathsound
|
||||
48*FRACUNIT, // speed
|
||||
34*FRACUNIT, // radius
|
||||
68*FRACUNIT, // height
|
||||
|
@ -5668,7 +5680,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
|
||||
{ // MT_JETFLAME
|
||||
-1, // doomednum
|
||||
S_JETFLAME1, // spawnstate
|
||||
S_JETFLAME, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
@ -5689,7 +5701,61 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
DMG_FIRE, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_PAIN|MF_FIRE, // flags
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_EGGROBO1
|
||||
1127, // doomednum
|
||||
S_EGGROBO1_STND,// spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_s3ka0, // seesound
|
||||
8, // reactiontime
|
||||
sfx_bsnipe, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_EGGROBO1_BSLAP1, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_EGGROBO1_PISSED, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_s3ka0, // deathsound
|
||||
12*FRACUNIT, // speed
|
||||
20*FRACUNIT, // radius
|
||||
72*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_EGGROBOJET
|
||||
-1, // doomednum
|
||||
S_EGGROBOJET, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
1, // speed
|
||||
10*FRACUNIT, // radius
|
||||
28*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
@ -16572,6 +16638,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_LOCKONINF
|
||||
1126, // doomednum
|
||||
S_INVISIBLE, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
8, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
111, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TAG
|
||||
-1, // doomednum
|
||||
S_TTAG, // spawnstate
|
||||
|
|
36
src/info.h
36
src/info.h
|
@ -335,6 +335,7 @@ typedef enum sprite
|
|||
// Boss 4 (Castle Eggman)
|
||||
SPR_EGGP,
|
||||
SPR_EFIR, // Boss 4 jet flame
|
||||
SPR_EGR1, // Boss 4 Spectator Eggrobo
|
||||
|
||||
// Boss 5 (Arid Canyon)
|
||||
SPR_FANG, // replaces EGGQ
|
||||
|
@ -1509,15 +1510,8 @@ typedef enum state
|
|||
S_EGGMOBILE4_RATK6,
|
||||
S_EGGMOBILE4_RAISE1,
|
||||
S_EGGMOBILE4_RAISE2,
|
||||
S_EGGMOBILE4_RAISE3,
|
||||
S_EGGMOBILE4_RAISE4,
|
||||
S_EGGMOBILE4_RAISE5,
|
||||
S_EGGMOBILE4_RAISE6,
|
||||
S_EGGMOBILE4_RAISE7,
|
||||
S_EGGMOBILE4_RAISE8,
|
||||
S_EGGMOBILE4_RAISE9,
|
||||
S_EGGMOBILE4_RAISE10,
|
||||
S_EGGMOBILE4_PAIN,
|
||||
S_EGGMOBILE4_PAIN1,
|
||||
S_EGGMOBILE4_PAIN2,
|
||||
S_EGGMOBILE4_DIE1,
|
||||
S_EGGMOBILE4_DIE2,
|
||||
S_EGGMOBILE4_DIE3,
|
||||
|
@ -1535,10 +1529,21 @@ typedef enum state
|
|||
S_EGGMOBILE4_FLEE1,
|
||||
S_EGGMOBILE4_FLEE2,
|
||||
S_EGGMOBILE4_MACE,
|
||||
S_EGGMOBILE4_MACE_DIE1,
|
||||
S_EGGMOBILE4_MACE_DIE2,
|
||||
S_EGGMOBILE4_MACE_DIE3,
|
||||
|
||||
// Boss 4 jet flame
|
||||
S_JETFLAME1,
|
||||
S_JETFLAME2,
|
||||
S_JETFLAME,
|
||||
|
||||
// Boss 4 Spectator Eggrobo
|
||||
S_EGGROBO1_STND,
|
||||
S_EGGROBO1_BSLAP1,
|
||||
S_EGGROBO1_BSLAP2,
|
||||
S_EGGROBO1_PISSED,
|
||||
|
||||
// Boss 4 Spectator Eggrobo jet flame
|
||||
S_EGGROBOJET,
|
||||
|
||||
// Boss 5
|
||||
S_FANG_IDLE1,
|
||||
|
@ -3422,6 +3427,12 @@ typedef enum state
|
|||
|
||||
S_LOCKON1,
|
||||
S_LOCKON2,
|
||||
S_LOCKON3,
|
||||
S_LOCKON4,
|
||||
S_LOCKONINF1,
|
||||
S_LOCKONINF2,
|
||||
S_LOCKONINF3,
|
||||
S_LOCKONINF4,
|
||||
|
||||
// Tag Sign
|
||||
S_TTAG,
|
||||
|
@ -4049,6 +4060,8 @@ typedef enum mobj_type
|
|||
MT_EGGMOBILE4,
|
||||
MT_EGGMOBILE4_MACE,
|
||||
MT_JETFLAME,
|
||||
MT_EGGROBO1,
|
||||
MT_EGGROBO1JET,
|
||||
|
||||
// Boss 5
|
||||
MT_FANG,
|
||||
|
@ -4525,6 +4538,7 @@ typedef enum mobj_type
|
|||
MT_DROWNNUMBERS, // Drowning Timer
|
||||
MT_GOTEMERALD, // Chaos Emerald (intangible)
|
||||
MT_LOCKON, // Target
|
||||
MT_LOCKONINF, // In-level Target
|
||||
MT_TAG, // Tag Sign
|
||||
MT_GOTFLAG, // Got Flag sign
|
||||
|
||||
|
|
|
@ -3163,21 +3163,35 @@ void A_FocusTarget(mobj_t *actor)
|
|||
// Description: Reverse arms direction.
|
||||
//
|
||||
// var1 = sfx to play
|
||||
// var2 = unused
|
||||
// var2 = sfx to play in pinch
|
||||
//
|
||||
void A_Boss4Reverse(mobj_t *actor)
|
||||
{
|
||||
sfxenum_t locvar1 = (sfxenum_t)var1;
|
||||
sfxenum_t locvar2 = (sfxenum_t)var2;
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_Boss4Reverse", actor))
|
||||
return;
|
||||
#endif
|
||||
S_StartSound(NULL, locvar1);
|
||||
actor->reactiontime = 0;
|
||||
if (actor->movedir == 1)
|
||||
actor->movedir = 2;
|
||||
if (actor->movedir < 3)
|
||||
{
|
||||
S_StartSound(NULL, locvar1);
|
||||
if (actor->movedir == 1)
|
||||
actor->movedir = 2;
|
||||
else
|
||||
actor->movedir = 1;
|
||||
}
|
||||
else
|
||||
actor->movedir = 1;
|
||||
{
|
||||
S_StartSound(NULL, locvar2);
|
||||
if (actor->movedir == 4)
|
||||
actor->movedir = 5;
|
||||
else
|
||||
actor->movedir = 4;
|
||||
actor->angle += ANGLE_180;
|
||||
actor->movefactor = -actor->movefactor;
|
||||
}
|
||||
}
|
||||
|
||||
// Function: A_Boss4SpeedUp
|
||||
|
@ -8685,8 +8699,8 @@ void A_BossJetFume(mobj_t *actor)
|
|||
{
|
||||
fixed_t jetx, jety, jetz;
|
||||
|
||||
jetx = actor->x + P_ReturnThrustX(actor, actor->angle, -FixedMul(60*FRACUNIT, actor->scale));
|
||||
jety = actor->y + P_ReturnThrustY(actor, actor->angle, -FixedMul(60*FRACUNIT, actor->scale));
|
||||
jetx = actor->x + P_ReturnThrustX(actor, actor->angle, -60*actor->scale);
|
||||
jety = actor->y + P_ReturnThrustY(actor, actor->angle, -60*actor->scale);
|
||||
if (actor->eflags & MFE_VERTICALFLIP)
|
||||
jetz = actor->z + actor->height - FixedMul(17*FRACUNIT + mobjinfo[MT_PROPELLER].height, actor->scale);
|
||||
else
|
||||
|
@ -8719,7 +8733,7 @@ void A_BossJetFume(mobj_t *actor)
|
|||
if (actor->eflags & MFE_VERTICALFLIP)
|
||||
jetz = actor->z + actor->height + FixedMul(50*FRACUNIT - mobjinfo[MT_JETFLAME].height, actor->scale);
|
||||
else
|
||||
jetz = actor->z - FixedMul(50*FRACUNIT, actor->scale);
|
||||
jetz = actor->z - 50*actor->scale;
|
||||
filler = P_SpawnMobj(actor->x, actor->y, jetz, MT_JETFLAME);
|
||||
P_SetTarget(&filler->target, actor);
|
||||
// Boss 4 already uses its tracer for other things
|
||||
|
@ -8728,6 +8742,30 @@ void A_BossJetFume(mobj_t *actor)
|
|||
if (actor->eflags & MFE_VERTICALFLIP)
|
||||
filler->flags2 |= MF2_OBJECTFLIP;
|
||||
}
|
||||
else if (locvar1 == 4) // Boss 4 Spectator Eggrobo jet flame
|
||||
{
|
||||
fixed_t jetx, jety, jetz, movefactor = 12;
|
||||
|
||||
jetz = actor->z;
|
||||
if (actor->eflags & MFE_VERTICALFLIP)
|
||||
jetz += (actor->height - FixedMul(mobjinfo[MT_EGGROBO1JET].height, actor->scale));
|
||||
|
||||
while (true)
|
||||
{
|
||||
jetx = actor->x + P_ReturnThrustX(actor, actor->angle+ANGLE_90, movefactor*actor->scale) - P_ReturnThrustX(actor, actor->angle, 19*actor->scale);
|
||||
jety = actor->y + P_ReturnThrustY(actor, actor->angle+ANGLE_90, movefactor*actor->scale) - P_ReturnThrustY(actor, actor->angle, 19*actor->scale);
|
||||
filler = P_SpawnMobj(jetx, jety, jetz, MT_EGGROBO1JET);
|
||||
filler->movefactor = movefactor;
|
||||
P_SetTarget(&filler->target, actor);
|
||||
filler->destscale = actor->scale;
|
||||
P_SetScale(filler, filler->destscale);
|
||||
if (actor->eflags & MFE_VERTICALFLIP)
|
||||
filler->flags2 |= MF2_OBJECTFLIP;
|
||||
if (movefactor <= 0)
|
||||
break;
|
||||
movefactor = -movefactor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function: A_RandomState
|
||||
|
|
|
@ -315,6 +315,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// Can happen with a sliding player corpse.
|
||||
if (toucher->health <= 0)
|
||||
return;
|
||||
if (special->health <= 0)
|
||||
return;
|
||||
|
||||
if (heightcheck)
|
||||
{
|
||||
|
@ -340,9 +342,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
}
|
||||
|
||||
if (special->health <= 0)
|
||||
return;
|
||||
|
||||
player = toucher->player;
|
||||
I_Assert(player != NULL); // Only players can touch stuff!
|
||||
|
||||
|
@ -1545,6 +1544,45 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
return;
|
||||
|
||||
case MT_EGGROBO1:
|
||||
if (special->state == &states[special->info->deathstate])
|
||||
return;
|
||||
if (P_PlayerInPain(player))
|
||||
return;
|
||||
|
||||
P_SetMobjState(special, special->info->meleestate);
|
||||
special->angle = special->movedir;
|
||||
special->momx = special->momy = 0;
|
||||
|
||||
// Buenos Dias Mandy
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_STUN);
|
||||
player->pflags &= ~PF_APPLYAUTOBRAKE;
|
||||
player->drawangle = special->angle + ANGLE_180;
|
||||
P_InstaThrust(toucher, special->angle, FixedMul(3*special->info->speed, special->scale/2));
|
||||
toucher->z += P_MobjFlip(toucher);
|
||||
if (toucher->eflags & MFE_UNDERWATER) // unlikely.
|
||||
P_SetObjectMomZ(toucher, FixedDiv(10511*FRACUNIT,2600*FRACUNIT), false);
|
||||
else
|
||||
P_SetObjectMomZ(toucher, FixedDiv(69*FRACUNIT,10*FRACUNIT), false);
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
quake.intensity = 9*FRACUNIT;
|
||||
quake.time = TICRATE/2;
|
||||
quake.epicenter = NULL;
|
||||
}
|
||||
|
||||
#if 0 // camera redirection - deemed unnecessary
|
||||
toucher->angle = special->angle;
|
||||
if (player == &players[consoleplayer])
|
||||
localangle = toucher->angle;
|
||||
else if (player == &players[secondarydisplayplayer])
|
||||
localangle2 = toucher->angle;
|
||||
#endif
|
||||
|
||||
S_StartSound(toucher, special->info->attacksound); // home run
|
||||
|
||||
return;
|
||||
|
||||
case MT_BIGTUMBLEWEED:
|
||||
case MT_LITTLETUMBLEWEED:
|
||||
if (toucher->momx || toucher->momy)
|
||||
|
|
404
src/p_mobj.c
404
src/p_mobj.c
|
@ -4612,9 +4612,9 @@ static void P_Boss3Thinker(mobj_t *mobj)
|
|||
}
|
||||
|
||||
// Move Boss4's sectors by delta.
|
||||
static boolean P_Boss4MoveCage(fixed_t delta)
|
||||
static boolean P_Boss4MoveCage(mobj_t *mobj, fixed_t delta)
|
||||
{
|
||||
const UINT16 tag = 65534;
|
||||
const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0);
|
||||
INT32 snum;
|
||||
sector_t *sector;
|
||||
for (snum = sectors[tag%numsectors].firsttag; snum != -1; snum = sector->nexttag)
|
||||
|
@ -4634,7 +4634,7 @@ static void P_Boss4MoveSpikeballs(mobj_t *mobj, angle_t angle, fixed_t fz)
|
|||
{
|
||||
INT32 s;
|
||||
mobj_t *base = mobj, *seg;
|
||||
fixed_t dist, bz = mobj->watertop+(16<<FRACBITS);
|
||||
fixed_t dist, bz = mobj->watertop+(8<<FRACBITS);
|
||||
while ((base = base->tracer))
|
||||
{
|
||||
for (seg = base, dist = 172*FRACUNIT, s = 9; seg; seg = seg->hnext, dist += 124*FRACUNIT, --s)
|
||||
|
@ -4644,26 +4644,44 @@ static void P_Boss4MoveSpikeballs(mobj_t *mobj, angle_t angle, fixed_t fz)
|
|||
}
|
||||
|
||||
// Pull them closer.
|
||||
static void P_Boss4PinchSpikeballs(mobj_t *mobj, angle_t angle, fixed_t fz)
|
||||
static void P_Boss4PinchSpikeballs(mobj_t *mobj, angle_t angle, fixed_t dz)
|
||||
{
|
||||
INT32 s;
|
||||
mobj_t *base = mobj, *seg;
|
||||
fixed_t dist, bz = mobj->watertop+(16<<FRACBITS);
|
||||
while ((base = base->tracer))
|
||||
fixed_t originx, originy, workx, worky, dx, dy, bz = mobj->watertop+(8<<FRACBITS);
|
||||
|
||||
if (mobj->spawnpoint)
|
||||
{
|
||||
for (seg = base, dist = 112*FRACUNIT, s = 9; seg; seg = seg->hnext, dist += 132*FRACUNIT, --s)
|
||||
originx = mobj->spawnpoint->x << FRACBITS;
|
||||
originy = mobj->spawnpoint->y << FRACBITS;
|
||||
}
|
||||
else
|
||||
{
|
||||
originx = mobj->x;
|
||||
originy = mobj->y;
|
||||
}
|
||||
|
||||
dz /= 9;
|
||||
|
||||
while ((base = base->tracer)) // there are 10 per spoke, remember that
|
||||
{
|
||||
dx = (originx + P_ReturnThrustX(mobj, angle, (9*132)<<FRACBITS) - mobj->x)/9;
|
||||
dy = (originy + P_ReturnThrustY(mobj, angle, (9*132)<<FRACBITS) - mobj->y)/9;
|
||||
workx = mobj->x + P_ReturnThrustX(mobj, angle, (112)<<FRACBITS);
|
||||
worky = mobj->y + P_ReturnThrustY(mobj, angle, (112)<<FRACBITS);
|
||||
for (seg = base, s = 9; seg; seg = seg->hnext, --s)
|
||||
{
|
||||
seg->z = bz + FixedMul(fz, FixedDiv(s<<FRACBITS, 9<<FRACBITS));
|
||||
P_TryMove(seg, mobj->x + P_ReturnThrustX(mobj, angle, dist), mobj->y + P_ReturnThrustY(mobj, angle, dist), true);
|
||||
seg->z = bz + (dz*(9-s));
|
||||
P_TryMove(seg, workx + (dx*s), worky + (dy*s), true);
|
||||
}
|
||||
angle += ANGLE_MAX/3;
|
||||
}
|
||||
}
|
||||
|
||||
// Destroy cage FOFs.
|
||||
static void P_Boss4DestroyCage(void)
|
||||
static void P_Boss4DestroyCage(mobj_t *mobj)
|
||||
{
|
||||
const UINT16 tag = 65534;
|
||||
const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0);
|
||||
INT32 snum, next;
|
||||
size_t a;
|
||||
sector_t *sector, *rsec;
|
||||
|
@ -4726,9 +4744,11 @@ static void P_Boss4PopSpikeballs(mobj_t *mobj)
|
|||
//
|
||||
static void P_Boss4Thinker(mobj_t *mobj)
|
||||
{
|
||||
fixed_t movespeed = 0;
|
||||
|
||||
if ((statenum_t)(mobj->state-states) == mobj->info->spawnstate)
|
||||
{
|
||||
if (mobj->health > mobj->info->damage || mobj->movedir == 4)
|
||||
if (mobj->flags2 & MF2_FRET && (mobj->health > mobj->info->damage))
|
||||
mobj->flags2 &= ~MF2_FRET;
|
||||
mobj->reactiontime = 0; // Drop the cage immediately.
|
||||
}
|
||||
|
@ -4738,12 +4758,50 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
{
|
||||
if (mobj->tracer) // need to clean up!
|
||||
{
|
||||
P_Boss4DestroyCage(); // Just in case pinch phase was skipped.
|
||||
P_Boss4DestroyCage(mobj); // Just in case pinch phase was skipped.
|
||||
P_Boss4PopSpikeballs(mobj);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (mobj->movedir) // only not during init
|
||||
{
|
||||
INT32 oldmovecount = mobj->movecount;
|
||||
if (mobj->movedir == 3) // pinch start
|
||||
movespeed = -210<<(FRACBITS>>1);
|
||||
else if (mobj->movedir > 3) // pinch
|
||||
{
|
||||
movespeed = 420<<(FRACBITS>>1);
|
||||
movespeed += (420*(mobj->info->damage-mobj->health)<<(FRACBITS>>1));
|
||||
if (mobj->movedir == 4)
|
||||
movespeed = -movespeed;
|
||||
}
|
||||
else // normal
|
||||
{
|
||||
movespeed = 170<<(FRACBITS>>1);
|
||||
movespeed += ((50*(mobj->info->spawnhealth-mobj->health))<<(FRACBITS>>1));
|
||||
if (mobj->movedir == 2)
|
||||
movespeed = -movespeed;
|
||||
if (mobj->movefactor)
|
||||
movespeed /= 2;
|
||||
else if (mobj->threshold)
|
||||
{
|
||||
// 1 -> 1.5 second timer
|
||||
INT32 maxtimer = TICRATE+(TICRATE*(mobj->info->spawnhealth-mobj->health)/10);
|
||||
if (maxtimer < 1)
|
||||
maxtimer = 1;
|
||||
maxtimer = ((mobj->threshold*movespeed)/(2*maxtimer));
|
||||
movespeed -= maxtimer;
|
||||
}
|
||||
}
|
||||
|
||||
mobj->movecount += movespeed + 360*FRACUNIT;
|
||||
mobj->movecount %= 360*FRACUNIT;
|
||||
|
||||
if (((oldmovecount>>FRACBITS)%120 >= 60) && !((mobj->movecount>>FRACBITS)%120 >= 60))
|
||||
S_StartSound(NULL, sfx_mswing);
|
||||
}
|
||||
|
||||
// movedir == battle stage:
|
||||
// 0: initialization
|
||||
// 1: phase 1 forward
|
||||
|
@ -4781,10 +4839,10 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
}
|
||||
// Move the cage up to the sky.
|
||||
mobj->movecount = 800*FRACUNIT;
|
||||
if (!P_Boss4MoveCage(mobj->movecount))
|
||||
if (!P_Boss4MoveCage(mobj, mobj->movecount))
|
||||
{
|
||||
mobj->movecount = 0;
|
||||
mobj->threshold = 3*TICRATE;
|
||||
//mobj->threshold = 3*TICRATE;
|
||||
mobj->extravalue1 = 1;
|
||||
mobj->movedir++; // We don't have a cage, just continue.
|
||||
}
|
||||
|
@ -4796,17 +4854,13 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
fixed_t oldz = mobj->movecount;
|
||||
mobj->threshold -= 5*FRACUNIT;
|
||||
mobj->movecount += mobj->threshold;
|
||||
if (mobj->movecount < 0)
|
||||
mobj->movecount = 0;
|
||||
P_Boss4MoveCage(mobj->movecount - oldz);
|
||||
P_Boss4MoveSpikeballs(mobj, 0, mobj->movecount);
|
||||
if (mobj->movecount == 0)
|
||||
if (mobj->movecount <= 0)
|
||||
{
|
||||
mobj->threshold = 3*TICRATE;
|
||||
mobj->extravalue1 = 1;
|
||||
P_LinedefExecute(LE_BOSS4DROP, mobj, NULL);
|
||||
mobj->movecount = 0;
|
||||
mobj->movedir++; // Initialization complete, next phase!
|
||||
}
|
||||
P_Boss4MoveCage(mobj, mobj->movecount - oldz);
|
||||
P_Boss4MoveSpikeballs(mobj, 0, mobj->movecount);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -4820,17 +4874,18 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
case 3:
|
||||
{
|
||||
fixed_t z;
|
||||
if (mobj->z < mobj->watertop+(512<<FRACBITS))
|
||||
if (mobj->z < mobj->watertop+(400<<FRACBITS))
|
||||
mobj->momz = 8*FRACUNIT;
|
||||
else
|
||||
{
|
||||
mobj->momz = 0;
|
||||
mobj->momz = mobj->movefactor = 0;
|
||||
mobj->threshold = 1110<<FRACBITS;
|
||||
S_StartSound(NULL, sfx_s3k60);
|
||||
mobj->movedir++;
|
||||
}
|
||||
mobj->movecount += 400<<(FRACBITS>>1);
|
||||
mobj->movecount %= 360*FRACUNIT;
|
||||
|
||||
z = mobj->z - mobj->watertop - mobjinfo[MT_EGGMOBILE4_MACE].height - mobj->height/2;
|
||||
if (z < 0) // We haven't risen high enough to pull the spikeballs along yet
|
||||
if (z < (8<<FRACBITS)) // We haven't risen high enough to pull the spikeballs along yet
|
||||
P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), 0); // So don't pull the spikeballs along yet.
|
||||
else
|
||||
P_Boss4PinchSpikeballs(mobj, FixedAngle(mobj->movecount), z);
|
||||
|
@ -4838,18 +4893,32 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
}
|
||||
// Pinch phase!
|
||||
case 4:
|
||||
case 5:
|
||||
{
|
||||
if (mobj->z < (mobj->watertop + ((512+128*(mobj->info->damage-mobj->health))<<FRACBITS)))
|
||||
mobj->momz = 8*FRACUNIT;
|
||||
else
|
||||
mobj->momz = 0;
|
||||
mobj->movecount += (800+800*(mobj->info->damage-mobj->health))<<(FRACBITS>>1);
|
||||
mobj->movecount %= 360*FRACUNIT;
|
||||
mobj->angle -= FixedAngle(movespeed/8);
|
||||
|
||||
if (mobj->movefactor != mobj->threshold)
|
||||
{
|
||||
if (mobj->threshold - mobj->movefactor < FRACUNIT)
|
||||
{
|
||||
mobj->movefactor = mobj->threshold;
|
||||
mobj->flags2 &= ~MF2_FRET;
|
||||
}
|
||||
else
|
||||
mobj->movefactor += (mobj->threshold - mobj->movefactor)/8;
|
||||
}
|
||||
|
||||
if (mobj->spawnpoint)
|
||||
P_TryMove(mobj,
|
||||
(mobj->spawnpoint->x<<FRACBITS) - P_ReturnThrustX(mobj, mobj->angle, mobj->movefactor),
|
||||
(mobj->spawnpoint->y<<FRACBITS) - P_ReturnThrustY(mobj, mobj->angle, mobj->movefactor),
|
||||
true);
|
||||
|
||||
P_Boss4PinchSpikeballs(mobj, FixedAngle(mobj->movecount), mobj->z - mobj->watertop - mobjinfo[MT_EGGMOBILE4_MACE].height - mobj->height/2);
|
||||
|
||||
if (!mobj->target || !mobj->target->health)
|
||||
P_SupermanLook4Players(mobj);
|
||||
A_FaceTarget(mobj);
|
||||
//A_FaceTarget(mobj);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4869,10 +4938,23 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
if (mobj->reactiontime == 1)
|
||||
{
|
||||
fixed_t oldz = mobj->movefactor;
|
||||
mobj->movefactor += 8*FRACUNIT;
|
||||
if (mobj->movefactor > 128*FRACUNIT)
|
||||
mobj->movefactor = 128*FRACUNIT;
|
||||
P_Boss4MoveCage(mobj->movefactor - oldz);
|
||||
if (mobj->movefactor != 128*FRACUNIT)
|
||||
{
|
||||
if (mobj->movefactor < 128*FRACUNIT)
|
||||
{
|
||||
mobj->movefactor += 8*FRACUNIT;
|
||||
if (!oldz)
|
||||
{
|
||||
// 5 -> 2.5 second timer
|
||||
mobj->threshold = 5*TICRATE-(TICRATE*(mobj->info->spawnhealth-mobj->health)/2);
|
||||
if (mobj->threshold < 1)
|
||||
mobj->threshold = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
mobj->movefactor = 128*FRACUNIT;
|
||||
P_Boss4MoveCage(mobj, mobj->movefactor - oldz);
|
||||
}
|
||||
}
|
||||
// Drop the cage!
|
||||
else if (mobj->movefactor)
|
||||
|
@ -4881,64 +4963,38 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
mobj->movefactor -= 4*FRACUNIT;
|
||||
if (mobj->movefactor < 0)
|
||||
mobj->movefactor = 0;
|
||||
P_Boss4MoveCage(mobj->movefactor - oldz);
|
||||
P_Boss4MoveCage(mobj, mobj->movefactor - oldz);
|
||||
if (!mobj->movefactor)
|
||||
{
|
||||
if (mobj->health <= mobj->info->damage)
|
||||
{ // Proceed to pinch phase!
|
||||
P_Boss4DestroyCage();
|
||||
P_Boss4DestroyCage(mobj);
|
||||
mobj->movedir = 3;
|
||||
P_LinedefExecute(LE_PINCHPHASE, mobj, NULL);
|
||||
P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL);
|
||||
P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), 0);
|
||||
var1 = 3;
|
||||
A_BossJetFume(mobj);
|
||||
return;
|
||||
}
|
||||
P_LinedefExecute(LE_BOSS4DROP, mobj, NULL);
|
||||
P_LinedefExecute(LE_BOSS4DROP - (mobj->info->spawnhealth-mobj->health) + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL);
|
||||
// 1 -> 1.5 second timer
|
||||
mobj->threshold = TICRATE+(TICRATE*(mobj->info->spawnhealth-mobj->health)/10);
|
||||
if (mobj->threshold < 1)
|
||||
mobj->threshold = 1;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
fixed_t movespeed = 170<<(FRACBITS>>1);
|
||||
if (mobj->reactiontime == 2)
|
||||
movespeed *= 3;
|
||||
if (mobj->movedir == 2)
|
||||
mobj->movecount -= movespeed;
|
||||
else
|
||||
mobj->movecount += movespeed;
|
||||
}
|
||||
mobj->movecount %= 360*FRACUNIT;
|
||||
P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), mobj->movefactor);
|
||||
|
||||
// Check for attacks, always tick the timer even while animating!!
|
||||
if (!(mobj->flags2 & MF2_FRET) // but pause for pain so we don't interrupt pinch phase, eep!
|
||||
&& mobj->threshold-- == 0)
|
||||
if (mobj->threshold)
|
||||
{
|
||||
// 5 -> 2.5 second timer
|
||||
mobj->threshold = 5*TICRATE-(TICRATE/2)*(mobj->info->spawnhealth-mobj->health);
|
||||
if (mobj->threshold < 1)
|
||||
mobj->threshold = 1;
|
||||
|
||||
if (mobj->extravalue1-- == 0)
|
||||
{
|
||||
P_SetMobjState(mobj, mobj->info->raisestate);
|
||||
mobj->extravalue1 = 3;
|
||||
}
|
||||
else
|
||||
if (!(mobj->flags2 & MF2_FRET) && !(--mobj->threshold)) // but pause for pain so we don't interrupt pinch phase, eep!
|
||||
{
|
||||
if (mobj->reactiontime == 1) // Cage is raised?
|
||||
mobj->reactiontime = 0; // Drop it!
|
||||
switch(P_RandomKey(10))
|
||||
{
|
||||
// Telegraph Right (Speed Up!!)
|
||||
case 1:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
P_SetMobjState(mobj, mobj->info->missilestate);
|
||||
break;
|
||||
// Telegraph Left (Reverse Direction)
|
||||
default:
|
||||
P_SetMobjState(mobj, mobj->info->meleestate);
|
||||
break;
|
||||
P_SetMobjState(mobj, mobj->info->spawnstate);
|
||||
mobj->reactiontime = 0; // Drop it!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4950,13 +5006,11 @@ static void P_Boss4Thinker(mobj_t *mobj)
|
|||
// Map allows us to get killed despite cage being down?
|
||||
if (mobj->health <= mobj->info->damage)
|
||||
{ // Proceed to pinch phase!
|
||||
P_Boss4DestroyCage();
|
||||
// spawn jet's flame now you're flying upwards
|
||||
// tracer is already used, so if this ever gets reached again we've got problems
|
||||
P_Boss4DestroyCage(mobj);
|
||||
mobj->movedir = 3;
|
||||
P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL);
|
||||
var1 = 3;
|
||||
A_BossJetFume(mobj);
|
||||
mobj->movedir = 3;
|
||||
P_LinedefExecute(LE_PINCHPHASE, mobj, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -7309,6 +7363,17 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
else
|
||||
mobj->z = mobj->target->z - FixedMul((16 + abs((signed)(leveltime % TICRATE) - TICRATE/2))*FRACUNIT, mobj->target->scale) - mobj->height;
|
||||
break;
|
||||
case MT_LOCKONINF:
|
||||
if (!(mobj->flags2 & MF2_STRONGBOX))
|
||||
{
|
||||
mobj->threshold = mobj->z;
|
||||
mobj->flags2 |= MF2_STRONGBOX;
|
||||
}
|
||||
if (!(mobj->eflags & MFE_VERTICALFLIP))
|
||||
mobj->z = mobj->threshold + FixedMul((16 + abs((signed)(leveltime % TICRATE) - TICRATE/2))*FRACUNIT, mobj->scale);
|
||||
else
|
||||
mobj->z = mobj->threshold - FixedMul((16 + abs((signed)(leveltime % TICRATE) - TICRATE/2))*FRACUNIT, mobj->scale);
|
||||
break;
|
||||
case MT_DROWNNUMBERS:
|
||||
if (!mobj->target)
|
||||
{
|
||||
|
@ -8243,7 +8308,166 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
P_UnsetThingPosition(mobj);
|
||||
mobj->x = mobj->target->x;
|
||||
mobj->y = mobj->target->y;
|
||||
mobj->z = mobj->target->z - FixedMul(50*FRACUNIT, mobj->target->scale);
|
||||
mobj->z = mobj->target->z - 50*mobj->target->scale;
|
||||
mobj->floorz = mobj->z;
|
||||
mobj->ceilingz = mobj->z+mobj->height;
|
||||
P_SetThingPosition(mobj);
|
||||
}
|
||||
break;
|
||||
case MT_EGGROBO1:
|
||||
#define SPECTATORRADIUS (96*mobj->scale)
|
||||
{
|
||||
if (!(mobj->flags2 & MF2_STRONGBOX))
|
||||
{
|
||||
mobj->cusval = mobj->x; // eat my SOCs, p_mobj.h warning, we have lua now
|
||||
mobj->cvmem = mobj->y; // ditto
|
||||
mobj->movedir = mobj->angle;
|
||||
mobj->threshold = P_MobjFlip(mobj)*10*mobj->scale;
|
||||
if (mobj->threshold < 0)
|
||||
mobj->threshold += (mobj->ceilingz - mobj->height);
|
||||
else
|
||||
mobj->threshold += mobj->floorz;
|
||||
var1 = 4;
|
||||
A_BossJetFume(mobj);
|
||||
mobj->flags2 |= MF2_STRONGBOX;
|
||||
}
|
||||
|
||||
if (mobj->state == &states[mobj->info->deathstate]) // todo: make map actually set health to 0 for these
|
||||
{
|
||||
if (mobj->movecount)
|
||||
{
|
||||
if (!(--mobj->movecount))
|
||||
S_StartSound(mobj, mobj->info->deathsound);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->momz += P_MobjFlip(mobj)*mobj->scale;
|
||||
if (mobj->momz > 0)
|
||||
{
|
||||
if (mobj->z + mobj->momz > mobj->ceilingz + (1000<<FRACBITS))
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (mobj->z + mobj->height + mobj->momz < mobj->floorz - (1000<<FRACBITS))
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->z = mobj->threshold + FixedMul(FINESINE(((leveltime + mobj->movecount)*ANG2>>(ANGLETOFINESHIFT-2)) & FINEMASK), 8*mobj->scale);
|
||||
if (mobj->state != &states[mobj->info->meleestate])
|
||||
{
|
||||
boolean didmove = false;
|
||||
|
||||
if (mobj->state == &states[mobj->info->spawnstate])
|
||||
{
|
||||
UINT8 i;
|
||||
fixed_t dist = INT32_MAX;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
fixed_t compdist;
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
if (players[i].spectator)
|
||||
continue;
|
||||
if (!players[i].mo)
|
||||
continue;
|
||||
if (!players[i].mo->health)
|
||||
continue;
|
||||
if (P_PlayerInPain(&players[i]))
|
||||
continue;
|
||||
if (players[i].mo->z > mobj->z + mobj->height + 8*mobj->scale)
|
||||
continue;
|
||||
if (players[i].mo->z + players[i].mo->height < mobj->z - 8*mobj->scale)
|
||||
continue;
|
||||
compdist = P_AproxDistance(
|
||||
players[i].mo->x + players[i].mo->momx - mobj->cusval,
|
||||
players[i].mo->y + players[i].mo->momy - mobj->cvmem);
|
||||
if (compdist >= dist)
|
||||
continue;
|
||||
dist = compdist;
|
||||
P_SetTarget(&mobj->target, players[i].mo);
|
||||
}
|
||||
|
||||
if (dist < (SPECTATORRADIUS<<1))
|
||||
{
|
||||
didmove = true;
|
||||
mobj->frame = 3 + ((leveltime & 2)>>1);
|
||||
mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->target->x, mobj->target->y);
|
||||
|
||||
if (P_AproxDistance(
|
||||
mobj->x - mobj->cusval,
|
||||
mobj->y - mobj->cvmem)
|
||||
< mobj->scale)
|
||||
S_StartSound(mobj, mobj->info->seesound);
|
||||
|
||||
P_TeleportMove(mobj,
|
||||
(15*(mobj->x>>4)) + (mobj->cusval>>4) + P_ReturnThrustX(mobj, mobj->angle, SPECTATORRADIUS>>4),
|
||||
(15*(mobj->y>>4)) + (mobj->cvmem>>4) + P_ReturnThrustY(mobj, mobj->angle, SPECTATORRADIUS>>4),
|
||||
mobj->z);
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t diff = (mobj->movedir - mobj->angle);
|
||||
if (diff > ANGLE_180)
|
||||
diff = InvAngle(InvAngle(diff)/8);
|
||||
else
|
||||
diff /= 8;
|
||||
mobj->angle += diff;
|
||||
|
||||
dist = FINECOSINE(((leveltime + mobj->movecount)*ANG2>>(ANGLETOFINESHIFT-2)) & FINEMASK);
|
||||
|
||||
if (abs(dist) < FRACUNIT/2)
|
||||
mobj->frame = 0;
|
||||
else
|
||||
mobj->frame = (dist > 0) ? 1 : 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (!didmove)
|
||||
{
|
||||
if (P_AproxDistance(
|
||||
mobj->x - mobj->cusval,
|
||||
mobj->y - mobj->cvmem)
|
||||
< mobj->scale)
|
||||
P_TeleportMove(mobj,
|
||||
mobj->cusval,
|
||||
mobj->cvmem,
|
||||
mobj->z);
|
||||
else
|
||||
P_TeleportMove(mobj,
|
||||
(15*(mobj->x>>4)) + (mobj->cusval>>4),
|
||||
(15*(mobj->y>>4)) + (mobj->cvmem>>4),
|
||||
mobj->z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
#undef SPECTATORRADIUS
|
||||
case MT_EGGROBO1JET:
|
||||
{
|
||||
if (!mobj->target || P_MobjWasRemoved(mobj->target) // if you have no target
|
||||
|| (mobj->target->health <= 0)) // or your target isn't a boss and it's popped now
|
||||
{ // then remove yourself as well!
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
|
||||
mobj->flags2 ^= MF2_DONTDRAW;
|
||||
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x = mobj->target->x + P_ReturnThrustX(mobj, mobj->target->angle+ANGLE_90, mobj->movefactor*mobj->target->scale) - P_ReturnThrustX(mobj, mobj->target->angle, 19*mobj->target->scale);
|
||||
mobj->y = mobj->target->y + P_ReturnThrustY(mobj, mobj->target->angle+ANGLE_90, mobj->movefactor*mobj->target->scale) - P_ReturnThrustY(mobj, mobj->target->angle, 19*mobj->target->scale);
|
||||
mobj->z = mobj->target->z;
|
||||
if (mobj->target->eflags & MFE_VERTICALFLIP)
|
||||
mobj->z += (mobj->target->height - mobj->height);
|
||||
mobj->floorz = mobj->z;
|
||||
mobj->ceilingz = mobj->z+mobj->height;
|
||||
P_SetThingPosition(mobj);
|
||||
|
@ -9347,6 +9571,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_ALTVIEWMAN:
|
||||
if (titlemapinaction) mobj->flags &= ~MF_NOTHINK;
|
||||
break;
|
||||
case MT_LOCKONINF:
|
||||
P_SetScale(mobj, (mobj->destscale = 3*mobj->scale));
|
||||
break;
|
||||
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
|
||||
mobj->fuse = mobj->info->painchance;
|
||||
break;
|
||||
|
@ -9451,6 +9678,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_BALLOON:
|
||||
mobj->color = SKINCOLOR_RED;
|
||||
break;
|
||||
case MT_EGGROBO1:
|
||||
mobj->movecount = P_RandomKey(13);
|
||||
mobj->color = SKINCOLOR_RUBY + P_RandomKey(MAXSKINCOLORS - SKINCOLOR_RUBY);
|
||||
case MT_HIVEELEMENTAL:
|
||||
mobj->extravalue1 = 5;
|
||||
break;
|
||||
|
@ -10301,7 +10531,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing)
|
|||
{
|
||||
x = mthing->x << FRACBITS;
|
||||
y = mthing->y << FRACBITS;
|
||||
angle = FixedAngle(mthing->angle*FRACUNIT);
|
||||
angle = FixedAngle(mthing->angle<<FRACBITS);
|
||||
}
|
||||
//spawn at the origin as a desperation move if there is no mapthing
|
||||
|
||||
|
|
|
@ -848,6 +848,9 @@ boolean P_PlayerInPain(player_t *player)
|
|||
if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing])
|
||||
return true;
|
||||
|
||||
if (player->mo->state == &states[S_PLAY_STUN])
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -197,6 +197,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"corkh", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Cork hit"},
|
||||
{"bowl", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bowling"},
|
||||
{"chuchu", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Train horn"},
|
||||
{"bsnipe", false, 200, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Home-run smash"},
|
||||
{"sprong", false, 112, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Power spring"},
|
||||
|
||||
// Menu, interface
|
||||
|
@ -335,7 +336,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"s3k5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"},
|
||||
{"s3k5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing laser"},
|
||||
{"s3k5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crusher stomp"},
|
||||
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"},
|
||||
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Accelerating"},
|
||||
{"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"},
|
||||
{"s3k62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Jump"},
|
||||
{"s3k63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Starpost"},
|
||||
|
@ -431,8 +432,8 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"s3kbcl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // long version of previous
|
||||
{"s3kbds", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"},
|
||||
{"s3kbdl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"}, // ditto
|
||||
{"s3kbes", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"},
|
||||
{"s3kbel", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"}, // ditto
|
||||
{"s3kbes", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying"},
|
||||
{"s3kbel", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying"}, // ditto
|
||||
{"s3kbfs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
||||
{"s3kbfl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"}, // ditto
|
||||
{"s3kc0s", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
||||
|
|
|
@ -263,6 +263,7 @@ typedef enum
|
|||
sfx_corkh,
|
||||
sfx_bowl,
|
||||
sfx_chuchu,
|
||||
sfx_bsnipe,
|
||||
sfx_sprong,
|
||||
|
||||
// Menu, interface
|
||||
|
|
Loading…
Reference in a new issue