T2-BoL/scripts/SiegeGame.cs
2015-08-30 02:30:29 -04:00

1225 lines
40 KiB
C#

//--- GAME RULES BEGIN ---
//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
//--- GAME RULES END ---
//Siege type script for TRIBES 2
//
//The two teams each take a turn at defense and offense.
//
//If initial defending team's objective is captured, then roles switch
//and new offense team gets same amount of time to attempt to capture the
//objective.
//
//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.
//
//The winner is either the team who captures the objective in least amount of time.
//
// In the mission file, Team 1 will be offense team, and team 2 will be the defense team.
// When the game actually starts, either team could start on offense, and the objects must
// have their team designation set accordingly.
//
// This mission type doesn't have a scoreLimit because, well, it really doesn't
// need one or lend itself to one.
// ai support
exec("scripts/aiSiege.cs");
$InvBanList[Siege, "MiningTool"] = 1;
package SiegeGame {
function FlipFlop::objectiveInit(%data, %flipflop)
{
Game.regObjective(%flipflop);
setTargetSkin(%flipflop.getTarget(), $teamSkin[0]);
}
function SiegeGame::regObjective(%game, %object)
{
%objSet = nameToID("MissionCleanup/Objectives");
if(!isObject(%objSet))
{
%objSet = new SimSet("Objectives");
MissionCleanup.add(%objSet);
}
%objSet.add(%object);
}
function FlipFlop::playerTouch(%data, %flipflop, %player)
{
if(%player.team != Game.offenseTeam)
return;
%defTeam = Game.offenseTeam == 1 ? 2 : 1;
Game.capPlayer[Game.offenseTeam] = stripChars( getTaggedString( %player.client.name ), "\cp\co\c6\c7\c8\c9" );
// Let the observers know:
messageTeam( 0, 'MsgSiegeTouchFlipFlop', '\c2%1 captured the %2 base!~wfx/misc/flipflop_taken.wav', %player.client.name, $TeamName[%defTeam] );
// Let the teammates know:
messageTeam( %player.team, 'MsgSiegeTouchFlipFlop', '\c2%1 captured the %2 base!~wfx/misc/flipflop_taken.wav', %player.client.name, $TeamName[%defTeam] );
// Let the other team know:
%losers = %player.team == 1 ? 2 : 1;
messageTeam( %losers, 'MsgSiegeTouchFlipFlop', '\c2%1 captured the %2 base!~wfx/misc/flipflop_lost.wav', %player.client.name, $TeamName[%defTeam]);
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") captured team "@%defTeam@" base");
Game.allObjectivesCompleted();
}
//--------------------------------------------------------------------------------
function StaticShapeData::onDisabled(%data, %obj, %prevState)
{
Parent::onDisabled(%data, %obj, %prevState);
if(%obj.waypoint)
game.switchWaypoint(%obj.waypoint);
}
//--------------------------------------------------------------------------------
function StaticShapeData::onEnabled(%data, %obj, %prevState)
{
if(%obj.waypoint)
game.switchWaypoint(%obj.waypoint);
if(%obj.isPowered())
%data.onGainPowerEnabled(%obj);
Parent::onEnabled(%data, %obj, %prevState);
}
};
//--------- Siege SCORING INIT ------------------
function SiegeGame::initGameVars(%game)
{
%game.SCORE_PER_SUICIDE = 0;
%game.SCORE_PER_TEAMKILL = 0;
%game.SCORE_PER_DEATH = 0;
%game.SCORE_PER_KILL = 0;
%game.SCORE_PER_TURRET_KILL = 0;
}
function SiegeGame::claimFlipflopResources(%game, %flipflop, %team)
{
// equipment shouldn't switch teams when flipflop is touched
}
function SiegeGame::missionLoadDone(%game)
{
if( $Host::timeLimit == 0 )
$Host::timeLimit = 999;
//default version sets up teams - must be called first...
DefaultGame::missionLoadDone(%game);
//clear the scores
$teamScore[1] = 0;
$teamScore[2] = 0;
//decide which team is starting first
if (getRandom() > 0.5)
{
%game.offenseTeam = 1;
%defenseTeam = 2;
}
else
{
%game.offenseTeam = 2;
%defenseTeam = 1;
}
//send the message
messageAll('MsgSiegeStart', '\c2Team %1 is starting on offense', $teamName[%game.offenseTeam]);
//if the first offense team is team2, switch the object team designation
if (%game.offenseTeam == 2)
{
%group = nameToID("MissionGroup/Teams");
%group.swapTeams();
// search for vehicle pads also
%mcg = nameToID("MissionCleanup");
%mcg.swapVehiclePads();
}
//also ensure the objectives are all on the defending team
%objSet = nameToId("MissionCleanup/Objectives");
for(%j = 0; %j < %objSet.getCount(); %j++)
{
%obj = %objSet.getObject(%j);
%obj.team = %defenseTeam;
setTargetSensorGroup(%obj.getTarget(), %defenseTeam);
}
//indicate we're starting the game from the beginning...
%game.firstHalf = true;
%game.timeLimitMS = $Host::TimeLimit * 60 * 1000;
%game.secondHalfCountDown = false;
%game.capPlayer[1] = "";
%game.capPlayer[2] = "";
// save off turret bases' original barrels
%game.checkTurretBases();
// add objective waypoints
%game.findObjectiveWaypoints();
MissionGroup.setupPositionMarkers(true);
}
function SiegeGame::checkTurretBases(%game)
{
%mGroup = nameToID("MissionGroup/Teams");
%mGroup.findTurretBase();
}
function SimGroup::findTurretBase(%this)
{
for (%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).findTurretBase();
}
function InteriorInstance::findTurretBase(%this)
{
// sorry, we're not looking for interiors
}
function AIObjective::findTurretBase(%this)
{
// prevent console error spam
}
function TSStatic::findTurretBase(%this)
{
// prevent console error spam
}
function GameBase::findTurretBase(%this)
{
// apparently, the initialBarrel attribute gets overwritten whenever the
// barrel gets replaced. :( So we have to save it again under "originalBarrel".
if(%this.getDatablock().getName() $= "TurretBaseLarge")
%this.originalBarrel = %this.initialBarrel;
}
function TSStatic::findTurretBase(%this)
{
// prevent console error spam
}
function SiegeGame::selectSpawnSphere(%game, %team)
{
//for siege, the team1 drops are offense, team2 drops are defense
%sphereTeam = %game.offenseTeam == %team ? 1 : 2;
return DefaultGame::selectSpawnSphere(%game, %sphereTeam);
}
function SiegeGame::startMatch(%game)
{
DefaultGame::startMatch( %game );
%game.startTimeMS = getSimTime();
// schedule first timeLimit check for 20 seconds
%game.timeSync = %game.schedule( 20000, "checkTimeLimit");
%game.timeThread = %game.schedule( %game.timeLimitMS, "timeLimitReached");
//updateClientTimes(%game.timeLimitMS);
messageAll('MsgSystemClock', "", $Host::TimeLimit, %game.timeLimitMS);
// %count = ClientGroup.getCount();
// for ( %i = 0; %i < %count; %i++ )
// {
// %cl = ClientGroup.getObject( %i );
// if ( %cl.team == %game.offenseTeam )
// centerPrint( %cl, "\nTouch the enemy control switch to capture their base!", 5, 3 );
// else
// centerPrint( %cl, "\nPrevent the enemy from touching your control switch!", 5, 3 );
// }
//make sure the AI is started
AISystemEnabled(true);
}
function SiegeGame::allObjectivesCompleted(%game)
{
Cancel( %game.timeSync );
Cancel( %game.timeThread );
cancelEndCountdown();
//store the elapsed time in the teamScore array...
$teamScore[%game.offenseTeam] = getSimTime() - %game.startTimeMS;
messageAll('MsgSiegeCaptured', '\c2Team %1 captured the base in %2!', $teamName[%game.offenseTeam], %game.formatTime($teamScore[%game.offenseTeam], true));
//set the new timelimit
%game.timeLimitMS = $teamScore[%game.offenseTeam];
if (%game.firstHalf)
{
// it's halftime, let everyone know
messageAll( 'MsgSiegeHalftime' );
}
else
{
// game is over
messageAll('MsgSiegeMisDone', '\c2Mission complete.');
}
logEcho("objective completed in "@%game.timeLimitMS);
//setup the second half...
// MES -- per MarkF, scheduling for 0 seconds will prevent player deletion-related crashes
%game.schedule(0, halftime, 'objectives');
}
function SiegeGame::timeLimitReached(%game)
{
cancel( %game.timeThread );
cancel( %game.timeSync );
// if time has run out, the offense team gets no score (note, %game.timeLimitMS doesn't change)
$teamScore[%game.offenseTeam] = 0;
messageAll('MsgSiegeFailed', '\c2Team %1 failed to capture the base.', $teamName[%game.offenseTeam]);
if (%game.firstHalf)
{
// it's halftime, let everyone know
messageAll( 'MsgSiegeHalftime' );
}
else
{
// game is over
messageAll('MsgSiegeMisDone', '\c2Mission complete.');
}
logEcho("time limit reached");
%game.halftime('time');
}
function SiegeGame::checkTimeLimit(%game)
{
//if we're counting down to the beginning of the second half, check back in
if (%game.secondHalfCountDown)
{
%game.timeSync = %game.schedule(1000, "checkTimeLimit");
return;
}
%timeElapsedMS = getSimTime() - %game.startTimeMS;
%curTimeLeftMS = %game.timeLimitMS - %timeElapsedMS;
if (%curTimeLeftMS <= 0)
{
// time's up, put down your pencils
%game.timeLimitReached();
}
else
{
if(%curTimeLeftMS >= 20000)
%game.timeSync = %game.schedule( 20000, "checkTimeLimit" );
else
%game.timeSync = %game.schedule( %curTimeLeftMS + 1, "checkTimeLimit" );
//now synchronize everyone's clock
messageAll('MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS);
}
}
function SiegeGame::startSecondHalf(%game)
{
$MatchStarted = true;
%game.secondHalfCountDown = false;
MessageAll('MsgMissionStart', "\c2Match started");
// set the start time.
//the new %game.timeLimitMS would have been set by timeLimitReached() or allObjectivesCompleted()
%game.startTimeMS = getSimTime();
%game.timeThread = %game.schedule(%game.timeLimitMS, "timeLimitReached");
if (%game.timeLimitMS > 20000)
%game.timeSync = %game.schedule(20000, "checkTimeLimit");
else
%game.timeSync = %game.schedule(%game.timeLimitMS, "checkTimeLimit");
logEcho("start second half");
EndCountdown(%game.timeLimitMS);
// set all clients control to their player
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
if (!isObject(%cl.player))
commandToClient(%cl, 'setHudMode', 'Observer');
else
{
%cl.observerMode = "";
%cl.setControlObject( %cl.player );
commandToClient(%cl, 'setHudMode', 'Standard');
// if ( %client.team == %game.offenseTeam )
// centerPrint( %cl, "\nTouch the enemy control switch to capture their base!", 5, 3 );
// else
// centerPrint( %cl, "\nPrevent the enemy from touching your control switch!", 5, 3 );
}
}
//now synchronize everyone's clock
updateClientTimes(%game.timeLimitMS);
//start the bots up again...
AISystemEnabled(true);
}
function SiegeGame::halftime(%game, %reason)
{
//stop the game and the bots
$MatchStarted = false;
AISystemEnabled(false);
if (%game.firstHalf)
{
//switch the game variables
%game.firstHalf = false;
%oldOffenseTeam = %game.offenseTeam;
if (%game.offenseTeam == 1)
%game.offenseTeam = 2;
else
%game.offenseTeam = 1;
//send the message
messageAll('MsgSiegeRolesSwitched', '\c2Team %1 is now on offense.', $teamName[%game.offenseTeam], %game.offenseTeam);
//reset stations and vehicles that players were using
%game.resetPlayers();
// zero out the counts for deployable items (found in defaultGame.cs)
%game.clearDeployableMaxes();
// z0dd - ZOD, 5/17/02. Clean up deployables triggers, function in supportClassic.cs
cleanTriggers(nameToID("MissionCleanup/Deployables"));
// clean up the MissionCleanup group - note, this includes deleting all the player objects
%clean = nameToID("MissionCleanup");
%clean.housekeeping();
// Non static objects placed in original position
resetNonStaticObjPositions();
// switch the teams for objects belonging to the teams
%group = nameToID("MissionGroup/Teams");
%group.swapTeams();
// search for vehicle pads also
%mcg = nameToID("MissionCleanup");
%mcg.swapVehiclePads();
//restore the objects
%game.restoreObjects();
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
if( !%client.isAIControlled() )
{
// Put everybody in observer mode:
%client.camera.getDataBlock().setMode( %client.camera, "observerStaticNoNext" );
%client.setControlObject( %client.camera );
// Send the halftime result info:
if ( %client.team == %oldOffenseTeam )
{
if ( $teamScore[%oldOffenseTeam] > 0 )
messageClient( %client, 'MsgSiegeResult', "", '%1 captured the %2 base in %3!', %game.capPlayer[%oldOffenseTeam], $teamName[%game.offenseTeam], %game.formatTime( $teamScore[%oldOffenseTeam], true ) );
else
messageClient( %client, 'MsgSiegeResult', "", 'Your team failed to capture the %1 base.', $teamName[%game.offenseTeam] );
}
else if ( $teamScore[%oldOffenseTeam] > 0 )
messageClient( %client, 'MsgSiegeResult', "", '%1 captured your base in %3!', %game.capPlayer[%oldOffenseTeam], %game.formatTime( $teamScore[%oldOffenseTeam], true ) );
else
messageClient( %client, 'MsgSiegeResult', "", 'Your team successfully held off team %1!', $teamName[%oldOffenseTeam] );
// List out the team rosters:
messageClient( %client, 'MsgSiegeAddLine', "", '<spush><color:00dc00><font:univers condensed:18><clip%%:50>%1</clip><lmargin%%:50><clip%%:50>%2</clip><spop>', $TeamName[1], $TeamName[2] );
%max = $TeamRank[1, count] > $TeamRank[2, count] ? $TeamRank[1, count] : $TeamRank[2, count];
for ( %line = 0; %line < %max; %line++ )
{
%plyr1 = $TeamRank[1, %line] $= "" ? "" : $TeamRank[1, %line].name;
%plyr2 = $TeamRank[2, %line] $= "" ? "" : $TeamRank[2, %line].name;
messageClient( %client, 'MsgSiegeAddLine', "", '<lmargin:0><clip%%:50> %1</clip><lmargin%%:50><clip%%:50> %2</clip>', %plyr1, %plyr2 );
}
// Show observers:
%header = false;
for ( %i = 0; %i < %count; %i++ )
{
%obs = ClientGroup.getObject( %i );
if ( %obs.team <= 0 )
{
if ( !%header )
{
messageClient( %client, 'MsgSiegeAddLine', "", '\n<lmargin:0><spush><color:00dc00><font:univers condensed:18>OBSERVERS<spop>' );
%header = true;
}
messageClient( %client, 'MsgSiegeAddLine', "", ' %1', %obs.name );
}
}
commandToClient( %client, 'SetHalftimeClock', $Host::Siege::Halftime / 60000 );
// Get the HUDs right:
commandToClient( %client, 'setHudMode', 'SiegeHalftime' );
commandToClient( %client, 'ControlObjectReset' );
clientResetTargets(%client, true);
%client.notReady = true;
}
}
%game.schedule( $Host::Siege::Halftime, halftimeOver );
}
else
{
// let's wrap it all up
%game.gameOver();
cycleMissions();
}
}
function SiegeGame::halftimeOver( %game )
{
// drop all players into mission
%game.dropPlayers();
//setup the AI for the second half
%game.aiHalfTime();
// start the mission again (release players)
%game.halfTimeCountDown( $Host::warmupTime );
//redo the objective waypoints
%game.findObjectiveWaypoints();
}
function SiegeGame::dropPlayers( %game )
{
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
if( !%client.isAIControlled() )
{
// keep observers in observer mode
if(%client.team == 0)
%client.camera.getDataBlock().setMode(%client.camera, "justJoined");
else
{
%game.spawnPlayer( %client, false );
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
%client.setControlObject( %client.camera );
%client.notReady = false;
}
}
}
}
function SiegeGame::resetPlayers(%game)
{
// go through the client group and reset anything the players were using
// is most of this stuff really necessary?
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
%player = %client.player;
// clear the pack icon
messageClient(%client, 'msgPackIconOff', "");
// if player was firing, stop firing
if(%player.getImageTrigger($WeaponSlot))
%player.setImageTrigger($WeaponSlot, false);
// if player had pack activated, deactivate it
if(%player.getImageTrigger($BackpackSlot))
%player.setImageTrigger($BackpackSlot, false);
// if player was in a vehicle, get rid of vehicle hud
commandToClient(%client, 'setHudMode', 'Standard', "", 0);
// clear player's weapons and inventory huds
%client.SetWeaponsHudClearAll();
%client.SetInventoryHudClearAll();
// if player was at a station, deactivate it
if(%player.station)
{
%player.station.triggeredBy = "";
%player.station.getDataBlock().stationTriggered(%player.station, 0);
if(%player.armorSwitchSchedule)
cancel(%player.armorSwitchSchedule);
}
// if piloting a vehicle, reset it (assuming it doesn't get deleted)
if(%player.lastVehicle.lastPilot)
%player.lastVehicle.lastPilot = "";
}
}
function SimGroup::housekeeping(%this)
{
// delete selectively in the MissionCleanup group
%count = %this.getCount();
// have to do this backwards or only half the objects will be deleted
for(%i = (%count - 1); %i > -1; %i--)
{
%detritus = %this.getObject(%i);
if(%detritus.getClassName() $= "SimSet")
{
// I don't think there are any simsets we want to delete
}
else if(%detritus.getName() $= "PZones")
{
// simgroup of physical zones for force fields
// don't delete them
}
//else if (%detritus.getClassName() $= "ScriptObject")
//{
// // this will be the game type object.
// // DEFINITELY don't want to delete this.
//}
else if(%detritus.getName() $= PosMarker)
{
//Needed to reset non static objects...
}
else if((%detritus.getName() $= "TeamDrops1") || (%detritus.getName() $= "TeamDrops2"))
{
// this will actually be a SimSet named TeamDropsN (1 or 2)
// don't want to delete the spawn sphere groups, so do nothing
}
else if (%detritus.getName() $= "PlayerListGroup")
{
// we don't want to delete PlayerListGroup (SimGroup)
}
else if (%detritus.getDatablock().getName() $= "stationTrigger")
{
//we don't want to delete triggers for stations
}
else if (%detritus.getDatablock().getName() $= "StationVehicle")
{
// vehicle stations automatically get placed in MissionCleanup in a
// position near the vehicle pad. Don't delete it.
}
else if (%detritus.getClassName() $= "Camera")
{
// Cameras should NOT be deleted
}
else
{
// this group of stuff to be deleted should include:
// mines, deployed objects, projectiles, explosions, corpses,
// players, and the like.
%detritus.delete();
}
}
}
function SiegeGame::groupSwapTeams(%game, %this)
{
for(%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).swapTeams();
}
function SiegeGame::objectSwapTeams(%game, %this)
{
%defTeam = %game.offenseTeam == 1 ? 2 : 1;
if(%this.getDatablock().getName() $= "Flipflop")
{
if(getTargetSensorGroup(%this.getTarget()) != %defTeam)
{
setTargetSensorGroup(%this.getTarget(), %defTeam);
%this.team = %defTeam;
}
}
else
{
if(%this.getTarget() != -1)
{
if(getTargetSensorGroup(%this.getTarget()) == %game.offenseTeam)
{
setTargetSensorGroup(%this.getTarget(), %defTeam);
%this.team = %defTeam;
}
else if(getTargetSensorGroup(%this.getTarget()) == %defTeam)
{
setTargetSensorGroup(%this.getTarget(), %game.offenseTeam);
%this.team = %game.offenseTeam;
}
}
if(%this.getClassName() $= "Waypoint")
{
if(%this.team == %defTeam)
%this.team = %game.offenseTeam;
else if(%this.team == %game.offenseTeam)
%this.team = %defTeam;
}
}
}
function SiegeGame::groupSwapVehiclePads(%game, %this)
{
for(%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).swapVehiclePads();
}
function SiegeGame::objectSwapVehiclePads(%game, %this)
{
%defTeam = %game.offenseTeam == 1 ? 2 : 1;
if(%this.getDatablock().getName() $= "StationVehicle")
{
if(%this.getTarget() != -1)
{
// swap the teams of both the vehicle pad and the vehicle station
if(getTargetSensorGroup(%this.getTarget()) == %game.offenseTeam)
{
setTargetSensorGroup(%this.getTarget(), %defTeam);
%this.team = %defTeam;
setTargetSensorGroup(%this.pad.getTarget(), %defTeam);
%this.pad.team = %defTeam;
// z0dd - ZOD, 4/20/02. Switch the teleporter too.
setTargetSensorGroup(%this.teleporter.getTarget(), %defTeam);
%this.teleporter.team = %defTeam;
}
else if(getTargetSensorGroup(%this.getTarget()) == %defTeam)
{
setTargetSensorGroup(%this.getTarget(), %game.offenseTeam);
%this.team = %game.offenseTeam;
setTargetSensorGroup(%this.pad.getTarget(), %game.offenseTeam);
%this.pad.team = %game.offenseTeam;
// z0dd - ZOD, 4/20/02. Switch the teleporter too.
setTargetSensorGroup(%this.teleporter.getTarget(), %game.offenseTeam);
%this.teleporter.team = %game.offenseTeam;
}
}
}
}
function SiegeGame::restoreObjects(%game)
{
// restore all the "permanent" mission objects to undamaged state
%group = nameToID("MissionGroup/Teams");
// SimGroup::objectRestore is defined in DefaultGame.cs -- it simply calls
// %game.groupObjectRestore
%group.objectRestore();
}
function SiegeGame::groupObjectRestore(%game, %this)
{
for(%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).objectRestore();
}
function SiegeGame::shapeObjectRestore(%game, %object)
{
//if(%object.getDatablock().getName() $= FlipFlop)
//{
// messageAll('MsgSiegeObjRestore', "", %object.number, true);
//}
//else if(%object.getDamageLevel())
if(%object.getDamageLevel())
{
%object.setDamageLevel(0.0);
%object.setDamageState(Enabled);
}
if(%object.getDatablock().getName() $= "TurretBaseLarge")
{
// check to see if the turret base still has the same type of barrel it had
// at the beginning of the mission
if(%object.getMountedImage(0))
if(%object.getMountedImage(0).getName() !$= %object.originalBarrel)
{
// pop the "new" barrel
%object.unmountImage(0);
// mount the original barrel
%object.mountImage(%object.originalBarrel, 0, false);
}
}
}
function InteriorInstance::objectRestore(%this)
{
// avoid console error spam
}
function Trigger::objectRestore(%this)
{
// avoid console error spam
}
function TSStatic::objectRestore(%this)
{
// avoid console error spam
}
function ForceFieldBare::objectRestore(%this)
{
// avoid console error spam
}
// ------------------------------------------------------------------------
// Waypoint managing
function siegeGame::findObjectiveWaypoints(%game, %group)
{
if(!%group)
%group = nameToId("MissionGroup/Teams");
for (%i = 0; %i < %group.getCount(); %i++)
{
%obj = %group.getObject(%i);
if(%obj.getClassName() $= SimGroup)
{
%game.findObjectiveWaypoints(%obj);
}
else if(%obj.needsObjectiveWaypoint)
{
%game.initializeWaypointAtObjective(%obj);
}
}
}
function siegeGame::initializeWaypointAtObjective(%game, %object)
{
// out with the old...jic
if ( %object.waypoint )
{
if ( isObject( %object.waypoint ) )
%object.waypoint.delete();
else
%object.waypoint = "";
}
if(%object.team == %game.offenseTeam)
%team = %game.offenseTeam;
else
%team = (%game.offenseTeam == 1 ? 2 : 1);
// to make the waypoint look a little prettier we are using the z from
// position and the x and y from worldBoxCenter
%posX = getWord(%object.getWorldBoxCenter(), 0);
%posY = getWord(%object.getWorldBoxCenter(), 1);
%posZ = getWord(%object.position, 2);
%append = getTaggedString(%object.getDataBlock().targetTypeTag);
%object.waypoint = new WayPoint() {
position = %posX SPC %posY SPC %posZ;
rotation = "1 0 0 0";
scale = "1 1 1";
dataBlock = "WayPointMarker";
team = %team;
name = getTaggedString(%object.nameTag) SPC %append;
};
MissionCleanup.add(%object.waypoint);
}
function siegeGame::switchWaypoint(%game, %waypoint)
{
%team = %waypoint.team;
%newTeam = (%team == 1 ? 2 : 1);
%waypoint.team = %newTeam;
}
function SiegeGame::gameOver(%game)
{
//call the default
DefaultGame::gameOver(%game);
cancel(%game.timeThread);
messageAll('MsgClearObjHud', "");
}
function SiegeGame::sendDebriefing( %game, %client )
{
//if neither team captured
%winnerName = "";
if ( $teamScore[1] == 0 && $teamScore[2] == 0 )
%winner = -1;
//else see if team1 won
else if ( $teamScore[1] > 0 && ( $teamScore[2] == 0 || $teamScore[1] < $teamScore[2] ) )
{
%winner = 1;
%winnerName = $teamName[1];
}
//else see if team2 won
else if ($teamScore[2] > 0 && ($teamScore[1] == 0 || $teamScore[2] < $teamScore[1]))
{
%winner = 2;
%winnerName = $teamName[2];
}
//else see if it was a tie (right down to the millisecond - doubtful)
else if ($teamScore[1] == $teamScore[2])
%winner = 0;
//send the winner message
if (%winnerName $= 'Storm')
messageClient( %client, 'MsgGameOver', "Match has ended.~wvoice/announcer/ann.stowins.wav" );
else if (%winnerName $= 'Inferno')
messageClient( %client, 'MsgGameOver', "Match has ended.~wvoice/announcer/ann.infwins.wav" );
else
messageClient( %client, 'MsgGameOver', "Match has ended.~wvoice/announcer/ann.gameover.wav" );
// Mission result:
if (%winner > 0)
{
if (%winner == 1)
{
if ($teamScore[2] == 0)
messageClient(%client, 'MsgDebriefResult', "", '<just:center>Team %1 wins!', $TeamName[1]);
else
{
%timeDiffMS = $teamScore[2] - $teamScore[1];
messageClient(%client, 'MsgDebriefResult', "", '<just:center>Team %1 won by capturing the base %2 faster!', $TeamName[1], %game.formatTime(%timeDiffMS, true));
}
}
else
{
if ($teamScore[1] == 0)
messageClient(%client, 'MsgDebriefResult', "", '<just:center>Team %1 wins!', $TeamName[2]);
else
{
%timeDiffMS = $teamScore[1] - $teamScore[2];
messageClient(%client, 'MsgDebriefResult', "", '<just:center>Team %1 won by capturing the base %2 faster!', $TeamName[2], %game.formatTime(%timeDiffMS, true));
}
}
}
else
messageClient( %client, 'MsgDebriefResult', "", '<just:center>The mission ended in a tie.' );
// Game summary:
messageClient( %client, 'MsgDebriefAddLine', "", '<spush><color:00dc00><font:univers condensed:18>SUMMARY:<spop>' );
%team1 = %game.offenseTeam == 1 ? 2 : 1;
%team2 = %game.offenseTeam;
if ( $teamScore[%team1] > 0 )
{
%timeStr = %game.formatTime($teamScore[%team1], true);
messageClient( %client, 'MsgDebriefAddLine', "", '<bitmap:bullet_2><lmargin:24>%1 captured the %2 base for Team %3 in %4.<lmargin:0>', %game.capPlayer[%team1], $TeamName[%team2], $TeamName[%team1], %timeStr);
}
else
messageClient( %client, 'MsgDebriefAddLine', "", '<bitmap:bullet_2><lmargin:24>Team %1 failed to capture the base.<lmargin:0>', $TeamName[%team1]);
if ( $teamScore[%team2] > 0 )
{
%timeStr = %game.formatTime($teamScore[%team2], true);
messageClient( %client, 'MsgDebriefAddLine', "", '<bitmap:bullet_2><lmargin:24>%1 captured the %2 base for Team %3 in %4.<lmargin:0>', %game.capPlayer[%team2], $TeamName[%team1], $TeamName[%team2], %timeStr);
}
else
messageClient( %client, 'MsgDebriefAddLine', "", '<bitmap:bullet_2><lmargin:24>Team %1 failed to capture the base.<lmargin:0>', $TeamName[%team2]);
// List out the team rosters:
messageClient( %client, 'MsgDebriefAddLine', "", '\n<spush><color:00dc00><font:univers condensed:18><clip%%:50>%1</clip><lmargin%%:50><clip%%:50>%2</clip><spop>', $TeamName[1], $TeamName[2] );
%max = $TeamRank[1, count] > $TeamRank[2, count] ? $TeamRank[1, count] : $TeamRank[2, count];
for ( %line = 0; %line < %max; %line++ )
{
%plyr1 = $TeamRank[1, %line] $= "" ? "" : $TeamRank[1, %line].name;
%plyr2 = $TeamRank[2, %line] $= "" ? "" : $TeamRank[2, %line].name;
messageClient( %client, 'MsgDebriefAddLine', "", '<lmargin:0><clip%%:50> %1</clip><lmargin%%:50><clip%%:50> %2</clip>', %plyr1, %plyr2 );
}
// Show observers:
%count = ClientGroup.getCount();
%header = false;
for ( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject( %i );
if ( %cl.team <= 0 )
{
if ( !%header )
{
messageClient( %client, 'MsgDebriefAddLine', "", '\n<lmargin:0><spush><color:00dc00><font:univers condensed:18>OBSERVERS<spop>' );
%header = true;
}
messageClient( %client, 'MsgDebriefAddLine', "", ' %1', %cl.name );
}
}
}
function SiegeGame::clientMissionDropReady(%game, %client)
{
messageClient(%client, 'MsgClientReady', "", %game.class);
for(%i = 1; %i <= %game.numTeams; %i++)
{
%isOffense = (%i == %game.offenseTeam);
messageClient(%client, 'MsgSiegeAddTeam', "", %i, $teamName[%i], %isOffense);
}
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
DefaultGame::clientMissionDropReady(%game, %client);
}
function SiegeGame::assignClientTeam(%game, %client, %respawn)
{
DefaultGame::assignClientTeam(%game, %client, %respawn);
// if player's team is not on top of objective hud, switch lines
messageClient(%client, 'MsgCheckTeamLines', "", %client.team);
}
function SiegeGame::resetScore(%game, %client)
{
%client.score = 0;
%client.kills = 0;
%client.deaths = 0;
%client.suicides = 0;
%client.objScore = 0;
%client.teamKills = 0;
%client.turretKills = 0;
%client.offenseScore = 0;
%client.defenseScore = 0;
}
//--------------- Scoring functions -----------------
function SiegeGame::recalcScore(%game, %cl)
{
%killValue = %cl.kills * %game.SCORE_PER_KILL;
%deathValue = %cl.deaths * %game.SCORE_PER_DEATH;
if (%killValue - %deathValue == 0)
%killPoints = 0;
else
%killPoints = (%killValue * %killValue) / (%killValue - %deathValue);
%cl.offenseScore = %killPoints;
%cl.offenseScore += %cl.teamKills * %game.SCORE_PER_TEAMKILL; // -1
%cl.offenseScore += %cl.objScore;
%cl.defenseScore = %cl.turretKills * %game.SCORE_PER_TURRET_KILL; // 1
%cl.score = %cl.offenseScore + %cl.defenseScore;
%cl.score = mFloor(%cl.score);
%game.recalcTeamRanks(%cl);
}
function SiegeGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
{
if(%game.testTurretKill(%implement)) //check for turretkill before awarded a non client points for a kill
{
%game.awardScoreTurretKill(%clVictim, %implement);
}
else if (%game.testKill(%clVictim, %clKiller)) //verify victim was an enemy
{
%game.awardScoreKill(%clKiller);
%game.awardScoreDeath(%clVictim);
}
else
{
if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
{
%game.awardScoreSuicide(%clVictim);
}
else
{
if (%game.testTeamKill(%clVictim, %clKiller)) //otherwise test for a teamkill
%game.awardScoreTeamKill(%clVictim, %clKiller);
}
}
}
function SiegeGame::testValidRepair(%game, %obj)
{
return ((%obj.lastDamagedByTeam != %obj.team) && (%obj.repairedBy.team == %obj.team));
}
function SiegeGame::genOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 generator!', %repairman.name, %obj.nameTag);
}
}
function SiegeGame::stationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 inventory station!', %repairman.name, %obj.nameTag);
}
}
function SiegeGame::sensorOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 pulse sensor!', %repairman.name, %obj.nameTag);
}
}
function SiegeGame::turretOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 turret!', %repairman.name, %obj.nameTag);
}
}
function SiegeGame::vStationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 vehicle station!', %repairman.name, %obj.nameTag);
}
}
function SiegeGame::halfTimeCountDown(%game, %time)
{
%game.secondHalfCountDown = true;
$MatchStarted = false;
%timeMS = %time * 1000;
%game.schedule(%timeMS, "startSecondHalf");
notifyMatchStart(%timeMS);
if(%timeMS > 30000)
schedule(%timeMS - 30000, 0, "notifyMatchStart", 30000);
if(%timeMS > 20000)
schedule(%timeMS - 20000, 0, "notifyMatchStart", 20000);
if(%timeMS > 10000)
schedule(%timeMS - 10000, 0, "notifyMatchStart", 10000);
if(%timeMS > 5000)
schedule(%timeMS - 5000, 0, "notifyMatchStart", 5000);
if(%timeMS > 4000)
schedule(%timeMS - 4000, 0, "notifyMatchStart", 4000);
if(%timeMS > 3000)
schedule(%timeMS - 3000, 0, "notifyMatchStart", 3000);
if(%timeMS > 2000)
schedule(%timeMS - 2000, 0, "notifyMatchStart", 2000);
if(%timeMS > 1000)
schedule(%timeMS - 1000, 0, "notifyMatchStart", 1000);
}
function SiegeGame::applyConcussion(%game, %player)
{
}
function SiegeGame::updateScoreHud(%game, %client, %tag)
{
%timeElapsedMS = getSimTime() - %game.startTimeMS;
%curTimeLeftMS = %game.timeLimitMS - %timeElapsedMS;
if (!$MatchStarted)
%curTimeLeftStr = %game.formatTime(%game.timelimitMS, false);
else
%curTimeLeftStr = %game.formatTime(%curTimeLeftMS, false);
// Send header:
if (%game.firstHalf)
messageClient( %client, 'SetScoreHudHeader', "", '<just:center>Team %1 has %2 to capture the base.',
$teamName[%game.offenseTeam], %curTimeLeftStr );
else
messageClient( %client, 'SetScoreHudHeader', "", '<just:center>Team %1 must capture the base within %2 to win.',
$teamName[%game.offenseTeam], %curTimeLeftStr );
// Send subheader:
messageClient( %client, 'SetScoreHudSubheader', "", '<tab:15,315>\t%1 (%2)\t%3 (%4)',
$TeamName[1], $TeamRank[1, count], $TeamName[2], $TeamRank[2, count] );
%index = 0;
while (true)
{
if (%index >= $TeamRank[1, count] && %index >= $TeamRank[2, count])
break;
//get the team1 client info
%team1Client = "";
%team1ClientScore = "";
%col1Style = "";
if (%index < $TeamRank[1, count])
{
%team1Client = $TeamRank[1, %index];
%team1ClientScore = %team1Client.score $= "" ? 0 : %team1Client.score;
if ( %team1Client == %client )
%col1Style = "<color:dcdcdc>";
}
//get the team2 client info
%team2Client = "";
%team2ClientScore = "";
%col2Style = "";
if (%index < $TeamRank[2, count])
{
%team2Client = $TeamRank[2, %index];
%team2ClientScore = %team2Client.score $= "" ? 0 : %team2Client.score;
if ( %team2Client == %client )
%col2Style = "<color:dcdcdc>";
}
//if the client is not an observer, send the message
if (%client.team != 0)
{
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20,320>\t<spush>%3<clip:200>%1</clip><spop>\t%4<clip:200>%2</clip>',
%team1Client.name, %team2Client.name, %col1Style, %col2Style );
}
//else for observers, create an anchor around the player name so they can be observed
else
{
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20,320>\t<spush>%3<clip:200><a:gamelink\t%5>%1</a></clip><spop>\t%4<clip:200><a:gamelink\t%6>%2</a></clip>',
%team1Client.name, %team2Client.name, %col1Style, %col2Style, %team1Client, %team2Client );
}
%index++;
}
// Tack on the list of observers:
%observerCount = 0;
for (%i = 0; %i < ClientGroup.getCount(); %i++)
{
%cl = ClientGroup.getObject(%i);
if (%cl.team == 0)
%observerCount++;
}
if (%observerCount > 0)
{
messageClient( %client, 'SetLineHud', "", %tag, %index, "");
%index++;
messageClient(%client, 'SetLineHud', "", %tag, %index, '<tab:10, 310><spush><font:Univers Condensed:22>\tOBSERVERS (%1)<rmargin:260><just:right>TIME<spop>', %observerCount);
%index++;
for (%i = 0; %i < ClientGroup.getCount(); %i++)
{
%cl = ClientGroup.getObject(%i);
//if this is an observer
if (%cl.team == 0)
{
%obsTime = getSimTime() - %cl.observerStartTime;
%obsTimeStr = %game.formatTime(%obsTime, false);
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20, 310>\t<clip:150>%1</clip><rmargin:260><just:right>%2',
%cl.name, %obsTimeStr );
%index++;
}
}
}
//clear the rest of Hud so we don't get old lines hanging around...
messageClient( %client, 'ClearHud', "", %tag, %index );
}