Merge branch 'trick-panel-controls' into 'master'

Accel press to trick

See merge request KartKrew/Kart!2332
This commit is contained in:
Oni 2024-05-02 05:25:37 +00:00
commit fb9aeb3466
9 changed files with 78 additions and 7 deletions

View file

@ -810,6 +810,7 @@ struct player_t
fixed_t trickboostpower; // Save the rough speed multiplier. Used for upwards tricks.
UINT8 trickboostdecay; // used to know how long you've waited
UINT8 trickboost; // Trick boost. This one is weird and has variable speed. Dear god.
UINT8 tricklock; // Input safety for 2.2 lenient tricks.
UINT8 dashRingPullTics; // Timer during which the player is pulled towards a dash ring
UINT8 dashRingPushTics; // Timer during which the player displays effects and has no gravity after being thrust by a dash ring

View file

@ -237,6 +237,7 @@ patch_t *kp_button_up[2];
patch_t *kp_button_down[2];
patch_t *kp_button_right[2];
patch_t *kp_button_left[2];
patch_t *kp_button_dpad[2];
static void K_LoadButtonGraphics(patch_t *kp[2], int letter)
{
@ -910,6 +911,7 @@ void K_LoadKartHUDGraphics(void)
K_LoadButtonGraphics(kp_button_down, 'K');
K_LoadButtonGraphics(kp_button_right, 'L');
K_LoadButtonGraphics(kp_button_left, 'M');
K_LoadButtonGraphics(kp_button_dpad, 'T');
}
// For the item toggle menu

View file

@ -92,6 +92,7 @@ extern patch_t *kp_button_up[2];
extern patch_t *kp_button_down[2];
extern patch_t *kp_button_right[2];
extern patch_t *kp_button_left[2];
extern patch_t *kp_button_dpad[2];
extern patch_t *kp_eggnum[6];
extern patch_t *kp_facenum[MAXPLAYERS+1];

View file

@ -8836,6 +8836,18 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->ringdelay)
player->ringdelay--;
if (player->trickpanel == TRICKSTATE_READY)
{
if (!player->throwdir && !cmd->turning)
player->tricklock = TICRATE/10;
else if (player->tricklock)
player->tricklock--;
}
else
{
player->tricklock = 0;
}
if (P_PlayerInPain(player))
{
player->ringboost = 0;
@ -10460,11 +10472,15 @@ INT16 K_GetKartTurnValue(const player_t *player, INT16 turnvalue)
return 0;
}
// Staff ghosts - direction-only trickpanel behavior
if (G_CompatLevel(0x000A) || K_PlayerUsesBotMovement(player))
{
if (player->trickpanel == TRICKSTATE_READY || player->trickpanel == TRICKSTATE_FORWARD)
{
// Forward trick or rising from trickpanel
return 0;
}
}
if (player->justDI > 0)
{
@ -10622,6 +10638,18 @@ INT16 K_GetKartTurnValue(const player_t *player, INT16 turnvalue)
turnfixed /= 2;
}
// 2.2 - Presteering allowed in trickpanels
if (!G_CompatLevel(0x000A) && !K_PlayerUsesBotMovement(player))
{
if (player->trickpanel == TRICKSTATE_READY || player->trickpanel == TRICKSTATE_FORWARD)
{
// Forward trick or rising from trickpanel
turnfixed /= 2;
if (player->tricklock)
turnfixed /= (player->tricklock/2 + 1);
}
}
return (turnfixed / FRACUNIT);
}
@ -13410,6 +13438,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->tumbleHeight = 30; // Base tumble bounce height
player->trickpanel = TRICKSTATE_NONE;
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
K_AddMessageForPlayer(player, "Press <dpad> + <a> to trick!", true, false);
if (player->itemflags & (IF_ITEMOUT|IF_EGGMANOUT))
{
//K_PopPlayerShield(player); // shield is just being yeeted, don't pop
@ -13426,6 +13455,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
INT16 aimingcompare = abs(cmd->throwdir) - abs(cmd->turning);
// 2.2 - Pre-steering trickpanels
if (!G_CompatLevel(0x000A) && !K_PlayerUsesBotMovement(player))
{
if (!(player->cmd.buttons & BT_ACCELERATE))
{
aimingcompare = 0;
}
}
// Uses cmd->turning over steering intentionally.
#define TRICKTHRESHOLD (KART_FULLTURN/2)
if (aimingcompare < -TRICKTHRESHOLD) // side trick
@ -13656,6 +13694,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->trickboostdecay = 0;
}
// 2.2 - Lenient trickpanels
if (G_CompatLevel(0x000A) || K_PlayerUsesBotMovement(player))
{
// Wait until we let go off the control stick to remove the delay
// buttons must be neutral after the initial trick delay. This prevents weirdness where slight nudges after blast off would send you flying.
if ((player->pflags & PF_TRICKDELAY) && !player->throwdir && !cmd->turning && (player->tricktime >= TRICKDELAY))
@ -13663,6 +13704,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->pflags &= ~PF_TRICKDELAY;
}
}
else
{
if ((player->pflags & PF_TRICKDELAY) && !(player->cmd.buttons & BT_ACCELERATE) && (player->tricktime >= TRICKDELAY))
{
player->pflags &= ~PF_TRICKDELAY;
}
}
}
K_KartDrift(player, onground);
K_KartSpindash(player);

View file

@ -478,6 +478,8 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->trickboostdecay);
else if (fastcmp(field,"trickboost"))
lua_pushinteger(L, plr->trickboost);
else if (fastcmp(field,"tricklock"))
lua_pushinteger(L, plr->tricklock);
else if (fastcmp(field,"dashringpulltics"))
lua_pushinteger(L, plr->dashRingPullTics);
else if (fastcmp(field,"dashringpushtics"))
@ -1030,6 +1032,8 @@ static int player_set(lua_State *L)
plr->trickboostdecay = luaL_checkinteger(L, 3);
else if (fastcmp(field,"trickboost"))
plr->trickboost = luaL_checkinteger(L, 3);
else if (fastcmp(field,"tricklock"))
plr->tricklock = luaL_checkinteger(L, 3);
else if (fastcmp(field,"dashringpulltics"))
plr->dashRingPullTics = luaL_checkinteger(L, 3);
else if (fastcmp(field,"dashringpushtics"))

View file

@ -541,6 +541,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT32(save->p, players[i].trickboostpower);
WRITEUINT8(save->p, players[i].trickboostdecay);
WRITEUINT8(save->p, players[i].trickboost);
WRITEUINT8(save->p, players[i].tricklock);
WRITEUINT8(save->p, players[i].dashRingPullTics);
WRITEUINT8(save->p, players[i].dashRingPushTics);
@ -1140,6 +1141,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].trickboostpower = READUINT32(save->p);
players[i].trickboostdecay = READUINT8(save->p);
players[i].trickboost = READUINT8(save->p);
players[i].tricklock = READUINT8(save->p);
players[i].dashRingPullTics = READUINT8(save->p);
players[i].dashRingPushTics = READUINT8(save->p);

View file

@ -43,6 +43,8 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
BUTTON("right", 0x02),
BUTTON("left", 0x03),
BUTTON("dpad", 0x04),
BUTTON("r", 0x07),
BUTTON("l", 0x08),
BUTTON("start", 0x09),
@ -197,6 +199,7 @@ patch_t** get_button_patch(Draw::Button type, int ver)
X(down);
X(right);
X(left);
X(dpad);
#undef X
}

View file

@ -76,6 +76,7 @@ public:
down,
right,
left,
dpad,
};
class TextElement

View file

@ -2505,6 +2505,11 @@ static UINT8 V_GetButtonCodeWidth(UINT8 c)
x = 14;
break;
case 0x04:
// dpad
x = 14;
break;
case 0x0A:
case 0x0B:
case 0x0C:
@ -2700,6 +2705,8 @@ void V_DrawStringScaled(
case 0x02: return {{0, 3, Draw::Button::right}};
case 0x03: return {{0, 3, Draw::Button::left}};
case 0x04: return {{0, 4, Draw::Button::dpad}};
case 0x07: return {{0, 2, Draw::Button::r}};
case 0x08: return {{0, 2, Draw::Button::l}};