From Gustavo6046, 2 Months ago, written in UnrealScript.
Embed
  1. /*
  2.  * If I can't do it in ZDoom,
  3.  * let's do it in UT99 :D
  4.  */
  5. class MushMatch expands TeamGamePlus;
  6.  
  7.  
  8. var bool bSelected, bHumanVictory, bStarted;
  9.  
  10. simulated function BeginPlay()
  11. {
  12.         local navigationPoint np;
  13.  
  14.         Super.BeginPlay();
  15.        
  16.         foreach AllActors(class'navigationPoint', np)
  17.                 if ( FRand() < 1.0 / 40 ) Spawn(class'SporeCanister',,, np.location);
  18. }
  19.  
  20. simulated function ScoreKill(Pawn Killer, Pawn Other)
  21. {
  22.         local bool h, m;
  23.         local Pawn p;
  24.  
  25.     if ( !Killer.bIsPlayer || !Other.bIsPlayer || Killer.PlayerReplicationInfo == none || Other.PlayerReplicationInfo == none )
  26.                 Super.ScoreKill(Killer, Other);
  27.                
  28.         if ( Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team )
  29.                 Super(DeathmatchPlus).ScoreKill(Killer, Other);
  30.                
  31.         Killer.PlayerReplicationInfo.Score -= 1;
  32.  
  33.         if ( !bSelected || bGameEnded )
  34.                 return;
  35.                
  36.         for ( p = Level.PawnList; p != none; p = p.nextPawn )
  37.                 if ( p.bIsPlayer && p.PlayerReplicationInfo != none )
  38.                 {
  39.                         if ( p.PlayerReplicationInfo.Team == 0 )
  40.                                 h = true;
  41.                
  42.                         if ( p.PlayerReplicationInfo.Team == 1 )
  43.                                 m = true;
  44.                 }
  45.                
  46.         if ( h == false || m == false )
  47.         {
  48.                 bHumanVictory = h;
  49.                
  50.                 if ( h )
  51.                         EndGame("Humans won the match!");
  52.                
  53.                 else
  54.                         EndGame("The mush won the match!");
  55.         }
  56. }
  57.  
  58. simulated function byte AssessBotAttitude(Bot aBot, Pawn Other)
  59. {
  60.         if ( aBot.PlayerReplicationInfo.Team == 0 )
  61.         {
  62.                 if ( Other.FindInventoryType(class'GusPackII.SpottedMush') == none )
  63.                         return 1;
  64.                
  65.                 return Super.AssessBotAttitude(aBot, Other);
  66.         }
  67.        
  68.         if ( aBot.PlayerReplicationInfo.Team == 1 )
  69.         {
  70.                 if ( Other.PlayerReplicationInfo.Team == 0 )
  71.                         return 1;
  72.                        
  73.                 return Super.AssessBotAttitude(aBot, Other);
  74.         }
  75. }
  76.  
  77. simulated function bool SpotMush(Pawn Other)
  78. {
  79.         if ( !Other.bIsPlayer || Other.PlayerReplicationInfo == none || Other.FindInventoryType(class'GusPackII.Spottedmush') != none )
  80.                 return false;
  81.  
  82.         Other.AddInventory(Spawn(class'GusPackII.Spottedmush'));
  83.        
  84.         Broadcastmessage(Other.PlayerReplicationInfo.Playername@"discovered mush!", true, 'CriticalEvent');
  85.        
  86.         return true;
  87. }
  88.  
  89. simulated function bool RestartPlayer(Pawn aPlayer)
  90. {
  91.         return false;
  92. }
  93.  
  94. simulated function modifyPlayer(PlayerPawn Other)
  95. {
  96.         Other.PlayerReplicationInfo.Team = 0;
  97. }
  98.  
  99. simulated function bool SetUpBot(Bot b)
  100. {
  101.         if ( b == none )
  102.         {
  103.                 Warn("ERROR: Added bot not found!");
  104.                
  105.                 return true;
  106.         }
  107.        
  108.         b.PlayerReplicationInfo.Team = 0;
  109.        
  110.         return true;
  111. }
  112.  
  113. simulated function bool AddBot()
  114. {
  115.         local Pawn p;
  116.         local Bot b;
  117.  
  118.         if ( !Super.AddBot() )
  119.                 return false;
  120.        
  121.         for ( p = Level.PawnList; p != none; p = p.nextPawn )
  122.                 if ( Bot(p) != none ) b = Bot(p);
  123.                
  124.         return SetUpBot(b);
  125. }
  126.  
  127. simulated function bool ForceAddBot()
  128. {
  129.         local Pawn p;
  130.         local Bot b;
  131.  
  132.         if ( !Super.ForceAddBot() )
  133.                 return false;
  134.        
  135.         for ( p = Level.PawnList; p != none; p = p.nextPawn )
  136.                 if ( Bot(p) != none ) b = Bot(p);
  137.                
  138.         return SetUpBot(b);
  139. }
  140.  
  141. simulated function InitGame(string Options, out string Error)
  142. {
  143.         Super.InitGame(Options, Error);
  144.         bStarted = true;
  145.        
  146.         GoToState('GameStarted');
  147. }
  148.  
  149. simulated function bool ChangeTeam(Pawn Other, int N)
  150. {
  151.         if ( !bSelected ) return Super.ChangeTeam(Other, n);
  152.        
  153.         return false;
  154. }
  155.  
  156. simulated function Killed(Pawn Killer, Pawn Other, name DamageType)
  157. {
  158.         Broadcastmessage(Other.PlayerReplicationInfo.Playername@"is out of the game!", true, 'CriticalEvent');
  159. }
  160.  
  161. auto state Idle {}
  162.  
  163. auto state Game
  164. {
  165.         function SelectTraitor()
  166.         {
  167.                 local Pawn p, c;
  168.                
  169.                 while ( p == none )
  170.                         for ( c = Level.PawnList; c != none; c = c.nextPawn )
  171.                                 if ( FRand() < 0.08 && p.bIsPlayer && b.PlayerReplicationInfo != none )
  172.                                         p = c;
  173.                                        
  174.                                 else if ( p.bIsPlayer && p.PlayerReplicationInfo != none )
  175.                                         p.PlayerReplicationInfo.Team = 0;
  176.                                        
  177.                 p.PlayerReplicationInfo.Team = 1;
  178.                 bSelected = true;
  179.                 Broadcastmessage("Selected mush!", true, 'CriticalEvent');
  180.         }
  181.        
  182. Begin:
  183.         Sleep(5.0);
  184.  
  185.         SelectTraitor();
  186. }
  187.  
  188. simulated function bool SuccessfulGame()
  189. {
  190.         local int i;
  191.  
  192.         return Bool(RatedPlayer.PlayerReplicationInfo.Team) != bHumanVictory;
  193. }
  194.  
  195. defaultproperties
  196. {
  197.     bNoMonsters=true
  198.     MapPrefix="DM"
  199.     bCoopWeaponMode=true
  200.     BeaconName="MUSH"
  201.     GameName="Mush Match"
  202.     MaxCommanders=2
  203.     StartUpMessage="Kill any suspiciously 'mush' players to win the match!"
  204.     MaxTeams=2
  205.     MaxAllowedTeams=2
  206.         HUDType=class'Botpack.ChallengeHUD'
  207. }
  208.