From 8cc535925ba3b23c4b1146f812e032ca46278db1 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 30 Oct 2022 17:04:19 -0700 Subject: [PATCH] Ironman: Randomize every lap and after intro --- src/g_demo.c | 2 +- src/k_hud.c | 12 +++++++++--- src/p_spec.c | 3 +++ src/p_user.c | 12 ++---------- src/r_skins.c | 16 ++++++++++++++++ src/r_skins.h | 1 + 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index c0aeb5839..bacc64063 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -3145,7 +3145,7 @@ void G_DoPlayDemo(char *defdemoname) // it would only break the replay if we clipped them. players[i].kartspeed = kartspeed[i]; players[i].kartweight = kartweight[i]; - players[i].fakeskin = lastfakeskin[i]; + players[i].lastfakeskin = lastfakeskin[i]; } demo.deferstart = true; diff --git a/src/k_hud.c b/src/k_hud.c index a2e2baa1c..47f103f34 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1700,6 +1700,7 @@ static boolean K_drawKartPositionFaces(void) INT32 rankplayer[MAXPLAYERS]; INT32 bumperx, emeraldx, numplayersingame = 0; INT32 xoff, yoff, flipflag = 0; + UINT8 workingskin; UINT8 *colormap; ranklines = 0; @@ -1797,13 +1798,18 @@ static boolean K_drawKartPositionFaces(void) if (players[rankplayer[i]].mo->color) { - colormap = R_GetTranslationColormap(((skin_t*)players[rankplayer[i]].mo->skin) - skins, players[rankplayer[i]].mo->color, GTC_CACHE); + if ((skin_t*)players[rankplayer[i]].mo->skin) + workingskin = (skin_t*)players[rankplayer[i]].mo->skin - skins; + else + workingskin = players[rankplayer[i]].skin; + + colormap = R_GetTranslationColormap(workingskin, players[rankplayer[i]].mo->color, GTC_CACHE); if (players[rankplayer[i]].mo->colorized) colormap = R_GetTranslationColormap(TC_RAINBOW, players[rankplayer[i]].mo->color, GTC_CACHE); else - colormap = R_GetTranslationColormap(((skin_t*)players[rankplayer[i]].mo->skin) - skins, players[rankplayer[i]].mo->color, GTC_CACHE); + colormap = R_GetTranslationColormap(workingskin, players[rankplayer[i]].mo->color, GTC_CACHE); - V_DrawMappedPatch(FACE_X + xoff, Y + yoff, V_HUDTRANS|V_SLIDEIN|V_SNAPTOLEFT|flipflag, faceprefix[((skin_t*)players[rankplayer[i]].mo->skin) - skins][FACE_RANK], colormap); + V_DrawMappedPatch(FACE_X + xoff, Y + yoff, V_HUDTRANS|V_SLIDEIN|V_SNAPTOLEFT|flipflag, faceprefix[workingskin][FACE_RANK], colormap); if (LUA_HudEnabled(hud_battlebumpers)) { diff --git a/src/p_spec.c b/src/p_spec.c index 25d75f3ff..7063b6dc5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1919,6 +1919,9 @@ static void K_HandleLapIncrement(player_t *player) player->karthud[khud_lapanimation] = 80; } + if (skins[player->skin].flags & SF_IRONMAN) + SetRandomFakePlayerSkin(player); + if (rainbowstartavailable == true) { S_StartSound(player->mo, sfx_s23c); diff --git a/src/p_user.c b/src/p_user.c index 3c64604f4..f19211f9f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4168,7 +4168,7 @@ void P_PlayerThink(player_t *player) player->stairjank--; } // Random skin / "ironman" - if (((skin_t *)player->mo->skin)->flags & SF_IRONMAN) + if (leveltime >= introtime && ((skin_t *)player->mo->skin)->flags & SF_IRONMAN) { if (player->mo) { if (player->fakeskin != MAXSKINS) @@ -4177,15 +4177,7 @@ void P_PlayerThink(player_t *player) } else { - INT32 i; - do { - i = P_RandomKey(PR_RANDOMSKIN, numskins); - } while (skins[i].flags & SF_IRONMAN || i == player->lastfakeskin); - - SetFakePlayerSkin(player, i); - - S_StartSound(NULL, sfx_kc33); - K_SpawnDriftElectricSparks(player, player->skincolor, false); + SetRandomFakePlayerSkin(player); } } } diff --git a/src/r_skins.c b/src/r_skins.c index ba081efd6..d4708b597 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -27,6 +27,8 @@ #include "p_local.h" #include "dehacked.h" // get_number (for thok) #include "m_cond.h" +#include "k_kart.h" +#include "m_random.h" #if 0 #include "k_kart.h" // K_KartResetPlayerColor #endif @@ -345,6 +347,20 @@ void SetFakePlayerSkin(player_t* player, INT32 skinnum) player->charflags = skins[skinnum].flags; } +// Loudly rerandomize +void SetRandomFakePlayerSkin(player_t* player) +{ + INT32 i; + do { + i = P_RandomKey(PR_RANDOMSKIN, numskins); + } while (skins[i].flags & SF_IRONMAN || i == player->lastfakeskin); + + SetFakePlayerSkin(player, i); + + S_StartSound(NULL, sfx_kc33); + K_SpawnDriftElectricSparks(player, player->skincolor, false); +} + // // Add skins from a pwad, each skin preceded by 'S_SKIN' marker // diff --git a/src/r_skins.h b/src/r_skins.h index 9e51f025c..66fdaf3a6 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -82,6 +82,7 @@ void R_InitSkins(void); void SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 void SetFakePlayerSkin(player_t* player, INT32 skinnum); +void SetRandomFakePlayerSkin(player_t* player); boolean R_SkinUsable(INT32 playernum, INT32 skinnum); UINT32 R_GetSkinAvailabilities(void); INT32 R_SkinAvailable(const char *name);