diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 094a52127..57783da8b 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5276,7 +5276,7 @@ static void HWR_ProjectSprite(mobj_t *thing) // New colormap stuff for skins Tails 06-07-2002 if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player! { - if (thing->player && thing->player->kartstuff[k_startimer]) + if (thing->colorized) vis->colormap = R_GetTranslationColormap(TC_STARMAN, thing->color, GTC_CACHE); else { @@ -5285,7 +5285,12 @@ static void HWR_ProjectSprite(mobj_t *thing) } } else - vis->colormap = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); + { + if (vis->mobj && vis->mobj->colorized) + vis->colormap = R_GetTranslationColormap(TC_STARMAN, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); + else + vis->colormap = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); + } } else vis->colormap = colormaps; diff --git a/src/k_kart.c b/src/k_kart.c index 3c66d5104..921aaebdf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1453,6 +1453,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { K_UpdateOffroad(player); + // setting players to use the star colormap and spawning afterimages + if (player->kartstuff[k_startimer]) + { + mobj_t *ghost; + player->mo->colorized = true; + ghost = P_SpawnGhostMobj(player->mo); + ghost->fuse = 4; + ghost->frame |= FF_FULLBRIGHT; + } + else + { + player->mo->colorized = false; + } + if (player->kartstuff[k_itemclose]) player->kartstuff[k_itemclose]--; @@ -1615,6 +1629,19 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_ChangeMusicInternal(mapmusname, true); } +void K_KartPlayerAfterThink(player_t *player) +{ + if (player->kartstuff[k_startimer]) + { + player->mo->frame |= FF_FULLBRIGHT; + } + else + { + if (!(player->mo->state->frame & FF_FULLBRIGHT)) + player->mo->frame &= ~FF_FULLBRIGHT; + } +} + static void K_PlayTauntSound(mobj_t *source) { switch (P_RandomFixed() % 4) @@ -4739,6 +4766,15 @@ static void K_drawKartPositionFaces(void) else { colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); + if (players[rankplayer[i]].mo->colorized) + { + colormap = R_GetTranslationColormap(TC_STARMAN, players[rankplayer[i]].mo->color, GTC_CACHE); + } + else + { + colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); + } + if (rankplayer[i] != myplayer) { V_DrawSmallTranslucentMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin], colormap); @@ -5087,7 +5123,15 @@ static void K_drawKartMinimap(void) V_DrawSciencePatch(amxpos, amypos, splitflags|V_FLIP, iconprefix[players[i].skin], FRACUNIT/2); else { - UINT8 *colormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, 0); //transtables[players[i].skin] - 256 + (players[i].skincolor<<8); + UINT8 *colormap; + if (players[i].mo->colorized) + { + colormap = R_GetTranslationColormap(TC_STARMAN, players[i].mo->color, 0); + } + else + { + colormap = R_GetTranslationColormap(players[i].skin, players[i].mo->color, 0); + } V_DrawFixedPatch(amxpos, amypos, FRACUNIT/2, splitflags|V_FLIP, iconprefix[players[i].skin], colormap); } } @@ -5097,7 +5141,15 @@ static void K_drawKartMinimap(void) V_DrawSciencePatch(amxpos, amypos, splitflags, iconprefix[players[i].skin], FRACUNIT/2); else { - UINT8 *colormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, 0); //transtables[players[i].skin] - 256 + (players[i].skincolor<<8); + UINT8 *colormap; + if (players[i].mo->colorized) + { + colormap = R_GetTranslationColormap(TC_STARMAN, players[i].mo->color, 0); + } + else + { + colormap = R_GetTranslationColormap(players[i].skin, players[i].mo->color, 0); + } V_DrawFixedPatch(amxpos, amypos, FRACUNIT/2, splitflags, iconprefix[players[i].skin], colormap); } } diff --git a/src/k_kart.h b/src/k_kart.h index 9a6c62bb9..c95818544 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -21,6 +21,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) void K_LakituChecker(player_t *player); void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); +void K_KartPlayerAfterThink(player_t *player); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index ec19261a0..2dbb58c89 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -80,7 +80,8 @@ enum mobj_e { mobj_extravalue1, mobj_extravalue2, mobj_cusval, - mobj_cvmem + mobj_cvmem, + mobj_colorized }; static const char *const mobj_opt[] = { @@ -140,6 +141,7 @@ static const char *const mobj_opt[] = { "extravalue2", "cusval", "cvmem", + "colorized", NULL}; #define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field]) @@ -343,6 +345,9 @@ static int mobj_get(lua_State *L) case mobj_cvmem: lua_pushinteger(L, mo->cvmem); break; + case mobj_colorized: + lua_pushboolean(L, mo->colorized); + break; default: // extra custom variables in Lua memory lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); @@ -638,6 +643,9 @@ static int mobj_set(lua_State *L) case mobj_cvmem: mo->cvmem = luaL_checkinteger(L, 3); break; + case mobj_colorized: + mo->colorized = luaL_checkboolean(L, 3); + break; default: lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); diff --git a/src/p_mobj.c b/src/p_mobj.c index 1ba05d699..2990947eb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8547,6 +8547,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) else mobj->z = z; + mobj->colorized = false; + #ifdef HAVE_BLUA // DANGER! This can cause P_SpawnMobj to return NULL! // Avoid using P_RemoveMobj on the newly created mobj in "MobjSpawn" Lua hooks! diff --git a/src/p_mobj.h b/src/p_mobj.h index c8207c564..3617ea407 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -360,6 +360,8 @@ typedef struct mobj_s struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?) #endif + boolean colorized; // Whether the mobj uses the starman colormap + // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/p_saveg.c b/src/p_saveg.c index 373b4d05e..577d512de 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -946,9 +946,11 @@ typedef enum MD2_HNEXT = 1<<7, #ifdef ESLOPE MD2_HPREV = 1<<8, - MD2_SLOPE = 1<<9 + MD2_SLOPE = 1<<9, + MD2_COLORIZED = 1<<10 #else - MD2_HPREV = 1<<8 + MD2_HPREV = 1<<8, + MD2_COLORIZED = 1<<9 #endif } mobj_diff2_t; @@ -1143,6 +1145,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (mobj->standingslope) diff2 |= MD2_SLOPE; #endif + if (mobj->colorized) + diff2 |= MD2_COLORIZED; if (diff2 != 0) diff |= MD_MORE; @@ -1262,6 +1266,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (diff2 & MD2_SLOPE) WRITEUINT16(save_p, mobj->standingslope->id); #endif + if (diff2 & MD2_COLORIZED) + WRITEUINT8(save_p, mobj->colorized); WRITEUINT32(save_p, mobj->mobjnum); } @@ -2131,7 +2137,8 @@ static void LoadMobjThinker(actionf_p1 thinker) if (diff2 & MD2_SLOPE) mobj->standingslope = P_SlopeById(READUINT16(save_p)); #endif - + if (diff2 & MD2_COLORIZED) + mobj->colorized = READUINT8(save_p); if (diff & MD_REDFLAG) { diff --git a/src/p_user.c b/src/p_user.c index 978ee1b9a..c1864ad3a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1513,6 +1513,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) } ghost->color = mobj->color; + ghost->colorized = mobj->colorized; // Kart: they should also be colorized if their origin is ghost->angle = mobj->angle; ghost->sprite = mobj->sprite; @@ -9518,7 +9519,7 @@ void P_PlayerThink(player_t *player) #if 1 // "Blur" a bit when you have speed shoes and are going fast enough if ((player->powers[pw_super] || player->powers[pw_sneakers] - || player->kartstuff[k_driftboost] || player->kartstuff[k_mushroomtimer]) // SRB2kart + || player->kartstuff[k_driftboost] || player->kartstuff[k_mushroomtimer]) && !player->kartstuff[k_startimer] // SRB2kart && (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale)) { mobj_t *gmobj = P_SpawnGhostMobj(player->mo); @@ -10073,4 +10074,6 @@ void P_PlayerAfterThink(player_t *player) if (P_IsObjectOnGround(player->mo)) player->mo->pmomz = 0; + + K_KartPlayerAfterThink(player); } diff --git a/src/r_things.c b/src/r_things.c index 6f88367a2..bac05b2f1 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -827,7 +827,7 @@ static void R_DrawVisSprite(vissprite_t *vis) dc_transmap = vis->transmap; if (vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // MT_GHOST LOOKS LIKE A PLAYER SO USE THE PLAYER TRANSLATION TABLES. >_> { - if (vis->mobj->player && vis->mobj->player->kartstuff[k_startimer]) + if (vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_STARMAN, vis->mobj->color, GTC_CACHE); else { @@ -851,7 +851,7 @@ static void R_DrawVisSprite(vissprite_t *vis) // New colormap stuff for skins Tails 06-07-2002 if (vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! { - if (vis->mobj->player && vis->mobj->player->kartstuff[k_startimer]) + if (vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_STARMAN, vis->mobj->color, GTC_CACHE); else {