From 61db93db0c57220d757cd323100449f78b0e8bf7 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Fri, 5 Jan 2024 17:08:15 -0600 Subject: [PATCH] Hardcode Joypolis trick balloons --- src/deh_tables.c | 37 ++++++++++ src/info.c | 140 ++++++++++++++++++++++++++++++++++++ src/info.h | 41 +++++++++++ src/k_objects.h | 4 ++ src/objects/CMakeLists.txt | 1 + src/objects/trick-balloon.c | 76 ++++++++++++++++++++ src/p_inter.c | 9 ++- src/p_mobj.c | 4 ++ 8 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 src/objects/trick-balloon.c diff --git a/src/deh_tables.c b/src/deh_tables.c index 116a69770..68b3c3f87 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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[] = { diff --git a/src/info.c b/src/info.c index bd6415f91..aed6dc8b0 100644 --- a/src/info.c +++ b/src/info.c @@ -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 + }, }; diff --git a/src/info.h b/src/info.h index 71c103b7b..17762d8db 100644 --- a/src/info.h +++ b/src/info.h @@ -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 diff --git a/src/k_objects.h b/src/k_objects.h index 3c68594c9..c7cdf19bd 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -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 diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index f920b7d78..d6b1798fd 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -49,6 +49,7 @@ target_sources(SRB2SDL2 PRIVATE fuel.cpp rocks.cpp emz-faucet.cpp + trick-balloon.c ) add_subdirectory(versus) diff --git a/src/objects/trick-balloon.c b/src/objects/trick-balloon.c new file mode 100644 index 000000000..e0a65f426 --- /dev/null +++ b/src/objects/trick-balloon.c @@ -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; + } +} diff --git a/src/p_inter.c b/src/p_inter.c index 164cec39c..291d5a948 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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; diff --git a/src/p_mobj.c b/src/p_mobj.c index 85c2f2259..b4288f4b7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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; }