Skip to content

Commit 5b7b23a

Browse files
golden frag suddendeath mode
1 parent 0420ed3 commit 5b7b23a

7 files changed

Lines changed: 125 additions & 3 deletions

File tree

include/g_consts.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@
302302
// k_sudden_death types
303303
#define SD_NORMAL (1)
304304
#define SD_TIEBREAK (2)
305+
#define SD_GOLDEN_FRAG (4)
306+
307+
308+
#define GOLDEN_FRAG_SNAPSHOT_INITIAL_VALUE (9999)
305309

306310
//
307311
#define CALLALIAS_SIZE (128)

include/g_local.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,21 @@ qbool AllowMonster(gedict_t *e);
12591259
#define SPAWN_SHOW_PREWAR 1
12601260
#define SPAWN_SHOW_MATCH 2
12611261

1262+
/**
1263+
* Stores the score state used to evaluate golden-frag overtime.
1264+
*
1265+
* The snapshot represents the score difference at the moment golden-frag
1266+
* tracking starts or is refreshed. A later score difference can be compared
1267+
* against this snapshot to determine whether a frag changed the lead enough
1268+
* to end the match.
1269+
*/
1270+
typedef struct {
1271+
int team1_score;
1272+
int team2_score;
1273+
} golden_frag_score_snapshot_t;
1274+
1275+
extern golden_frag_score_snapshot_t golden_frag_score_snapshot;
1276+
12621277
#define SPAWNICIDE_DISABLED 0
12631278
#define SPAWNICIDE_PREWAR 1
12641279
#define SPAWNICIDE_MATCH 2

src/client.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,10 +2418,77 @@ int tiecount(void)
24182418
return (deathmatch == 4 ? 2 : 3);
24192419
}
24202420

2421+
/**
2422+
* Gets the absolute score difference from the golden frag snapshot.
2423+
* @return The absolute difference between team1 and team2 snapshot scores.
2424+
*/
2425+
int GetGoldenFragSnapshotDifference(void)
2426+
{
2427+
return abs(golden_frag_score_snapshot.team1_score - golden_frag_score_snapshot.team2_score);
2428+
}
2429+
2430+
/**
2431+
* Checks if the current game mode is solo (duel or FFA).
2432+
* @return true if the mode is duel or FFA, false otherwise.
2433+
*/
2434+
qbool isDuelOrFFA(void) {
2435+
return (isDuel() || isFFA());
2436+
}
2437+
2438+
/**
2439+
* Gets the current absolute frag difference between the top two players / teams.
2440+
* @return The absolute difference in frags. For solo modes (duel/FFA), returns difference
2441+
* between the top two players' frags. For team modes, returns difference between team scores.
2442+
*/
2443+
int GetCurrentFragDifference(void) {
2444+
if (isDuelOrFFA()) {
2445+
const gedict_t *ed1 = get_ed_scores1();
2446+
const gedict_t *ed2 = get_ed_scores2();
2447+
if (ed1 && ed2) {
2448+
return abs((int)ed1->s.v.frags - (int)ed2->s.v.frags);
2449+
}
2450+
}
2451+
return abs(get_scores1() - get_scores2());
2452+
}
2453+
2454+
/**
2455+
* Checks if the golden frag snapshot should be updated mid-match.
2456+
* @return true if k_overtime is set to SD_GOLDEN_FRAG but k_sudden_death is not yet,
2457+
* indicating the match is still in regulation but will use golden frag for overtime.
2458+
*/
2459+
qbool shouldUpdateGoldenFragMidMatch(void) {
2460+
return (int) cvar("k_overtime") == SD_GOLDEN_FRAG
2461+
&& (int) k_sudden_death != SD_GOLDEN_FRAG;
2462+
}
2463+
2464+
/**
2465+
* Updates the golden frag score snapshot with current scores.
2466+
* For solo modes (duel/FFA), stores individual player frags.
2467+
* For team modes, stores team scores. This snapshot is used to track
2468+
* the score difference when golden frag overtime begins.
2469+
*/
2470+
void updateGoldenFragSnapshot(void) {
2471+
if (isDuelOrFFA()) {
2472+
const gedict_t *ed1 = get_ed_scores1();
2473+
const gedict_t *ed2 = get_ed_scores2();
2474+
if (ed1 && ed2) {
2475+
golden_frag_score_snapshot.team1_score = (int) ed1->s.v.frags;
2476+
golden_frag_score_snapshot.team2_score = (int) ed2->s.v.frags;
2477+
}
2478+
} else {
2479+
golden_frag_score_snapshot.team1_score = get_scores1();
2480+
golden_frag_score_snapshot.team2_score = get_scores2();
2481+
}
2482+
}
2483+
24212484
// check sudden death end
24222485
// call this on player death
24232486
void Check_SD(gedict_t *p)
24242487
{
2488+
if (shouldUpdateGoldenFragMidMatch()) {
2489+
updateGoldenFragSnapshot();
2490+
}
2491+
24252492
if (!match_in_progress)
24262493
{
24272494
return;
@@ -2463,6 +2530,15 @@ void Check_SD(gedict_t *p)
24632530
}
24642531
return;
24652532
}
2533+
2534+
case SD_GOLDEN_FRAG: {
2535+
// End when the leader extends the frag lead
2536+
if (GetCurrentFragDifference() > GetGoldenFragSnapshotDifference()) {
2537+
EndMatch(0);
2538+
} else {
2539+
updateGoldenFragSnapshot();
2540+
}
2541+
}
24662542
}
24672543
}
24682544

src/commands.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1729,7 +1729,7 @@ void ChangeOvertime(void)
17291729
return;
17301730
}
17311731

1732-
f1 = bound(0, cvar("k_overtime"), 3);
1732+
f1 = bound(0, cvar("k_overtime"), 4);
17331733
f2 = bound(0, cvar("k_exttime"), 999);
17341734

17351735
if (!f1)
@@ -1755,6 +1755,11 @@ void ChangeOvertime(void)
17551755
G_bprint(2, "%s: tie-break\n", redtext("Overtime"));
17561756
}
17571757
else if (f1 == 3)
1758+
{
1759+
cvar_fset("k_overtime", SD_GOLDEN_FRAG);
1760+
G_bprint(2, "%s: golden frag\n", redtext("Overtime"));
1761+
}
1762+
else if (f1 == SD_GOLDEN_FRAG)
17581763
{
17591764
cvar_fset("k_overtime", 0);
17601765
G_bprint(2, "%s: off\n", redtext("Overtime"));
@@ -1998,6 +2003,10 @@ void ModStatus2(void)
19982003
ot = va("%d tie-break", tiecount());
19992004
break;
20002005

2006+
case SD_GOLDEN_FRAG:
2007+
ot = va("golden frag");
2008+
break;
2009+
20012010
default:
20022011
ot = "unknown";
20032012
break;

src/g_utils.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2652,6 +2652,9 @@ char* SD_type_str(void)
26522652
case SD_TIEBREAK:
26532653
return "tie-break";
26542654

2655+
case SD_GOLDEN_FRAG:
2656+
return "Golden Frag";
2657+
26552658
default:
26562659
return "unknown";
26572660
}

src/globals.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,9 @@ float lastTeamLocationTime; // next udate for CheckTeamStatus()
112112
qbool first_rl_taken; // true when some one alredy took rl
113113

114114
int sv_minping; // used to broadcast changes
115+
116+
// { golden frag, setup with values that return large absolute value
117+
golden_frag_score_snapshot_t golden_frag_score_snapshot = {
118+
-GOLDEN_FRAG_SNAPSHOT_INITIAL_VALUE, GOLDEN_FRAG_SNAPSHOT_INITIAL_VALUE
119+
};
120+
// }

src/match.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ void CheckOvertime(void)
532532

533533
// If 0 no overtime, 1 overtime, 2 sudden death
534534
// And if its neither then well we exit
535-
if (!k_mb_overtime || ((k_mb_overtime != 1) && (k_mb_overtime != 2) && (k_mb_overtime != 3)))
535+
if (!k_mb_overtime || ((k_mb_overtime != 1) && (k_mb_overtime != 2) && (k_mb_overtime != 3) && (k_mb_overtime != SD_GOLDEN_FRAG)))
536536
{
537537
EndMatch(0);
538538

@@ -565,7 +565,8 @@ void CheckOvertime(void)
565565
|| ((isTeam() || isCTF()) && (teams == 2) && (players > 1))) // Handle a 2v2 or above team game or 1v1 CTF
566566
{
567567
if (((k_mb_overtime == 3) && abs(sc) > 1) // tie-break overtime allowed with one frag difference (c) ktpro
568-
|| ((k_mb_overtime != 3) && abs(sc) > 0)) // time based or sudden death overtime allowed with zero frag difference
568+
|| (k_mb_overtime != 3 && k_mb_overtime != SD_GOLDEN_FRAG && abs(sc) > 0)) // time based
569+
//or sudden death overtime not including golden frag allowed with zero frag difference
569570
{
570571
k_mb_overtime = 0;
571572
}
@@ -603,6 +604,10 @@ void CheckOvertime(void)
603604
k_sudden_death = SD_NORMAL;
604605
match_end_time = 0;
605606
}
607+
else if (k_overtime == SD_GOLDEN_FRAG) {
608+
k_sudden_death = SD_GOLDEN_FRAG;
609+
match_end_time = 0;
610+
}
606611
else
607612
{
608613
k_sudden_death = SD_TIEBREAK;
@@ -1702,6 +1707,10 @@ void PrintCountdown(int seconds)
17021707
ot = va("%s %s", dig3(tiecount()), redtext("tb"));
17031708
break;
17041709

1710+
case SD_GOLDEN_FRAG:
1711+
ot = va("gold");
1712+
break;
1713+
17051714
default:
17061715
ot = redtext("Unkn");
17071716
break;

0 commit comments

Comments
 (0)