home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58b_TRIBES.iso / Tribes / base / scripts.vol / game.cs < prev    next >
Encoding:
Text File  |  1998-12-16  |  25.9 KB  |  788 lines

  1. exec("comchat.cs");
  2. $SensorNetworkEnabled = true;
  3.  
  4. $GuiModePlay = 1;
  5. $GuiModeCommand = 2;
  6. $GuiModeVictory = 3;
  7. $GuiModeInventory = 4;
  8. $GuiModeObjectives = 5;
  9. $GuiModeLobby = 6;
  10.  
  11.  
  12. //  Global Variables
  13.  
  14. //---------------------------------------------------------------------------------
  15. // Energy each team is given at beginning of game
  16. //---------------------------------------------------------------------------------
  17. $DefaultTeamEnergy = "Infinite";
  18.  
  19. //---------------------------------------------------------------------------------
  20. // Team Energy variables
  21. //---------------------------------------------------------------------------------
  22. $TeamEnergy[-1] = $DefaultTeamEnergy; 
  23. $TeamEnergy[0]  = $DefaultTeamEnergy; 
  24. $TeamEnergy[1]  = $DefaultTeamEnergy; 
  25. $TeamEnergy[2]  = $DefaultTeamEnergy; 
  26. $TeamEnergy[3]  = $DefaultTeamEnergy; 
  27. $TeamEnergy[4]  = $DefaultTeamEnergy; 
  28. $TeamEnergy[5]  = $DefaultTeamEnergy; 
  29. $TeamEnergy[6]  = $DefaultTeamEnergy;                 
  30. $TeamEnergy[7]  = $DefaultTeamEnergy; 
  31.  
  32. //---------------------------------------------------------------------------------
  33. // If 1 then Team Spending Ignored -- Team Energy is set to $MaxTeamEnergy every
  34. //     $secTeamEnergy.
  35. //---------------------------------------------------------------------------------
  36. $TeamEnergyCheat = 0;
  37.  
  38. //---------------------------------------------------------------------------------
  39. // MAX amount team energy can reach
  40. //---------------------------------------------------------------------------------
  41. $MaxTeamEnergy = 700000;
  42.  
  43. //---------------------------------------------------------------------------------
  44. // Amount to inc team energy every ($secTeamEnergy) seconds
  45. //---------------------------------------------------------------------------------
  46. $incTeamEnergy = 700;
  47.  
  48. //---------------------------------------------------------------------------------
  49. // (Rate is sec's) Set how often TeamEnergy is incremented
  50. //---------------------------------------------------------------------------------
  51. $secTeamEnergy = 30;
  52.  
  53. //---------------------------------------------------------------------------------
  54. // (Rate is sec's) Items respwan
  55. //---------------------------------------------------------------------------------
  56. $ItemRespawnTime = 30;
  57.  
  58. //---------------------------------------------------------------------------------
  59. //Amount of Energy remote stations start out with
  60. //---------------------------------------------------------------------------------
  61. $RemoteAmmoEnergy = 2500; 
  62. $RemoteInvEnergy = 3000;
  63.  
  64. //---------------------------------------------------------------------------------
  65. // TEAM ENERGY -  Warn team when teammate has spent x amount - Warn team that 
  66. //                  energy level is low when it reaches x amount 
  67. //---------------------------------------------------------------------------------
  68. $TeammateSpending = -4000;  //Set = to 0 if don't want the warning message
  69. $WarnEnergyLow = 4000;        //Set = to 0 if don't want the warning message
  70.  
  71. //---------------------------------------------------------------------------------
  72. // Amount added to TeamEnergy when a player joins a team
  73. //---------------------------------------------------------------------------------
  74. $InitialPlayerEnergy = 5000;
  75.  
  76. //---------------------------------------------------------------------------------
  77. // REMOTE TURRET
  78. //---------------------------------------------------------------------------------
  79. $MaxNumTurretsInBox = 2;     //Number of remote turrets allowed in the area
  80. $TurretBoxMaxLength = 50;    //Define Max Length of the area
  81. $TurretBoxMaxWidth =  50;    //Define Max Width of the area
  82. $TurretBoxMaxHeight = 50;    //Define Max Height of the area
  83.  
  84. $TurretBoxMinLength = 10;      //Define Min Length from another turret
  85. $TurretBoxMinWidth =  10;      //Define Min Width from another turret
  86. $TurretBoxMinHeight = 10;    //Define Min Height from another turret
  87.  
  88. //---------------------------------------------------------------------------------
  89. //    Object Types    
  90. //---------------------------------------------------------------------------------
  91. $SimTerrainObjectType    = 1 << 1;
  92. $SimInteriorObjectType   = 1 << 2;
  93. $SimPlayerObjectType     = 1 << 7;
  94.  
  95. $MineObjectType            = 1 << 26;    
  96. $MoveableObjectType        = 1 << 22;
  97. $VehicleObjectType          = 1 << 29;  
  98. $StaticObjectType             = 1 << 23;       
  99. $ItemObjectType             = 1 << 21;      
  100.  
  101. //---------------------------------------------------------------------------------
  102. // CHEATS
  103. //---------------------------------------------------------------------------------
  104. $ServerCheats = 0;
  105. $TestCheats = 0;
  106.  
  107. //---------------------------------------------------------------------------------
  108. //Respawn automatically after X sec's -  If 0..no respawn
  109. //---------------------------------------------------------------------------------
  110. $AutoRespawn = 0;
  111.  
  112. //---------------------------------------------------------------------------------
  113. // Player death messages - %1 = killer's name, %2 = victim's name
  114. //       %3 = killer's gender pronoun (his/her), %4 = victim's gender pronoun
  115. //---------------------------------------------------------------------------------
  116. $deathMsg[$LandingDamageType, 0]      = "%2 falls to %3 death.";
  117. $deathMsg[$LandingDamageType, 1]      = "%2 forgot to tie %3 bungie cord.";
  118. $deathMsg[$LandingDamageType, 2]      = "%2 bites the dust in a forceful manner.";
  119. $deathMsg[$LandingDamageType, 3]      = "%2 fall down go boom.";
  120. $deathMsg[$ImpactDamageType, 0]      = "%1 makes quite an impact on %2.";
  121. $deathMsg[$ImpactDamageType, 1]      = "%2 becomes the victim of a fly-by from %1.";
  122. $deathMsg[$ImpactDamageType, 2]      = "%2 leaves a nasty dent in %1's fender.";
  123. $deathMsg[$ImpactDamageType, 3]      = "%1 says, 'Hey %2, you scratched my paint job!'";
  124. $deathMsg[$BulletDamageType, 0]      = "%1 ventilates %2 with %3 chaingun.";
  125. $deathMsg[$BulletDamageType, 1]      = "%1 gives %2 an overdose of lead.";
  126. $deathMsg[$BulletDamageType, 2]      = "%1 fills %2 full of holes.";
  127. $deathMsg[$BulletDamageType, 3]      = "%1 guns down %2.";
  128. $deathMsg[$EnergyDamageType, 0]      = "%2 dies of turret trauma.";
  129. $deathMsg[$EnergyDamageType, 1]      = "%2 is chewed to pieces by a turret.";
  130. $deathMsg[$EnergyDamageType, 2]      = "%2 walks into a stream of turret fire.";
  131. $deathMsg[$EnergyDamageType, 3]      = "%2 ends up on the wrong side of a turret.";
  132. $deathMsg[$PlasmaDamageType, 0]      = "%2 feels the warm glow of %1's plasma.";
  133. $deathMsg[$PlasmaDamageType, 1]      = "%1 gives %2 a white-hot plasma injection.";
  134. $deathMsg[$PlasmaDamageType, 2]      = "%1 asks %2, 'Got plasma?'";
  135. $deathMsg[$PlasmaDamageType, 3]      = "%1 gives %2 a plasma transfusion.";
  136. $deathMsg[$ExplosionDamageType, 0]   = "%2 catches a Frisbee of Death thrown by %1.";
  137. $deathMsg[$ExplosionDamageType, 1]   = "%1 blasts %2 with a well-placed disc.";
  138. $deathMsg[$ExplosionDamageType, 2]   = "%1's spinfusor caught %2 by surprise.";
  139. $deathMsg[$ExplosionDamageType, 3]   = "%2 falls victim to %1's Stormhammer.";
  140. $deathMsg[$ShrapnelDamageType, 0]    = "%1 blows %2 up real good.";
  141. $deathMsg[$ShrapnelDamageType, 1]    = "%2 gets a taste of %1's explosive temper.";
  142. $deathMsg[$ShrapnelDamageType, 2]    = "%1 gives %2 a fatal concussion.";
  143. $deathMsg[$ShrapnelDamageType, 3]    = "%2 never saw it coming from %1.";
  144. $deathMsg[$LaserDamageType, 0]       = "%1 adds %2 to %3 list of sniper victims.";
  145. $deathMsg[$LaserDamageType, 1]       = "%1 fells %2 with a sniper shot.";
  146. $deathMsg[$LaserDamageType, 2]       = "%2 becomes a victim of %1's laser rifle.";
  147. $deathMsg[$LaserDamageType, 3]       = "%2 stayed in %1's crosshairs for too long.";
  148. $deathMsg[$MortarDamageType, 0]      = "%1 mortars %2 into oblivion.";
  149. $deathMsg[$MortarDamageType, 1]      = "%2 didn't see that last mortar from %1.";
  150. $deathMsg[$MortarDamageType, 2]      = "%1 inflicts a mortal mortar wound on %2.";
  151. $deathMsg[$MortarDamageType, 3]      = "%1's mortar takes out %2.";
  152. $deathMsg[$BlasterDamageType, 0]     = "%2 gets a blast out of %1.";
  153. $deathMsg[$BlasterDamageType, 1]     = "%2 succumbs to %1's rain of blaster fire.";
  154. $deathMsg[$BlasterDamageType, 2]     = "%1's puny blaster shows %2 a new world of pain.";
  155. $deathMsg[$BlasterDamageType, 3]     = "%2 meets %1's master blaster.";
  156. $deathMsg[$ElectricityDamageType, 0] = "%2 gets zapped with %1's ELF gun.";
  157. $deathMsg[$ElectricityDamageType, 1] = "%1 gives %2 a nasty jolt.";
  158. $deathMsg[$ElectricityDamageType, 2] = "%2 gets a real shock out of meeting %1.";
  159. $deathMsg[$ElectricityDamageType, 3] = "%1 short-circuits %2's systems.";
  160. $deathMsg[$CrushDamageType, 0]         = "%2 didn't stay away from the moving parts.";
  161. $deathMsg[$CrushDamageType, 1]         = "%2 is crushed.";
  162. $deathMsg[$CrushDamageType, 2]         = "%2 gets smushed flat.";
  163. $deathMsg[$CrushDamageType, 3]         = "%2 gets caught in the machinery.";
  164. $deathMsg[$DebrisDamageType, 0]         = "%2 is a victim among the wreckage.";
  165. $deathMsg[$DebrisDamageType, 1]         = "%2 is killed by debris.";
  166. $deathMsg[$DebrisDamageType, 2]         = "%2 becomes a victim of collateral damage.";
  167. $deathMsg[$DebrisDamageType, 3]         = "%2 got too close to the exploding stuff.";
  168. $deathMsg[$MissileDamageType, 0]        = "%2 takes a missile up the keister.";
  169. $deathMsg[$MissileDamageType, 1]        = "%2 gets shot down.";
  170. $deathMsg[$MissileDamageType, 2]        = "%2 gets real friendly with a rocket.";
  171. $deathMsg[$MissileDamageType, 3]        = "%2 feels the burn from a warhead.";
  172. $deathMsg[$MineDamageType, 0]           = "%1 blows %2 up real good.";
  173. $deathMsg[$MineDamageType, 1]           = "%2 gets a taste of %1's explosive temper.";
  174. $deathMsg[$MineDamageType, 2]           = "%1 gives %2 a fatal concussion.";
  175. $deathMsg[$MineDamageType, 3]           = "%2 never saw it coming from %1.";
  176.  
  177. // "you just killed yourself" messages
  178. //   %1 = player name,  %2 = player gender pronoun
  179.  
  180. $deathMsg[-2,0]                         = "%1 ends it all.";
  181. $deathMsg[-2,1]                         = "%1 takes %2 own life.";
  182. $deathMsg[-2,2]                         = "%1 kills %2 own dumb self.";
  183. $deathMsg[-2,3]                         = "%1 decides to see what the afterlife is like.";
  184.  
  185. $numDeathMsgs = 4;
  186. //---------------------------------------------------------------------------------
  187.  
  188. $spawnBuyList[0] = LightArmor;
  189. $spawnBuyList[1] = Blaster;
  190. $spawnBuyList[2] = Chaingun;
  191. $spawnBuyList[3] = Disclauncher;
  192. $spawnBuyList[4] = RepairKit;
  193. $spawnBuyList[5] = "";
  194.  
  195. function remotePlayMode(%clientId)
  196. {
  197.    if(!%clientId.guiLock)
  198.    {
  199.       remoteSCOM(%clientId, -1);
  200.       Client::setGuiMode(%clientId, $GuiModePlay);
  201.    }
  202. }
  203.  
  204. function remoteCommandMode(%clientId)
  205. {
  206.    // can't switch to command mode while a server menu is up
  207.    if(!%clientId.guiLock)
  208.    {
  209.       remoteSCOM(%clientId, -1);  // force the bandwidth to be full command
  210.         if(%clientId.observerMode != "pregame")
  211.            checkControlUnmount(%clientId);
  212.         Client::setGuiMode(%clientId, $GuiModeCommand);
  213.    }
  214. }
  215.  
  216. function remoteInventoryMode(%clientId)
  217. {
  218.    if(!%clientId.guiLock && !Observer::isObserver(%clientId))
  219.    {
  220.       remoteSCOM(%clientId, -1);
  221.       Client::setGuiMode(%clientId, $GuiModeInventory);
  222.    }
  223. }
  224.  
  225. function remoteObjectivesMode(%clientId)
  226. {
  227.    if(!%clientId.guiLock)
  228.    {
  229.       remoteSCOM(%clientId, -1);
  230.       Client::setGuiMode(%clientId, $GuiModeObjectives);
  231.    }
  232. }
  233.  
  234. function remoteScoresOn(%clientId)
  235. {
  236.    if(!%clientId.menuMode)
  237.       Game::menuRequest(%clientId);
  238. }
  239.  
  240. function remoteScoresOff(%clientId)
  241. {
  242.    Client::cancelMenu(%clientId);
  243. }
  244.  
  245. function remoteToggleCommandMode(%clientId)
  246. {
  247.     if (Client::getGuiMode(%clientId) != $GuiModeCommand)
  248.         remoteCommandMode(%clientId);
  249.     else
  250.         remotePlayMode(%clientId);
  251. }
  252.  
  253. function remoteToggleInventoryMode(%clientId)
  254. {
  255.     if (Client::getGuiMode(%clientId) != $GuiModeInventory)
  256.         remoteInventoryMode(%clientId);
  257.     else
  258.         remotePlayMode(%clientId);
  259. }
  260.  
  261. function remoteToggleObjectivesMode(%clientId)
  262. {
  263.     if (Client::getGuiMode(%clientId) != $GuiModeObjectives)
  264.         remoteObjectivesMode(%clientId);
  265.     else
  266.         remotePlayMode(%clientId);
  267. }
  268.  
  269. function Time::getMinutes(%simTime)
  270. {
  271.    return floor(%simTime / 60);
  272. }
  273.  
  274. function Time::getSeconds(%simTime)
  275. {
  276.    return %simTime % 60;
  277. }
  278.  
  279. function Game::pickRandomSpawn(%team)
  280. {
  281.    %group = nameToID("MissionGroup/Teams/team" @ %team @ "/DropPoints/Random");
  282.    %count = Group::objectCount(%group);
  283.    if(!%count)
  284.       return -1;
  285.       %spawnIdx = floor(getRandom() * (%count - 0.1));
  286.       %value = %count;
  287.     for(%i = %spawnIdx; %i < %value; %i++) {
  288.         %set = newObject("set",SimSet);
  289.         %obj = Group::getObject(%group, %i);
  290.         if(containerBoxFillSet(%set,$SimPlayerObjectType|$VehicleObjectType,GameBase::getPosition(%obj),2,2,4,0) == 0) {
  291.             deleteObject(%set);
  292.             return %obj;        
  293.         }
  294.         if(%i == %count - 1) {
  295.             %i = -1;
  296.             %value = %spawnIdx;
  297.         }
  298.         deleteObject(%set);
  299.     }
  300.    return false;
  301. }
  302.  
  303. function Game::pickStartSpawn(%team)
  304. {
  305.    %group = nameToID("MissionGroup\\Teams\\team" @ %team @ "\\DropPoints\\Start");
  306.    %count = Group::objectCount(%group);
  307.    if(!%count)
  308.       return -1;
  309.  
  310.    %spawnIdx = $lastTeamSpawn[%team] + 1;
  311.    if(%spawnIdx >= %count)
  312.       %spawnIdx = 0;
  313.    $lastTeamSpawn[%team] = %spawnIdx;
  314.    return Group::getObject(%group, %spawnIdx);
  315. }
  316.  
  317. function Game::pickTeamSpawn(%team, %respawn)
  318. {
  319.    if(%respawn)
  320.       return Game::pickRandomSpawn(%team);
  321.    else
  322.    {
  323.       %spawn = Game::pickStartSpawn(%team);
  324.       if(%spawn == -1)
  325.          return Game::pickRandomSpawn(%team);
  326.       return %spawn;
  327.    }
  328. }
  329.  
  330. function Game::pickObserverSpawn(%client)
  331. {
  332.    %group = nameToID("MissionGroup\\ObserverDropPoints");
  333.    %count = Group::objectCount(%group);
  334.    if(%group == -1 || !%count)
  335.       %group = nameToID("MissionGroup\\Teams\\team" @ Client::getTeam(%client) @ "\\DropPoints\\Random");
  336.    %count = Group::objectCount(%group);
  337.    if(%group == -1 || !%count)
  338.       %group = nameToID("MissionGroup\\Teams\\team0\\DropPoints\\Random");
  339.    %count = Group::objectCount(%group);
  340.    if(%group == -1 || !%count)
  341.       return -1;
  342.    %spawnIdx = %client.lastObserverSpawn + 1;
  343.    if(%spawnIdx >= %count)
  344.       %spawnIdx = 0;
  345.    %client.lastObserverSpawn = %spawnIdx;
  346.     return Group::getObject(%group, %spawnIdx);
  347. }
  348.  
  349. function UpdateClientTimes(%time)
  350. {
  351.    for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl))
  352.       remoteEval(%cl, "setTime", -%time);
  353. }
  354.  
  355. function Game::notifyMatchStart(%time)
  356. {
  357.    messageAll(0, "Match starts in " @ %time @ " seconds.");
  358.    UpdateClientTimes(%time);
  359. }
  360.  
  361. function Game::startMatch()
  362. {
  363.    $matchStarted = true;
  364.    $missionStartTime = getSimTime();
  365.    messageAll(0, "Match started.");
  366.     Game::resetScores();    
  367.  
  368.    %numTeams = getNumTeams();
  369.    for(%i = 0; %i < %numTeams; %i = %i + 1) {
  370.         if($TeamEnergy[%i] != "Infinite")
  371.             schedule("replenishTeamEnergy(" @ %i @ ");", $secTeamEnergy);
  372.     }
  373.  
  374.    for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl))
  375.    {
  376.         if(%cl.observerMode == "pregame")
  377.       {
  378.          %cl.observerMode = "";
  379.          Client::setControlObject(%cl, Client::getOwnedObject(%cl));
  380.       }
  381.        Game::refreshClientScore(%cl);
  382.     }
  383.    Game::checkTimeLimit();
  384. }
  385.  
  386. function Game::pickPlayerSpawn(%clientId, %respawn)
  387. {
  388.    return Game::pickTeamSpawn(Client::getTeam(%clientId), %respawn);
  389. }
  390.  
  391. function Game::playerSpawn(%clientId, %respawn)
  392. {
  393.    if(!$ghosting)
  394.       return false;
  395.  
  396.     Client::clearItemShopping(%clientId);
  397.    %spawnMarker = Game::pickPlayerSpawn(%clientId, %respawn);
  398.    if(!%respawn)
  399.    {
  400.       // initial drop
  401.       bottomprint(%clientId, "<jc><f0>Mission: <f1>" @ $missionName @ "   <f0>Mission Type: <f1>" @ $Game::missionType @ "\n<f0>Press <f1>'O'<f0> for specific objectives.", 5);
  402.    }
  403.     if(%spawnMarker) {   
  404.         %clientId.guiLock = "";
  405.          %clientId.dead = "";
  406.        if(%spawnMarker == -1)
  407.        {
  408.           %spawnPos = "0 0 300";
  409.           %spawnRot = "0 0 0";
  410.        }
  411.        else
  412.        {
  413.           %spawnPos = GameBase::getPosition(%spawnMarker);
  414.           %spawnRot = GameBase::getRotation(%spawnMarker);
  415.        }
  416.  
  417.         if(!String::ICompare(Client::getGender(%clientId), "Male"))
  418.           %armor = "larmor";
  419.        else
  420.           %armor = "lfemale";
  421.  
  422.        %pl = spawnPlayer(%armor, %spawnPos, %spawnRot);
  423.        echo("SPAWN: cl:" @ %clientId @ " pl:" @ %pl @ " marker:" @ %spawnMarker @ " armor:" @ %armor);
  424.        if(%pl != -1)
  425.        {
  426.           GameBase::setTeam(%pl, Client::getTeam(%clientId));
  427.           Client::setOwnedObject(%clientId, %pl);
  428.           Game::playerSpawned(%pl, %clientId, %armor, %respawn);
  429.           
  430.           if($matchStarted)
  431.              Client::setControlObject(%clientId, %pl);
  432.           else
  433.           {
  434.              %clientId.observerMode = "pregame";
  435.              Client::setControlObject(%clientId, Client::getObserverCamera(%clientId));
  436.              Observer::setOrbitObject(%clientId, %pl, 3, 3, 3);
  437.           }
  438.        }
  439.       return true;
  440.     }
  441.     else {
  442.         Client::sendMessage(%clientId,0,"Sorry No Respawn Positions Are Empty - Try again later ");
  443.       return false;
  444.     }
  445. }
  446.  
  447. function Game::playerSpawned(%pl, %clientId, %armor)
  448. {                          
  449.     %clientId.spawn= 1;
  450.     %max = getNumItems();
  451.    for(%i = 0; (%item = $spawnBuyList[%i]) != ""; %i++)
  452.    {
  453.         buyItem(%clientId,%item);    
  454.         if(%item.className == Weapon) 
  455.             %clientId.spawnWeapon = %item;
  456.     }
  457.     %clientId.spawn= "";
  458.     if(%clientId.spawnWeapon != "") {
  459.         Player::useItem(%pl,%clientId.spawnWeapon);    
  460.        %clientId.spawnWeapon="";
  461.     }
  462.  
  463. function Game::autoRespawn(%client)
  464. {
  465.     if(%client.dead == 1)
  466.         Game::playerSpawn(%client, "true");
  467. }
  468.  
  469. function onServerGhostAlwaysDone()
  470. {
  471. }
  472.  
  473. function Game::initialMissionDrop(%clientId)
  474. {
  475.     Client::setGuiMode(%clientId, $GuiModePlay);
  476.  
  477.    if(%clientId.observerMode == "observerFly" || %clientId.observerMode == "observerOrbit")
  478.    {
  479.        %clientId.observerMode = "observerOrbit";
  480.        %clientId.guiLock = "";
  481.       Observer::jump(%clientId);
  482.       return;
  483.    }
  484.    %numTeams = getNumTeams();
  485.    %curTeam = Client::getTeam(%clientId);
  486.  
  487.    if(!$Server::TourneyMode && (%curTeam >= %numTeams || (%curTeam == -1 && (%numTeams < 2 || $Server::AutoAssignTeams))) )
  488.       Game::assignClientTeam(%clientId);
  489.    else if($Server::TourneyMode)
  490.       GameBase::setTeam(%clientId, -1);
  491.  
  492.     Client::setControlObject(%clientId, Client::getObserverCamera(%clientId));
  493.    %camSpawn = Game::pickObserverSpawn(%clientId);
  494.    Observer::setFlyMode(%clientId, GameBase::getPosition(%camSpawn), 
  495.        GameBase::getRotation(%camSpawn), true, true);
  496.  
  497.    if(Client::getTeam(%clientId) == -1)
  498.    {
  499.       %clientId.observerMode = "pickingTeam";
  500.  
  501.       if($Server::TourneyMode && ($matchStarted || $matchStarting))
  502.       {
  503.          %clientId.observerMode = "observerFly";
  504.          return;
  505.       }
  506.       else if($Server::TourneyMode)
  507.       {
  508.          if($Server::TeamDamageScale)
  509.             %td = "ENABLED";
  510.          else
  511.             %td = "DISABLED";
  512.          bottomprint(%clientId, "<jc><f1>Server is running in Competition Mode\nPick a team.\nTeam damage is " @ %td, 0);
  513.       }
  514.       Client::buildMenu(%clientId, "Pick a team:", "InitialPickTeam");
  515.       Client::addMenuItem(%clientId, "0Observe", -2);
  516.       Client::addMenuItem(%clientId, "1Automatic", -1);
  517.       for(%i = 0; %i < getNumTeams(); %i = %i + 1)
  518.          Client::addMenuItem(%clientId, (%i+2) @ getTeamName(%i), %i);
  519.       %clientId.justConnected = "";
  520.    }
  521.    else 
  522.    {
  523.       Client::setSkin(%clientId, $Server::teamSkin[Client::getTeam(%clientId)]);
  524.       if(%clientId.justConnected)
  525.       {
  526.          centerprint(%clientId, $Server::JoinMOTD, 0);
  527.          %clientId.observerMode = "justJoined";
  528.          %clientId.justConnected = "";
  529.       }
  530.       else if(%clientId.observerMode == "justJoined")
  531.       {
  532.          centerprint(%clientId, "");
  533.          %clientId.observerMode = "";
  534.          Game::playerSpawn(%clientId, false);
  535.       }
  536.       else
  537.          Game::playerSpawn(%clientId, false);
  538.     }
  539.     if($TeamEnergy[Client::getTeam(%clientId)] != "Infinite")
  540.         $TeamEnergy[Client::getTeam(%clientId)] += $InitialPlayerEnergy;
  541.     %clientId.teamEnergy = 0;
  542. }
  543.  
  544. function processMenuInitialPickTeam(%clientId, %team)
  545. {
  546.    if($Server::TourneyMode && $matchStarted)
  547.       %team = -2;
  548.  
  549.    if(%team == -2)
  550.    {
  551.       Observer::enterObserverMode(%clientId);
  552.    }
  553.    if(%team == -1)
  554.    {
  555.       Game::assignClientTeam(%clientId);
  556.       %team = Client::getTeam(%clientId);
  557.    }
  558.    if(%team != -2)
  559.    {
  560.       GameBase::setTeam(%clientId, %team);
  561.         if($TeamEnergy[%team] != "Infinite")
  562.             $TeamEnergy[%team] += $InitialPlayerEnergy;
  563.       %clientId.teamEnergy = 0;
  564.       Client::setControlObject(%clientId, -1);
  565.       Game::playerSpawn(%clientId, false);
  566.    }
  567.    if($Server::TourneyMode && !$CountdownStarted)
  568.    {
  569.       bottomprint(%clientId, "", 0);
  570.       // loop through all the clients and see if any are still in
  571.       // pickingTeam observer mode:
  572.       %playerCount = 0;
  573.       for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl))
  574.       {
  575.          if(%cl.observerMode == "pickingTeam")
  576.             return;
  577.          if(%cl.observerMode == "pregame")
  578.             %playerCount++;
  579.       }
  580.       if(%playerCount != 0)
  581.          Server::Countdown(30);
  582.    }
  583. }
  584.  
  585. function Game::checkTimeLimit()
  586. {
  587.    // if no timeLimit set or timeLimit set to 0,
  588.    // just reschedule the check for a minute hence
  589.    $timeLimitReached = false;
  590.  
  591.    if(!$Server::timeLimit)
  592.    {
  593.       schedule("Game::checkTimeLimit();", 60);
  594.       return;
  595.    }
  596.    %curTimeLeft = ($Server::timeLimit * 60) + $missionStartTime - getSimTime();
  597.    if(%curTimeLeft <= 0 && $matchStarted)
  598.    {
  599.       echo("GAME: Timelimit reached.");
  600.       $timeLimitReached = true;
  601.       Server::nextMission();
  602.    }
  603.    else
  604.    {
  605.       schedule("Game::checkTimeLimit();", 20);
  606.       UpdateClientTimes(%curTimeLeft);
  607.    }
  608. }
  609.  
  610. function Game::resetScores(%client)
  611. {
  612.     if(%client == "") {
  613.        for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl)) {
  614.           %cl.scoreKills = 0;
  615.           %cl.scoreDeaths = 0;
  616.             %cl.ratio = 0;
  617.           %cl.score = 0;
  618.         }
  619.     }
  620.     else {
  621.       %client.scoreKills = 0;
  622.          %client.scoreDeaths = 0;
  623.         %client.ratio = 0;
  624.          %client.score = 0;
  625.     }
  626. }
  627.  
  628. function remoteSetArmor(%player, %armorType)
  629. {
  630.     if ($ServerCheats) {
  631.         checkMax(Player::getClient(%player),%armorType);
  632.        Player::setArmor(%player, %armorType);
  633.     }
  634.     else if($TestCheats) {
  635.        Player::setArmor(%player, %armorType);
  636.     }
  637. }
  638.  
  639.  
  640. function Game::onPlayerConnected(%playerId)
  641. {
  642.    %playerId.scoreKills = 0;
  643.    %playerId.scoreDeaths = 0;
  644.     %playerId.score = 0;
  645.    %playerId.justConnected = true;
  646.    $menuMode[%playerId] = "None";
  647.    Game::refreshClientScore(%playerId);
  648. }
  649.  
  650. function Game::assignClientTeam(%playerId)
  651. {
  652.    if($teamplay)
  653.    {
  654.       %name = Client::getName(%playerId);
  655.       %numTeams = getNumTeams();
  656.       if($teamPreset[%name] != "")
  657.       {
  658.          if($teamPreset[%name] < %numTeams)
  659.          {
  660.             GameBase::setTeam(%playerId, $teamPreset[%name]);
  661.             echo(Client::getName(%playerId), " was preset to team ", $teamPreset[%name]);
  662.             return;
  663.          }            
  664.       }
  665.       %numPlayers = getNumClients();
  666.       for(%i = 0; %i < %numTeams; %i = %i + 1)
  667.          %numTeamPlayers[%i] = 0;
  668.  
  669.       for(%i = 0; %i < %numPlayers; %i = %i + 1)
  670.       {
  671.          %pl = getClientByIndex(%i);
  672.          if(%pl != %playerId)
  673.          {
  674.             %team = Client::getTeam(%pl);
  675.             %numTeamPlayers[%team] = %numTeamPlayers[%team] + 1;
  676.          }
  677.       }
  678.       %leastPlayers = %numTeamPlayers[0];
  679.       %leastTeam = 0;
  680.       for(%i = 1; %i < %numTeams; %i = %i + 1)
  681.       {
  682.          if( (%numTeamPlayers[%i] < %leastPlayers) || 
  683.             ( (%numTeamPlayers[%i] == %leastPlayers) && 
  684.             ($teamScore[%i] < $teamScore[%leastTeam] ) ))
  685.          {
  686.             %leastTeam = %i;
  687.             %leastPlayers = %numTeamPlayers;
  688.          }
  689.       }
  690.       GameBase::setTeam(%playerId, %leastTeam);
  691.       echo(Client::getName(%playerId), " was automatically assigned to team ", %leastTeam);
  692.    }
  693.    else
  694.    {
  695.       GameBase::setTeam(%playerId, 0);
  696.    }
  697. }
  698.  
  699. function Client::onKilled(%playerId, %killerId, %damageType)
  700. {
  701.    echo("GAME: kill " @ %killerId @ " " @ %playerId @ " " @ %damageType);
  702.    %playerId.guiLock = true;
  703.    Client::setGuiMode(%playerId, $GuiModePlay);
  704.     if(!String::ICompare(Client::getGender(%playerId), "Male"))
  705.    {
  706.       %playerGender = "his";
  707.    }
  708.     else
  709.     {
  710.         %playerGender = "her";
  711.     }
  712.     %ridx = floor(getRandom() * ($numDeathMsgs - 0.01));
  713.     %victimName = Client::getName(%playerId);
  714.  
  715.  
  716.    if(!%killerId)
  717.    {
  718.       messageAll(0, strcat(%victimName, " dies."));
  719.       %playerId.scoreDeaths++;
  720.   }
  721.    else if(%killerId == %playerId)
  722.    {
  723.       %oopsMsg = sprintf($deathMsg[-2, %ridx], %victimName, %playerGender);
  724.       messageAll(0, %oopsMsg);
  725.       %playerId.scoreDeaths++;
  726.       %playerId.score--;
  727.       Game::refreshClientScore(%playerId);
  728.    }
  729.    else
  730.    {
  731.         if(!String::ICompare(Client::getGender(%killerId), "Male"))
  732.         {
  733.             %killerGender = "his";
  734.         }
  735.         else
  736.         {
  737.             %killerGender = "her";
  738.         }
  739.       if($teamplay && (Client::getTeam(%killerId) == Client::getTeam(%playerId)))
  740.       {
  741.          messageAll(0, strcat(Client::getName(%killerId), 
  742.             " mows down ", %killerGender, " teammate, ", %victimName));
  743.          %killerId.scoreDeaths++;
  744.          %playerId.score--;
  745.          Game::refreshClientScore(%killerId);
  746.       }
  747.       else
  748.       {
  749.          %obitMsg = sprintf($deathMsg[%damageType, %ridx], Client::getName(%killerId),
  750.            %victimName, %killerGender, %playerGender);
  751.          messageAll(0, %obitMsg);
  752.          %killerId.scoreKills++;
  753.          %playerId.scoreDeaths++;  // test play mode
  754.          %killerId.score++;
  755.          Game::refreshClientScore(%killerId);
  756.          Game::refreshClientScore(%playerId);
  757.       }
  758.    }
  759.    Game::clientKilled(%playerId, %killerId);
  760. }
  761.  
  762. function Game::clientKilled(%playerId, %killerId)
  763. {
  764.    // do nothing
  765. }
  766.  
  767. function Client::leaveGame(%clientId)
  768. {
  769.    // do nothing
  770. }
  771.  
  772. function Player::enterMissionArea(%player)
  773. {
  774.    echo("Player " @ %player @ " entered the mission area.");
  775. }
  776.  
  777. function Player::leaveMissionArea(%player)
  778. {
  779.    echo("Player " @ %player @ " left the mission area.");
  780. }
  781.  
  782. function GameBase::getHeatFactor(%this)
  783. {
  784.    return 0.0;
  785. }
  786.  
  787.