2015-08-30 06:30:29 +00:00
// --------------------------------------------------------
// Survival Mission Type
// --------------------------------------------------------
// DisplayName = Survival
//--- GAME RULES BEGIN ---
//Survive as many waves of enemies as possible.
//The bot count increments by one each round.
//If progressive mode is enabled, bots are spawned every thirty seconds.
//--- GAME RULES END ---
$InvBanList [ SV , " MiningTool " ] = 1 ;
exec ( " scripts/aiSurvival.cs " );
package SVGame
{
function UpdateClientTimes ( % time ) //Used for initial countdown if needed
{
% secondsLeft = % time / 1000 ;
messageAll ( 'MsgSystemClock' , " " , ( % secondsLeft / 60 ), % time );
return true ;
}
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
function notifyMatchEnd ( % time ){ return true ; } //Survival has NO end
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
function Disconnect () //Package this function so we can disable the schedules on disconnect
{
parent :: Disconnect ();
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
cancel ( Game . helper );
cancel ( Game . roundStart );
cancel ( Game . roundMessage [ 0 ]);
cancel ( Game . roundMessage [ 1 ]);
cancel ( Game . roundMessage [ 2 ]);
cancel ( Game . roundMessage [ 3 ]);
cancel ( Game . roundMessage [ 4 ]);
cancel ( Game . roundMessage [ 5 ]);
cancel ( Game . BotWave );
return true ;
}
};
function SVGame :: initGameVars ( % game )
{
% game . SCORE_PER_KILL = 1 ;
% game . SCORE_PER_DEATH = - 1 ;
% game . SCORE_PER_SUICIDE = - 1 ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
//SV Vars
% game . rounds = 1 ;
% game . playerCount = 0 ;
% game . botCount = 0 ;
% game . shouldSpawn = 0 ;
% game . start = 0 ;
% game . AIWon = 0 ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
% prefs = new ScriptObject (){ class = " BasicDataParser " ; };
2016-03-17 06:16:14 +00:00
% prefs . load ( " prefs/survival.cfg " );
2015-08-30 06:30:29 +00:00
% config = % prefs . get ( " Config " , 0 );
% area = % prefs . get ( " MissionArea " , 0 );
// Load configuration
% game . maxBots = % config . element ( " MaxBots " );
% game . difficultyIncrement = % config . element ( " difficultyIncrement " );
% game . fastDifficultyIncrement = % config . element ( " fastDifficultyIncrement " );
% game . startDifficulty = % config . element ( " startDifficulty " );
% game . enableGodbot = % config . element ( " enableGodbot " );
% game . godBotFrequency = % config . element ( " godBotFrequency " );
% game . hintsEnabled = % config . element ( " hintsEnabled " );
% game . hintTimeMS = % config . element ( " hintTimeMS " );
% game . allowSetup = % config . element ( " allowSetup " );
% game . setupTimeMS = % config . element ( " setupTimeMS " );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
% prefs . empty ();
% prefs . delete ();
% area . empty ();
% area . delete ();
return true ;
}
function SVGame :: missionLoadDone ( % game )
{
//default version sets up teams - must be called first...
DefaultGame :: missionLoadDone ( % game );
//Ok.. for some odd reason the AI grenade Set isn't created for this gamemode.
//Without it, the bots don't function very well at all.
//Make sure it exists when the game starts
if ( ! IsObject ( $AIGrenadeSet ))
AIObjectives . add ( $AIGrenadeSet = new Simgroup ( AIGrenadeSet ));
//Remove console spam..
if ( ! IsObject ( $AIRemoteTurretSet ))
AIObjectives . add ( $AIRemoteTurretSet = new Simgroup ( AIRemoteTurretSet ));
if ( ! IsObject ( $ObjectiveQ [ 2 ]))
$ObjectiveQ [ 2 ] = new simSet ();
return true ;
}
function SVGame :: setUpTeams ( % game )
{
DefaultGame :: setUpTeams ( % game );
% game . numTeams = 1 ; //Players cannot switch teams
setSensorGroupCount ( 3 ); //Team 0, 1, and 2
return true ;
}
function SVGame :: RoundStart ( % game )
{
if ( % game . playerCount <= 0 )
{
messageAll ( 'MsgAll' , " \ c2The round cannot start untill someone spawns! ~wfx/misc/misc.error.wav " );
Game . shouldSpawn = 1 ; //Tell the game to start a 10 sec countdown now
return ;
}
% game . start = 1 ;
% game . AIWon = 0 ;
messageAll ( 'MsgSystemClock' , " \ c2The round has started! ~wfx/misc/red_alert.wav " , 1 , 120000 ); //Start "Player Help" countdown
Game . lockDeadClients ();
Game . spawnAI ();
Game . helper = Game . schedule ( 120000 , " PlayerHelp " );
//Ok.. bots spawn every 30 secs
if ( $Host :: ProgressiveMode )
Game . BotWave = Game . schedule ( 180000 , " SpawnAI " , true );
return true ;
}
function SVGame :: checkTimeLimit ( % game , % forced ){}
function SVGame :: freeDeadClients ( % game )
{
for ( % i = 0 ; % i < ClientGroup . getCount (); % i ++ )
{
% cl = ClientGroup . getObject ( % i );
% cl . isDead = false ;
% cl . kills = 0 ; //Since this is called every round, might as well reset the kill count for this round
}
return true ;
}
function SVGame :: lockDeadClients ( % game )
{
for ( % i = 0 ; % i < ClientGroup . getCount (); % i ++ )
{
% cl = ClientGroup . getObject ( % i );
% cl . isDead = true ; //Doesn't matter if the dude is alive -- when he dies the flag is set.
}
return true ;
}
function SVGame :: startMatch ( % game )
{
DefaultGame :: startMatch ( % game );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( ! $Host :: ProgressiveMode )
messageAll ( 'MsgSystemClock' , " \ c2The first round will start in one minute. " , 1 , 60000 );
else
messageAll ( 'MsgSystemClock' , " \ c2The attack will start in one minute! " , 1 , 60000 );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
Game . roundMessage [ 0 ] = schedule ( 50000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in ten seconds.~wfx/misc/hunters_10.wav " );
Game . roundMessage [ 1 ] = schedule ( 55000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in five seconds.~wfx/misc/hunters_5.wav " );
Game . roundMessage [ 2 ] = schedule ( 56000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in four seconds.~wfx/misc/hunters_4.wav " );
Game . roundMessage [ 3 ] = schedule ( 57000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in three seconds.~wfx/misc/hunters_3.wav " );
Game . roundMessage [ 4 ] = schedule ( 58000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in two seconds.~wfx/misc/hunters_2.wav " );
Game . roundMessage [ 5 ] = schedule ( 59000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in one second.~wfx/misc/hunters_1.wav " );
Game . roundStart = Game . schedule ( 60000 , " RoundStart " );
Game . freeDeadClients ();
return true ;
}
function SVGame :: checkRounds ( % game )
{
if ( % game . start )
return false ;
for ( % i = 0 ; % i < ClientGroup . getCount (); % i ++ )
{
% cl = ClientGroup . getObject ( % i );
if ( IsObject ( % cl . player ) && % cl . player . getState () $ = " move " )
{
% cl . streak ++ ;
if ( % cl . streak > $Data :: Rounds [ % cl . GUID , $MissionName ])
{
messageClient ( % cl , 'MsgClient' , '\c2Congratulations, you broke your old Round record of %1!' , % cl . streak -- );
$Data :: Rounds [ % cl . GUID , $MissionName ] ++ ;
}
}
}
return true ;
}
function SVGame :: onClientKilled ( % game , % clVictim , % clKiller , % damageType , % implement , % damageLoc )
{
cancel ( % clVictim . player . alertThread );
DefaultGame :: onClientKilled ( % game , % clVictim , % clKiller , % damageType , % implement , % damageLoc );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( IsObject ( % clVictim ) && !% clVictim . isAIControlled ())
{
% game . playerCount -- ; //May be someone switching to observer
if ( % game . start )
% clVictim . isDead = true ;
% clVictim . streak = 0 ; //Moved from SVGame::CheckRounds to fix .streak being reset for some reason
}
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( % game . playerCount <= 0 && % game . start )
{
messageAll ( 'MsgSystemClock' , " \ c2Round " @% game . rounds @ " belongs to the Artificial Intelligance! The game will now restart back at round 1. ~wfx/misc/flag_return.wav " , 1 , 60000 );
% game . rounds = 1 ;
% game . start = 0 ;
% game . AIWon = 1 ; //Tell the game the b0ts won, or else when they disconnect, it'll be counted as a player win
cancel ( Game . helper );
messageAll ( 'MsgSPCurrentObjective1' , " " , 'Current round: 1' );
Game . roundMessage [ 0 ] = schedule ( 50000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in ten seconds.~wfx/misc/hunters_10.wav " );
Game . roundMessage [ 1 ] = schedule ( 55000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in five seconds.~wfx/misc/hunters_5.wav " );
Game . roundMessage [ 2 ] = schedule ( 56000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in four seconds.~wfx/misc/hunters_4.wav " );
Game . roundMessage [ 3 ] = schedule ( 57000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in three seconds.~wfx/misc/hunters_3.wav " );
Game . roundMessage [ 4 ] = schedule ( 58000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in two seconds.~wfx/misc/hunters_2.wav " );
Game . roundMessage [ 5 ] = schedule ( 59000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in one second.~wfx/misc/hunters_1.wav " );
Game . roundStart = Game . schedule ( 60000 , " RoundStart " );
//disconnectAllBots();
Game . freeDeadClients ();
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
% bots = Array . create ();
% count = HiddenClientGroup . getCount ();
for ( % i = 0 ; % i < % count ; % i ++ )
{
% cl = HiddenClientGroup . getObject ( % i );
if ( % cl . isAIControlled ())
% bots . setElement ( % i , % cl );
}
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
// For the lulz
% damageCount = 8 ;
% damageType [ 0 ] = $DamageType :: Suicide ;
% damageType [ 1 ] = $DamageType :: Lava ;
% damageType [ 2 ] = $DamageType :: Ground ;
% damageType [ 3 ] = $DamageType :: Impact ;
% damageType [ 4 ] = $DamageType :: OutOfBounds ;
% damageType [ 5 ] = $DamageType :: ForceFieldPowerup ;
% damageType [ 6 ] = $DamageType :: Lightning ;
% damageType [ 7 ] = $DamageType :: NexusCamping ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
// Now to kill them
for ( % i = 0 ; % i < % count ; % i ++ )
{
% bot = % bots . element ( % i );
% death = getRandom ( 0 , 2 );
if ( % death == 0 ) // Explode
{
% bot . player . blowup ();
% bot . player . schedule ( 100 , " setPosition " , " 0 0 -99999 " );
% bot . player . schedule ( 110 , " scriptKill " , % damageType [ getRandom ( 0 , % damageCount )]);
}
else if ( % death == 1 ) // Fade
{
% bot . player . setCloaked ( true );
% bot . player . schedule ( 100 , " setPosition " , " 0 0 -99999 " );
% bot . player . schedule ( 110 , " scriptKill " , % damageType [ getRandom ( 0 , % damageCount )]);
}
else
% bot . player . scriptKill ( % damageType [ getRandom ( 0 , % damageCount )]);
}
% bots . delete ();
Game . botCount = 0 ;
}
return true ;
}
function SVGame :: spawnPlayer ( % game , % client , % respawn )
{
if ( % client . isDead )
return commandToClient ( % client , 'CenterPrint' , " You will respawn next round. " , 2 );
else if ( !% client . isAIControlled ())
{
% client . team = 1 ;
DefaultGame :: spawnPlayer ( % game , % client , % respawn );
Game . playerCount ++ ;
commandToClient ( % client , 'bottomPrint' , " Try not to die. " , 3 );
if ( % game . shouldSpawn )
{
% game . shouldSpawn = 0 ;
messageAll ( 'MsgSystemClock' , " \ c2Round starts in ten seconds.~wfx/misc/hunters_10.wav " , 1 , 10000 );
Game . roundMessage [ 0 ] = schedule ( 5000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in five seconds.~wfx/misc/hunters_5.wav " );
Game . roundMessage [ 1 ] = schedule ( 6000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in four seconds.~wfx/misc/hunters_4.wav " );
Game . roundMessage [ 2 ] = schedule ( 7000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in three seconds.~wfx/misc/hunters_3.wav " );
Game . roundMessage [ 3 ] = schedule ( 8000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in two seconds.~wfx/misc/hunters_2.wav " );
Game . roundMessage [ 4 ] = schedule ( 9000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in one second.~wfx/misc/hunters_1.wav " );
Game . roundStart = Game . schedule ( 10000 , " RoundStart " );
}
}
return true ;
}
function SVGame :: onAIKilled ( % game , % clVictim , % clAttacker , % damageType , % implement )
{
DefaultGame :: onAIKilled ( % game , % clVictim , % clAttacker , % damageType , % implement );
if ( IsObject ( % clVictim ) && % clVictim . isAIControlled ())
{
if ( % game . botCount != 0 )
% game . botCount -- ;
messageAll ( 'MsgSPCurrentObjective2' , " " , 'Number of bots: %1' , Game . botCount );
HiddenClientGroup . remove ( % clVictim );
% clVictim . drop ();
}
if ( % game . botCount <= 0 && ! $Host :: ProgressiveMode && !% game . AIWon ) //There are no rounds..
{
messageAll ( 'MsgSystemClock' , " \ c2Round " @% game . rounds @ " belongs to the players! They have thirty seconds to get ready. ~wfx/misc/flag_return.wav " , 1 , 30000 );
% game . rounds ++ ;
% game . start = 0 ;
cancel ( Game . helper );
messageAll ( 'MsgSPCurrentObjective1' , " " , 'Current Round: %1' , Game . rounds );
Game . roundMessage [ 0 ] = schedule ( 20000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in ten seconds.~wfx/misc/hunters_10.wav " );
Game . roundMessage [ 1 ] = schedule ( 25000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in five seconds.~wfx/misc/hunters_5.wav " );
Game . roundMessage [ 2 ] = schedule ( 26000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in four seconds.~wfx/misc/hunters_4.wav " );
Game . roundMessage [ 3 ] = schedule ( 27000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in three seconds.~wfx/misc/hunters_3.wav " );
Game . roundMessage [ 4 ] = schedule ( 28000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in two seconds.~wfx/misc/hunters_2.wav " );
Game . roundMessage [ 5 ] = schedule ( 29000 , 0 , " messageAll " , 'msgAll' , " \ c2Round starts in one second.~wfx/misc/hunters_1.wav " );
//Award a client's ROUNDs if he beat his old round record
Game . checkRounds ();
//Allow dead peeps to rejoin
Game . freeDeadClients ();
Game . roundStart = Game . schedule ( 30000 , " RoundStart " );
}
return true ;
}
function SVGame :: PlayerHelp ( % game ) //Is called after 2 minutes in each round; tells where the b0ts are
{
if ( % game . start )
{
messageAll ( 'MsgSystemClock' , " \ c2Good hunting! ~wvoice/Training/Any/ANY.hunting.wav " , 1 , 120000 );
for ( % i = 0 ; % i < HiddenClientGroup . getcount (); % i ++ )
{
% cl = HiddenClientGroup . getObject ( % i );
if ( % cl . isAIControlled () && % cl . team == 2 )
{
% wp = new Waypoint ()
{
Datablock = " WayPointMarker " ;
Position = % cl . player . getPosition ();
Name = % cl . namebase ;
Team = 2 ;
};
% wp . schedule ( 3000 , " Delete " );
}
}
Game . helper = Game . schedule ( 120000 , " PlayerHelp " );
}
}
function SVGame :: SpawnAI ( % game , % val )
{
if ( % val && ! $Host :: ProgressiveMode )
return ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( Game . rounds == 90 )
{
messageAll ( 'msgAll' , " \ c3The Godbot is here! ~wfx/misc/red_alert.wav " );
for ( % i = 0 ; % i < 6 ; % i ++ )
{
% bot = aiConnectByName ( " Godbot " , 2 );
% bot . setSkillLevel ( 1 );
% bot . player . clearInventory ();
% bot . player . setArmor ( " TR2Heavy " );
% bot . player . setInventory ( " TR2EnergyPack " , 1 , true );
% bot . player . setInventory ( " Disc " , 1 , true );
% bot . player . setInventory ( " DiscAmmo " , 900 , true );
// %bot.player.setInventory("Chaingun",1,true);
//%bot.player.setInventory("ChaingunAmmo",999,true);
% bot . player . setInventory ( " GrenadeLauncher " , 1 , true );
% bot . player . setInventory ( " GrenadeLauncherAmmo " , 999 , true );
% bot . player . setInventory ( " Shocklance " , 1 , true );
% bot . player . setInventory ( " Mortar " , 1 , true );
% bot . player . setInventory ( " MortarAmmo " , 999 , true );
% bot . player . use ( " Disc " );
% game . botCount = 5 ;
hideClient ( % bot );
}
return ;
}
% playerCount = clientGroup . getCount () - 1 ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
for ( % i = 0 ; % i < 2 + Game . rounds + 1 ; % i ++ )
{
% bot = aiConnectByIndex ( getRandom ( 0 , $BotProfile :: Count ), 2 ); //Choose random b0ts by Index
//Alright -- this'll make the game a bit harder -- depending on the rounds, the bots will have random armors.
% chance = getRandom ( 1 , 5 + Game . rounds );
% bot . player . clearInventory ();
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( % chance > 6 ) //Medium Armor
{
% bot . player . setArmor ( " Medium " );
// %bot.player.setInventory("Chaingun",1,1);
//%bot.player.setInventory("ChaingunAmmo",500,1);
% bot . player . setInventory ( " GrenadeLauncher " , 1 , 1 );
% bot . player . setInventory ( " GrenadeLauncherAmmo " , 999 , 1 );
% bot . player . setInventory ( " Disc " , 1 , 1 );
% bot . player . setInventory ( " DiscAmmo " , 30 , 1 );
% bot . player . setInventory ( " Shoklance " , 1 , 1 );
% bot . player . setInventory ( " MissileLauncher " , 1 , 1 );
% bot . player . setInventory ( " MissileLauncherAmmo " , 50 );
% bot . player . use ( " Chaingun " );
}
else if ( % chance > 10 ) //JUGGY
{
% bot . player . setArmor ( " Heavy " );
% bot . player . setInventory ( " GrenadeLauncher " , 1 , 1 );
% bot . player . setInventory ( " GrenadeLauncherAmmo " , 999 , 1 );
// %bot.player.setInventory("Chaingun",1,1);
// %bot.player.setInventory("ChaingunAmmo",500,1);
% bot . player . setInventory ( " Disc " , 1 , 1 );
% bot . player . setInventory ( " DiscAmmo " , 30 , 1 );
% bot . player . setInventory ( " Shoklance " , 1 , 1 );
% bot . player . use ( " Chaingun " );
}
else //Light
{
% bot . player . setArmor ( " Light " );
% bot . player . setInventory ( " GrenadeLauncher " , 1 , 1 );
% bot . player . setInventory ( " GrenadeLauncherAmmo " , 999 , 1 );
// %bot.player.setInventory("Chaingun",1,1);
// %bot.player.setInventory("ChaingunAmmo",500,1);
% bot . player . setInventory ( " Disc " , 1 , 1 );
% bot . player . setInventory ( " DiscAmmo " , 30 , 1 );
% bot . player . setInventory ( " Shoklance " , 1 , 1 );
% bot . player . use ( " Chaingun " );
}
hideClient ( % bot );
% random = getRandom ( 0 , % playerCount );
// %client = clientGroup.getObject(%random);
// %bot.stepEscort(%client.player);
% bot . player . setInventory ( " AmmoPack " , 1 , 1 );
setTeam ( % bot , 2 );
% bot . setSkillLevel ( 99 );
// %bot.stepEngage(clientGroup.getObject(%random));
}
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( $Host :: ProgressiveMode && % val )
{
% game . rounds ++ ; //So we increment every time -- I should put a limit to the bots..
Game . BotWave = Game . schedule ( 180000 , " SpawnAI " , true );
}
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
messageAll ( 'MsgSPCurrentObjective2' , " " , 'Number of bots: %1' , Game . botCount );
}
function SVGame :: allowsProtectedStatics ( % game )
{
return true ;
}
function SVGame :: equip ( % game , % player )
{
for ( % i = 0 ; % i < $InventoryHudCount ; % i ++ )
% player . client . setInventoryHudItem ( $InventoryHudData [ % i , itemDataName ], 0 , 1 );
% player . client . clearBackpackIcon ();
//%player.setArmor("Light");
% player . setInventory ( RepairKit , 1 );
% player . setInventory ( " Disc " , 1 );
% player . setInventory ( " DiscAmmo " , 15 );
% player . setInventory ( " TargetingLaser " , 1 );
% player . weaponCount = 1 ;
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( % player . client . race $ = " Draakan " ) //Also defined in DefaultGame.cs, but this overrides it.
% player . setInventory ( Flamer , 1 );
// do we want to give players a disc launcher instead? GJL: Yes we do!
% player . use ( " Disc " );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
return true ;
}
function SVGame :: pickPlayerSpawn ( % game , % client , % respawn )
{
// if the client is a bot and on team 2, use team 2 -- otherwise we're always team 1
if ( % client . isAIControlled () && % client . team == 2 )
return % game . pickTeamSpawn ( 2 );
else
return % game . pickTeamSpawn ( 1 );
return false ;
}
function SVGame :: clientJoinTeam ( % game , % client , % team , % respawn )
{
% game . assignClientTeam ( % client );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
// Spawn the player:
% game . spawnPlayer ( % client , % respawn );
return true ;
}
function SVGame :: 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 );
return true ;
}
function SVGame :: clientMissionDropReady ( % game , % client )
{
messageClient ( % client , 'MsgClientReady' , " " , " SinglePlayerGame " ); //Force the client to set up the SP game objective HUD
% game . resetScore ( % client );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
//Setup the client's objective hud
messageClient ( % client , 'MsgSPCurrentObjective1' , " " , 'Current round: 1' );
messageClient ( % client , 'MsgSPCurrentObjective2' , " " , 'Number of bots: 0' ); //Should update as soon as our player joins
2016-03-17 06:16:14 +00:00
messageClient ( % client , 'MsgMissionDropInfo' , '\c0You are in mission %1 (%2).' , $MissionDisplayName , $MissionTypeDisplayName , $ServerName );
2015-08-30 06:30:29 +00:00
DefaultGame :: clientMissionDropReady ( % game , % client );
return true ;
}
function SVGame :: AIHasJoined ( % game , % client )
{
% game . botCount ++ ;
return true ;
}
function SVGame :: checkScoreLimit ( % game , % client )
{
//there's no score limit in DM
}
function SVGame :: createPlayer ( % game , % client , % spawnLoc , % respawn )
{
DefaultGame :: createPlayer ( % game , % client , % spawnLoc , % respawn );
% client . setSensorGroup ( % client . team );
return true ;
}
function SVGame :: resetScore ( % game , % client )
{
% client . deaths = 0 ;
% client . kills = 0 ;
% client . score = 0 ;
% client . efficiency = 0.0 ;
% client . suicides = 0 ;
return true ;
}
function SVGame :: assignClientTeam ( % game , % client , % respawn )
{
if ( !% client . isDead )
DefaultGame :: assignClientTeam ( % game , % client , % respawn );
else
return true ;
return false ;
}
function SVGame :: updateKillScores ( % game , % clVictim , % clKiller , % damageType , % implement )
{
if ( % game . testKill ( % clVictim , % clKiller )) //verify victim was an enemy
{
% game . awardScoreKill ( % clKiller );
messageClient ( % clKiller , 'MsgDMKill' , " " , % clKiller . kills );
% game . awardScoreDeath ( % clVictim );
2016-03-17 06:16:14 +00:00
}
2015-08-30 06:30:29 +00:00
else if ( % game . testSuicide ( % clVictim , % clKiller , % damageType )) //otherwise test for suicide
2016-03-17 06:16:14 +00:00
% game . awardScoreSuicide ( % clVictim );
2015-08-30 06:30:29 +00:00
return true ;
}
function SVGame :: recalcScore ( % game , % client )
{
% killValue = % client . kills * % game . SCORE_PER_KILL ;
% deathValue = % client . deaths * % game . SCORE_PER_DEATH ;
% suicideValue = % client . suicides * % game . SCORE_PER_SUICIDE ;
if ( % killValue - % deathValue == 0 )
% client . efficiency = % suicideValue ;
else
% client . efficiency = (( % killValue * % killValue ) / ( % killValue - % deathValue )) + % suicideValue ;
% client . score = mFloatLength ( % client . efficiency , 1 );
messageClient ( % client , 'MsgYourScoreIs' , " " , % client . score );
% game . recalcTeamRanks ( % client );
% game . checkScoreLimit ( % client );
return true ;
}
function SVGame :: timeLimitReached ( % game )
{
logEcho ( " game over (timelimit) " );
% game . gameOver ();
cycleMissions ();
return true ;
}
function SVGame :: scoreLimitReached ( % game )
{
logEcho ( " game over (scorelimit) " );
% game . gameOver ();
cycleMissions ();
return true ;
}
function SVGame :: gameOver ( % game )
{
//call the default
DefaultGame :: gameOver ( % game );
Game . GameEnded = true ;
messageAll ( 'MsgGameOver' , " Match has ended.~wvoice/announcer/ann.gameover.wav " );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
//cancel the schedules..
cancel ( Game . helper );
cancel ( Game . roundStart );
cancel ( Game . roundMessage [ 0 ]);
cancel ( Game . roundMessage [ 1 ]);
cancel ( Game . roundMessage [ 2 ]);
cancel ( Game . roundMessage [ 3 ]);
cancel ( Game . roundMessage [ 4 ]);
cancel ( Game . roundMessage [ 5 ]);
cancel ( Game . BotWave );
cancel ( % game . timeThread );
messageAll ( 'MsgClearObjHud' , " " );
2016-03-17 06:16:14 +00:00
for ( % i = 0 ; % i < ClientGroup . getCount (); % i ++ )
2015-08-30 06:30:29 +00:00
{
% client = ClientGroup . getObject ( % i );
% game . resetScore ( % client );
}
return true ;
}
function SVGame :: enterMissionArea ( % game , % playerData , % player )
{
2016-03-17 06:16:14 +00:00
% player . client . outOfBounds = false ;
2015-08-30 06:30:29 +00:00
messageClient ( % player . client , 'EnterMissionArea' , '\c1You are back in the mission area.' );
logEcho ( % player . client . nameBase @ " (pl " @% player @ " /cl " @% player . client @ " ) entered mission area " );
cancel ( % player . alertThread );
return true ;
}
function SVGame :: leaveMissionArea ( % game , % playerData , % player )
{
if ( % player . getState () $ = " Dead " )
return false ;
% player . client . outOfBounds = true ;
% player . setDamageFlash ( 0.3 );
messageClient ( % player . client , 'LeaveMissionArea' , '\c1You have left the mission area. Return or die.~wfx/misc/warning_beep.wav' );
logEcho ( % player . client . nameBase @ " (pl " @% player @ " /cl " @% player . client @ " ) left mission area " );
% player . alertThread = % game . schedule ( 200 , " DMAlertPlayer " , 3 , % player );
return true ;
}
function SVGame :: DMAlertPlayer ( % game , % count , % player )
{
// MES - I commented below line out because it prints a blank line to chat window
//messageClient(%player.client, 'MsgDMLeftMisAreaWarn', '~wfx/misc/red_alert.wav');
if ( % count > 1 )
% player . alertThread = % game . schedule ( 1000 , " DMAlertPlayer " , % count - 1 , % player );
else
% player . alertThread = % game . schedule ( 1000 , " MissionAreaDamage " , % player );
return true ;
}
function SVGame :: MissionAreaDamage ( % game , % player )
{
% player . setWhiteout ( % player . getWhiteout () + 0.027 );
% player . alertThread = % game . schedule ( 100 , " MissionAreaDamage " , % player );
if ( % player . getWhiteout () >= 1 )
% player . schedule ( 400 , " scriptKill " , $DamageType :: OutOfBounds );
return true ;
}
function SVGame :: updateScoreHud ( % game , % client , % tag )
{
// Clear the header:
messageClient ( % client , 'SetScoreHudHeader' , " " , " " );
2016-03-17 06:16:14 +00:00
2015-08-30 06:30:29 +00:00
if ( $Data :: Rounds [ % client . GUID , $MissionName ] $ = " " )
$Data :: Rounds [ % client . GUID , $MissionName ] = 0 ;
// Send the subheader:
messageClient ( % client , 'SetScoreHudSubheader' , " " , '<tab:15,235,340,415>\tPLAYER\tRACE\tKILLS\tROUNDS' );
for ( % index = 0 ; % index < ClientGroup . getCount (); % index ++ )
{
//get the client info
% cl = ClientGroup . getObject ( % index );
//get the score
% clScore = mFloatLength ( % cl . efficiency , 1 );
% clKills = mFloatLength ( % cl . kills , 0 );
% clDeaths = mFloatLength ( % cl . deaths + % cl . suicides , 0 );
% clStyle = % cl == % client ? " <color:dcdcdc> " : " " ;
//if the client is not an observer, send the message
if ( % client . team != 0 )
{
if ( % client . race ! $ = " Draakan " ) //The type will make some difference someday.. lol
messageClient ( % client , 'SetLineHud' , " " , % tag , % index , '%6<tab:20, 450>\t<clip:200>%1</clip><rmargin:280><just:right>%2<rmargin:370><just:right>%3<rmargin:460>%4' , % cl . name , % cl . race , % clKills , $Data :: Rounds [ % client . GUID , $MissionName ], % clDeaths , % clStyle );
else
messageClient ( % client , 'SetLineHud' , " " , % tag , % index , '%6<tab:20, 450>\t<clip:200>%1</clip><rmargin:280><just:right>%2 (%7)<rmargin:370><just:right>%3<rmargin:460>%4' , % cl . name , % cl . race , % clKills , $Data :: Rounds [ % client . GUID , $MissionName ], % clDeaths , % clStyle , % cl . sex );
}
}
// 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 );
}
function SVGame :: applyConcussion ( % game , % player )
{
2016-03-17 06:16:14 +00:00
}