From 9cd426dd3d9a90e1883c92868a738e916edac8be Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 22:47:07 -0800 Subject: [PATCH 1/5] Battle: last player standing gets 100 points --- src/k_battle.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/k_battle.c b/src/k_battle.c index e6a971163..134194286 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -122,6 +122,7 @@ void K_CheckBumpers(void) UINT8 numingame = 0; UINT8 nobumpers = 0; UINT8 eliminated = 0; + SINT8 kingofthehill = -1; if (!(gametyperules & GTR_BUMPERS)) return; @@ -148,6 +149,10 @@ void K_CheckBumpers(void) { eliminated++; } + else + { + kingofthehill = i; + } } if (numingame - eliminated == 2 && battleovertime.enabled && battleovertime.radius <= BARRIER_MIN_RADIUS) @@ -166,6 +171,13 @@ void K_CheckBumpers(void) } else if (eliminated >= numingame - 1) { + if (kingofthehill != -1) + { + // If every other player is eliminated, the + // last player standing wins by default. + players[kingofthehill].roundscore = 100; + } + P_DoAllPlayersExit(0, false); return; } From 91fdba650f8eb213eed479867910659aab6dcba2 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 23:04:31 -0800 Subject: [PATCH 2/5] 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 --- src/k_objects.h | 2 +- src/objects/monitor.c | 14 ++++++++++++-- src/p_inter.c | 8 +++++++- src/p_mobj.c | 9 +++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/k_objects.h b/src/k_objects.h index 45385b9a6..a14dd7dd1 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -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); diff --git a/src/objects/monitor.c b/src/objects/monitor.c index 359210d8e..474a49795 100644 --- a/src/objects/monitor.c +++ b/src/objects/monitor.c @@ -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); diff --git a/src/p_inter.c b/src/p_inter.c index a36f74262..6e4033fd8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -396,6 +396,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_InstaThrust(player->mo, player->mo->angle, 20<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); diff --git a/src/p_mobj.c b/src/p_mobj.c index 6622bbf79..dfe9008b8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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: From 9e4b716ed1c1879ea12a8576e0d73b3a55e9657c Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 23:11:32 -0800 Subject: [PATCH 3/5] Battle: any death is an elimination while Overtime Barrier is tangible --- src/p_inter.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index 6e4033fd8..d806f6573 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1790,6 +1790,11 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget if (gametyperules & GTR_BUMPERS) { + if (battleovertime.enabled >= 10*TICRATE) // Overtime Barrier is armed + { + target->player->pflags |= PF_ELIMINATED; + } + K_CheckBumpers(); if (target->player->roundscore > 1) From 54cf037eff4fa238f128abb5be8a66cc1d71f06d Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 23:32:06 -0800 Subject: [PATCH 4/5] Battle: point limit cap 20 -> 16 --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b5ae9b39e..6f494d32e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13359,9 +13359,9 @@ UINT32 K_PointLimitForGametype(void) } } - if (ptsCap > 20) + if (ptsCap > 16) { - ptsCap = 20; + ptsCap = 16; } } From 97e5d7404a743a64fd073906ada14765da89ce4e Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 17 Jan 2024 00:16:09 -0800 Subject: [PATCH 5/5] Battle: final KO gives the winner 100 points --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index 6f494d32e..32ebab1ad 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3909,6 +3909,7 @@ void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UIN // Check this before adding to player score if ((gametyperules & GTR_BUMPERS) && finishOff && g_pointlimit <= player->roundscore) { + player->roundscore = 100; // Make sure you win! P_DoAllPlayersExit(0, false); }