summaryrefslogtreecommitdiff
path: root/src/strife
diff options
context:
space:
mode:
Diffstat (limited to 'src/strife')
-rw-r--r--src/strife/d_englsh.h6
-rw-r--r--src/strife/deh_cheat.c36
-rw-r--r--src/strife/p_map.c4
-rw-r--r--src/strife/p_mobj.c87
-rw-r--r--src/strife/st_stuff.c157
-rw-r--r--src/strife/st_stuff.h26
6 files changed, 162 insertions, 154 deletions
diff --git a/src/strife/d_englsh.h b/src/strife/d_englsh.h
index 63f38a3a..6d615194 100644
--- a/src/strife/d_englsh.h
+++ b/src/strife/d_englsh.h
@@ -242,16 +242,16 @@
#define STSTR_MUS "Music Change"
#define STSTR_NOMUS "IMPOSSIBLE SELECTION"
-#define STSTR_DQDON "You're invincible!" // [STRIFE]
+#define STSTR_DQDON "You're Invincible!" // [STRIFE]
#define STSTR_DQDOFF "You're a looney!" // [STRIFE]
#define STSTR_KFAADDED "Very Happy Ammo Added"
-#define STSTR_FAADDED "Ammo (no keys) Added"
+#define STSTR_FAADDED "Ammo Added" // [STRIFE]
#define STSTR_NCON "No Clipping Mode ON"
#define STSTR_NCOFF "No Clipping Mode OFF"
-#define STSTR_BEHOLD "inVuln, Str, Inviso, Rad, Allmap, or Lite-amp"
+#define STSTR_BEHOLD "Bzrk, Inviso, Mask, Health, Pack, Stats" // [STRIFE]
#define STSTR_BEHOLDX "Power-up Toggled"
#define STSTR_CHOPPERS "... doesn't suck - GM"
diff --git a/src/strife/deh_cheat.c b/src/strife/deh_cheat.c
index c693a2df..9d3d453d 100644
--- a/src/strife/deh_cheat.c
+++ b/src/strife/deh_cheat.c
@@ -43,23 +43,25 @@ typedef struct
static deh_cheat_t allcheats[] =
{
+ // haleyjd 20110224: filled in all cheats
{"Change music", &cheat_mus },
{"Level Warp", &cheat_clev },
- {"Stealth Boots", NULL }, // STRIFE-TODO
- {"Sigil piece", NULL }, // STRIFE-TODO
- {"FPS", NULL }, // STRIFE-TODO
- {"TeleportMapSpot", NULL }, // STRIFE-TODO
- {"Gold&StatTokens", NULL }, // STRIFE-TODO
+ {"Stealth Boots", &cheat_stealth },
+ {"Sigil piece", &cheat_lego },
+ {"FPS", &cheat_mypos },
+ {"TeleportMapSpot", &cheat_scoot },
+ {"Gold&StatTokens", &cheat_midas },
{"God mode", &cheat_god },
- {"Keys", NULL }, // STRIFE-TODO
- {"Weapons & Ammo", NULL }, // STRIFE-TODO
- {"Massacre", NULL }, // STRIFE-TODO
+ {"Keys", &cheat_keys },
+ {"Weapons & Ammo", &cheat_ammo },
+ {"Massacre", &cheat_nuke },
{"No Clipping", &cheat_noclip },
- {"Berserk", &cheat_powerup[1] },
- {"Invisibility", &cheat_powerup[2] },
- {"Enviro Suit", &cheat_powerup[3] },
- {"Health", NULL }, // STRIFE-TODO
- {"Backpack", NULL }, // STRIFE-TODO
+ {"Berserk", &cheat_powerup[0] },
+ {"Invisibility", &cheat_powerup[1] },
+ {"Enviro Suit", &cheat_powerup[2] },
+ {"Health", &cheat_powerup[3] },
+ {"Backpack", &cheat_powerup[4] },
+ // STRIFE-FIXME/TODO: Does SeHackEd not support PUMPUP{S,T,nil}, or "DOTS" ?
};
static deh_cheat_t *FindCheatByName(char *name)
@@ -122,10 +124,10 @@ static void DEH_CheatParseLine(deh_context_t *context, char *line, void *tag)
break;
}
- if (deh_apply_cheats)
- {
- cheat->seq->sequence[i] = unsvalue[i];
- }
+ if (deh_apply_cheats)
+ {
+ cheat->seq->sequence[i] = unsvalue[i];
+ }
++i;
// Absolute limit - don't exceed
diff --git a/src/strife/p_map.c b/src/strife/p_map.c
index 206d8664..322e479b 100644
--- a/src/strife/p_map.c
+++ b/src/strife/p_map.c
@@ -263,12 +263,12 @@ boolean PIT_CheckLine (line_t* ld)
// villsa [STRIFE] include jumpover flag
if ( ld->flags & ML_BLOCKING &&
(!(ld->flags & ML_JUMPOVER) || tmfloorz + (32*FRACUNIT) > tmthing->z) )
- return false; // explicitly blocking everything
+ return false; // explicitly blocking everything
// villsa [STRIFE] exclude floaters from blockmonster lines
if ( !tmthing->player && (ld->flags & ML_BLOCKMONSTERS) &&
!(tmthing->flags & MF_FLOAT))
- return false; // block monsters only
+ return false; // block monsters only
// villsa [STRIFE]
if ( ld->flags & ML_BLOCKFLOATERS && tmthing->flags & MF_FLOAT )
diff --git a/src/strife/p_mobj.c b/src/strife/p_mobj.c
index 85b20e37..f0743125 100644
--- a/src/strife/p_mobj.c
+++ b/src/strife/p_mobj.c
@@ -115,9 +115,11 @@ void P_ExplodeMissile (mobj_t* mo)
// * No SKULLFLY logic (replaced by BOUNCE flag)
// * Missiles can activate G1/GR line types
// * Player walking logic
+// * Air friction for players
//
#define STOPSPEED 0x1000
#define FRICTION 0xe800
+#define AIRFRICTION 0xfff0 // [STRIFE]
void P_XYMovement (mobj_t* mo)
{
@@ -202,7 +204,7 @@ void P_XYMovement (mobj_t* mo)
if(blockingline && blockingline->special)
P_ShootSpecialLine(mo, blockingline);
if(numspechit)
- P_ShootSpecialLine(mo, spechit[numspechit]);
+ P_ShootSpecialLine(mo, spechit[numspechit-1]);
// explode a missile
if (ceilingline &&
@@ -234,8 +236,18 @@ void P_XYMovement (mobj_t* mo)
if (mo->flags & (MF_MISSILE | MF_BOUNCE) )
return; // no friction for missiles ever
+ // haleyjd 20110224: [STRIFE] players experience friction even in the air,
+ // although less than when on the ground. With this fix, the 1.2-and-up
+ // IWAD demo is now in sync!
if (mo->z > mo->floorz)
+ {
+ if(player)
+ {
+ mo->momx = FixedMul (mo->momx, AIRFRICTION);
+ mo->momy = FixedMul (mo->momy, AIRFRICTION);
+ }
return; // no friction when airborne
+ }
if (mo->flags & MF_CORPSE)
{
@@ -260,7 +272,7 @@ void P_XYMovement (mobj_t* mo)
&& player->cmd.sidemove == 0 ) ) )
{
// if in a walking frame, stop moving
- // villsa [STRIFE]: different player state (haleyjd - verified 02/02/11)
+ // villsa [STRIFE]: different player state (haleyjd - verified 20110202)
if ( player&&(unsigned)((player->mo->state - states) - S_PLAY_01) < 4)
P_SetMobjState (player->mo, S_PLAY_00);
@@ -305,7 +317,6 @@ void P_ZMovement (mobj_t* mo)
mo->ceilingz = mo->height + mo->z;
else
mo->floorz = mo->z;
-
}
//mo->z += mo->momz; // villsa [STRIFE] unused
@@ -327,7 +338,6 @@ void P_ZMovement (mobj_t* mo)
else if (delta>0 && dist < (delta*3) )
mo->z += FLOATSPEED;
}
-
}
// clip movement
@@ -386,13 +396,13 @@ void P_ZMovement (mobj_t* mo)
mo->player->deltaviewheight = mo->momz>>3;
// villsa [STRIFE] fall damage
+ // haleyjd 09/18/10: Repaired calculation
if(mo->momz < -20*FRACUNIT)
- {
- // haleyjd 09/18/10: Repaired calculation
P_DamageMobj(mo, NULL, mo, mo->momz / -25000);
- mo->player->centerview = 1;
- }
+ // haleyjd 20110224: *Any* fall centers your view, not just
+ // damaging falls (moved outside the above if).
+ mo->player->centerview = 1;
S_StartSound (mo, sfx_oof);
}
mo->momz = 0;
@@ -417,46 +427,45 @@ void P_ZMovement (mobj_t* mo)
&& !(mo->flags & (MF_NOCLIP|MF_BOUNCE)) )
{
P_ExplodeMissile (mo);
- return;
}
}
- else if (! (mo->flags & MF_NOGRAVITY) )
+ else // haleyjd 20110224: else here, not else if - Strife change or what?
{
- if (mo->momz == 0)
- mo->momz = -GRAVITY*2;
- else
- mo->momz -= GRAVITY;
- }
-
- if (mo->z + mo->height > mo->ceilingz)
- {
- // villsa [STRIFE] replace skullfly flag with MF_BOUNCE
- if (mo->flags & MF_BOUNCE)
+ if (! (mo->flags & MF_NOGRAVITY) )
{
- // villsa [STRIFE] affect reactiontime
- // momz is also shifted by 1
- mo->momz = -mo->momz >> 1;
- mo->reactiontime >>= 1;
+ if (mo->momz == 0)
+ mo->momz = -GRAVITY*2;
+ else
+ mo->momz -= GRAVITY;
}
- // hit the ceiling
- if (mo->momz > 0)
- mo->momz = 0;
+ if (mo->z + mo->height > mo->ceilingz)
{
- mo->z = mo->ceilingz - mo->height;
- }
+ // villsa [STRIFE] replace skullfly flag with MF_BOUNCE
+ if (mo->flags & MF_BOUNCE)
+ {
+ // villsa [STRIFE] affect reactiontime
+ // momz is also shifted by 1
+ mo->momz = -mo->momz >> 1;
+ mo->reactiontime >>= 1;
+ }
- // villsa [STRIFE] also check for MF_BOUNCE
- if ( (mo->flags & MF_MISSILE)
- && !(mo->flags & (MF_NOCLIP|MF_BOUNCE)) )
- {
- // villsa [STRIFE] check against skies
- if(mo->subsector->sector->ceilingpic == skyflatnum)
- P_RemoveMobj(mo);
- else
- P_ExplodeMissile (mo);
+ // hit the ceiling
+ if (mo->momz > 0)
+ mo->momz = 0;
- return;
+ mo->z = mo->ceilingz - mo->height;
+
+ // villsa [STRIFE] also check for MF_BOUNCE
+ if ( (mo->flags & MF_MISSILE)
+ && !(mo->flags & (MF_NOCLIP|MF_BOUNCE)) )
+ {
+ // villsa [STRIFE] check against skies
+ if(mo->subsector->sector->ceilingpic == skyflatnum)
+ P_RemoveMobj(mo);
+ else
+ P_ExplodeMissile (mo);
+ }
}
}
}
diff --git a/src/strife/st_stuff.c b/src/strife/st_stuff.c
index 934ce42c..7ba3bcec 100644
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -248,8 +248,7 @@ static int st_fragscount;
cheatseq_t cheat_mus = CHEAT("spin", 2); // [STRIFE]: idmus -> spin
cheatseq_t cheat_god = CHEAT("omnipotent", 0); // [STRIFE]: iddqd -> omnipotent
-cheatseq_t cheat_ammo = CHEAT("idkfa", 0); // STRIFE-TODO
-cheatseq_t cheat_ammonokey = CHEAT("idfa", 0); // STRIFE-TODO
+cheatseq_t cheat_ammo = CHEAT("boomstix", 0); // [STRIFE]: idfa -> boomstix
cheatseq_t cheat_noclip = CHEAT("elvis", 0); // [STRIFE]: idclip -> elvis
cheatseq_t cheat_clev = CHEAT("rift", 2); // [STRIFE]: idclev -> rift
cheatseq_t cheat_mypos = CHEAT("gps", 0); // [STRIFE]: idmypos -> gps
@@ -259,16 +258,32 @@ cheatseq_t cheat_keys = CHEAT("jimmy", 0); // [STRIFE]: new cheat j
cheatseq_t cheat_stealth = CHEAT("gripper", 0); // [STRIFE]: new cheat gripper
cheatseq_t cheat_midas = CHEAT("donnytrump", 0); // [STRIFE]: new cheat
cheatseq_t cheat_lego = CHEAT("lego", 0); // [STRIFE]: new cheat
+cheatseq_t cheat_dev = CHEAT("dots", 0); // [STRIFE]: new cheat
-cheatseq_t cheat_powerup[7] = // STRIFE-TODO
+// haleyjd 20110224: enumeration for access to powerup cheats
+enum
{
- CHEAT("idbeholdv", 0),
- CHEAT("idbeholds", 0),
- CHEAT("idbeholdi", 0),
- CHEAT("idbeholdr", 0),
- CHEAT("idbeholda", 0),
- CHEAT("idbeholdl", 0),
- CHEAT("idbehold", 0),
+ ST_PUMPUP_B,
+ ST_PUMPUP_I,
+ ST_PUMPUP_M,
+ ST_PUMPUP_H,
+ ST_PUMPUP_P,
+ ST_PUMPUP_S,
+ ST_PUMPUP_T,
+ ST_PUMPUP,
+ NUM_ST_PUMPUP
+};
+
+cheatseq_t cheat_powerup[NUM_ST_PUMPUP] = // [STRIFE]
+{
+ CHEAT("pumpupb", 0),
+ CHEAT("pumpupi", 0),
+ CHEAT("pumpupm", 0),
+ CHEAT("pumpuph", 0),
+ CHEAT("pumpupp", 0),
+ CHEAT("pumpups", 0),
+ CHEAT("pumpupt", 0),
+ CHEAT("pumpup", 0),
};
//cheatseq_t cheat_choppers = CHEAT("idchoppers", 0); [STRIFE] no such thing
@@ -481,8 +496,7 @@ boolean ST_Responder(event_t* ev)
else
S_ChangeMusic(musnum, 1);
}
- /*
- // STRIFE-TODO: "dev" cheat - is this the "DOTS" cheat?
+ // [STRIFE]: "dev" cheat - "DOTS"
else if (cht_CheckCheat(&cheat_dev, ev->data2))
{
devparm = !devparm;
@@ -491,7 +505,6 @@ boolean ST_Responder(event_t* ev)
else
plyr->message = DEH_String("devparm OFF");
}
- */
// [STRIFE] Cheats below are not allowed in netgames or demos
if(netgame || !usergame)
@@ -511,46 +524,32 @@ boolean ST_Responder(event_t* ev)
plyr->message = DEH_String(STSTR_DQDON);
}
else
+ {
+ plyr->st_update = true;
plyr->message = DEH_String(STSTR_DQDOFF);
- }
- //
- // STRIFE-TODO: IDFA, IDKFA equivs are unfinished
- //
- else if (cht_CheckCheat(&cheat_ammonokey, ev->data2))
- {
- // 'fa' cheat for killer fucking arsenal
- plyr->armorpoints = deh_idfa_armor;
- plyr->armortype = deh_idfa_armor_class;
-
- for (i=0;i<NUMWEAPONS;i++)
- plyr->weaponowned[i] = true;
-
- for (i=0;i<NUMAMMO;i++)
- plyr->ammo[i] = plyr->maxammo[i];
-
- plyr->message = DEH_String(STSTR_FAADDED);
+ }
}
else if (cht_CheckCheat(&cheat_ammo, ev->data2))
{
- // 'kfa' cheat for key full ammo
+ // [STRIFE]: "BOOMSTIX" cheat for all normal weapons
plyr->armorpoints = deh_idkfa_armor;
plyr->armortype = deh_idkfa_armor_class;
- for (i=0;i<NUMWEAPONS;i++)
- plyr->weaponowned[i] = true;
+ for (i = 0; i < NUMWEAPONS; i++)
+ if(!isdemoversion || weaponinfo[i].availabledemo)
+ plyr->weaponowned[i] = true;
+
+ // Takes away the Sigil, even if you already had it...
+ plyr->weaponowned[wp_sigil] = false;
for (i=0;i<NUMAMMO;i++)
plyr->ammo[i] = plyr->maxammo[i];
- for (i=0;i<NUMCARDS;i++)
- plyr->cards[i] = true;
-
- plyr->message = DEH_String(STSTR_KFAADDED);
+ plyr->message = DEH_String(STSTR_FAADDED);
}
-
- // villsa [STRIFE]
else if(cht_CheckCheat(&cheat_keys, ev->data2))
{
+ // villsa [STRIFE]: "JIMMY" cheat for all keys
#define FIRSTKEYSETAMOUNT 16
if(plyr->cards[FIRSTKEYSETAMOUNT - 1])
@@ -596,10 +595,9 @@ boolean ST_Responder(event_t* ev)
plyr->mo->flags &= ~MF_NOCLIP;
}
}
-
- // villsa [STRIFE]
else if(cht_CheckCheat(&cheat_stealth, ev->data2))
{
+ // villsa [STRIFE]: "GRIPPER" cheat; nothing to do with stealth...
plyr->cheats ^= CF_NOMOMENTUM;
if(plyr->cheats & CF_NOMOMENTUM)
plyr->message = DEH_String("STEALTH BOOTS ON");
@@ -607,82 +605,71 @@ boolean ST_Responder(event_t* ev)
plyr->message = DEH_String("STEALTH BOOTS OFF");
}
-
- //
- // STRIFE-TODO: Fix idbehold equivalent
- //
- for (i=0;i<6;i++)
+ for(i = 0; i < ST_PUMPUP_B + 3; ++i)
{
- // 'behold?' power-up cheats
- if (cht_CheckCheat(&cheat_powerup[i], ev->data2))
+ // [STRIFE]: Handle berserk, invisibility, and envirosuit
+ if(cht_CheckCheat(&cheat_powerup[i], ev->data2))
{
- if (!plyr->powers[i])
- P_GivePower( plyr, i);
- else if (i!=pw_strength)
- plyr->powers[i] = 1;
+ if(plyr->powers[i])
+ plyr->powers[i] = (i != 1);
else
- plyr->powers[i] = 0;
-
+ P_GivePower(plyr, i);
plyr->message = DEH_String(STSTR_BEHOLDX);
}
}
- // STRIFE-TODO:
- if (cht_CheckCheat(&cheat_powerup[6], ev->data2))
- {
- // 'behold' power-up menu
- plyr->message = DEH_String(STSTR_BEHOLD);
- }
-
- //
- // STRIFE-TODO:
- // * Give medical items cheat (what code???)
- // * Ammo cheat
- // * Stats cheat
- // * Unknown power-giving cheat
- /*
- if(cht_CheckCheat(&cheat_meditems, ev->data2))
+ if(cht_CheckCheat(&cheat_powerup[ST_PUMPUP_H], ev->data2))
{
+ // [STRIFE]: PUMPUPH gives medical inventory items
P_GiveItemToPlayer(plyr, SPR_STMP, MT_INV_MED1);
P_GiveItemToPlayer(plyr, SPR_MDKT, MT_INV_MED2);
P_GiveItemToPlayer(plyr, SPR_FULL, MT_INV_MED3);
plyr->message = DEH_String("you got the stuff!");
}
- if (cht_CheckCheat(&off_885E4, ev->data2))
+ if(cht_CheckCheat(&cheat_powerup[ST_PUMPUP_P], ev->data2))
{
+ // [STRIFE]: PUMPUPP gives backpack
if(!plyr->backpack)
{
- for(i = 0; i < NUMAMMO; i++)
+ for(i = 0; i < NUMAMMO; ++i)
plyr->maxammo[i] = 2 * plyr->maxammo[i];
- plyr->backpack = true;
}
- for(i = 0; i < NUMAMMO; i++)
+ plyr->backpack = true;
+
+ for(i = 0; i < NUMAMMO; ++i)
P_GiveAmmo(plyr, i, 1);
plyr->message = DEH_String("you got the stuff!");
}
- if(cht_CheckCheat(&cheat_stats, ev->data2))
+ if(cht_CheckCheat(&cheat_powerup[ST_PUMPUP_S], ev->data2))
{
+ // [STRIFE]: PUMPUPS gives stamina and accuracy upgrades
P_GiveItemToPlayer(plyr, SPR_TOKN, MT_TOKEN_STAMINA);
P_GiveItemToPlayer(plyr, SPR_TOKN, MT_TOKEN_NEW_ACCURACY);
plyr->message = DEH_String("you got the stuff!");
}
- //
- // UNKNOWN POWER GIVING CHEAT HERE...
- //
- */
-
- // STRIFE-TODO: weird isdemoversion check
+ if(cht_CheckCheat(&cheat_powerup[ST_PUMPUP_T], ev->data2))
+ {
+ // [STRIFE] PUMPUPT gives targeter
+ P_GivePower(plyr, pw_targeter);
+ plyr->message = DEH_String("you got the stuff!");
+ }
+ // [STRIFE]: PUMPUP
+ if (cht_CheckCheat(&cheat_powerup[ST_PUMPUP], ev->data2))
+ {
+ // 'behold' power-up menu
+ plyr->message = DEH_String(STSTR_BEHOLD);
+ return false;
+ }
if (cht_CheckCheat(&cheat_mypos, ev->data2))
{
// [STRIFE] 'GPS' for player position
- static char buf[ST_MSGWIDTH];
+ static char buf[ST_MSGWIDTH];
sprintf(buf, "ang=0x%x;x,y=(0x%x,0x%x)",
players[consoleplayer].mo->angle,
players[consoleplayer].mo->x,
players[consoleplayer].mo->y);
plyr->message = buf;
}
-
// 'rift' change-level cheat
if (cht_CheckCheat(&cheat_clev, ev->data2))
@@ -697,6 +684,7 @@ boolean ST_Responder(event_t* ev)
// haleyjd 09/01/10: Removed Chex Quest stuff.
// haleyjd 09/15/10: Removed retail/registered/shareware stuff
+ // STRIFE-TODO: different bounds in v1.31
// Ohmygod - this is not going to work.
if (map <= 0 || map > 40)
return false;
@@ -719,6 +707,7 @@ boolean ST_Responder(event_t* ev)
{
plyr->message = DEH_String("Spawning to spot");
G_RiftCheat(spot);
+ return false;
}
}
@@ -727,6 +716,7 @@ boolean ST_Responder(event_t* ev)
{
stonecold ^= 1;
plyr->message = DEH_String("Kill 'em. Kill 'em All");
+ return false;
}
// villsa [STRIFE]
@@ -737,7 +727,8 @@ boolean ST_Responder(event_t* ev)
}
// villsa [STRIFE]
- if(cht_CheckCheat(&cheat_lego, ev->data2))
+ // haleyjd 20110224: No sigil in demo version
+ if(!isdemoversion && cht_CheckCheat(&cheat_lego, ev->data2))
{
plyr->st_update = true;
if(plyr->weaponowned[wp_sigil])
diff --git a/src/strife/st_stuff.h b/src/strife/st_stuff.h
index 0223108c..34b1146d 100644
--- a/src/strife/st_stuff.h
+++ b/src/strife/st_stuff.h
@@ -88,16 +88,22 @@ typedef enum
boolean ST_Responder(event_t* ev);
extern byte *st_backing_screen;
-extern cheatseq_t cheat_mus;
-extern cheatseq_t cheat_god;
-extern cheatseq_t cheat_ammo;
-extern cheatseq_t cheat_ammonokey;
-extern cheatseq_t cheat_noclip;
-extern cheatseq_t cheat_commercial_noclip;
-extern cheatseq_t cheat_powerup[7];
-extern cheatseq_t cheat_choppers;
-extern cheatseq_t cheat_clev;
-extern cheatseq_t cheat_mypos;
+
+extern cheatseq_t cheat_mus; // [STRIFE]: idmus -> spin
+extern cheatseq_t cheat_god; // [STRIFE]: iddqd -> omnipotent
+extern cheatseq_t cheat_ammo; // [STRIFE]: idfa -> boomstix
+extern cheatseq_t cheat_noclip; // [STRIFE]: idclip -> elvis
+extern cheatseq_t cheat_clev; // [STRIFE]: idclev -> rift
+extern cheatseq_t cheat_mypos; // [STRIFE]: idmypos -> gps
+extern cheatseq_t cheat_scoot; // [STRIFE]: new cheat scoot
+extern cheatseq_t cheat_nuke; // [STRIFE]: new cheat stonecold
+extern cheatseq_t cheat_keys; // [STRIFE]: new cheat jimmy (all keys)
+extern cheatseq_t cheat_stealth; // [STRIFE]: new cheat gripper
+extern cheatseq_t cheat_midas; // [STRIFE]: new cheat
+extern cheatseq_t cheat_lego; // [STRIFE]: new cheat
+extern cheatseq_t cheat_dev; // [STRIFE]: new cheat
+
+extern cheatseq_t cheat_powerup[];
#endif