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

  1. exec("game.cs");
  2. $MaxNumKills = 15;
  3. //Deathmatch mission script -Aug. 25 1998
  4.  
  5. //calc scores upon fraging
  6. function Game::clientKilled(%playerId, %killerId)
  7. {
  8.    if($teamplay)
  9.    {
  10.       if(%killerId == -1 || %playerId == -1)
  11.       {
  12.          return;
  13.       }
  14.       %kteam = Client::getTeam(%killerId);
  15.       %pteam = Client::getTeam(%playerId);
  16.       
  17.       if(%kteam == %pteam)
  18.          $teamScore[%kteam] = $teamScore[%kteam] - 1;
  19.       else
  20.          $teamScore[%kteam] = $teamScore[%kteam] - 1;
  21.       
  22.       DMTEAM::checkMissionObjectives();
  23.    }
  24.    else
  25.       DM::checkMissionObjectives(%killerId);
  26.    
  27. }
  28.  
  29. function Game::playerSpawned(%pl, %clientId, %armor)
  30. {      
  31.    // use this client's skin preference
  32.    Client::setSkin(%clientId, $Client::info[%clientId, 0]);
  33.  
  34.    //spawn with only blaster and health kit
  35.    Player::setItemCount(%clientId,$ArmorName[%armor],1);
  36.    Player::setItemCount(%clientId,Blaster,1);
  37.    Player::setItemCount(%clientId,RepairKit,1);
  38.     Player::useItem(%pl,Blaster);
  39.    
  40.    if($teamplay)
  41.    {
  42.       DMTEAM::checkMissionObjectives();
  43.       DMTEAM::echoScores();
  44.    }
  45. }
  46.  
  47. //Player has a total of 10 seconds per life allowed outside designated mission area.
  48. //After a player expends this 10 sec, the player is remotely killed.
  49. //-lesson to be learned= stay in the mission area!
  50. function Player::leaveMissionArea(%player)
  51. {
  52.    %cl = Player::getClient(%player);
  53.     Client::sendMessage(%cl,1,"You have left the mission area.");
  54.     %player.outArea=1;
  55.     alertPlayer(%player, 3);
  56. }
  57.  
  58. //checking for timeout of dieSeqCount
  59. function Player::checkLMATimeout(%player, %seqCount)
  60. {
  61.    echo("checking player timeout " @ %player @ " " @ %seqCount);
  62.    if(%player.dieSeqCount == %seqCount)
  63.       remoteKill(Player::getClient(%player));
  64. }
  65.  
  66. //called if player leaves mission area
  67. function Player::enterMissionArea(%player)
  68. {
  69.    %player.outArea="";
  70.    %player.dieSeqCount = 0;
  71.    %player.timeLeft = %player.timeLeft - (getSimTime() - %player.leaveTime);
  72. }
  73.   
  74. function alertPlayer(%player, %count)
  75. {
  76.     if(%player.outArea == 1) {
  77.         %clientId = Player::getClient(%player);
  78.           Client::sendMessage(%clientId,1,"~wLeftMissionArea.wav");
  79.         if(%count > 1)
  80.            schedule("alertPlayer(" @ %player @ ", " @ %count - 1 @ ");",1.5,%clientId);
  81.         else 
  82.            schedule("leaveMissionAreaDamage(" @ %clientId @ ");",1,%clientId);
  83.     }
  84. }
  85.  
  86. function leaveMissionAreaDamage(%client)
  87. {
  88.     %player = Client::getOwnedObject(%client);
  89.     if(%player.outArea == 1) {
  90.         if(!Player::isDead(%player)) {
  91.               Player::setDamageFlash(%client,0.1);
  92.             GameBase::setDamageLevel(%player,GameBase::getDamageLevel(%player) + 0.05);
  93.            schedule("leaveMissionAreaDamage(" @ %client @ ");",1);
  94.         }
  95.         else 
  96.             playNextAnim(%client);    
  97.     }
  98. }
  99.  
  100. function Game::checkTimeLimit()
  101. {
  102.    // if no timeLimit set or timeLimit set to 0,
  103.    // just reschedule the check for a minute hence
  104.    $timeLimitReached = false;
  105.  
  106.    if(!$Server::timeLimit)
  107.    {
  108.       schedule("Game::checkTimeLimit();", 60);
  109.       return;
  110.    }
  111.    %curTimeLeft = ($Server::timeLimit * 60) + $missionStartTime - getSimTime();
  112.    if(%curTimeLeft <= 0)
  113.    {
  114.       $timeLimitReached = true;
  115.       $timeReached = 1;
  116.         DM::missionObjectives();
  117.         Server::nextMission();
  118.     }
  119.    else
  120.    {
  121.       schedule("Game::checkTimeLimit();", 20);
  122.       UpdateClientTimes(%curTimeLeft);
  123.    }
  124. }
  125.  
  126. function Vote::changeMission()
  127. {
  128.     $timeLimitReached = true;
  129.    $timeReached = 1;
  130.     DM::missionObjectives();
  131. }
  132.   
  133. //---------------------------------------------------------------------------------------
  134. //
  135. //Free for all Deathmatch function definitions
  136. //
  137. //---------------------------------------------------------------------------------------
  138. function DM::checkMissionObjectives(%playerId) 
  139. {
  140.    if(DM::missionObjectives(%playerId)) 
  141.       schedule("nextMission();", 0);
  142. }
  143.  
  144. function DM::missionObjectives()
  145. {
  146.     %numClients = getNumClients();
  147.     for(%i = 0 ; %i < %numClients ; %i++) 
  148.         %clientList[%i] = getClientByIndex(%i);
  149.     %doIt = 1;
  150.     while(%doIt == 1) {
  151.         %doIt = "";
  152.         for(%i= 0 ; %i < %numClients; %i++) {
  153.             if((%clientList[%i]).ratio < (%clientList[%i+1]).ratio) {
  154.                 %hold = %clientList[%i];
  155.                 %clientList[%i] = %clientList[%i+1];
  156.                 %clientList[%i+1]    = %hold;
  157.                 %doIt=1;
  158.             }
  159.         }
  160.     }
  161.    if(!$Server::timeLimit)
  162.       %str = "<f1>   - No time limit on the game.";
  163.    else if($timeLimitReached)
  164.       %str = "<f1>   - Time limit reached.";
  165.    else
  166.       %str = "<f1>   - Time remaining: " @ floor($Server::timeLimit - (getSimTime() - $missionStartTime) / 60) @ " minutes.";
  167.     for(%l = -1; %l < 1 ; %l++) {        
  168.         %lineNum = 0;
  169.         if($timeReached == "") {
  170.                Team::setObjective(%l, %lineNum, "<jc><B0,0:deathmatch1.bmp><B0,0:deathmatch2.bmp>");
  171.               Team::setObjective(%l, %lineNum++, "<f5>Mission Information:");
  172.             Team::setObjective(%l, %lineNum++, "<f1>   - Mission Name: " @ $missionName); 
  173.           Team::setObjective(%l, %lineNum++, %str);
  174.           Team::setObjective(%l, %lineNum++, " ");
  175.                Team::setObjective(%l, %lineNum++, "<f5>Mission Objectives:");
  176.                Team::setObjective(%l, %lineNum++, "<f1>   -Kill all other players!");
  177.                Team::setObjective(%l, %lineNum++, "<f1>   -Stay alive!");
  178.                Team::setObjective(%l, %lineNum++, "<f1>   -To have the highest Efficiency!");
  179.                Team::setObjective(%l, %lineNum++, "<f1>        -Efficiency is calculated once (Kills + Deaths) is greater than 4");
  180.                Team::setObjective(%l, %lineNum++, " ");
  181.                Team::setObjective(%l, %lineNum++, "<f1>Remember to stay within the mission area, which is defined by the extents of your commander screen map."    @ 
  182.                                           " If you go outside of the mission area you will have 3 seconds to get back into the mission area, or you'll start taking damage!");
  183.                Team::setObjective(%l, %lineNum++, " ");
  184.                Team::setObjective(%l, %lineNum++, " ");
  185.               Team::setObjective(%l, %lineNum++, "<f5>TOP PLAYERS ARE: " );
  186.                Team::setObjective(%l, %lineNum++, " ");
  187.                Team::setObjective(%l, %lineNum++, "<f1>Player Name<L30>Kills<L50>Deaths<L70>Efficiency");
  188.        }
  189.        else {
  190.             Team::setObjective(%l, %lineNum++, "<f5>Mission Summary:");
  191.                Team::setObjective(%l, %lineNum++, " " );
  192.                Team::setObjective(%l, %lineNum++, "<f1>     - The Best Player(s): " );
  193.             %i=0;
  194.             %TopRatio="";
  195.             while(%i < %numClients && %clientList[%i].ratio != 0 && (%TopRatio == "" || (%TopRatio ==  (%clientList[%i+1]).ratio && %TopRatio != 0) )) {
  196.                    Team::setObjective(%l, %lineNum++, "<L14><f5><Bskull_big.bmp>\n" @ Client::getName(%clientList[%i]) @ "<f1> with a ratio of <f5>" @ (%clientList[%i]).ratio @ ".0%");
  197.                 %TopRatio = (%clientList[%i]).ratio;
  198.                 %i++;
  199.             }
  200.             if(%i == 0)
  201.                    Team::setObjective(%l, %lineOffset++, "<L14><f1>NONE with a ratio greater than 0.0%");
  202.                Team::setObjective(%l, %lineNum++, " ");
  203.                Team::setObjective(%l, %lineNum++, " ");
  204.             Team::setObjective(%l, %lineNum++, "<f5>TOP PLAYERS ARE: " );
  205.                Team::setObjective(%l, %lineNum++, " ");
  206.             Team::setObjective(%l, %lineNum++, "<f1>Player Name<L30>Kills<L50>Deaths<L70>Efficiency");
  207.         }
  208.        //print out top 5 scores
  209.         %index = 0;
  210.         while(%index < %numClients && %clientList[%index].ratio != 0 && (%index < 5 || (%clientList[%index].ratio == %lastRatio && %lastRatio != 0))) {
  211.               %client = getClientByIndex(%count);
  212.              Team::setObjective(%l, %lineNum++,"<Bskull_small.bmp>" @ Client::getName(%clientList[%index]) @ " <L31>" @ (%clientList[%index]).scoreKills @ "<L53>" @ (%clientList[%index]).scoreDeaths @ "<L72>" @ (%clientList[%index]).ratio @ ".0%");
  213.             %lastRatio = (%clientList[%index]).ratio;
  214.             %index++;
  215.         }  
  216.         for(%s = %lineNum+1; %s < 30 ;%s++)
  217.             Team::setObjective(%l, %s, " ");
  218.     }
  219.     $timeReached="";
  220. }
  221.  
  222. //-----------------------------------------------------------------
  223. //
  224. //Team Deathmatch Function definitions
  225. // 
  226. //-----------------------------------------------------------------
  227. function DMTEAM::echoScores()
  228. {   
  229.      %score = getTeamName(0) @ ": " @ $teamScore[0];
  230.      
  231.      for(%i = 1; %i < $numTeams; %i = %i + 1)
  232.         %score = %score @ ", " @ getTeamName(%i) @ ": " @ $teamScore[%i];
  233.      
  234.      MessageAll(0, %score);
  235.      schedule("DMTEAM::echoScores();", 40);
  236. }
  237.  
  238. function DMTEAM::checkMissionObjectives()
  239. {
  240.    for(%p = 0; %p < $numTeams; %p = %p + 1) 
  241.    {
  242.       if(DMTEAM::teamMissionObjectives(%p))
  243.          schedule("Server::nextMission();", 0);
  244.    }
  245. }
  246.  
  247. function DMTEAM::teamMissionObjectives(%teamId)
  248. {
  249.    %numHighs = 0;
  250.    %teamName = getTeamName(%teamId);
  251.    %teamScore = $teamScore[%teamId];
  252.    %highScore = 0;
  253.   
  254.    for(%t = 0; %t < $numTeams; %t = %t + 1)
  255.    {
  256.        if(%teamScore > $teamScore[%t]) 
  257.        {
  258.           %highScore = %teamScore;
  259.           %numHighs = %numHighs + 1;
  260.        }
  261.        else if($teamScore[%t] > %highScore)
  262.        {
  263.           %highScore = $teamScore[%t];
  264.           %numHighs = %numHighs + 1;
  265.        }
  266.    }
  267.  
  268.    if(%highScore == $ScoreLimit)
  269.    {
  270.        for(%r = 0; %r < $numTeams; %r = %r + 1)
  271.        {
  272.           if(%teamScore == %highScore)
  273.              Team::setObjective(%teamId, 2, "~f0Your team is victorious!");
  274.           else if((%teamScore == %highScore) && (%numHighs > 1)) 
  275.              Team::setObjective(%teamId, 2, "~f0Your team ended up tied for the lead!");
  276.           else
  277.              Team::setObjective(%teamId, 2, "~f0Your team lost!"); 
  278.        }
  279.  
  280.        Team::setObjective(%teamId, 3, "\n");
  281.        //print out all team scores
  282.        %lnum = 4;
  283.        for(%q = 0; %q < $numTeams; %q = %q + 1) 
  284.        {
  285.              Team::setObjective(%teamId, %lnum, getTeamName(%q) @ ": " @ $teamScore[%q]);
  286.           %lnum = %lnum + 1;
  287.        }
  288.        return "True"; //change mission
  289.    }
  290.   
  291.    Team::setObjective(%teamId, 3, "\n");
  292.    Team::setObjective(%teamId, 4, "Mission Status:");                                                         
  293.    
  294.    
  295.    if((%teamScore == %highScore) && (%highScore == 0))
  296.       Team::setObjective(%teamId, 5, "~f0All teams tied at 0.");
  297.    else if((%teamScore == %highScore) && (%numHighs > 1)) 
  298.       Team::setObjective(%teamId, 5, "~f0Your team is Tied for the lead!");
  299.    else    if((%teamScore == %highScore) && (%numHighs == 1))
  300.       Team::setObjective(%teamId, 5, "~f0Your team is winning.");
  301.    else
  302.       Team::setObjective(%teamId, 5, "~f0Your team is losing.");
  303.    
  304.    
  305.    Team::setObjective(%teamId, 6, "\n");
  306.    Team::setObjective(%teamId, 7, "You must:");
  307.    Team::setObjective(%teamId, 8, "-Kill all players on all other teams.");
  308.    Team::setObjective(%teamId, 9, "-Stay alive!");
  309.    Team::setObjective(%teamId, 10, "\n");
  310.    Team::setObjective(%teamId, 11, "Remember to stay within the mission area, which is defined by the extents of your commander screen map."    @
  311.                                   " If you go outside of the mission area you will have 10 seconds to get back into the mission area, or you will be killed!");
  312.                                    
  313.    Team::setObjective(%teamId, 12, "\n");
  314.        //print out team scores
  315.        %lnum = 14;
  316.        Team::setObjective(%teamId, 13, "Team Scores");
  317.        for(%g = 0; %g < $numTeams; %g = %g + 1) 
  318.        {
  319.              Team::setObjective(%teamId, %lnum, getTeamName(%g) @ ": " @ $teamScore[%g]);
  320.           %lnum = %lnum + 1;
  321.        }
  322.  
  323.    return "False";
  324. }                                                
  325. function getEfficiencyRatio(%clientId)
  326. {
  327.     if((%clientId.scoreKills + %clientId.scoreDeaths) > 4) {
  328.         %ratio = floor((%clientId.scoreKills/(%clientId.scoreKills + %clientId.scoreDeaths))*100);        
  329.         return %ratio;
  330.     }
  331.     return "0";
  332. }
  333.  
  334. function Game::refreshClientScore(%clientId)
  335. {
  336.     %clientId.ratio = getEfficiencyRatio(%clientId);
  337.    if($teamplay)
  338.       Client::setScore(%clientId, "%n\t%t\t" @ %clientId.score  @ "\t%p\t%l", %clientId.score);
  339.    else
  340.       Client::setScore(%clientId, "%n\t " @ %clientId.scoreKills @ "\t  " @ %clientId.scoreDeaths @ "\t  " @ %clientId.ratio @ ".0%\t%p\t %l", %clientId.ratio);
  341.     DM::missionObjectives();
  342. }
  343.  
  344.  
  345. function Mission::init()
  346. {
  347.    setClientScoreHeading("Player Name\t\x78Team\t\xC8Score");
  348.  
  349.    $numTeams = getNumTeams();
  350.    for(%i = 0; %i < $numTeams; %i++)
  351.       $teamScore[%i] = 0;
  352.  
  353.    if($teamplay = !($numTeams == 1))
  354.    {
  355.       setTeamScoreHeading("Team Name\t\xC8Score");
  356.       setClientScoreHeading("Player Name\t\x78Team\t\xC8Score");
  357.    }
  358.    else
  359.    {
  360.       $SensorNetworkEnabled = false;
  361.       setTeamScoreHeading("");
  362.       setClientScoreHeading("Player Name\t\x55Kills\t\x75Deaths\t\xA5Efficiency\t\xE3Ping\t\xFFPL");
  363.    }
  364.    $dieSeqCount = 0;
  365.     DM::missionObjectives();
  366. }
  367.