Monitors: for 6 seconds, dropped items can only be picked up by the player who destroyed the monitor

- Paper items colorize to player color
  - Color flickers back to normal 1 second before the item
    can be picked up by anyone
- If a player who can't pick it up steps on the paper
  item, that player becomes shadowed
This commit is contained in:
James R 2024-01-16 23:04:31 -08:00
parent 9cd426dd3d
commit 91fdba650f
4 changed files with 29 additions and 4 deletions

View file

@ -95,7 +95,7 @@ void Obj_MonitorThink(mobj_t *monitor);
void Obj_MonitorPartThink(mobj_t *part);
fixed_t Obj_MonitorGetDamage(mobj_t *monitor, mobj_t *inflictor, UINT8 damagetype);
void Obj_MonitorOnDamage(mobj_t *monitor, mobj_t *inflictor, INT32 damage);
void Obj_MonitorOnDeath(mobj_t *monitor);
void Obj_MonitorOnDeath(mobj_t *monitor, mobj_t *source);
void Obj_MonitorShardThink(mobj_t *shard);
UINT32 Obj_MonitorGetEmerald(const mobj_t *monitor);
void Obj_MonitorSetItemSpot(mobj_t *monitor, mobj_t *spot);

View file

@ -670,7 +670,9 @@ Obj_MonitorOnDamage
}
void
Obj_MonitorOnDeath (mobj_t *monitor)
Obj_MonitorOnDeath
( mobj_t * monitor,
mobj_t * source)
{
const UINT8 itemcount = get_monitor_itemcount(monitor);
const angle_t ang = ANGLE_MAX / itemcount;
@ -686,13 +688,21 @@ Obj_MonitorOnDeath (mobj_t *monitor)
const SINT8 result = get_item_result();
const UINT32 localseed = restore_item_rng(sharedseed);
adjust_monitor_drop(monitor,
mobj_t *drop = adjust_monitor_drop(monitor,
K_FlingPaperItem(
monitor->x, monitor->y, monitor->z + (128 * mapobjectscale * flip),
i * ang, flip,
K_ItemResultToType(result),
K_ItemResultToAmount(result)));
if (!P_MobjWasRemoved(source) && source->player)
{
P_SetTarget(&drop->tracer, source);
drop->extravalue1 = 6*TICRATE;
drop->colorized = true;
drop->color = source->player->skincolor;
}
// K_FlingPaperItem may advance RNG, so update our
// copy of the seed afterward
sharedseed = restore_item_rng(localseed);

View file

@ -396,6 +396,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_InstaThrust(player->mo, player->mo->angle, 20<<FRACBITS);
return;
case MT_FLOATINGITEM: // SRB2Kart
if (special->extravalue1 > 0 && toucher != special->tracer)
{
player->pflags |= PF_CASTSHADOW;
return;
}
if (special->threshold >= FIRSTPOWERUP)
{
if (P_PlayerInPain(player))
@ -2366,7 +2372,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
}
case MT_MONITOR:
Obj_MonitorOnDeath(target);
Obj_MonitorOnDeath(target, source);
break;
case MT_BATTLEUFO:
Obj_BattleUFODeath(target, inflictor);

View file

@ -7587,6 +7587,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
K_UpdateMobjItemOverlay(mobj, mobj->threshold, mobj->movecount);
if (mobj->extravalue1 > 0)
{
mobj->extravalue1--;
if (mobj->extravalue1 < TICRATE)
{
mobj->colorized = mobj->extravalue1 & 1;
}
}
break;
}
case MT_ITEMCAPSULE: