From e2ac69824732ddef41c0c0aa33fe529f61b36ea4 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 27 May 2022 17:51:47 -0400 Subject: [PATCH 1/3] Make Ballhog more interesting - No more instant fuck you button. You charge up a meter instead by holding down attack, and let go to fire as many as you charged up. Tapping fires one out of five, holding for the entire duration shoots out all five like before, but anything inbetween is also possible. - Ballhog projectiles scale up over time (like Contra spread shot), to help make it stronger again after players started getting faster. --- src/d_player.h | 6 +- src/k_hud.c | 10 ++++ src/k_kart.c | 134 +++++++++++++++++++++++++++----------------- src/k_kart.h | 2 +- src/lua_playerlib.c | 4 ++ src/p_inter.c | 2 +- src/p_mobj.c | 3 + src/p_saveg.c | 4 ++ 8 files changed, 111 insertions(+), 54 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index c6328c3ca..9b5ba4cca 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -259,6 +259,8 @@ typedef enum #define TUMBLEBOUNCES 3 +#define BALLHOGINCREMENT (7) + //} // for kickstartaccel @@ -470,9 +472,11 @@ typedef struct player_s UINT16 flamemeter; // Flame Shield dash meter left UINT8 flamelength; // Flame Shield dash meter, number of segments + UINT16 ballhogcharge; // Ballhog charge up -- the higher this value, the more projectiles + UINT16 hyudorotimer; // Duration of the Hyudoro offroad effect itself SINT8 stealingtimer; // if >0 you are stealing, if <0 you are being stolen from - mobj_t *hoverhyudoro; // First hyudoro hovering next to player + mobj_t *hoverhyudoro; // First hyudoro hovering next to player UINT16 sneakertimer; // Duration of a Sneaker Boost (from Sneakers or level boosters) UINT8 numsneakers; // Number of stacked sneaker effects diff --git a/src/k_hud.c b/src/k_hud.c index 2f0a43b24..4e9a4544f 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1204,6 +1204,16 @@ static void K_drawKartItem(void) else localpatch = kp_nodraw; } + else if (stplyr->ballhogcharge > 0) + { + itembar = stplyr->ballhogcharge; + maxl = (((stplyr->itemamount-1) * BALLHOGINCREMENT) + 1); + + if (leveltime & 1) + localpatch = kp_ballhog[offset]; + else + localpatch = kp_nodraw; + } else if (stplyr->rocketsneakertimer > 1) { itembar = stplyr->rocketsneakertimer; diff --git a/src/k_kart.c b/src/k_kart.c index 170e5a361..f2b4cb21f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -493,6 +493,10 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) player->itemtype = KITEM_JAWZ; player->itemamount = 2; break; + case KITEM_BALLHOG: // Ballhog x5 + player->itemtype = KITEM_BALLHOG; + player->itemamount = 5; + break; default: if (getitem <= 0 || getitem >= NUMKARTRESULTS) // Sad (Fallback) { @@ -4052,7 +4056,6 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I if (source->player != NULL) { - if (source->player->itemscale == ITEMSCALE_SHRINK) { // Nerf the base item speed a bit. @@ -4165,6 +4168,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I S_StartSound(th, sfx_s3kbfl); S_StartSound(th, sfx_cdfm35); break; + case MT_BALLHOG: + // Contra spread shot scale up + th->destscale = th->destscale << 1; + th->scalespeed = abs(th->destscale - th->scale) / (2*TICRATE); + break; default: break; } @@ -5000,7 +5008,7 @@ static mobj_t *K_FindLastTrailMobj(player_t *player) return trail; } -mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow) +mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow, angle_t angleOffset) { mobj_t *mo; INT32 dir; @@ -5066,46 +5074,21 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, if (missile) // Shootables { - if (mapthing == MT_BALLHOG) // Messy + if (dir == -1 && mapthing != MT_SPB) { - mo = NULL; // can't return multiple projectiles - if (dir == -1) - { - // Shoot backward - K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) - 0x06000000, 0, PROJSPEED/8); - K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) - 0x03000000, 0, PROJSPEED/8); - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/8); - K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + 0x03000000, 0, PROJSPEED/8); - K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + 0x06000000, 0, PROJSPEED/8); - } - else - { - // Shoot forward - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); - K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x06000000, 0, PROJSPEED); - } + // Shoot backward + mo = K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + angleOffset, 0, PROJSPEED/8); } else { - if (dir == -1 && mapthing != MT_SPB) - { - // Shoot backward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/8); - } - else - { - // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); - } + // Shoot forward + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + angleOffset, 0, PROJSPEED); + } - if (mapthing == MT_DROPTARGET && mo) - { - mo->reactiontime = TICRATE/2; - P_SetMobjState(mo, mo->info->painstate); - } + if (mapthing == MT_DROPTARGET && mo) + { + mo->reactiontime = TICRATE/2; + P_SetMobjState(mo, mo->info->painstate); } } else @@ -6067,6 +6050,10 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 newType = KITEM_JAWZ; newAmount = 2; break; + case KITEM_BALLHOG: // Ballhog x5 + newType = KITEM_BALLHOG; + newAmount = 5; + break; default: newType = i; newAmount = 1; @@ -9573,7 +9560,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (ATTACK_IS_DOWN) { - K_ThrowKartItem(player, false, MT_EGGMANITEM, -1, 0); + K_ThrowKartItem(player, false, MT_EGGMANITEM, -1, 0, 0); K_PlayAttackTaunt(player->mo); player->pflags &= ~PF_EGGMANOUT; K_UpdateHnextList(player, true); @@ -9699,7 +9686,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (ATTACK_IS_DOWN && (player->pflags & PF_ITEMOUT)) // Banana x3 thrown { - K_ThrowKartItem(player, false, MT_BANANA, -1, 0); + K_ThrowKartItem(player, false, MT_BANANA, -1, 0, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; K_UpdateHnextList(player, false); @@ -9762,7 +9749,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (ATTACK_IS_DOWN && (player->pflags & PF_ITEMOUT)) // Orbinaut x3 thrown { - K_ThrowKartItem(player, true, MT_ORBINAUT, 1, 0); + K_ThrowKartItem(player, true, MT_ORBINAUT, 1, 0, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; K_UpdateHnextList(player, false); @@ -9804,9 +9791,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && HOLDING_ITEM && (player->pflags & PF_ITEMOUT)) // Jawz thrown { if (player->throwdir == 1 || player->throwdir == 0) - K_ThrowKartItem(player, true, MT_JAWZ, 1, 0); + K_ThrowKartItem(player, true, MT_JAWZ, 1, 0, 0); else if (player->throwdir == -1) // Throwing backward gives you a dud that doesn't home in - K_ThrowKartItem(player, true, MT_JAWZ_DUD, -1, 0); + K_ThrowKartItem(player, true, MT_JAWZ_DUD, -1, 0, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; K_UpdateHnextList(player, false); @@ -9832,7 +9819,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (ATTACK_IS_DOWN && (player->pflags & PF_ITEMOUT)) { - K_ThrowKartItem(player, false, MT_SSMINE, 1, 1); + K_ThrowKartItem(player, false, MT_SSMINE, 1, 1, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; player->pflags &= ~PF_ITEMOUT; @@ -9867,7 +9854,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (ATTACK_IS_DOWN && (player->pflags & PF_ITEMOUT)) { - K_ThrowKartItem(player, (player->throwdir > 0), MT_DROPTARGET, -1, 0); + K_ThrowKartItem(player, (player->throwdir > 0), MT_DROPTARGET, -1, 0, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; player->pflags &= ~PF_ITEMOUT; @@ -9875,18 +9862,63 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } break; case KITEM_BALLHOG: - if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + if (!HOLDING_ITEM && NO_HYUDORO) { - player->itemamount--; - K_ThrowKartItem(player, true, MT_BALLHOG, 1, 0); - K_PlayAttackTaunt(player->mo); + INT32 ballhogmax = ((player->itemamount-1) * BALLHOGINCREMENT) + 1; + + if ((cmd->buttons & BT_ATTACK) && (player->pflags & PF_HOLDREADY) + && (player->ballhogcharge < ballhogmax)) + { + player->ballhogcharge++; + } + else + { + if (cmd->buttons & BT_ATTACK) + { + player->pflags &= ~PF_HOLDREADY; + } + else + { + player->pflags |= PF_HOLDREADY; + } + + if (player->ballhogcharge > 0) + { + INT32 numhogs = min((player->ballhogcharge / BALLHOGINCREMENT) + 1, player->itemamount); + + if (numhogs <= 1) + { + player->itemamount--; + K_ThrowKartItem(player, true, MT_BALLHOG, 1, 0, 0); + } + else + { + angle_t cone = 0x01800000 * (numhogs-1); + angle_t offsetAmt = (cone * 2) / (numhogs-1); + angle_t angleOffset = cone; + INT32 i; + + player->itemamount -= numhogs; + + for (i = 0; i < numhogs; i++) + { + K_ThrowKartItem(player, true, MT_BALLHOG, 1, 0, angleOffset); + angleOffset -= offsetAmt; + } + } + + player->ballhogcharge = 0; + K_PlayAttackTaunt(player->mo); + player->pflags &= ~PF_HOLDREADY; + } + } } break; case KITEM_SPB: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { player->itemamount--; - K_ThrowKartItem(player, true, MT_SPB, 1, 0); + K_ThrowKartItem(player, true, MT_SPB, 1, 0, 0); K_PlayAttackTaunt(player->mo); } break; @@ -9987,7 +10019,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->bubbleblowup > bubbletime*2) { - K_ThrowKartItem(player, (player->throwdir > 0), MT_BUBBLESHIELDTRAP, -1, 0); + K_ThrowKartItem(player, (player->throwdir > 0), MT_BUBBLESHIELDTRAP, -1, 0, 0); K_PlayAttackTaunt(player->mo); player->bubbleblowup = 0; player->bubblecool = 0; @@ -10131,7 +10163,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (ATTACK_IS_DOWN && HOLDING_ITEM && (player->pflags & PF_ITEMOUT)) // Sink thrown { - K_ThrowKartItem(player, false, MT_SINK, 1, 2); + K_ThrowKartItem(player, false, MT_SINK, 1, 2, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; player->pflags &= ~PF_ITEMOUT; diff --git a/src/k_kart.h b/src/k_kart.h index 5a6555db0..275e345fe 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -87,7 +87,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo); void K_SpawnDraftDust(mobj_t *mo); void K_DriftDustHandling(mobj_t *spawner); void K_Squish(mobj_t *mo); -mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow); +mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow, angle_t angleOffset); void K_PuntMine(mobj_t *mine, mobj_t *punter); void K_DoSneaker(player_t *player, INT32 type); void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 4b2bad33d..7984b053b 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -330,6 +330,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->flamemeter); else if (fastcmp(field,"flamelength")) lua_pushinteger(L, plr->flamelength); + else if (fastcmp(field,"ballhogcharge")) + lua_pushinteger(L, plr->ballhogcharge); else if (fastcmp(field,"hyudorotimer")) lua_pushinteger(L, plr->hyudorotimer); else if (fastcmp(field,"stealingtimer")) @@ -682,6 +684,8 @@ static int player_set(lua_State *L) plr->flamemeter = luaL_checkinteger(L, 3); else if (fastcmp(field,"flamelength")) plr->flamelength = luaL_checkinteger(L, 3); + else if (fastcmp(field,"ballhogcharge")) + plr->ballhogcharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"hyudorotimer")) plr->hyudorotimer = luaL_checkinteger(L, 3); else if (fastcmp(field,"stealingtimer")) diff --git a/src/p_inter.c b/src/p_inter.c index 27455872d..689b91912 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1410,7 +1410,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget // special behavior for SPB capsules if (target->threshold == KITEM_SPB) { - K_ThrowKartItem(player, true, MT_SPB, 1, 0); + K_ThrowKartItem(player, true, MT_SPB, 1, 0, 0); break; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 5219fb707..a1ec033bc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1548,7 +1548,10 @@ void P_XYMovement(mobj_t *mo) { mo->health--; if (mo->health == 0) + { + mo->scalespeed = mo->scale/12; mo->destscale = 0; + } } } //} diff --git a/src/p_saveg.c b/src/p_saveg.c index 0ae0ee72a..1eac84058 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -314,6 +314,8 @@ static void P_NetArchivePlayers(void) WRITEUINT16(save_p, players[i].flamemeter); WRITEUINT8(save_p, players[i].flamelength); + WRITEUINT16(save_p, players[i].ballhogcharge); + WRITEUINT16(save_p, players[i].hyudorotimer); WRITESINT8(save_p, players[i].stealingtimer); @@ -595,6 +597,8 @@ static void P_NetUnArchivePlayers(void) players[i].flamemeter = READUINT16(save_p); players[i].flamelength = READUINT8(save_p); + players[i].ballhogcharge = READUINT16(save_p); + players[i].hyudorotimer = READUINT16(save_p); players[i].stealingtimer = READSINT8(save_p); From 16a12de4f4e2d9546f2d701abc4e2db58607c6bb Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 16 Sep 2022 06:57:28 -0400 Subject: [PATCH 2/3] Fix hyudoro ballhog bug --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index d91e26e18..e57b01991 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9011,7 +9011,7 @@ void K_StripItems(player_t *player) player->curshield = KSHIELD_NONE; player->bananadrag = 0; - + player->ballhogcharge = 0; player->sadtimer = 0; K_UpdateHnextList(player, true); From a2db1673dc0be5a70d29a1e598ae17f9b9982b6f Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Mon, 19 Sep 2022 19:27:23 -0400 Subject: [PATCH 3/3] Made hitbox radius 26 instead of 16 --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 6774050b6..e80098499 100644 --- a/src/info.c +++ b/src/info.c @@ -23753,7 +23753,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_hogbom, // deathsound 80*FRACUNIT, // speed - 16*FRACUNIT, // radius + 26*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset 100, // mass