From 29234d8f20f0450c153e1711c1a83f27e99d3aa7 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 26 May 2025 14:45:55 -0700 Subject: [PATCH 1/2] Add A_GenericBumper, hardcoded generic version of some bumper object scripts --- src/deh_tables.c | 1 + src/info.h | 2 ++ src/p_enemy.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ src/p_map.c | 14 ++++++++++++- 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 2d92aac06..e115287c8 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -297,6 +297,7 @@ actionpointer_t actionpointers[] = {{A_MakeSSCandle}, "A_MAKESSCANDLE"}, {{A_HologramRandomTranslucency}, "A_HOLOGRAMRANDOMTRANSLUCENCY"}, {{A_SSChainShatter}, "A_SSCHAINSHATTER"}, + {{A_GenericBumper}, "A_GENERICBUMPER"}, {{NULL}, "NONE"}, diff --git a/src/info.h b/src/info.h index d7495e852..2be47f164 100644 --- a/src/info.h +++ b/src/info.h @@ -289,6 +289,7 @@ enum actionnum A_MAKESSCANDLE, A_HOLOGRAMRANDOMTRANSLUCENCY, A_SSCHAINSHATTER, + A_GENERICBUMPER, NUMACTIONS }; @@ -557,6 +558,7 @@ void A_BlendEyePuyoHack(); void A_MakeSSCandle(); void A_HologramRandomTranslucency(); void A_SSChainShatter(); +void A_GenericBumper(); extern boolean actionsoverridden[NUMACTIONS]; diff --git a/src/p_enemy.c b/src/p_enemy.c index de957c0c4..3006b7369 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -321,6 +321,7 @@ void A_BlendEyePuyoHack(mobj_t *actor); void A_MakeSSCandle(mobj_t *actor); void A_HologramRandomTranslucency(mobj_t *actor); void A_SSChainShatter(mobj_t *actor); +void A_GenericBumper(mobj_t *actor); //for p_enemy.c @@ -12668,3 +12669,54 @@ void A_SSChainShatter(mobj_t* actor) actor->fuse = 1; } + +// var1 = If -1, triggered by collision event +// var2 = Strength value +// +// mobjinfo dependencies: +// - deathsound - bumper noise +// - seestate - bumper flashing state +// +void A_GenericBumper(mobj_t* actor) +{ + if (var1 != -1) + return; + + mobj_t *other = actor->target; + + if (!other) + return; + + // This code was ported from Lua + // Original was Balloon Park's bumpers? + INT32 hang = R_PointToAngle2( + actor->x, actor->y, + other->x, other->y + ); + + INT32 vang = 0; + + if (!P_IsObjectOnGround(other)) + { + vang = R_PointToAngle2( + FixedHypot(actor->x, actor->y), actor->z + (actor->height / 2), + FixedHypot(other->x, other->y), other->z + (other->height / 2) + ); + } + + INT32 baseStrength = abs(astate->var2); + fixed_t strength = (baseStrength * actor->scale) / 2; + + other->momx = FixedMul(FixedMul(strength, FCOS(hang)), abs(FCOS(vang))); + other->momy = FixedMul(FixedMul(strength, FSIN(hang)), abs(FCOS(vang))); + other->momz = FixedMul(strength, FSIN(vang)); + + if (other->player) + K_SetTireGrease(other->player, max(other->player->tiregrease, 2*TICRATE)); + + if (actor->state != &states[actor->info->seestate]) + { + S_StartSound(actor, actor->info->deathsound); + P_SetMobjState(actor, actor->info->seestate); + } +} diff --git a/src/p_map.c b/src/p_map.c index bdec595d7..07090967f 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1552,7 +1552,19 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (!K_PuntCollide(thing, g_tm.thing)) { - K_KartSolidBounce(g_tm.thing, thing); + state_t *st = &states[thing->info->spawnstate]; + + if (st->action.acp1 == A_GenericBumper) + { + P_SetTarget(&thing->target, g_tm.thing); + + var1 = -1; + var2 = 0; + astate = st; + st->action.acp1(thing); + } + else + K_KartSolidBounce(g_tm.thing, thing); } return BMIT_CONTINUE; } From 465387c69e2966698485f8860070a75ef12106a3 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 26 May 2025 14:56:44 -0700 Subject: [PATCH 2/2] MT_SEALEDSTAR_BUMPER: use A_GenericBumper --- src/info.c | 4 +-- src/k_objects.h | 1 - src/objects/sealed-star.c | 52 --------------------------------------- src/p_inter.c | 4 --- 4 files changed, 2 insertions(+), 59 deletions(-) diff --git a/src/info.c b/src/info.c index 59c252880..d017dda40 100644 --- a/src/info.c +++ b/src/info.c @@ -3640,7 +3640,7 @@ state_t states[NUMSTATES] = {SPR_S_SP, FF_ANIMATE|FF_SEMIBRIGHT, -1, {NULL}, 3, 2, S_NULL}, // S_SLSTMACE // MT_SEALEDSTAR_BUMPER - {SPR_SBMP, 0|FF_FULLBRIGHT, -1, {NULL}, 2, 8, S_SEALEDSTAR_BUMPER}, // S_SEALEDSTAR_BUMPER + {SPR_SBMP, 0|FF_FULLBRIGHT, -1, {A_GenericBumper}, 0, 56, S_SEALEDSTAR_BUMPER}, // S_SEALEDSTAR_BUMPER {SPR_SBMP, 1|FF_ANIMATE|FF_FULLBRIGHT, 8, {NULL}, 1, 2, S_SEALEDSTAR_BUMPER}, // S_SEALEDSTAR_BUMPERHIT // MT_SSCHAIN_SPAWNER @@ -22233,7 +22233,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_NOGRAVITY, // flags + MF_NOGRAVITY|MF_SOLID, // flags S_NULL // raisestate }, { // MT_SSCHAIN_SPAWNER diff --git a/src/k_objects.h b/src/k_objects.h index cbdb189a7..c6cc64db9 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -411,7 +411,6 @@ void Obj_SSGobletMobjThink(mobj_t* mo); void Obj_SSLampMapThingSpawn(mobj_t* mo, mapthing_t* mt); void Obj_SSWindowMapThingSpawn(mobj_t* mo, mapthing_t* mt); void Obj_SLSTMaceMobjThink(mobj_t* mo); -void Obj_SSBumperTouchSpecial(mobj_t* special, mobj_t* toucher); void Obj_SSBumperMobjSpawn(mobj_t* mo); void Obj_SSChainMobjThink(mobj_t* mo); void Obj_SSGachaTargetMobjSpawn(mobj_t* mo); diff --git a/src/objects/sealed-star.c b/src/objects/sealed-star.c index ccf136800..2ee16a6fd 100644 --- a/src/objects/sealed-star.c +++ b/src/objects/sealed-star.c @@ -542,58 +542,6 @@ void Obj_SLSTMaceMobjThink(mobj_t* mo) } } -#define BUMPER_STRENGTH (56) - -void Obj_SSBumperTouchSpecial(mobj_t* special, mobj_t* toucher) -{ - angle_t hang; - angle_t vang; - fixed_t str; - int i; - - hang = R_PointToAngle2(special->x, special->y, toucher->x, toucher->y); - vang = 0; - - if (P_IsObjectOnGround(toucher) == false) - { - vang = R_PointToAngle2( - FixedHypot(special->x, special->y), special->z + (special->height >> 1), - FixedHypot(toucher->x, toucher->y), toucher->z + (toucher->height >> 1) - ); - } - - str = (BUMPER_STRENGTH * special->scale) >> 1; - - toucher->momx = FixedMul(FixedMul(str, FCOS(hang)), abs(FCOS(vang))); - toucher->momy = FixedMul(FixedMul(str, FSIN(hang)), abs(FCOS(vang))); - toucher->momz = FixedMul(str, FSIN(vang)); - - if (toucher->player) - { - if (toucher->player->tiregrease == 0) - { - for (i = 0; i < 2; i++) - { - mobj_t *grease = P_SpawnMobjFromMobj(toucher, 0, 0, 0, MT_TIREGREASE); - P_SetTarget(&grease->target, toucher); - grease->angle = toucher->angle; - grease->extravalue1 = i; - } - } - - if (toucher->player->tiregrease < 2*TICRATE) // greasetics - { - toucher->player->tiregrease = 2*TICRATE; - } - } - - if (special->state != &states[special->info->seestate]) - { - S_StartSound(special, special->info->deathsound); - P_SetMobjState(special, special->info->seestate); - } -} - void Obj_SSBumperMobjSpawn(mobj_t* mo) { mo->shadowscale = FRACUNIT; diff --git a/src/p_inter.c b/src/p_inter.c index 2df953dec..ff2b90ed1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1083,10 +1083,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) Obj_TrickBalloonTouchSpecial(special, toucher); return; - case MT_SEALEDSTAR_BUMPER: - Obj_SSBumperTouchSpecial(special, toucher); - return; - case MT_PULLUPHOOK: Obj_PulleyHookTouch(special, toucher); return;