Tribes 2 // Mod Development Handbook GitHub

24 · Siege

The second gametype Classic ships its own copy of, and the only base gametype with no score limit — Sierra’s own comment explains why.

The rules

scripts/SiegeGame.cs’s header [script]:

One team defends base, other team tries to conquer it as quickly as possible
Game has two rounds: Round 1 ends when base is conquered or time runs out
Round 2: Teams switch sides, play again -- to win, attackers MUST beat the time set by the attackers in Round 1
Touching base switch conquers base

The fuller comment above the package declaration explains the design choice explicitly [script]:

“This mission type doesn’t have a scoreLimit because, well, it really doesn’t need one or lend itself to one.”

Siege is a time trial with roles reversed on the second lap, not a points race. Round 1 is timed; Round 2 repeats the same objective with sides swapped, and the winner is whichever team’s offense was faster. If the first attacking team never captures the base, the second team simply has to capture it at all — there is no clock to beat. Sierra’s mission comment states the asymmetry plainly:

If time runs out before initial defending team's objective is captured, then roles switch
and new offense team has to try to capture the objective before time runs out.

Conquering the base

The win condition is a single trigger touch, not a scoring accumulation [script]:

function FlipFlop::playerTouch(%data, %flipflop, %player)
{
   if(%player.team != Game.offenseTeam)
      return;
   ...
   Game.allObjectivesCompleted();
}

FlipFlop is the same switch object DnD holds for continuous points (section 23); here, touching it while on the attacking side ends the round outright — Game.allObjectivesCompleted() — rather than paying out per second. Same object class, two entirely different scoring philosophies layered on top of it depending on which gametype’s package is active. That reuse is a good demonstration of the package convention: the FlipFlop datablock stays fixed, and each gametype’s package supplies its own playerTouch handler.

What Classic changed

Classic’s SiegeGame.cs grows from 1213 lines to 1648 — the largest expansion of any shadowed gametype in this handbook. As with CTF, the growth splits into a consolidation and a set of genuine additions.

Removed by consolidation. Five per-object repair handlers — genOnRepaired, sensorOnRepaired, stationOnRepaired, turretOnRepaired, vStationOnRepaired — collapse into one generic staticShapeOnRepaired / objectRepaired pair [mod-script], the same simplification CTF received.

Added — defensive scoring. awardScoreGenDefend / testGenDefend and awardScorePlayerFFDefend / testPlayerFFDefend [mod-script]. This is the concrete implementation of the line noted in 39 · Classic 1.5.2: “Added some asset scoring to Siege, helpful for finding out who is doing what.” Base Siege scores only the round outcome; Classic scores individual defensive contributions — generator defence and force-field defence specifically — so a defender who never touches the switch still gets credit for the round.

Added — readiness voting. checkMatchStart / voteMatchStart [mod-script]. Siege’s round structure means a mid-round join is disruptive in a way CTF’s continuous play is not, so Classic adds an explicit vote to confirm both teams are ready before a round begins — the same instinct behind tournament mode’s spawn-wait countdown (section 31), applied at gametype level rather than server level.

Added elsewhere. RepairGunImage::onRepair, ShapeBaseData::onDestroyed, Observer::onTrigger, vehicleDestroyed, awardScoreTkDestroy — mostly plumbing in support of the two feature additions above.