Guest User

Roll the dice

a guest
Sep 23rd, 2012
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.00 KB | None | 0 0
  1. #RequireContext CSmMode
  2.  
  3. #Include "MathLib" as MathLib
  4. #Include "TextLib" as TextLib
  5. #Include "Libs/Nadeo/Mode.Script.txt" as Mode
  6. #Include "Libs/Nadeo/ShootMania/SM.Script.txt" as SM
  7. #Include "Libs/Nadeo/ShootMania/Score.Script.txt" as Score
  8.  
  9. #Const  CompatibleMapTypes  "MeleeArena"
  10. #Const  Version             "2012-09-23"
  11.  
  12. /* -------------------------------------- */
  13. // Settings
  14. /* -------------------------------------- */
  15. #Setting S_TimeLimit    600 as _("Time limit")  ///< Time limit on a map
  16. #Setting S_PointLimit   25  as _("Point limit") ///< Point limit on a map
  17.  
  18. #Const  C_UITickInterval    200 ///< Time interval between UI update
  19. #Const  RollCount           10
  20.  
  21. /* -------------------------------------- */
  22. // Globales variables
  23. /* -------------------------------------- */
  24. declare Ident[] G_SpawnsList;       ///< Id of all the BlockSpawns of the map
  25. declare Ident   G_LatestSpawnId;    ///< Id of the last BlockSpawn used
  26.  
  27. /* -------------------------------------- */
  28. // Functions
  29. /* -------------------------------------- */
  30.  
  31. /* -------------------------------------- */
  32. /// Fill the SpawnsList with all the BlockSpanws of the map
  33. Void FillSpawnsList() {
  34.     foreach (BlockSpawn in BlockSpawns) { G_SpawnsList.add(BlockSpawn.Id); }
  35. }
  36.  
  37. /* ------------------------------------- */
  38. /** Update the infos UI of a player
  39.  *
  40.  * @param   _Player     The player to update
  41.  *
  42.  * @return      The ManiaLink string
  43.  */
  44. Text UpdateLayerInfos(CSmPlayer _Player) {
  45.     if (_Player.Score == Null) return "";
  46.    
  47.     return """
  48.         <frame posn="150 -88">
  49.             <label posn="0 1" halign="left" valign="bottom" text="/{{{ Scores.count }}}"/>
  50.             <label posn="0 0" halign="right" valign="bottom" style="TextRaceChrono" text="{{{ Scores.keyof(_Player.Score) + 1 }}}"/>
  51.         </frame>
  52.     """;
  53. }
  54.  
  55. Integer RealRandom (Integer Min, Integer Max)
  56. {
  57.     declare Rand = MathLib::Rand(Min, Max);
  58.    
  59.     foreach(Player in Players)
  60.     {
  61.         Rand += MathLib::NearestInteger(Player.Position.X * Player.Position.Y * Player.Position.Z);
  62.     }
  63.     return Min + (Rand % (Max - Min + 1));
  64. }
  65.  
  66. Void SetRoll(CSmPlayer _Player, Integer _Roll)
  67. {
  68.     declare netwrite Text RollName for UIManager.GetUI(_Player);
  69.     declare netwrite Text RollDesc for UIManager.GetUI(_Player);
  70.    
  71.     declare StealRatio for _Player = 0.;
  72.    
  73.     SetPlayerWeapon(_Player, CSmMode::EWeapon::Rocket, True);
  74.     _Player.AmmoGain = 1.;
  75.     _Player.ArmorMax = 200;
  76.     _Player.Armor = 100;
  77.     _Player.StaminaGain = 1.;
  78.     _Player.StaminaMax = 1.;
  79.    
  80.     StealRatio = 0.;
  81.     switch(_Roll)
  82.     {
  83.         case 1:{
  84.         SetPlayerWeapon(_Player, CSmMode::EWeapon::Laser, False);
  85.         _Player.AmmoGain = 2.;
  86.         RollName = "$0f0Instagib";
  87.         RollDesc = "One shot, one kill";
  88.         break;}
  89.         case 2:{
  90.         SetPlayerWeapon(_Player, CSmMode::EWeapon::Nucleus, False);
  91.         _Player.AmmoGain = 2.;
  92.         RollName = "$ff0Nucleus Only";
  93.         RollDesc = "Only Nucleus ^^";
  94.         break;}
  95.         case 3:{
  96.         _Player.StaminaMax = 0.1;
  97.         RollName = "$f00Low Stamina";
  98.         RollDesc = "Can't run";
  99.         break;}
  100.         case 4:{
  101.         _Player.ArmorMax = 500;
  102.         _Player.Armor = 500;
  103.         RollName = "$0f0Tank";
  104.         RollDesc = "More armor";
  105.         break;}
  106.         case 5:{
  107.         _Player.ArmorMax = 100;
  108.         RollName = "$f00Glass Canon";
  109.         RollDesc = "Less armor";
  110.         break;}
  111.         case 6:{
  112.         _Player.ArmorGain = 50;
  113.         RollName = "$0f0Regen";
  114.         RollDesc = "You regenerate your health";
  115.         break;}
  116.         case 7:{
  117.         _Player.AmmoGain = 5.;
  118.         _Player.AmmoPower = 0.7;
  119.         RollName = "$ff0Fast shooter";
  120.         RollDesc = "Faster reloading, less damage";
  121.         break;}
  122.         case 8:{
  123.         RollName = "$ff0Vanilla";
  124.         RollDesc = "Nothing";
  125.         break;}
  126.         case 9:{
  127.         StealRatio = 1.;
  128.         RollName = "$0f0Vampire";
  129.         RollDesc = "Steal armor from enemies";
  130.         break;}
  131.         case 10:{
  132.         StealRatio = -1.;
  133.         _Player.ArmorMax = 500;
  134.         _Player.Armor = 500;
  135.         RollName = "$f00Reflection";
  136.         RollDesc = "You get the damage you do";
  137.         break;}
  138.     }
  139.    
  140.    
  141. }
  142.  
  143. Void Roll(CSmPlayer _Player)
  144. {
  145.     SetRoll(_Player, RealRandom(1, RollCount));
  146. }
  147.  
  148.  
  149. /* ------------------------------------- */
  150. /** Spawn a player
  151.  *
  152.  * @param   _Player     The player to spawn
  153.  */
  154. Void SpawnPlayers(CSmPlayer _Player) {
  155.     if (G_SpawnsList.count == 0) FillSpawnsList();
  156.     declare SpawnId = NullId;
  157.     while (True) {
  158.         SpawnId = G_SpawnsList[MathLib::Rand(0, G_SpawnsList.count - 1)];
  159.         if (SpawnId != G_LatestSpawnId) break;
  160.         if (G_SpawnsList.count == 1) break;
  161.     }
  162.     Roll(_Player);
  163.     SM::SpawnPlayer(_Player, 0, BlockSpawns[SpawnId]);
  164.     G_LatestSpawnId = SpawnId;
  165.     declare Tmp = G_SpawnsList.remove(SpawnId);
  166. }
  167.  
  168. /* ------------------------------------- */
  169. /** Get the help manialink string.
  170.  *
  171.  * @return      The manialink string
  172.  */
  173. Text UpdateLayerSpawnScreen() {
  174.     declare Text ML;
  175.    
  176.     declare RulesText = _("Free for all\n\n- Hit an opponent to score a point.\n- The player with the most points wins.");
  177.     declare RulesTip  = _("Press F1 to show rules");
  178.    
  179.     ML = """
  180.         <script><!--
  181.             main () {
  182.                 declare FrameRules  <=> Page.GetFirstChild("FrameRules");
  183.                 declare FrameShow   <=> Page.GetFirstChild("FrameShow");
  184.                 declare ShowRules = False;
  185.                
  186.                 while(True) {
  187.                     if (ShowRules) {
  188.                         FrameRules.Show();
  189.                         FrameShow.Hide();
  190.                     } else {
  191.                         FrameRules.Hide();
  192.                         FrameShow.Show();
  193.                     }
  194.                    
  195.                     yield;
  196.                    
  197.                     // process events.
  198.                     foreach (Event in PendingEvents) {
  199.                         switch (Event.Type) {
  200.                             case CMlEvent::Type::MouseClick :
  201.                             {
  202.                                 if (Event.ControlId == "FrameRules") ShowRules = !ShowRules;
  203.                             }
  204.                            
  205.                             case CMlEvent::Type::KeyPress:
  206.                             {
  207.                                 if (Event.CharPressed == "2424832") ShowRules = !ShowRules; // F1
  208.                             }
  209.                         }
  210.                     }
  211.                 }
  212.             }
  213.         --></script>
  214.         <frame posn="0 -70 0" id="FrameShow">
  215.             <quad posn="0 0 10" sizen="140 20" halign="center" valign="center" style="Bgs1InRace" substyle="BgTitle3_5" />
  216.             <label posn="0 0 11" scale="2" halign="center" valign="center" style="TextTitle3" text="{{{ RulesTip }}}" />
  217.         </frame>
  218.         <frame posn="0 50 1" id="FrameRules">
  219.             <frame posn="0 0 5">
  220.                 <quad posn="0 0 10" sizen="120 20" halign="center" valign="center" style="Bgs1InRace" substyle="BgTitle3_5" />
  221.                 <label posn="0 0 11" scale="2" halign="center" valign="center" style="TextTitle3" text="$fffMelee" />
  222.             </frame>
  223.             <frame posn="0 -10 5">
  224.                 <quad posn="0 0 10" sizen="300 120" halign="center" bgcolor="222c" />
  225.                 <label posn="-145 -5 11" sizen="145 5" scale="2" autonewline="1" style="TextCardSmallScores2" text="{{{ RulesText }}}" />
  226.             </frame>
  227.         </frame>
  228.     """;
  229.    
  230.     return ML;
  231. }
  232.  
  233. /* ------------------------------------- */
  234. // Main
  235. /* ------------------------------------- */
  236. main() {
  237.     UseClans = False;
  238.    
  239.     declare LayerSpawnScreen <=> UIManager.UILayerCreate();
  240.     declare LayerScoresTable <=> UIManager.UILayerCreate();
  241.     LayerSpawnScreen.Type = CUILayer::EUILayerType::ScreenIn3d;
  242.     LayerScoresTable.Type = CUILayer::EUILayerType::ScoresTable;
  243.    
  244.     while (!ServerShutdownRequested) {
  245. /* ------------------------------------- */
  246. // Map/Round begin
  247. /* ------------------------------------- */
  248.         Mode::LoadMap();
  249.        
  250.         G_SpawnsList.clear();
  251.         G_LatestSpawnId = NullId;
  252.         Score::MatchBegin();
  253.         Score::RoundBegin();
  254.        
  255.         MatchEndRequested = False;
  256.        
  257.         UIManager.ResetAll();
  258.         SM::SetupDefaultVisibility();
  259.         LayerSpawnScreen.ManialinkPage = UpdateLayerSpawnScreen();
  260.         UIManager.UIAll.UILayers.add(LayerSpawnScreen);
  261.        
  262.         LayerScoresTable.ManialinkPage = """
  263.             <frame posn="0 -47">
  264.                 <quad posn="0 0 1" sizen="40 8" style="Bgs1InRace" halign="center" substyle="BgList"/>
  265.                 <label posn="0 -2 2" sizen="40 8" halign="center" text="{{{_("Point limit")}}}: {{{ S_PointLimit }}}" />
  266.             </frame>
  267.         """;
  268.         UIManager.UIAll.UILayers.add(LayerScoresTable);
  269.        
  270.         UIManager.UIAll.UISequence = CUIConfig::EUISequence::Intro;
  271.         UIManager.UIAll.BigMessageSound = CUIConfig::EUISound::StartRound;
  272.         UIManager.UIAll.BigMessageSoundVariant = 0;
  273.         UIManager.UIAll.BigMessage = _("New match");
  274.         wait(UIManager.UIAll.UISequenceIsCompleted);
  275.         UIManager.UIAll.BigMessage = "";
  276.        
  277.         UIManager.UIAll.UISequence = CUIConfig::EUISequence::Playing;
  278.         declare LastUITick = 0;
  279.         StartTime = Now;
  280.         EndTime = StartTime + (S_TimeLimit * 1000);
  281.         while (!MatchEndRequested && !ServerShutdownRequested) {
  282. /* ------------------------------------- */
  283. // Play loop
  284. /* ------------------------------------- */
  285.             yield;
  286.            
  287.             foreach (Event, PendingEvents) {
  288.                 log(Event);
  289.                 if (Event.Type == CSmModeEvent::EType::OnArmorEmpty) {
  290.                     log(Event);
  291.                     if (Event.Shooter == Event.Victim || Event.Shooter == Null) {
  292.                         Score::RemovePoints(Event.Victim, 1);
  293.                     }
  294.                     PassOn(Event);
  295.                 } else if (Event.Type == CSmModeEvent::EType::OnHit) {
  296.                     if (Event.Shooter == Event.Victim) {
  297.                         Discard(Event);
  298.                     } else {
  299.                         declare Points = Event.Damage / 100;
  300.                         Score::AddPoints(Event.Shooter, Points);
  301.                         Event.ShooterPoints = Points;
  302.                         // Play sound and notice if someone is close to win
  303.                         if (Event.Shooter != Null && Event.Shooter.Score != Null) {
  304.                             declare Gap = S_PointLimit - Event.Shooter.Score.RoundPoints;
  305.                             if (Gap <= 3 && Gap > 0) {
  306.                                 declare Variant = 3 - Gap;
  307.                                 declare Msg = "";
  308.                                 if (Gap > 1)
  309.                                     Msg = TextLib::Compose(_("$<%1$> is %2 points from victory!"), Event.Shooter.Name, TextLib::ToText(Gap));
  310.                                 else
  311.                                     Msg = TextLib::Compose(_("$<%1$> is 1 point from victory!"), Event.Shooter.Name);
  312.                                 UIManager.UIAll.SendNotice(
  313.                                     Msg,
  314.                                     CUIConfig::ENoticeLevel::PlayerInfo,
  315.                                     Null, CUIConfig::EAvatarVariant::Default,
  316.                                     CUIConfig::EUISound::TieBreakPoint, Variant
  317.                                 );
  318.                             } else if (Gap <= 0) {
  319.                                 UIManager.UIAll.SendNotice(
  320.                                     TextLib::Compose(_("$<%1$> gets the final hit!"), Event.Shooter.Name),
  321.                                     CUIConfig::ENoticeLevel::PlayerInfo,
  322.                                     Null, CUIConfig::EAvatarVariant::Default,
  323.                                     CUIConfig::EUISound::VictoryPoint, 0
  324.                                 );
  325.                                
  326.                             }
  327.                         }
  328.                         PassOn(Event);
  329.                     }
  330.                 } else if (Event.Type == CSmModeEvent::EType::OnPlayerRequestRespawn) {
  331.                     Score::RemovePoints(Event.Player, 1);
  332.                     PassOn(Event);
  333.                 } else {
  334.                     PassOn(Event);
  335.                 }
  336.             }      
  337.                
  338.             foreach (Player in Players) {
  339.                 // Spawn
  340.                 if (Player.SpawnStatus == CSmPlayer::ESpawnStatus::NotSpawned && !Player.RequestsSpectate) {
  341.                     SpawnPlayers(Player);
  342.                 }
  343.             }
  344.            
  345.             /* -------------------------------------- */
  346.             // Update UI
  347.             if (LastUITick + C_UITickInterval < Now) {
  348.                 declare UsedLayers = Ident[];
  349.                
  350.                 // Add layer and create it if necessary
  351.                 foreach (Player in Players) {
  352.                     declare UI <=> UIManager.GetUI(Player);
  353.                     if (UI == Null) continue;
  354.                    
  355.                     declare CUILayer LayerInfos;
  356.                     if (UI.UILayers.count != 1) {
  357.                         LayerInfos <=> UIManager.UILayerCreate();
  358.                         UI.UILayers.add(LayerInfos);
  359.                     } else {
  360.                         LayerInfos <=> UI.UILayers[0];
  361.                     }
  362.                     UsedLayers.add(LayerInfos.Id);
  363.                     LayerInfos.ManialinkPage = UpdateLayerInfos(Player);
  364.                 }
  365.                 // Remove layers
  366.                 declare LayersToRemove = Ident[];
  367.                 foreach (Layer in UIManager.UIAll.UILayers) { UsedLayers.add(Layer.Id); }
  368.                 foreach (Layer in UIManager.UILayers) {
  369.                     if (!UsedLayers.exists(Layer.Id)) {
  370.                         LayersToRemove.add(Layer.Id);
  371.                     }
  372.                 }
  373.                 foreach (LayerId in LayersToRemove) {
  374.                     UIManager.UILayerDestroy(UIManager.UILayers[LayerId]);
  375.                 }
  376.                
  377.                 LastUITick = Now;
  378.             }
  379.            
  380.             /* -------------------------------------- */
  381.             // victory conditions
  382.             declare IsMatchOver = False;
  383.             if (Now > StartTime + (S_TimeLimit * 1000))
  384.                 IsMatchOver = True;
  385.             foreach (Player in Players) {
  386.                 if (Player.Score != Null && Player.Score.RoundPoints >= S_PointLimit) IsMatchOver = True;
  387.             }
  388.            
  389.             if (IsMatchOver) break;
  390.         }
  391.        
  392. /* ------------------------------------- */
  393. // Map/Round end
  394. /* ------------------------------------- */
  395.         Score::RoundEnd();
  396.         Score::MatchEnd(True);
  397.        
  398.         /* -------------------------------------- */
  399.         // End match sequence
  400.         declare CUser Winner <=> Null;
  401.         declare MaxPoints = 0;
  402.         foreach (Score in Scores) {
  403.             if (Score.Points > MaxPoints) {
  404.                 MaxPoints = Score.Points;
  405.                 Winner <=> Score.User;
  406.             } else if (Score.Points == MaxPoints) {
  407.                 Winner <=> Null;
  408.             }
  409.         }
  410.         foreach (Player in Players) {
  411.             if (Player.User != Winner) UnspawnPlayer(Player);
  412.         }
  413.        
  414.         UIManager.UIAll.BigMessageSound = CUIConfig::EUISound::EndRound;
  415.         UIManager.UIAll.BigMessageSoundVariant = 0;
  416.         if (Winner != Null) {
  417.             UIManager.UIAll.BigMessage = TextLib::Compose(_("$<%1$> wins the match!"), Winner.Name);
  418.         } else {
  419.             UIManager.UIAll.BigMessage = _("|Match|Draw");
  420.         }
  421.         sleep(2000);
  422.         UIManager.UIAll.UISequence = CUIConfig::EUISequence::EndRound;
  423.         UIManager.UIAll.ScoreTableVisibility = CUIConfig::EVisibility::ForcedVisible;
  424.         sleep(5000);
  425.        
  426.         UIManager.UIAll.UISequence = CUIConfig::EUISequence::Podium;
  427.         wait(UIManager.UIAll.UISequenceIsCompleted);
  428.        
  429.         UIManager.UIAll.ScoreTableVisibility = CUIConfig::EVisibility::Normal;
  430.         UIManager.UIAll.BigMessage = "";
  431.        
  432.         Mode::UnloadMap();
  433.     }
  434.    
  435.     UIManager.UILayerDestroy(LayerSpawnScreen);
  436.     UIManager.UILayerDestroy(LayerScoresTable);
  437. }
Advertisement
Add Comment
Please, Sign In to add comment