Oni's suggestions

- Only look for players who can pick up the item. Serves as a subtle tell for other players holding onto items, and lets you see the canon color more often
- Held eggman item uses black instead of player color
- Fix karma items not animating
This commit is contained in:
Sally Cochenour 2020-03-30 07:43:22 -04:00
parent 266ad99374
commit 69a67376b3
3 changed files with 30 additions and 24 deletions

View file

@ -542,16 +542,21 @@ UINT8 K_GetKartColorByName(const char *name)
//} //}
UINT8 K_GetClosestPlayersColor(mobj_t *mobj) player_t *K_GetItemBoxPlayer(mobj_t *mobj)
{ {
fixed_t closest = INT32_MAX; fixed_t closest = INT32_MAX;
UINT8 color = SKINCOLOR_NONE; player_t *player = NULL;
UINT8 i; UINT8 i;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo) if (!(playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo) && !players[i].spectator))
&& !players[i].spectator && !players[i].exiting) {
continue;
}
// Always use normal item box rules -- could pass in "2" for fakes but they blend in better like this
if (P_CanPickupItem(&players[i], 1))
{ {
fixed_t dist = P_AproxDistance(P_AproxDistance( fixed_t dist = P_AproxDistance(P_AproxDistance(
players[i].mo->x - mobj->x, players[i].mo->x - mobj->x,
@ -566,13 +571,13 @@ UINT8 K_GetClosestPlayersColor(mobj_t *mobj)
if (dist < closest) if (dist < closest)
{ {
color = players[i].skincolor; player = &players[i];
closest = dist; closest = dist;
} }
} }
} }
return color; return player;
} }
//{ SRB2kart Net Variables //{ SRB2kart Net Variables
@ -5220,9 +5225,8 @@ static void K_MoveHeldObjects(player_t *player)
if (cur->type == MT_EGGMANITEM_SHIELD) if (cur->type == MT_EGGMANITEM_SHIELD)
{ {
// K_GetClosestPlayersColor will practically always get our player anyway // Decided that this should use their "canon" color.
// so we might as well save the effort cur->color = SKINCOLOR_BLACK;
cur->color = player->skincolor;
} }
cur->flags &= ~MF_NOCLIPTHING; cur->flags &= ~MF_NOCLIPTHING;

View file

@ -18,7 +18,7 @@ extern const UINT8 KartColor_Opposite[MAXSKINCOLORS*2];
void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor); void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor);
void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color); void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color);
UINT8 K_GetKartColorByName(const char *name); UINT8 K_GetKartColorByName(const char *name);
UINT8 K_GetClosestPlayersColor(mobj_t *mobj); player_t *K_GetItemBoxPlayer(mobj_t *mobj);
void K_RegisterKartStuff(void); void K_RegisterKartStuff(void);

View file

@ -8109,11 +8109,12 @@ void P_MobjThinker(mobj_t *mobj)
} }
case MT_EGGMANITEM: case MT_EGGMANITEM:
{ {
UINT8 color = K_GetClosestPlayersColor(mobj); player_t *player = K_GetItemBoxPlayer(mobj);
UINT8 color = SKINCOLOR_BLACK;
if (color == SKINCOLOR_NONE) if (player != NULL)
{ {
color = SKINCOLOR_BLACK; color = player->skincolor;
} }
mobj->color = color; mobj->color = color;
@ -8872,8 +8873,8 @@ void P_MobjThinker(mobj_t *mobj)
if (mobj->target->player->kartstuff[k_comebacktimer] > 0) if (mobj->target->player->kartstuff[k_comebacktimer] > 0)
{ {
if (state < mobj->info->spawnstate || state > mobj->info->spawnstate+19) if (state < S_PLAYERBOMB1 || state > S_PLAYERBOMB20)
P_SetMobjState(mobj, mobj->info->spawnstate); P_SetMobjState(mobj, S_PLAYERBOMB1);
if (mobj->target->player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) if (mobj->target->player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1))
mobj->flags2 &= ~MF2_DONTDRAW; mobj->flags2 &= ~MF2_DONTDRAW;
else else
@ -8882,14 +8883,14 @@ void P_MobjThinker(mobj_t *mobj)
else else
{ {
if (!mobj->target->player->kartstuff[k_comebackmode] if (!mobj->target->player->kartstuff[k_comebackmode]
&& (state < mobj->info->spawnstate || state > mobj->info->spawnstate+19)) && (state < S_PLAYERBOMB1 || state > S_PLAYERBOMB20))
P_SetMobjState(mobj, mobj->info->spawnstate); P_SetMobjState(mobj, S_PLAYERBOMB1);
else if (mobj->target->player->kartstuff[k_comebackmode] == 1 else if (mobj->target->player->kartstuff[k_comebackmode] == 1
&& state != mobj->info->seestate) && (state < S_PLAYERITEM1 || state > S_PLAYERITEM12))
P_SetMobjState(mobj, mobj->info->seestate); P_SetMobjState(mobj, S_PLAYERITEM1);
else if (mobj->target->player->kartstuff[k_comebackmode] == 2 else if (mobj->target->player->kartstuff[k_comebackmode] == 2
&& state != mobj->info->painstate) && (state < S_PLAYERFAKE1 || state > S_PLAYERFAKE12))
P_SetMobjState(mobj, mobj->info->painstate); P_SetMobjState(mobj, S_PLAYERFAKE1);
if (mobj->target->player->powers[pw_flashing] && (leveltime & 1)) if (mobj->target->player->powers[pw_flashing] && (leveltime & 1))
mobj->flags2 |= MF2_DONTDRAW; mobj->flags2 |= MF2_DONTDRAW;
@ -9969,11 +9970,12 @@ void P_MobjThinker(mobj_t *mobj)
} }
else else
{ {
UINT8 color = K_GetClosestPlayersColor(mobj); player_t *player = K_GetItemBoxPlayer(mobj);
UINT8 color = SKINCOLOR_BLACK;
if (color == SKINCOLOR_NONE) if (player != NULL)
{ {
color = SKINCOLOR_BLACK; color = player->skincolor;
} }
mobj->color = color; mobj->color = color;