Hardcode Joypolis trick balloons

This commit is contained in:
Eidolon 2024-01-05 17:08:15 -06:00
parent 0f468c4634
commit 61db93db0c
8 changed files with 310 additions and 2 deletions

View file

@ -4899,6 +4899,38 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
// MT_EMFAUCET_PARTICLE
"S_EMFAUCET_PARTICLE",
// MT_TRICKBALLOON_RED
"S_TRICKBALLOON_RED1",
"S_TRICKBALLOON_RED2",
"S_TRICKBALLOON_RED_POP1",
"S_TRICKBALLOON_RED_POP2",
"S_TRICKBALLOON_RED_POP3",
"S_TRICKBALLOON_RED_GONE",
"S_TRICKBALLOON_RED_INFLATE1",
"S_TRICKBALLOON_RED_INFLATE2",
"S_TRICKBALLOON_RED_INFLATE3",
"S_TRICKBALLOON_RED_INFLATE4",
"S_TRICKBALLOON_RED_INFLATE5",
// MT_TRICKBALLOON_RED_POINT
"S_TRICKBALLOON_RED_POINT1",
// MT_TRICKBALLOON_YELLOW
"S_TRICKBALLOON_YELLOW1",
"S_TRICKBALLOON_YELLOW2",
"S_TRICKBALLOON_YELLOW_POP1",
"S_TRICKBALLOON_YELLOW_POP2",
"S_TRICKBALLOON_YELLOW_POP3",
"S_TRICKBALLOON_YELLOW_GONE",
"S_TRICKBALLOON_YELLOW_INFLATE1",
"S_TRICKBALLOON_YELLOW_INFLATE2",
"S_TRICKBALLOON_YELLOW_INFLATE3",
"S_TRICKBALLOON_YELLOW_INFLATE4",
"S_TRICKBALLOON_YELLOW_INFLATE5",
// MT_TRICKBALLOON_YELLOW_POINT
"S_TRICKBALLOON_YELLOW_POINT1",
};
// RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1",
@ -6161,6 +6193,11 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_EMFAUCET_DRIP",
"MT_EMFAUCET_PARTICLE",
"MT_EMRAINGEN",
"MT_TRICKBALLOON_RED",
"MT_TRICKBALLOON_RED_POINT",
"MT_TRICKBALLOON_YELLOW",
"MT_TRICKBALLOON_YELLOW_POINT",
};
const char *const MOBJFLAG_LIST[] = {

View file

@ -1015,6 +1015,10 @@ char sprnames[NUMSPRITES + 1][5] =
"EMR3",
"EMFC",
// Joypolis Trick Balloons
"TKBR",
"TKBY",
// First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later
"VIEW",
};
@ -5774,6 +5778,38 @@ state_t states[NUMSTATES] =
// MT_EMFAUCET_PARTICLE
{SPR_EMFC, 2, -1, {NULL}, 0, 0, S_EMFAUCET_PARTICLE}, // S_EMFAUCET_PARTICLE
// MT_TRICKBALLOON_RED
{SPR_TKBR, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED2}, // S_TRICKBALLOON_RED1
{SPR_TKBR, 1, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED1},
{SPR_TKBR, 2, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_POP2}, // S_TRICKBALLOON_RED_POP1
{SPR_TKBR, 3, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_POP3},
{SPR_TKBR, 4, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_GONE},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_INFLATE1}, // S_TRICKBALLOON_RED_GONE
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_INFLATE2}, // S_TRICKBALLOON_RED_INFLATE1
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_INFLATE3},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_INFLATE4},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED_INFLATE5},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_RED1},
// MT_TRICKBALLOON_RED_POINT
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_TRICKBALLOON_RED_POINT1}, // S_TRICKBALLOON_RED_POINT1
// MT_TRICKBALLOON_YELLOW
{SPR_TKBY, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW2}, // S_TRICKBALLOON_YELLOW1
{SPR_TKBY, 1, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW1},
{SPR_TKBY, 2, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_POP2}, // S_TRICKBALLOON_YELLOW_POP1
{SPR_TKBY, 3, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_POP3},
{SPR_TKBY, 4, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_GONE},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_INFLATE1}, // S_TRICKBALLOON_YELLOW_GONE
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_INFLATE2}, // S_TRICKBALLOON_YELLOW_INFLATE1
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_INFLATE3},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_INFLATE4},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_INFLATE5},
{SPR_NULL, 0, 2, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW1},
// MT_TRICKBALLOON_YELLOW_POINT
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_POINT1}, // S_TRICKBALLOON_YELLOW_POINT1
};
mobjinfo_t mobjinfo[NUMMOBJTYPES] =
@ -33052,6 +33088,110 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MF_NOGRAVITY|MF_NOBLOCKMAP|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_TRICKBALLOON_RED
2764, // doomednum
S_TRICKBALLOON_RED1, // spawnstate
1, // 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_s3k77, // deathsound
0, // speed
96*FRACUNIT, // radius
128*FRACUNIT, // height
0, // dispoffset
0, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_TRICKBALLOON_RED_POINT
-1, // doomednum
S_TRICKBALLOON_RED_POINT1, // spawnstate
1, // 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_None, // deathsound
0, // speed
32*FRACUNIT, // radius
64*FRACUNIT, // height
0, // dispoffset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_TRICKBALLOON_YELLOW
2765, // doomednum
S_TRICKBALLOON_YELLOW1, // spawnstate
1, // 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_s3k77, // deathsound
0, // speed
96*FRACUNIT, // radius
128*FRACUNIT, // height
0, // dispoffset
0, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_TRICKBALLOON_YELLOW_POINT
-1, // doomednum
S_TRICKBALLOON_YELLOW_POINT1, // spawnstate
1, // 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_None, // deathsound
0, // speed
32*FRACUNIT, // radius
64*FRACUNIT, // height
0, // dispoffset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY, // flags
S_NULL // raisestate
},
};

View file

@ -1569,6 +1569,10 @@ typedef enum sprite
SPR_EMR3,
SPR_EMFC,
// Joypolis Trick Balloon
SPR_TKBR,
SPR_TKBY,
// First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later
SPR_VIEW,
@ -6199,6 +6203,38 @@ typedef enum state
// MT_EMFAUCET_PARTICLE
S_EMFAUCET_PARTICLE,
// MT_TRICKBALLOON_RED
S_TRICKBALLOON_RED1,
S_TRICKBALLOON_RED2,
S_TRICKBALLOON_RED_POP1,
S_TRICKBALLOON_RED_POP2,
S_TRICKBALLOON_RED_POP3,
S_TRICKBALLOON_RED_GONE,
S_TRICKBALLOON_RED_INFLATE1,
S_TRICKBALLOON_RED_INFLATE2,
S_TRICKBALLOON_RED_INFLATE3,
S_TRICKBALLOON_RED_INFLATE4,
S_TRICKBALLOON_RED_INFLATE5,
// MT_TRICKBALLOON_RED_POINT
S_TRICKBALLOON_RED_POINT1,
// MT_TRICKBALLOON_YELLOW
S_TRICKBALLOON_YELLOW1,
S_TRICKBALLOON_YELLOW2,
S_TRICKBALLOON_YELLOW_POP1,
S_TRICKBALLOON_YELLOW_POP2,
S_TRICKBALLOON_YELLOW_POP3,
S_TRICKBALLOON_YELLOW_GONE,
S_TRICKBALLOON_YELLOW_INFLATE1,
S_TRICKBALLOON_YELLOW_INFLATE2,
S_TRICKBALLOON_YELLOW_INFLATE3,
S_TRICKBALLOON_YELLOW_INFLATE4,
S_TRICKBALLOON_YELLOW_INFLATE5,
// MT_TRICKBALLOON_YELLOW_POINT
S_TRICKBALLOON_YELLOW_POINT1,
S_FIRSTFREESLOT,
S_LASTFREESLOT = S_FIRSTFREESLOT + NUMSTATEFREESLOTS - 1,
NUMSTATES
@ -7481,6 +7517,11 @@ typedef enum mobj_type
MT_EMFAUCET_PARTICLE,
MT_EMRAINGEN,
MT_TRICKBALLOON_RED,
MT_TRICKBALLOON_RED_POINT,
MT_TRICKBALLOON_YELLOW,
MT_TRICKBALLOON_YELLOW_POINT,
MT_FIRSTFREESLOT,
MT_LASTFREESLOT = MT_FIRSTFREESLOT + NUMMOBJFREESLOTS - 1,
NUMMOBJTYPES

View file

@ -354,6 +354,10 @@ void Obj_EMZFaucetThink(mobj_t *mo);
void Obj_EMZDripDeath(mobj_t *mo);
void Obj_EMZRainGenerator(mobj_t *mo);
/* Joypolis Trick Balloons */
void Obj_TrickBalloonMobjSpawn(mobj_t* mobj);
void Obj_TrickBalloonTouchSpecial(mobj_t* special, mobj_t* toucher);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -49,6 +49,7 @@ target_sources(SRB2SDL2 PRIVATE
fuel.cpp
rocks.cpp
emz-faucet.cpp
trick-balloon.c
)
add_subdirectory(versus)

View file

@ -0,0 +1,76 @@
// DR. ROBOTNIK'S RING RACERS
//-------------------------------
// Copyright (C) 2024 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \brief Joypolis Trick Balloons
#include "../info.h"
#include "../doomdef.h"
#include "../g_game.h"
#include "../p_local.h"
#include "../k_kart.h"
#include "../k_objects.h"
#include "../s_sound.h"
void Obj_TrickBalloonMobjSpawn(mobj_t* mobj)
{
mobjtype_t spawntype;
switch (mobj->type)
{
case MT_TRICKBALLOON_RED:
spawntype = MT_TRICKBALLOON_RED_POINT;
break;
case MT_TRICKBALLOON_YELLOW:
spawntype = MT_TRICKBALLOON_YELLOW_POINT;
break;
default:
return;
}
P_SpawnMobj(mobj->x, mobj->y, mobj->z, spawntype);
}
void Obj_TrickBalloonTouchSpecial(mobj_t* special, mobj_t* toucher)
{
if (special->state == &states[S_TRICKBALLOON_RED1] || special->state == &states[S_TRICKBALLOON_RED2])
{
fixed_t vspeed = 32 << FRACBITS;
if (toucher->player && toucher->player)
{
toucher->player->trickpanel = 1;
toucher->player->pflags |= PF_TRICKDELAY;
toucher->player->tricktime = 0;
}
K_DoPogoSpring(toucher, vspeed, 0);
P_InstaThrust(toucher, toucher->angle, 42 * special->scale);
S_StartSound(special, special->info->deathsound);
P_SetMobjState(special, S_TRICKBALLOON_RED_POP1);
return;
}
if (special->state == &states[S_TRICKBALLOON_YELLOW1] || special->state == &states[S_TRICKBALLOON_YELLOW2])
{
fixed_t vspeed = 16 << FRACBITS;
if (toucher->player && toucher->player)
{
toucher->player->trickpanel = 1;
toucher->player->pflags |= PF_TRICKDELAY;
toucher->player->tricktime = 0;
}
K_DoPogoSpring(toucher, vspeed, 0);
P_InstaThrust(toucher, toucher->angle, 42 * special->scale);
S_StartSound(special, special->info->deathsound);
P_SetMobjState(special, S_TRICKBALLOON_YELLOW_POP1);
return;
}
}

View file

@ -1015,6 +1015,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return;
}
case MT_TRICKBALLOON_RED:
case MT_TRICKBALLOON_YELLOW:
Obj_TrickBalloonTouchSpecial(special, toucher);
return;
default: // SOC or script pickup
P_SetTarget(&special->target, toucher);
break;
@ -1154,7 +1159,7 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source)
UINT16 bonustime = 10*TICRATE;
INT16 clamptime = 0; // Don't allow reserve time past this value (by much)...
INT16 mintime = 5*TICRATE; // But give SOME reward for every hit. (This value used for Normal)
if (grandprixinfo.gp)
{
if (grandprixinfo.masterbots)
@ -3200,7 +3205,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
// Reduce the value of subsequent invinc extensions
kinvextend = kinvextend / (1 + source->player->invincibilityextensions); // 50%, 33%, 25%[...]
kinvextend = max(kinvextend, TICRATE);
source->player->invincibilityextensions++;
source->player->invincibilitytimer += kinvextend;

View file

@ -11838,6 +11838,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
case MT_EMROCKS:
Obj_LinkRocks(mobj);
break;
case MT_TRICKBALLOON_RED:
case MT_TRICKBALLOON_YELLOW:
Obj_TrickBalloonMobjSpawn(mobj);
break;
default:
break;
}