mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-09 02:11:49 +00:00
WIP: Insta-"whip"
This commit is contained in:
parent
cf120e7d8e
commit
18c45d8a8a
14 changed files with 133 additions and 1 deletions
|
|
@ -742,6 +742,8 @@ struct player_t
|
||||||
mobj_t *stumbleIndicator;
|
mobj_t *stumbleIndicator;
|
||||||
mobj_t *sliptideZipIndicator;
|
mobj_t *sliptideZipIndicator;
|
||||||
|
|
||||||
|
UINT8 instaShieldCooldown;
|
||||||
|
|
||||||
uint8_t public_key[PUBKEYLENGTH];
|
uint8_t public_key[PUBKEYLENGTH];
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
|
|
||||||
|
|
@ -3287,6 +3287,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
||||||
|
|
||||||
"S_SLIPTIDEZIP",
|
"S_SLIPTIDEZIP",
|
||||||
|
|
||||||
|
"S_INSTAWHIP",
|
||||||
|
|
||||||
// Signpost sparkles
|
// Signpost sparkles
|
||||||
"S_SIGNSPARK1",
|
"S_SIGNSPARK1",
|
||||||
"S_SIGNSPARK2",
|
"S_SIGNSPARK2",
|
||||||
|
|
@ -5318,6 +5320,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
||||||
|
|
||||||
"MT_SLIPTIDEZIP",
|
"MT_SLIPTIDEZIP",
|
||||||
|
|
||||||
|
"MT_INSTAWHIP",
|
||||||
|
|
||||||
"MT_SIGNSPARKLE",
|
"MT_SIGNSPARKLE",
|
||||||
|
|
||||||
"MT_FASTLINE",
|
"MT_FASTLINE",
|
||||||
|
|
|
||||||
31
src/info.c
31
src/info.c
|
|
@ -555,6 +555,8 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
|
|
||||||
"SLPT", // Sliptide zip indicator
|
"SLPT", // Sliptide zip indicator
|
||||||
|
|
||||||
|
"IWHP", // Instawhip
|
||||||
|
|
||||||
"WIPD", // Wipeout dust trail
|
"WIPD", // Wipeout dust trail
|
||||||
"DRIF", // Drift Sparks
|
"DRIF", // Drift Sparks
|
||||||
"BDRF", // Brake 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_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, {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|1, 1, {NULL}, 0, 0, S_SIGNSPARK3}, // S_SIGNSPARK2
|
||||||
{SPR_SGNS, FF_ADD|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_SIGNSPARK4}, // S_SIGNSPARK3
|
{SPR_SGNS, FF_ADD|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_SIGNSPARK4}, // S_SIGNSPARK3
|
||||||
|
|
@ -22633,6 +22637,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
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
|
{ // MT_SIGNSPARKLE
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_SIGNSPARK1, // spawnstate
|
S_SIGNSPARK1, // spawnstate
|
||||||
|
|
|
||||||
|
|
@ -1108,6 +1108,8 @@ typedef enum sprite
|
||||||
|
|
||||||
SPR_SLPT, // Sliptide zip indicator
|
SPR_SLPT, // Sliptide zip indicator
|
||||||
|
|
||||||
|
SPR_IWHP, // Instawhip
|
||||||
|
|
||||||
SPR_WIPD, // Wipeout dust trail
|
SPR_WIPD, // Wipeout dust trail
|
||||||
SPR_DRIF, // Drift Sparks
|
SPR_DRIF, // Drift Sparks
|
||||||
SPR_BDRF, // Brake drift sparks
|
SPR_BDRF, // Brake drift sparks
|
||||||
|
|
@ -4357,6 +4359,8 @@ typedef enum state
|
||||||
|
|
||||||
S_SLIPTIDEZIP,
|
S_SLIPTIDEZIP,
|
||||||
|
|
||||||
|
S_INSTAWHIP,
|
||||||
|
|
||||||
// Signpost sparkles
|
// Signpost sparkles
|
||||||
S_SIGNSPARK1,
|
S_SIGNSPARK1,
|
||||||
S_SIGNSPARK2,
|
S_SIGNSPARK2,
|
||||||
|
|
@ -6423,6 +6427,8 @@ typedef enum mobj_type
|
||||||
MT_MAGICIANBOX,
|
MT_MAGICIANBOX,
|
||||||
MT_SLIPTIDEZIP,
|
MT_SLIPTIDEZIP,
|
||||||
|
|
||||||
|
MT_INSTAWHIP,
|
||||||
|
|
||||||
MT_SIGNSPARKLE,
|
MT_SIGNSPARKLE,
|
||||||
|
|
||||||
MT_FASTLINE,
|
MT_FASTLINE,
|
||||||
|
|
|
||||||
|
|
@ -787,6 +787,35 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2)
|
||||||
return true;
|
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)
|
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)))
|
if (((t1->target == t2) || (!(t2->flags & (MF_ENEMY|MF_BOSS)) && (t1->target == t2->target))) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2);
|
||||||
void K_LightningShieldAttack(mobj_t *actor, fixed_t size);
|
void K_LightningShieldAttack(mobj_t *actor, fixed_t size);
|
||||||
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2);
|
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_KitchenSinkCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
||||||
boolean K_FallingRockCollide(mobj_t *t1, mobj_t *t2);
|
boolean K_FallingRockCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
|
||||||
15
src/k_kart.c
15
src/k_kart.c
|
|
@ -7877,6 +7877,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
if (player->gateBoost)
|
if (player->gateBoost)
|
||||||
player->gateBoost--;
|
player->gateBoost--;
|
||||||
|
|
||||||
|
if (player->instaShieldCooldown)
|
||||||
|
player->instaShieldCooldown--;
|
||||||
|
|
||||||
if (player->startboost > 0 && onground == true)
|
if (player->startboost > 0 && onground == true)
|
||||||
{
|
{
|
||||||
player->startboost--;
|
player->startboost--;
|
||||||
|
|
@ -10530,6 +10533,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
// Ring boosting
|
// Ring boosting
|
||||||
if (player->pflags & PF_USERINGS)
|
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)
|
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);
|
mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING);
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,9 @@ void Obj_LoopEndpointCollide(mobj_t *special, mobj_t *toucher);
|
||||||
void Obj_BeginDropTargetMorph(mobj_t *target, skincolornum_t color);
|
void Obj_BeginDropTargetMorph(mobj_t *target, skincolornum_t color);
|
||||||
boolean Obj_DropTargetMorphThink(mobj_t *morph);
|
boolean Obj_DropTargetMorphThink(mobj_t *morph);
|
||||||
|
|
||||||
|
/* Instawhip */
|
||||||
|
void Obj_InstaWhipThink(mobj_t *whip);
|
||||||
|
|
||||||
/* Ring Shooter */
|
/* Ring Shooter */
|
||||||
boolean Obj_RingShooterThinker(mobj_t *mo);
|
boolean Obj_RingShooterThinker(mobj_t *mo);
|
||||||
boolean Obj_PlayerRingShooterFreeze(player_t *const player);
|
boolean Obj_PlayerRingShooterFreeze(player_t *const player);
|
||||||
|
|
|
||||||
|
|
@ -319,6 +319,8 @@ static int player_get(lua_State *L)
|
||||||
lua_pushinteger(L, plr->sliptideZipDelay);
|
lua_pushinteger(L, plr->sliptideZipDelay);
|
||||||
else if (fastcmp(field,"sliptideZipBoost"))
|
else if (fastcmp(field,"sliptideZipBoost"))
|
||||||
lua_pushinteger(L, plr->sliptideZipBoost);
|
lua_pushinteger(L, plr->sliptideZipBoost);
|
||||||
|
else if (fastcmp(field,"instaShieldCooldown"))
|
||||||
|
lua_pushinteger(L, plr->instaShieldCooldown);
|
||||||
/*
|
/*
|
||||||
else if (fastcmp(field,"itemroulette"))
|
else if (fastcmp(field,"itemroulette"))
|
||||||
lua_pushinteger(L, plr->itemroulette);
|
lua_pushinteger(L, plr->itemroulette);
|
||||||
|
|
@ -713,6 +715,8 @@ static int player_set(lua_State *L)
|
||||||
plr->sliptideZipDelay = luaL_checkinteger(L, 3);
|
plr->sliptideZipDelay = luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"sliptideZipBoost"))
|
else if (fastcmp(field,"sliptideZipBoost"))
|
||||||
plr->sliptideZipBoost = luaL_checkinteger(L, 3);
|
plr->sliptideZipBoost = luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"instaShieldCooldown"))
|
||||||
|
plr->instaShieldCooldown = luaL_checkinteger(L, 3);
|
||||||
/*
|
/*
|
||||||
else if (fastcmp(field,"itemroulette"))
|
else if (fastcmp(field,"itemroulette"))
|
||||||
plr->itemroulette = luaL_checkinteger(L, 3);
|
plr->itemroulette = luaL_checkinteger(L, 3);
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,5 @@ target_sources(SRB2SDL2 PRIVATE
|
||||||
ring-shooter.c
|
ring-shooter.c
|
||||||
audience.c
|
audience.c
|
||||||
random-item.c
|
random-item.c
|
||||||
|
instawhip.c
|
||||||
)
|
)
|
||||||
|
|
|
||||||
20
src/objects/instawhip.c
Normal file
20
src/objects/instawhip.c
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -741,7 +741,13 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
||||||
return BMIT_ABORT; // stop moving
|
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)
|
if (thing->type == MT_SPB)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -8356,6 +8356,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
||||||
Obj_GardenTopThink(mobj);
|
Obj_GardenTopThink(mobj);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MT_INSTAWHIP:
|
||||||
|
{
|
||||||
|
Obj_InstaWhipThink(mobj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MT_GARDENTOPSPARK:
|
case MT_GARDENTOPSPARK:
|
||||||
{
|
{
|
||||||
Obj_GardenTopSparkThink(mobj);
|
Obj_GardenTopSparkThink(mobj);
|
||||||
|
|
|
||||||
|
|
@ -419,6 +419,8 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
||||||
|
|
||||||
WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH);
|
WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH);
|
||||||
|
|
||||||
|
WRITEUINT8(save->p, players[i].instaShieldCooldown);
|
||||||
|
|
||||||
// respawnvars_t
|
// respawnvars_t
|
||||||
WRITEUINT8(save->p, players[i].respawn.state);
|
WRITEUINT8(save->p, players[i].respawn.state);
|
||||||
WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].respawn.wp));
|
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);
|
READMEM(save->p, players[i].public_key, PUBKEYLENGTH);
|
||||||
|
|
||||||
|
players[i].instaShieldCooldown = READUINT8(save->p);
|
||||||
|
|
||||||
// respawnvars_t
|
// respawnvars_t
|
||||||
players[i].respawn.state = READUINT8(save->p);
|
players[i].respawn.state = READUINT8(save->p);
|
||||||
players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save->p);
|
players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save->p);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue