mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'bail' into 'master'
Bail and Burst See merge request kart-krew-dev/ring-racers-internal!2635
This commit is contained in:
commit
39b5f81922
32 changed files with 476 additions and 36 deletions
|
|
@ -5397,7 +5397,7 @@ static void FuzzTiccmd(ticcmd_t* target)
|
|||
{
|
||||
target->buttons |= BT_ACCELERATE;
|
||||
target->buttons &= ~BT_LOOKBACK;
|
||||
target->buttons &= ~BT_RESPAWN;
|
||||
target->buttons &= ~BT_BAIL;
|
||||
target->buttons &= ~BT_BRAKE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1081,6 +1081,10 @@ struct player_t
|
|||
UINT16 progressivethrust; // When getting beat up in GTR_BUMPERS, speed up the longer you've been out of control.
|
||||
UINT8 ringvisualwarning; // Check with > 1, not >= 1! Set when put in debt, counts down and holds at 1 when still in debt.
|
||||
|
||||
UINT32 bailcharge;
|
||||
UINT32 baildrop;
|
||||
boolean bailquake;
|
||||
|
||||
boolean analoginput; // Has an input been recorded that requires analog usage? For input display.
|
||||
|
||||
boolean markedfordeath;
|
||||
|
|
|
|||
|
|
@ -32,12 +32,13 @@ typedef enum
|
|||
BT_BRAKE = 1<<3, // Brake
|
||||
BT_ATTACK = 1<<4, // Use Item
|
||||
BT_LOOKBACK = 1<<5, // Look Backward
|
||||
BT_RESPAWN = 1<<6, // Respawn
|
||||
BT_BAIL = 1<<6, // Bail
|
||||
BT_VOTE = 1<<7, // Vote
|
||||
BT_SPINDASH = 1<<8, // Spindash
|
||||
|
||||
BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE),
|
||||
BT_SPINDASHMASK = (BT_ACCELERATE|BT_BRAKE|BT_DRIFT),
|
||||
BT_RESPAWNMASK = (BT_EBRAKEMASK|BT_BAIL),
|
||||
|
||||
// free: 1<<9 to 1<<12
|
||||
|
||||
|
|
|
|||
|
|
@ -1574,6 +1574,13 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_BLOCKRING",
|
||||
"S_BLOCKBODY",
|
||||
|
||||
"S_BAIL",
|
||||
"S_BAIB1",
|
||||
"S_BAIB2",
|
||||
"S_BAIB3",
|
||||
"S_BAIC",
|
||||
"S_BAILCHARGE",
|
||||
|
||||
"S_AMPRING",
|
||||
"S_AMPBODY",
|
||||
"S_AMPAURA",
|
||||
|
|
@ -3564,6 +3571,10 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_BLOCKRING",
|
||||
"MT_BLOCKBODY",
|
||||
|
||||
"MT_BAIL",
|
||||
"MT_BAILCHARGE",
|
||||
"MT_BAILSPARKLE",
|
||||
|
||||
"MT_AMPRING",
|
||||
"MT_AMPBODY",
|
||||
"MT_AMPAURA",
|
||||
|
|
@ -5048,11 +5059,12 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"BT_BRAKE",BT_BRAKE},
|
||||
{"BT_ATTACK",BT_ATTACK},
|
||||
{"BT_LOOKBACK",BT_LOOKBACK},
|
||||
{"BT_RESPAWN",BT_RESPAWN},
|
||||
{"BT_BAIL",BT_BAIL},
|
||||
{"BT_VOTE",BT_VOTE},
|
||||
{"BT_SPINDASH",BT_SPINDASH}, // Real button now, but triggers the macro same as always.
|
||||
{"BT_EBRAKEMASK",BT_EBRAKEMASK}, // Macro button
|
||||
{"BT_SPINDASHMASK",BT_SPINDASHMASK}, // Macro button
|
||||
{"BT_RESPAWNMASK",BT_RESPAWNMASK}, // Macro button
|
||||
{"BT_LUAA",BT_LUAA}, // Lua customizable
|
||||
{"BT_LUAB",BT_LUAB}, // Lua customizable
|
||||
{"BT_LUAC",BT_LUAC}, // Lua customizable
|
||||
|
|
|
|||
|
|
@ -404,10 +404,7 @@ class TiccmdBuilder
|
|||
map(gc_item, BT_ATTACK); // fire
|
||||
|
||||
map(gc_lookback, BT_LOOKBACK); // rear view
|
||||
if (!modeattacking)
|
||||
{
|
||||
map(gc_respawn, BT_RESPAWN | (freecam() ? 0 : BT_EBRAKEMASK)); // respawn
|
||||
}
|
||||
map(gc_bail, BT_BAIL); // bail
|
||||
map(gc_vote, BT_VOTE); // mp general function button
|
||||
|
||||
// lua buttons a thru c
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ typedef enum
|
|||
gc_lookback = gc_b,
|
||||
gc_spindash = gc_c,
|
||||
gc_brake = gc_x,
|
||||
gc_respawn = gc_y,
|
||||
gc_bail = gc_y,
|
||||
gc_vote = gc_z,
|
||||
gc_item = gc_l,
|
||||
gc_drift = gc_r,
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ void K_DrawInputDisplay(float x, float y, INT32 flags, char mode, UINT8 pid, boo
|
|||
box.patch(but('B', gc_b, BT_LOOKBACK));
|
||||
box.patch(but('C', gc_c, BT_SPINDASH));
|
||||
box.patch(but('X', gc_x, BT_BRAKE));
|
||||
box.patch(but('Y', gc_y, BT_RESPAWN));
|
||||
box.patch(but('Y', gc_y, BT_BAIL));
|
||||
box.patch(but('Z', gc_z, BT_VOTE));
|
||||
box.patch(but('L', gc_l, BT_ATTACK));
|
||||
box.patch(but('R', gc_r, BT_DRIFT));
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ void K_drawSpectatorHUD(boolean director)
|
|||
}
|
||||
else
|
||||
{
|
||||
bool press = D_LocalTiccmd(viewnum)->buttons & BT_RESPAWN;
|
||||
bool press = D_LocalTiccmd(viewnum)->buttons & BT_BAIL;
|
||||
const char* label = (press && I_GetTime() % 16 < 8) ? "> <" : ">< ";
|
||||
|
||||
list.insert({{label, press ? "<y_pressed>" : "<y>"}, {"Exit", "<c_animated>"}});
|
||||
|
|
|
|||
96
src/info.c
96
src/info.c
|
|
@ -334,6 +334,11 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"GRNG", // Guard ring
|
||||
"GBDY", // Guard body
|
||||
|
||||
"BAIL", // Bail charge
|
||||
"BAIB", // Bail after effect
|
||||
"BAIC", // Bail sparkle
|
||||
"TECH", // Bail tech charge
|
||||
|
||||
"TRC1", // Charge aura
|
||||
"TRC2", // Charge fall
|
||||
"TRC3", // Charge flicker/sparks
|
||||
|
|
@ -2160,6 +2165,16 @@ state_t states[NUMSTATES] =
|
|||
{SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING
|
||||
{SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY
|
||||
|
||||
// why can we not use actions on spawn? I'd love to fix it but I imagine all sorts of crazy pain if I change something fundamental like that
|
||||
{SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 9, {NULL}, 8, 1, S_BAIB1}, // S_BAIL
|
||||
{SPR_BAIB, 0, 0, {A_PlaySound}, sfx_gshb2, 2, S_BAIB2}, // S_BAIB1
|
||||
{SPR_BAIB, 0, 0, {A_PlaySound}, sfx_gshbd, 2, S_BAIB3}, // S_BAIB2
|
||||
{SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB3
|
||||
|
||||
{SPR_BAIC, FF_FULLBRIGHT|FF_ANIMATE|0, 11, {NULL}, 10, 1, S_NULL}, // S_BAIC
|
||||
|
||||
{SPR_TECH, 1, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE
|
||||
|
||||
{SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING
|
||||
{SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY
|
||||
{SPR_AMPD, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPAURA
|
||||
|
|
@ -13745,6 +13760,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BAIL
|
||||
-1, // doomednum
|
||||
S_BAIL, // 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
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
1, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BAILCHARGE
|
||||
-1, // doomednum
|
||||
S_BAILCHARGE, // 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
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
1, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BAILSPARKLE
|
||||
-1, // doomednum
|
||||
S_BAIC, // 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
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
1, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_AMPRING
|
||||
-1, // doomednum
|
||||
S_AMPRING, // spawnstate
|
||||
|
|
|
|||
16
src/info.h
16
src/info.h
|
|
@ -875,6 +875,11 @@ typedef enum sprite
|
|||
SPR_GRNG, // Guard ring
|
||||
SPR_GBDY, // Guard body
|
||||
|
||||
SPR_BAIL, // Bail charge
|
||||
SPR_BAIB, // Bail after effect
|
||||
SPR_BAIC, // Bail sparkle
|
||||
SPR_TECH, // Bail tech charge
|
||||
|
||||
SPR_TRC1, // Charge aura
|
||||
SPR_TRC2, // Charge fall
|
||||
SPR_TRC3, // Charge flicker/sparks
|
||||
|
|
@ -2629,6 +2634,13 @@ typedef enum state
|
|||
S_BLOCKRING,
|
||||
S_BLOCKBODY,
|
||||
|
||||
S_BAIL,
|
||||
S_BAIB1,
|
||||
S_BAIB2,
|
||||
S_BAIB3,
|
||||
S_BAIC,
|
||||
S_BAILCHARGE,
|
||||
|
||||
S_AMPRING,
|
||||
S_AMPBODY,
|
||||
S_AMPAURA,
|
||||
|
|
@ -4646,6 +4658,10 @@ typedef enum mobj_type
|
|||
MT_BLOCKRING,
|
||||
MT_BLOCKBODY,
|
||||
|
||||
MT_BAIL,
|
||||
MT_BAILCHARGE,
|
||||
MT_BAILSPARKLE,
|
||||
|
||||
MT_AMPRING,
|
||||
MT_AMPBODY,
|
||||
MT_AMPAURA,
|
||||
|
|
|
|||
|
|
@ -1803,7 +1803,7 @@ static void K_BuildBotTiccmdNormal(player_t *player, ticcmd_t *cmd)
|
|||
if (K_TryRingShooter(player, botController) == true && player->botvars.respawnconfirm >= BOTRESPAWNCONFIRM)
|
||||
{
|
||||
// We want to respawn. Simply hold Y and stop here!
|
||||
cmd->buttons |= (BT_RESPAWN | BT_EBRAKEMASK);
|
||||
cmd->buttons |= BT_RESPAWNMASK;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -546,7 +546,7 @@ void K_HandleFollower(player_t *player)
|
|||
}
|
||||
|
||||
// Sal: Turn the follower around when looking backwards.
|
||||
if ( player->cmd.buttons & BT_LOOKBACK )
|
||||
if (K_GetKartButtons(player) & BT_LOOKBACK)
|
||||
{
|
||||
destAngle += ANGLE_180;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,9 @@ void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage)
|
|||
return;
|
||||
}
|
||||
|
||||
if (mo->player && mo->player->overshield)
|
||||
tics = min(tics, 3);
|
||||
|
||||
mo->hitlag += tics;
|
||||
mo->hitlag = min(mo->hitlag, MAXHITLAGTICS);
|
||||
|
||||
|
|
|
|||
|
|
@ -4876,7 +4876,7 @@ static void K_drawKartPlayerCheck(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (stplyr->cmd.buttons & BT_LOOKBACK)
|
||||
if (K_GetKartButtons(stplyr) & BT_LOOKBACK)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -7521,7 +7521,7 @@ void K_drawKartHUD(void)
|
|||
if (ta)
|
||||
{
|
||||
using srb2::Draw;
|
||||
Draw::TextElement text = Draw::TextElement().parse("<y> Restart");
|
||||
Draw::TextElement text = Draw::TextElement().parse("<z> Restart");
|
||||
Draw(BASEVIDWIDTH - 19, 2)
|
||||
.flags(flags | V_YELLOWMAP)
|
||||
.align(Draw::Align::kRight)
|
||||
|
|
|
|||
187
src/k_kart.c
187
src/k_kart.c
|
|
@ -4069,8 +4069,16 @@ boolean K_KartKickstart(const player_t *player)
|
|||
|
||||
UINT16 K_GetKartButtons(const player_t *player)
|
||||
{
|
||||
return (player->cmd.buttons |
|
||||
(K_KartKickstart(player) ? BT_ACCELERATE : 0));
|
||||
UINT16 buttons = player->cmd.buttons;
|
||||
if ((buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK)
|
||||
{
|
||||
buttons &= ~BT_LOOKBACK;
|
||||
}
|
||||
if (K_KartKickstart(player))
|
||||
{
|
||||
buttons = buttons | BT_ACCELERATE;
|
||||
}
|
||||
return buttons;
|
||||
}
|
||||
|
||||
SINT8 K_GetForwardMove(const player_t *player)
|
||||
|
|
@ -7772,6 +7780,30 @@ void K_PopPlayerShield(player_t *player)
|
|||
K_UnsetItemOut(player);
|
||||
}
|
||||
|
||||
static void K_DeleteHnextList(player_t *player)
|
||||
{
|
||||
mobj_t *work = player->mo, *nextwork;
|
||||
|
||||
if (work == NULL || P_MobjWasRemoved(work))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
nextwork = work->hnext;
|
||||
|
||||
while ((work = nextwork) && !(work == NULL || P_MobjWasRemoved(work)))
|
||||
{
|
||||
nextwork = work->hnext;
|
||||
|
||||
if (!work->health)
|
||||
continue; // taking care of itself
|
||||
|
||||
K_SpawnLandMineExplosion(work, player->skincolor, player->mo->hitlag);
|
||||
|
||||
P_RemoveMobj(work);
|
||||
}
|
||||
}
|
||||
|
||||
void K_DropHnextList(player_t *player)
|
||||
{
|
||||
mobj_t *work = player->mo, *nextwork, *dropwork;
|
||||
|
|
@ -9778,7 +9810,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
// UINT16 oldringboost = player->ringboost;
|
||||
|
||||
if (player->superring == 0 || player->stunned)
|
||||
if (!player->baildrop && (player->superring == 0 || player->stunned))
|
||||
player->ringboost -= max((player->ringboost / roller), 1);
|
||||
else if (K_LegacyRingboost(player))
|
||||
player->ringboost--;
|
||||
|
|
@ -9969,6 +10001,51 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
if (player->baildrop)
|
||||
{
|
||||
if (player->stunned & 0x8000)
|
||||
player->stunned = 0x8000 | BAILSTUN;
|
||||
else
|
||||
player->stunned = BAILSTUN;
|
||||
|
||||
mobj_t *pmo = player->mo;
|
||||
// particle spawn
|
||||
#define BAILSPARKLE_MAXBAIL 61 // amount of bail rings needed for max sparkle spawn frequency
|
||||
UINT32 baildropinversefreq = BAILSPARKLE_MAXBAIL - min(player->baildrop, BAILSPARKLE_MAXBAIL-6);
|
||||
UINT32 baildropmodulo = baildropinversefreq *5/3 /10;
|
||||
if ((leveltime % (1+baildropmodulo)) == 0)
|
||||
{
|
||||
mobj_t *sparkle = P_SpawnMobj(pmo->x + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale),
|
||||
pmo->y + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale),
|
||||
pmo->z + (pmo->height/2) + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale),
|
||||
MT_BAILSPARKLE);
|
||||
|
||||
sparkle->scale = pmo->scale;
|
||||
sparkle->angle = pmo->angle;
|
||||
sparkle->momx = 3*pmo->momx/4;
|
||||
sparkle->momy = 3*pmo->momy/4;
|
||||
sparkle->momz = 3*P_GetMobjZMovement(pmo)/4;
|
||||
K_MatchGenericExtraFlags(sparkle, pmo);
|
||||
sparkle->renderflags = (pmo->renderflags & ~RF_TRANSMASK);//|RF_TRANS20|RF_ADD;
|
||||
}
|
||||
|
||||
if ((player->baildrop % BAIL_DROPFREQUENCY) == 0)
|
||||
{
|
||||
P_FlingBurst(player, K_MomentumAngle(pmo), MT_FLINGRING, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY);
|
||||
S_StartSound(pmo, sfx_gshad);
|
||||
}
|
||||
|
||||
player->baildrop--;
|
||||
if (player->baildrop == 0)
|
||||
player->ringboost /= 3;
|
||||
}
|
||||
|
||||
if (player->bailquake && !player->mo->hitlag) // quake as soon as we leave hitlag
|
||||
{
|
||||
P_StartQuakeFromMobj(7, 50 * player->mo->scale, 2048 * player->mo->scale, player->mo);
|
||||
player->bailquake = false;
|
||||
}
|
||||
|
||||
// The precise ordering of start-of-level made me want to cut my head off,
|
||||
// so let's try this instead. Whatever!
|
||||
if (leveltime <= starttime || player->gradingpointnum == 0)
|
||||
|
|
@ -10050,7 +10127,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
K_RemoveGrowShrink(player);
|
||||
}
|
||||
|
||||
if (player->respawn.state != RESPAWNST_MOVE && (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN)
|
||||
if (player->respawn.state != RESPAWNST_MOVE && (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK)
|
||||
{
|
||||
player->finalfailsafe++; // Decremented by ringshooter to "freeze" this timer
|
||||
// Part-way through the auto-respawn timer, you can tap Ring Shooter to respawn early
|
||||
|
|
@ -10136,7 +10213,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
if (player->nextringaward >= ringrate)
|
||||
{
|
||||
if (player->instaWhipCharge)
|
||||
if (player->instaWhipCharge || player->baildrop || player->bailcharge)
|
||||
{
|
||||
// Store award rings to do diabolical horseshit with later.
|
||||
player->nextringaward = ringrate;
|
||||
|
|
@ -13876,6 +13953,106 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
}
|
||||
|
||||
|
||||
if ((player->cmd.buttons & BT_BAIL) && (player->cmd.buttons & BT_RESPAWNMASK) != BT_RESPAWNMASK && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active))
|
||||
{
|
||||
boolean grounded = P_IsObjectOnGround(player->mo);
|
||||
onground && player->tumbleBounces == 0 ? player->bailcharge += 2 : player->bailcharge++; // charge twice as fast on the ground
|
||||
if ((P_PlayerInPain(player) && player->bailcharge == 1) || (grounded && P_PlayerInPain(player) && player->bailcharge == 2)) // this is brittle ..
|
||||
{
|
||||
mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE);
|
||||
S_StartSound(bail, sfx_gshb9); // I tried to use info.c, but you can't play sounds on mobjspawn via A_PlaySound
|
||||
S_StartSound(bail, sfx_kc4e);
|
||||
P_SetTarget(&bail->target, player->mo);
|
||||
bail->renderflags |= RF_FULLBRIGHT; // set fullbright here, were gonna animate frames in the thinker and it saves us from setting FF_FULLBRIGHT every frame
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player->bailcharge = 0;
|
||||
}
|
||||
|
||||
if ((!P_PlayerInPain(player) && player->bailcharge >= 5) || player->bailcharge >= BAIL_MAXCHARGE)
|
||||
{
|
||||
player->bailcharge = 0;
|
||||
|
||||
mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL);
|
||||
P_SetTarget(&bail->target, player->mo);
|
||||
|
||||
UINT32 debtrings = 20;
|
||||
if (player->rings < 0)
|
||||
{
|
||||
debtrings -= player->rings;
|
||||
player->rings = 0;
|
||||
}
|
||||
|
||||
UINT32 totalrings = player->rings + player->superring + player->pickuprings;
|
||||
if (BAIL_CREDIT_DEBTRINGS)
|
||||
totalrings += debtrings;
|
||||
totalrings = max(totalrings, 0);
|
||||
UINT32 bailboost = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_BOOST));
|
||||
UINT32 baildrop = FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP));
|
||||
|
||||
if (player->itemRoulette.active)
|
||||
{
|
||||
player->itemRoulette.active = false;
|
||||
}
|
||||
|
||||
K_PopPlayerShield(player);
|
||||
K_DeleteHnextList(player);
|
||||
K_DropItems(player);
|
||||
|
||||
player->itemamount = 0;
|
||||
player->itemtype = 0;
|
||||
|
||||
/*
|
||||
if (player->itemamount)
|
||||
{
|
||||
K_DropPaperItem(player, player->itemtype, player->itemamount);
|
||||
player->itemtype = player->itemamount = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
player->rings = -20;
|
||||
player->superring = 0;
|
||||
player->pickuprings = 0;
|
||||
player->ringboxaward = 0;
|
||||
player->ringboxdelay = 0;
|
||||
|
||||
player->superringdisplay = 0;
|
||||
player->superringalert = 0;
|
||||
player->superringpeak = 0;
|
||||
|
||||
player->counterdash += TICRATE/8;
|
||||
|
||||
player->ringboost += bailboost * (3+K_GetKartRingPower(player, true));
|
||||
player->baildrop = baildrop * BAIL_DROPFREQUENCY + 1;
|
||||
|
||||
K_AddHitLag(player->mo, TICRATE/4, false);
|
||||
player->bailquake = true; // set for a one time quake effect as soon as hitlag ends
|
||||
|
||||
if (P_PlayerInPain(player))
|
||||
{
|
||||
player->spinouttimer = 0;
|
||||
player->spinouttype = 0;
|
||||
player->tumbleBounces = 0;
|
||||
player->pflags &= ~PF_TUMBLELASTBOUNCE;
|
||||
player->mo->rollangle = 0;
|
||||
P_ResetPitchRoll(player->mo);
|
||||
}
|
||||
|
||||
INT32 fls = K_GetEffectiveFollowerSkin(player);
|
||||
if (player->follower && fls >= 0 && fls < numfollowers)
|
||||
{
|
||||
const follower_t *fl = &followers[fls];
|
||||
S_StartSound(NULL, fl->hornsound);
|
||||
}
|
||||
|
||||
if (player->amps > 0)
|
||||
K_DefensiveOverdrive(player);
|
||||
|
||||
S_StartSound(player->mo, sfx_kc33);
|
||||
}
|
||||
|
||||
if (player && player->mo && K_PlayerCanUseItem(player))
|
||||
{
|
||||
// First, the really specific, finicky items that function without the item being directly in your item slot.
|
||||
|
|
|
|||
|
|
@ -44,6 +44,13 @@ Make sure this matches the actual number of states
|
|||
#define INSTAWHIP_TETHERBLOCK (TICRATE*4)
|
||||
#define PUNISHWINDOW (7*TICRATE/10)
|
||||
|
||||
#define BAIL_MAXCHARGE (84) // tics to bail when in painstate nad in air, on ground is half, if you touch this, also update Obj_BailChargeThink synced animation logic
|
||||
#define BAIL_DROP (FRACUNIT)
|
||||
#define BAIL_BOOST (FRACUNIT)
|
||||
#define BAIL_CREDIT_DEBTRINGS (true)
|
||||
#define BAIL_DROPFREQUENCY (2)
|
||||
#define BAILSTUN (TICRATE*10)
|
||||
|
||||
#define MAXCOMBOTHRUST (mapobjectscale*20)
|
||||
#define MAXCOMBOFLOAT (mapobjectscale*10)
|
||||
#define MINCOMBOTHRUST (mapobjectscale*2)
|
||||
|
|
|
|||
|
|
@ -465,8 +465,8 @@ boolean M_Responder(event_t *ev)
|
|||
// Special mid-game input behaviours
|
||||
if (Playing() && !demo.playback)
|
||||
{
|
||||
// Quick Retry (Y in modeattacking)
|
||||
if (modeattacking && G_PlayerInputDown(0, gc_respawn, splitscreen + 1) == true)
|
||||
// Quick Retry (Z in modeattacking)
|
||||
if (modeattacking && G_PlayerInputDown(0, gc_vote, splitscreen + 1) == true)
|
||||
{
|
||||
M_TryAgain(0);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -153,6 +153,10 @@ void Obj_ChargeFallThink(mobj_t *charge);
|
|||
void Obj_ChargeReleaseThink(mobj_t *release);
|
||||
void Obj_ChargeExtraThink(mobj_t *extra);
|
||||
|
||||
/* Bail VFX */
|
||||
void Obj_BailThink(mobj_t *aura);
|
||||
void Obj_BailChargeThink(mobj_t *aura);
|
||||
|
||||
/* Ring Shooter */
|
||||
boolean Obj_RingShooterThinker(mobj_t *mo);
|
||||
boolean Obj_PlayerRingShooterFreeze(const player_t *player);
|
||||
|
|
|
|||
|
|
@ -284,6 +284,12 @@ static int player_get(lua_State *L)
|
|||
lua_pushboolean(L, plr->progressivethrust);
|
||||
else if (fastcmp(field,"ringvisualwarning"))
|
||||
lua_pushboolean(L, plr->ringvisualwarning);
|
||||
else if (fastcmp(field,"bailcharge"))
|
||||
lua_pushinteger(L, plr->bailcharge);
|
||||
else if (fastcmp(field,"baildrop"))
|
||||
lua_pushinteger(L, plr->baildrop);
|
||||
else if (fastcmp(field,"bailquake"))
|
||||
lua_pushboolean(L, plr->bailquake);
|
||||
else if (fastcmp(field,"dotrickfx"))
|
||||
lua_pushboolean(L, plr->dotrickfx);
|
||||
else if (fastcmp(field,"stingfx"))
|
||||
|
|
@ -915,6 +921,12 @@ static int player_set(lua_State *L)
|
|||
plr->progressivethrust = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"ringvisualwarning"))
|
||||
plr->ringvisualwarning = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"bailcharge"))
|
||||
plr->bailcharge = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"baildrop"))
|
||||
plr->baildrop = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"bailquake"))
|
||||
plr->bailquake = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"analoginput"))
|
||||
plr->analoginput = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"transfer"))
|
||||
|
|
|
|||
|
|
@ -39,10 +39,10 @@ menuitem_t OPTIONS_ProfileControls[] = {
|
|||
{IT_CONTROL, "Brake / Go back", "Brake / Go back",
|
||||
"TLB_X", {.routine = M_ProfileSetControl}, gc_x, 0},
|
||||
|
||||
{IT_CONTROL, "Respawn", "Respawn",
|
||||
{IT_CONTROL, "Ring Bail", "Ring Bail / Burst",
|
||||
"TLB_Y", {.routine = M_ProfileSetControl}, gc_y, 0},
|
||||
|
||||
{IT_CONTROL, "Action", "Multiplayer quick-chat / quick-vote",
|
||||
{IT_CONTROL, "Action", "Quick-vote / Quick-chat / Time Attack Quick Restart",
|
||||
"TLB_Z", {.routine = M_ProfileSetControl}, gc_z, 0},
|
||||
|
||||
{IT_CONTROL, "Use Item", "Use item",
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ target_sources(SRB2SDL2 PRIVATE
|
|||
flame-shield.cpp
|
||||
stone-shoe.cpp
|
||||
exp.c
|
||||
bail.c
|
||||
)
|
||||
|
||||
add_subdirectory(versus)
|
||||
|
|
|
|||
80
src/objects/bail.c
Normal file
80
src/objects/bail.c
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2025 by AJ "Tyron" Martinez.
|
||||
// Copyright (C) 2025 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.
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \file bail.c
|
||||
/// \brief Charge VFX code.
|
||||
|
||||
#include "../doomdef.h"
|
||||
#include "../info.h"
|
||||
#include "../k_objects.h"
|
||||
#include "../info.h"
|
||||
#include "../k_kart.h"
|
||||
#include "../p_local.h"
|
||||
#include "../s_sound.h"
|
||||
|
||||
void Obj_BailThink (mobj_t *aura)
|
||||
{
|
||||
if (P_MobjWasRemoved(aura->target)
|
||||
|| aura->target->health == 0
|
||||
|| aura->target->destscale <= 1 // sealed star fall out
|
||||
|| !aura->target->player
|
||||
|| P_PlayerInPain(aura->target->player)) // if you got hit when starting to bail, cancel the VFX
|
||||
{
|
||||
P_RemoveMobj(aura);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj_t *mo = aura->target;
|
||||
|
||||
aura->flags &= ~(MF_NOCLIPTHING);
|
||||
P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2);
|
||||
aura->flags |= MF_NOCLIPTHING;
|
||||
|
||||
fixed_t baseScale = 12*mo->scale/10;
|
||||
|
||||
P_SetScale(aura, baseScale);
|
||||
|
||||
// make target player invisible during the effect, like the retro games
|
||||
if (aura->state == &states[S_BAIL])
|
||||
mo->renderflags |= RF_DONTDRAW;
|
||||
}
|
||||
}
|
||||
|
||||
void Obj_BailChargeThink (mobj_t *aura)
|
||||
{
|
||||
if (P_MobjWasRemoved(aura->target)
|
||||
|| aura->target->health == 0
|
||||
|| aura->target->destscale <= 1 // sealed star fall out
|
||||
|| !aura->target->player
|
||||
|| !aura->target->player->bailcharge)
|
||||
{
|
||||
P_RemoveMobj(aura);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj_t *mo = aura->target;
|
||||
player_t *player = mo->player;
|
||||
|
||||
// Follow player
|
||||
aura->flags &= ~(MF_NOCLIPTHING);
|
||||
P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2);
|
||||
aura->flags |= MF_NOCLIPTHING;
|
||||
// aura->color = mo->color;
|
||||
|
||||
aura->frame = ((player->bailcharge-1)/2); // By syncing the frame with the charge timer here
|
||||
|
||||
fixed_t baseScale = 13*mo->scale/10;
|
||||
|
||||
P_SetScale(aura, baseScale);
|
||||
|
||||
mobj_t *ghost = P_SpawnGhostMobj(aura);
|
||||
ghost->renderflags = (ghost->renderflags & ~RF_TRANSMASK)|RF_ADD;
|
||||
ghost->fuse = 3;
|
||||
}
|
||||
}
|
||||
|
|
@ -668,7 +668,7 @@ boolean Obj_PlayerRingShooterFreeze(const player_t *player)
|
|||
const mobj_t *base = player->ringShooter;
|
||||
|
||||
if (AllowRingShooter(player) == true
|
||||
&& (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN
|
||||
&& (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK
|
||||
&& P_MobjWasRemoved(base) == false)
|
||||
{
|
||||
return (rs_base_canceled(base) == 0);
|
||||
|
|
@ -682,7 +682,7 @@ void Obj_RingShooterInput(player_t *player)
|
|||
mobj_t *const base = player->ringShooter;
|
||||
|
||||
if (AllowRingShooter(player) == true
|
||||
&& (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN)
|
||||
&& (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK)
|
||||
{
|
||||
// "Freeze" final-failsafe timer if we're eligible to ringshooter, but don't reset it.
|
||||
if (player->finalfailsafe)
|
||||
|
|
|
|||
|
|
@ -3503,7 +3503,7 @@ void A_AttractChase(mobj_t *actor)
|
|||
|
||||
if (actor->extravalue1 && actor->type != MT_EMERALD) // SRB2Kart
|
||||
{
|
||||
if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player)
|
||||
if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player || actor->target->player->baildrop || actor->target->player->bailcharge)
|
||||
{
|
||||
P_RemoveMobj(actor);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -723,6 +723,17 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (special->extravalue1)
|
||||
return;
|
||||
|
||||
// No picking up rings while SPB is targetting you
|
||||
if (player->pflags & PF_RINGLOCK)
|
||||
return;
|
||||
|
||||
// Prepping instawhip? Don't ruin it by collecting rings
|
||||
if (player->instaWhipCharge)
|
||||
return;
|
||||
|
||||
if (player->baildrop || player->bailcharge)
|
||||
return;
|
||||
|
||||
// Don't immediately pick up spilled rings
|
||||
if (special->threshold > 0 || P_PlayerInPain(player) || player->spindash) // player->spindash: Otherwise, players can pick up rings that are thrown out of them from invinc spindash penalty
|
||||
return;
|
||||
|
|
@ -3596,7 +3607,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
#define RING_LAYER_SIDE_SIZE (3)
|
||||
#define RING_LAYER_SIZE (RING_LAYER_SIDE_SIZE * 2)
|
||||
|
||||
static void P_FlingBurst
|
||||
void P_FlingBurst
|
||||
( player_t *player,
|
||||
angle_t fa,
|
||||
mobjtype_t objType,
|
||||
|
|
|
|||
|
|
@ -549,6 +549,7 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End);
|
|||
void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source);
|
||||
boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype);
|
||||
void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype);
|
||||
void P_FlingBurst(player_t *player, angle_t fa, mobjtype_t objType, tic_t objFuse, fixed_t objScale, INT32 i);
|
||||
void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c
|
||||
|
||||
void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck);
|
||||
|
|
|
|||
10
src/p_mobj.c
10
src/p_mobj.c
|
|
@ -8923,6 +8923,16 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
Obj_BlockBodyThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_BAIL:
|
||||
{
|
||||
Obj_BailThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_BAILCHARGE:
|
||||
{
|
||||
Obj_BailChargeThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_AMPRING:
|
||||
{
|
||||
Obj_AmpRingThink(mobj);
|
||||
|
|
|
|||
|
|
@ -672,6 +672,10 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
WRITEUINT16(save->p, players[i].progressivethrust);
|
||||
WRITEUINT8(save->p, players[i].ringvisualwarning);
|
||||
|
||||
WRITEUINT32(save->p, players[i].bailcharge);
|
||||
WRITEUINT32(save->p, players[i].baildrop);
|
||||
WRITEUINT8(save->p, players[i].bailquake);
|
||||
|
||||
WRITEUINT8(save->p, players[i].analoginput);
|
||||
|
||||
WRITEUINT8(save->p, players[i].markedfordeath);
|
||||
|
|
@ -1329,6 +1333,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
players[i].progressivethrust = READUINT16(save->p);
|
||||
players[i].ringvisualwarning = READUINT8(save->p);
|
||||
|
||||
players[i].bailcharge = READUINT32(save->p);
|
||||
players[i].baildrop = READUINT32(save->p);
|
||||
players[i].bailquake = READUINT8(save->p);
|
||||
|
||||
players[i].analoginput = READUINT8(save->p);
|
||||
|
||||
players[i].markedfordeath = READUINT8(save->p);
|
||||
|
|
|
|||
|
|
@ -8698,7 +8698,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
|
|||
if (G_IsModeAttackRetrying() && !demo.playback)
|
||||
{
|
||||
nowtime = lastwipetic;
|
||||
while (G_PlayerInputDown(0, gc_respawn, splitscreen + 1) == true)
|
||||
while (G_PlayerInputDown(0, gc_vote, splitscreen + 1) == true)
|
||||
{
|
||||
while (!((nowtime = I_GetTime()) - lastwipetic))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9635,7 +9635,7 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset)
|
|||
quake = quake->next;
|
||||
}
|
||||
|
||||
// Add level-based effects.
|
||||
// Add level-based effects
|
||||
if (P_MobjWasRemoved(viewer->mo) == false
|
||||
&& viewer->speed > viewer->mo->scale
|
||||
&& P_IsObjectOnGround(viewer->mo) == true)
|
||||
|
|
|
|||
|
|
@ -3067,7 +3067,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num)
|
|||
}
|
||||
|
||||
// if you hold Y, you will lock on to displayplayer. (The last player you were ""f12-ing"")
|
||||
if (cam->freecam && cmd->buttons & BT_RESPAWN)
|
||||
if (cam->freecam && cmd->buttons & BT_BAIL)
|
||||
{
|
||||
lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot.
|
||||
cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y);
|
||||
|
|
@ -3369,7 +3369,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
|||
if (P_CameraThinker(player, thiscam, resetcalled))
|
||||
return true;
|
||||
|
||||
lookback = ( player->cmd.buttons & BT_LOOKBACK );
|
||||
lookback = K_GetKartButtons(player) & BT_LOOKBACK;
|
||||
|
||||
camspeed = cv_cam_speed[num].value;
|
||||
camstill = cv_cam_still[num].value || player->seasaw; // RR: seasaws lock the camera so that it isn't disorienting.
|
||||
|
|
|
|||
10
src/sounds.c
10
src/sounds.c
|
|
@ -778,7 +778,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc31", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc33", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away
|
||||
{"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
|
|
@ -805,7 +805,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Pop-shot"},
|
||||
{"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Power up"},
|
||||
{"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc4e", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away
|
||||
{"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"kc51", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
|
|
@ -1432,18 +1432,18 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"gshaf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away
|
||||
{"gshb3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshb9", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x4away
|
||||
{"gshba", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshbb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshbc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshbd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshbd", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away
|
||||
{"gshbe", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshbf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
{"gshc0a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue