Add Stone Shoe states

- Cvars
  - stoneshoe
- Items enum
  - KITEM_STONESHOE
  - KDROP_STONESHOETRAP
- Player vars
  - stonedrag (fixed_t)
  - stoneShoe (mobj pointer)
- States
  - S_STON
- Mobjs
  - MT_STONESHOE
  - MT_STONESHOE_CHAIN
- Sprites
  - STON
This commit is contained in:
James R 2025-06-10 16:33:35 -07:00
parent da991e5300
commit 4e6c501888
9 changed files with 103 additions and 1 deletions

View file

@ -686,6 +686,7 @@ consvar_t cv_items[] = {
UnsavedNetVar("droptarget", "On").on_off(), UnsavedNetVar("droptarget", "On").on_off(),
UnsavedNetVar("gardentop", "On").on_off(), UnsavedNetVar("gardentop", "On").on_off(),
UnsavedNetVar("gachabom", "On").on_off(), UnsavedNetVar("gachabom", "On").on_off(),
UnsavedNetVar("stoneshoe", "On").on_off(),
UnsavedNetVar("dualsneaker", "On").on_off(), UnsavedNetVar("dualsneaker", "On").on_off(),
UnsavedNetVar("triplesneaker", "On").on_off(), UnsavedNetVar("triplesneaker", "On").on_off(),
UnsavedNetVar("triplebanana", "On").on_off(), UnsavedNetVar("triplebanana", "On").on_off(),

View file

@ -193,7 +193,8 @@ Run this macro, then #undef FOREACH afterward
FOREACH (KITCHENSINK, 20),\ FOREACH (KITCHENSINK, 20),\
FOREACH (DROPTARGET, 21),\ FOREACH (DROPTARGET, 21),\
FOREACH (GARDENTOP, 22),\ FOREACH (GARDENTOP, 22),\
FOREACH (GACHABOM, 23) FOREACH (GACHABOM, 23),\
FOREACH (STONESHOE, 24)
typedef enum typedef enum
{ {
@ -214,6 +215,8 @@ typedef enum
NUMKARTRESULTS, NUMKARTRESULTS,
KDROP_STONESHOETRAP,
// Power-ups exist in the same enum as items so it's easy // Power-ups exist in the same enum as items so it's easy
// for paper items to be reused for them. // for paper items to be reused for them.
FIRSTPOWERUP, FIRSTPOWERUP,
@ -771,6 +774,7 @@ struct player_t
fixed_t accelboost; // Boost value smoothing for acceleration fixed_t accelboost; // Boost value smoothing for acceleration
fixed_t handleboost; // Boost value smoothing for handling fixed_t handleboost; // Boost value smoothing for handling
angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted. angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted.
fixed_t stonedrag;
fixed_t draftpower; // (0 to FRACUNIT) - Drafting power, doubles your top speed & acceleration at max fixed_t draftpower; // (0 to FRACUNIT) - Drafting power, doubles your top speed & acceleration at max
UINT16 draftleeway; // Leniency timer before removing draft power UINT16 draftleeway; // Leniency timer before removing draft power
@ -1047,6 +1051,7 @@ struct player_t
mobj_t *whip; mobj_t *whip;
mobj_t *hand; mobj_t *hand;
mobj_t *flickyAttacker; mobj_t *flickyAttacker;
mobj_t *stoneShoe;
SINT8 pitblame; // Index of last player that hit you, resets after being in control for a bit. If you deathpit, credit the old attacker! SINT8 pitblame; // Index of last player that hit you, resets after being in control for a bit. If you deathpit, credit the old attacker!

View file

@ -3109,6 +3109,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
// Flybot767 (stun) // Flybot767 (stun)
"S_FLYBOT767", "S_FLYBOT767",
"S_STON",
}; };
// RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1", // RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1",
@ -4009,6 +4011,9 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_AMPS", "MT_AMPS",
"MT_FLYBOT767", "MT_FLYBOT767",
"MT_STONESHOE",
"MT_STONESHOE_CHAIN",
}; };
const char *const MOBJFLAG_LIST[] = { const char *const MOBJFLAG_LIST[] = {
@ -5194,6 +5199,7 @@ struct int_const_s const INT_CONST[] = {
{"KRITEM_DUALJAWZ",KRITEM_DUALJAWZ}, {"KRITEM_DUALJAWZ",KRITEM_DUALJAWZ},
{"KRITEM_TRIPLEGACHABOM",KRITEM_TRIPLEGACHABOM}, {"KRITEM_TRIPLEGACHABOM",KRITEM_TRIPLEGACHABOM},
{"NUMKARTRESULTS",NUMKARTRESULTS}, {"NUMKARTRESULTS",NUMKARTRESULTS},
{"KDROP_STONESHOETRAP",KDROP_STONESHOETRAP},
{"FIRSTPOWERUP",FIRSTPOWERUP}, {"FIRSTPOWERUP",FIRSTPOWERUP},
{"POWERUP_SMONITOR",POWERUP_SMONITOR}, {"POWERUP_SMONITOR",POWERUP_SMONITOR},
{"POWERUP_BARRIER",POWERUP_BARRIER}, {"POWERUP_BARRIER",POWERUP_BARRIER},

View file

@ -792,6 +792,8 @@ char sprnames[NUMSPRITES + 1][5] =
// Flybot767 (stun) // Flybot767 (stun)
"STUN", "STUN",
"STON",
// Pulley // Pulley
"HCCH", "HCCH",
"HCHK", "HCHK",
@ -3680,6 +3682,8 @@ state_t states[NUMSTATES] =
// Flybot767 (stun) // Flybot767 (stun)
{SPR_STUN, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 4, 4, S_NULL}, // S_FLYBOT767 {SPR_STUN, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 4, 4, S_NULL}, // S_FLYBOT767
{SPR_STON, 0, -1, {NULL}, 0, 0, S_STON}, // S_STON
}; };
mobjinfo_t mobjinfo[NUMMOBJTYPES] = mobjinfo_t mobjinfo[NUMMOBJTYPES] =
@ -22529,6 +22533,58 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING, // flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING, // flags
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_STONESHOE
-1, // doomednum
S_STON, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // 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_pop, // deathsound
4*FRACUNIT, // speed
64*FRACUNIT, // radius
64*FRACUNIT, // height
0, // dispoffset
0, // mass
0, // damage
sfx_None, // activesound
MF_SOLID|MF_NOSQUISH|MF_NOHITLAGFORME|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_STONESHOE_CHAIN
-1, // doomednum
S_SHRINK_CHAIN, // 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
0, // speed
32*FRACUNIT, // radius
64*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_PICKUPFROMBELOW|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
}; };

View file

@ -1329,6 +1329,8 @@ typedef enum sprite
// Flybot767 (stun) // Flybot767 (stun)
SPR_STUN, SPR_STUN,
SPR_STON,
// Pulley // Pulley
SPR_HCCH, SPR_HCCH,
SPR_HCHK, SPR_HCHK,
@ -4167,6 +4169,8 @@ typedef enum state
// Flybot767 (stun) // Flybot767 (stun)
S_FLYBOT767, S_FLYBOT767,
S_STON,
S_FIRSTFREESLOT, S_FIRSTFREESLOT,
S_LASTFREESLOT = S_FIRSTFREESLOT + NUMSTATEFREESLOTS - 1, S_LASTFREESLOT = S_FIRSTFREESLOT + NUMSTATEFREESLOTS - 1,
NUMSTATES NUMSTATES
@ -5090,6 +5094,9 @@ typedef enum mobj_type
MT_FLYBOT767, MT_FLYBOT767,
MT_STONESHOE,
MT_STONESHOE_CHAIN,
MT_FIRSTFREESLOT, MT_FIRSTFREESLOT,
MT_LASTFREESLOT = MT_FIRSTFREESLOT + NUMMOBJFREESLOTS - 1, MT_LASTFREESLOT = MT_FIRSTFREESLOT + NUMMOBJFREESLOTS - 1,
NUMMOBJTYPES NUMMOBJTYPES

View file

@ -171,6 +171,7 @@ static patch_t *kp_kitchensink[3];
static patch_t *kp_droptarget[3]; static patch_t *kp_droptarget[3];
static patch_t *kp_gardentop[3]; static patch_t *kp_gardentop[3];
static patch_t *kp_gachabom[3]; static patch_t *kp_gachabom[3];
static patch_t *kp_stoneshoe[3];
static patch_t *kp_bar[2]; static patch_t *kp_bar[2];
static patch_t *kp_doublebar[2]; static patch_t *kp_doublebar[2];
static patch_t *kp_triplebar[2]; static patch_t *kp_triplebar[2];
@ -639,6 +640,7 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_droptarget[0], "K_ITDTRG"); HU_UpdatePatch(&kp_droptarget[0], "K_ITDTRG");
HU_UpdatePatch(&kp_gardentop[0], "K_ITGTOP"); HU_UpdatePatch(&kp_gardentop[0], "K_ITGTOP");
HU_UpdatePatch(&kp_gachabom[0], "K_ITGBOM"); HU_UpdatePatch(&kp_gachabom[0], "K_ITGBOM");
HU_UpdatePatch(&kp_stoneshoe[0], "K_ITSTON");
HU_UpdatePatch(&kp_bar[0], "K_RBBAR"); HU_UpdatePatch(&kp_bar[0], "K_RBBAR");
HU_UpdatePatch(&kp_doublebar[0], "K_RBBAR2"); HU_UpdatePatch(&kp_doublebar[0], "K_RBBAR2");
HU_UpdatePatch(&kp_triplebar[0], "K_RBBAR3"); HU_UpdatePatch(&kp_triplebar[0], "K_RBBAR3");
@ -699,6 +701,7 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_droptarget[1], "K_ISDTRG"); HU_UpdatePatch(&kp_droptarget[1], "K_ISDTRG");
HU_UpdatePatch(&kp_gardentop[1], "K_ISGTOP"); HU_UpdatePatch(&kp_gardentop[1], "K_ISGTOP");
HU_UpdatePatch(&kp_gachabom[1], "K_ISGBOM"); HU_UpdatePatch(&kp_gachabom[1], "K_ISGBOM");
HU_UpdatePatch(&kp_stoneshoe[1], "K_ISSTON");
HU_UpdatePatch(&kp_bar[1], "K_SBBAR"); HU_UpdatePatch(&kp_bar[1], "K_SBBAR");
HU_UpdatePatch(&kp_doublebar[1], "K_SBBAR2"); HU_UpdatePatch(&kp_doublebar[1], "K_SBBAR2");
HU_UpdatePatch(&kp_triplebar[1], "K_SBBAR3"); HU_UpdatePatch(&kp_triplebar[1], "K_SBBAR3");
@ -757,6 +760,7 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_droptarget[2], "ISPYDTRG"); HU_UpdatePatch(&kp_droptarget[2], "ISPYDTRG");
HU_UpdatePatch(&kp_gardentop[2], "ISPYGTOP"); HU_UpdatePatch(&kp_gardentop[2], "ISPYGTOP");
HU_UpdatePatch(&kp_gachabom[2], "ISPYGBOM"); HU_UpdatePatch(&kp_gachabom[2], "ISPYGBOM");
HU_UpdatePatch(&kp_stoneshoe[2], "ISPYSTON");
// CHECK indicators // CHECK indicators
sprintf(buffer, "K_CHECKx"); sprintf(buffer, "K_CHECKx");
@ -1177,6 +1181,7 @@ static patch_t *K_GetCachedItemPatch(INT32 item, UINT8 offset)
kp_droptarget, kp_droptarget,
kp_gardentop, kp_gardentop,
kp_gachabom, kp_gachabom,
kp_stoneshoe,
}; };
if (item == KITEM_SAD || (item > KITEM_NONE && item < NUMKARTITEMS)) if (item == KITEM_SAD || (item > KITEM_NONE && item < NUMKARTITEMS))

View file

@ -15446,6 +15446,10 @@ void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount)
part->sprite = SPR_ITEM; part->sprite = SPR_ITEM;
part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE; part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE;
break; break;
case KDROP_STONESHOETRAP:
part->sprite = SPR_STON;
part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|4;
break;
default: default:
if (itemType >= FIRSTPOWERUP) if (itemType >= FIRSTPOWERUP)
{ {

View file

@ -92,6 +92,7 @@ typedef enum
TRICKINDICATOR = 0x2000, TRICKINDICATOR = 0x2000,
BARRIER = 0x4000, BARRIER = 0x4000,
BALLHOGRETICULE = 0x8000, BALLHOGRETICULE = 0x8000,
STONESHOE = 0x10000,
} player_saveflags; } player_saveflags;
static inline void P_ArchivePlayer(savebuffer_t *save) static inline void P_ArchivePlayer(savebuffer_t *save)
@ -364,6 +365,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
if (players[i].powerup.barrier) if (players[i].powerup.barrier)
flags |= BARRIER; flags |= BARRIER;
if (players[i].stoneShoe)
flags |= STONESHOE;
WRITEUINT32(save->p, flags); WRITEUINT32(save->p, flags);
if (flags & SKYBOXVIEW) if (flags & SKYBOXVIEW)
@ -411,6 +415,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
if (flags & BARRIER) if (flags & BARRIER)
WRITEUINT32(save->p, players[i].powerup.barrier->mobjnum); WRITEUINT32(save->p, players[i].powerup.barrier->mobjnum);
if (flags & STONESHOE)
WRITEUINT32(save->p, players[i].stoneShoe->mobjnum);
WRITEUINT32(save->p, (UINT32)players[i].followitem); WRITEUINT32(save->p, (UINT32)players[i].followitem);
WRITEUINT32(save->p, players[i].charflags); WRITEUINT32(save->p, players[i].charflags);
@ -499,6 +506,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEFIXED(save->p, players[i].accelboost); WRITEFIXED(save->p, players[i].accelboost);
WRITEFIXED(save->p, players[i].handleboost); WRITEFIXED(save->p, players[i].handleboost);
WRITEANGLE(save->p, players[i].boostangle); WRITEANGLE(save->p, players[i].boostangle);
WRITEFIXED(save->p, players[i].stonedrag);
WRITEFIXED(save->p, players[i].draftpower); WRITEFIXED(save->p, players[i].draftpower);
WRITEUINT16(save->p, players[i].draftleeway); WRITEUINT16(save->p, players[i].draftleeway);
@ -1058,6 +1066,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
if (flags & BARRIER) if (flags & BARRIER)
players[i].powerup.barrier = (mobj_t *)(size_t)READUINT32(save->p); players[i].powerup.barrier = (mobj_t *)(size_t)READUINT32(save->p);
if (flags & STONESHOE)
players[i].stoneShoe = (mobj_t *)(size_t)READUINT32(save->p);
players[i].followitem = (mobjtype_t)READUINT32(save->p); players[i].followitem = (mobjtype_t)READUINT32(save->p);
//SetPlayerSkinByNum(i, players[i].skin); //SetPlayerSkinByNum(i, players[i].skin);
@ -1147,6 +1158,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].accelboost = READFIXED(save->p); players[i].accelboost = READFIXED(save->p);
players[i].handleboost = READFIXED(save->p); players[i].handleboost = READFIXED(save->p);
players[i].boostangle = READANGLE(save->p); players[i].boostangle = READANGLE(save->p);
players[i].stonedrag = READFIXED(save->p);
players[i].draftpower = READFIXED(save->p); players[i].draftpower = READFIXED(save->p);
players[i].draftleeway = READUINT16(save->p); players[i].draftleeway = READUINT16(save->p);
@ -6218,6 +6230,11 @@ static void P_RelinkPointers(void)
if (!RelinkMobj(&players[i].powerup.barrier)) if (!RelinkMobj(&players[i].powerup.barrier))
CONS_Debug(DBG_GAMELOGIC, "powerup.barrier not found on player %d\n", i); CONS_Debug(DBG_GAMELOGIC, "powerup.barrier not found on player %d\n", i);
} }
if (players[i].stoneShoe)
{
if (!RelinkMobj(&players[i].stoneShoe))
CONS_Debug(DBG_GAMELOGIC, "stoneShoe not found on player %d\n", i);
}
} }
} }

View file

@ -4241,6 +4241,7 @@ void P_PlayerThink(player_t *player)
PlayerPointerErase(player->hoverhyudoro); PlayerPointerErase(player->hoverhyudoro);
PlayerPointerErase(player->ballhogreticule); PlayerPointerErase(player->ballhogreticule);
PlayerPointerErase(player->flickyAttacker); PlayerPointerErase(player->flickyAttacker);
PlayerPointerErase(player->stoneShoe);
PlayerPointerErase(player->powerup.flickyController); PlayerPointerErase(player->powerup.flickyController);
PlayerPointerErase(player->powerup.barrier); PlayerPointerErase(player->powerup.barrier);