From 18c45d8a8ab66452738f4467b4e022b0c1d732f7 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Tue, 16 May 2023 23:36:38 -0700 Subject: [PATCH] WIP: Insta-"whip" --- src/d_player.h | 2 ++ src/deh_tables.c | 4 ++++ src/info.c | 31 +++++++++++++++++++++++++++++++ src/info.h | 6 ++++++ src/k_collide.cpp | 29 +++++++++++++++++++++++++++++ src/k_collide.h | 2 ++ src/k_kart.c | 15 +++++++++++++++ src/k_objects.h | 3 +++ src/lua_playerlib.c | 4 ++++ src/objects/CMakeLists.txt | 1 + src/objects/instawhip.c | 20 ++++++++++++++++++++ src/p_map.c | 8 +++++++- src/p_mobj.c | 5 +++++ src/p_saveg.c | 4 ++++ 14 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/objects/instawhip.c diff --git a/src/d_player.h b/src/d_player.h index a6aa69675..10a8c02e5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -742,6 +742,8 @@ struct player_t mobj_t *stumbleIndicator; mobj_t *sliptideZipIndicator; + UINT8 instaShieldCooldown; + uint8_t public_key[PUBKEYLENGTH]; #ifdef HWRENDER diff --git a/src/deh_tables.c b/src/deh_tables.c index 63458676b..f9ad7fdad 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3287,6 +3287,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SLIPTIDEZIP", + "S_INSTAWHIP", + // Signpost sparkles "S_SIGNSPARK1", "S_SIGNSPARK2", @@ -5318,6 +5320,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_SLIPTIDEZIP", + "MT_INSTAWHIP", + "MT_SIGNSPARKLE", "MT_FASTLINE", diff --git a/src/info.c b/src/info.c index 3bfe157e3..caf458a3d 100644 --- a/src/info.c +++ b/src/info.c @@ -555,6 +555,8 @@ char sprnames[NUMSPRITES + 1][5] = "SLPT", // Sliptide zip indicator + "IWHP", // Instawhip + "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks "BDRF", // Brake drift sparks @@ -3946,6 +3948,8 @@ state_t states[NUMSTATES] = {SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP + {SPR_IWHP, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_INSTAWHIP + {SPR_SGNS, FF_ADD|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_SIGNSPARK2}, // S_SIGNSPARK1 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_SIGNSPARK3}, // S_SIGNSPARK2 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_SIGNSPARK4}, // S_SIGNSPARK3 @@ -22632,6 +22636,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, + + { // MT_INSTAWHIP + -1, // doomednum + S_INSTAWHIP, // 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_None, // deathsound + 0, // speed + 90*FRACUNIT, // radius + 90*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, { // MT_SIGNSPARKLE -1, // doomednum diff --git a/src/info.h b/src/info.h index cdb577e1b..10d35a0a8 100644 --- a/src/info.h +++ b/src/info.h @@ -1108,6 +1108,8 @@ typedef enum sprite SPR_SLPT, // Sliptide zip indicator + SPR_IWHP, // Instawhip + SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks @@ -4357,6 +4359,8 @@ typedef enum state S_SLIPTIDEZIP, + S_INSTAWHIP, + // Signpost sparkles S_SIGNSPARK1, S_SIGNSPARK2, @@ -6423,6 +6427,8 @@ typedef enum mobj_type MT_MAGICIANBOX, MT_SLIPTIDEZIP, + MT_INSTAWHIP, + MT_SIGNSPARKLE, MT_FASTLINE, diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 9bb2283be..43f3ee64b 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -787,6 +787,35 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2) return true; } +boolean K_InstaWhipCollide(mobj_t *t1, mobj_t *t2) +{ + if (t2->player) + { + if (t2 != t1->target && !P_PlayerInPain(t2->player) && t2->player->flashing == 0) + { + P_DamageMobj(t2, t1, t1, 1, DMG_NORMAL); + K_AddHitLag(t2, 10, true); + K_AddHitLag(t1->target, 2, false); + t1->hitlag = t1->target->hitlag; + return true; + } + return false; + } + else + { + if (t2->type == MT_ORBINAUT || t2->type == MT_JAWZ || t2->type == MT_GACHABOM + || t2->type == MT_BANANA || t2->type == MT_EGGMANITEM || t2->type == MT_BALLHOG + || t2->type == MT_SSMINE || t2->type == MT_LANDMINE || t2->type == MT_SINK + || t2->type == MT_GARDENTOP || t2->type == MT_DROPTARGET) + { + P_RemoveMobj(t2); + K_AddHitLag(t1->target, 2, false); + t1->hitlag = t1->target->hitlag; + } + return false; + } +} + boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) { if (((t1->target == t2) || (!(t2->flags & (MF_ENEMY|MF_BOSS)) && (t1->target == t2->target))) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) diff --git a/src/k_collide.h b/src/k_collide.h index c93c72ed2..0f29ebf6b 100644 --- a/src/k_collide.h +++ b/src/k_collide.h @@ -24,6 +24,8 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2); void K_LightningShieldAttack(mobj_t *actor, fixed_t size); boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2); +boolean K_InstaWhipCollide(mobj_t *t1, mobj_t *t2); + boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2); boolean K_FallingRockCollide(mobj_t *t1, mobj_t *t2); diff --git a/src/k_kart.c b/src/k_kart.c index 91b2802ee..716a23bad 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7877,6 +7877,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->gateBoost) player->gateBoost--; + if (player->instaShieldCooldown) + player->instaShieldCooldown--; + if (player->startboost > 0 && onground == true) { player->startboost--; @@ -10530,6 +10533,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Ring boosting if (player->pflags & PF_USERINGS) { + if (ATTACK_IS_DOWN && player->rings <= 0 && players->instaShieldCooldown == 0) + { + player->instaShieldCooldown = 2*TICRATE/3; + S_StartSound(player->mo, sfx_join); + mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP); + P_SetScale(whip, player->mo->scale); + P_SetTarget(&whip->target, player->mo); + K_MatchGenericExtraFlags(whip, player->mo); + whip->fuse = 10; + player->flashing = max(player->flashing, 10); + } + if ((cmd->buttons & BT_ATTACK) && !player->ringdelay && player->rings > 0) { mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING); diff --git a/src/k_objects.h b/src/k_objects.h index 605206ec7..a7788d303 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -107,6 +107,9 @@ void Obj_LoopEndpointCollide(mobj_t *special, mobj_t *toucher); void Obj_BeginDropTargetMorph(mobj_t *target, skincolornum_t color); boolean Obj_DropTargetMorphThink(mobj_t *morph); +/* Instawhip */ +void Obj_InstaWhipThink(mobj_t *whip); + /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); boolean Obj_PlayerRingShooterFreeze(player_t *const player); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 4dc28ac18..39039e011 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -319,6 +319,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->sliptideZipDelay); else if (fastcmp(field,"sliptideZipBoost")) lua_pushinteger(L, plr->sliptideZipBoost); + else if (fastcmp(field,"instaShieldCooldown")) + lua_pushinteger(L, plr->instaShieldCooldown); /* else if (fastcmp(field,"itemroulette")) lua_pushinteger(L, plr->itemroulette); @@ -713,6 +715,8 @@ static int player_set(lua_State *L) plr->sliptideZipDelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"sliptideZipBoost")) plr->sliptideZipBoost = luaL_checkinteger(L, 3); + else if (fastcmp(field,"instaShieldCooldown")) + plr->instaShieldCooldown = luaL_checkinteger(L, 3); /* else if (fastcmp(field,"itemroulette")) plr->itemroulette = luaL_checkinteger(L, 3); diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index df047fb5d..cb2f61519 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -17,4 +17,5 @@ target_sources(SRB2SDL2 PRIVATE ring-shooter.c audience.c random-item.c + instawhip.c ) diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c new file mode 100644 index 000000000..30587c762 --- /dev/null +++ b/src/objects/instawhip.c @@ -0,0 +1,20 @@ +#include "../doomdef.h" +#include "../info.h" +#include "../k_objects.h" +#include "../p_local.h" + +void Obj_InstaWhipThink (mobj_t *whip) +{ + if (P_MobjWasRemoved(whip->target)) + { + P_RemoveMobj(whip); + } + else + { + whip->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(whip, whip->target->x, whip->target->y, whip->target->z + whip->target->height/2); + whip->flags |= MF_NOCLIPTHING; + + P_SetScale(whip, whip->target->scale); + } +} \ No newline at end of file diff --git a/src/p_map.c b/src/p_map.c index 5b539ad28..d96afc08d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -741,7 +741,13 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) return BMIT_ABORT; // stop moving } - // SRB2kart 011617 - Colission[sic] code for kart items //{ + // SRB2kart 011617 - Colission[sic] code for kart items // + + if (tm.thing->type == MT_INSTAWHIP) + { + K_InstaWhipCollide(tm.thing, thing); + return BMIT_CONTINUE; + } if (thing->type == MT_SPB) { diff --git a/src/p_mobj.c b/src/p_mobj.c index fbe4d90c2..98b9470a8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8356,6 +8356,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_GardenTopThink(mobj); break; } + case MT_INSTAWHIP: + { + Obj_InstaWhipThink(mobj); + break; + } case MT_GARDENTOPSPARK: { Obj_GardenTopSparkThink(mobj); diff --git a/src/p_saveg.c b/src/p_saveg.c index 70ccf1624..46cf3afeb 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -419,6 +419,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH); + WRITEUINT8(save->p, players[i].instaShieldCooldown); + // respawnvars_t WRITEUINT8(save->p, players[i].respawn.state); WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].respawn.wp)); @@ -804,6 +806,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) READMEM(save->p, players[i].public_key, PUBKEYLENGTH); + players[i].instaShieldCooldown = READUINT8(save->p); + // respawnvars_t players[i].respawn.state = READUINT8(save->p); players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save->p);