RegularEngine/RegularGame
RegularGame is the chief Gametype class.
The RestartPlayer function handles spawning the player or bot into the appropriate class. Much of the rest is merely handling campaign voting. Essentialy the campaign is ignored until the end of the game, when a MapTrader (for winners) or MapViewer (for losers) is presented and votes are tabulated by the RegularRules class.
class RegularGame extends xTeamGame config(RegularEngineData); var() class<Controller> BotControllerClass; var bool bGameVoted,bMapVoting; var RegularRules RegularRules; var PlayerReplicationInfo FinalWinner; var string FinalReason; var config bool bCampaignGame; function PostBeginPlay() { Super.PostBeginPlay(); RegularRules = spawn(class'RegularRules'); if (Level.Game.GameRulesModifiers == None) { Level.Game.GameRulesModifiers = RegularRules; }else{ Level.Game.GameRulesModifiers.AddGameRules(RegularRules); } } function Bot SpawnBot(optional string botName) { local Bot NewBot; local RosterEntry Chosen; local UnrealTeamInfo BotTeam; BotTeam = GetBotTeam(); Chosen = BotTeam.ChooseBotClass(botName); if (Chosen.PawnClass == None) Chosen.Init(); //amb //log("Chose pawn class "$Chosen.PawnClass); NewBot = Bot(Spawn(BotControllerClass)); if ( NewBot != None ) InitializeBot(NewBot,BotTeam,Chosen); return NewBot; } function RestartPlayer(Controller aPlayer) { if(RegularPlayer(aPlayer) != none) { if(RegularPRI(aPlayer.PlayerReplicationInfo) != none && RegularPRI(aPlayer.PlayerReplicationInfo).PlayerClassName ~= "" || !RegularPRI(aPlayer.PlayerReplicationInfo).ValidPlayerClassChoice() ) { RegularPlayer(aPlayer).OpenClassTrader(); return; } } if(RegularBot(aPlayer) != none) { RegularBot(aPlayer).ChoosePlayerClass(); } super.RestartPlayer(aPlayer); // Log("Spawned a "$aPlayer.Pawn$" for "$aPlayer); } function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason) { if(!bCampaignGame) { return super.CheckEndGame(Winner,Reason); } // no campaign? end as normal if(bGameVoted) {return true;} super.CheckEndGame(Winner,Reason); //get a winner //allow voting RegularGRI(GameReplicationInfo).RewardMap(Winner.Team.TeamIndex,GetURLMap()); PromptMapVote(TeamInfo(GameReplicationInfo.Winner)); FinalWinner = Winner; FinalReason = Reason; GotoState('WaitingForVote'); return false; } function string CheckEndCampaign() { // if( RegularGRI(GameReplicationInfo).CampaignWon() ) { RegularGRI(GameReplicationInfo).ResetCampaign(); // } if (FinalWinner.Team.TeamIndex == 0) { return RegularGRI(GameReplicationInfo).TeamAMaps[0].MapName; } else {return RegularGRI(GameReplicationInfo).TeamBMaps[0].MapName; } } function PromptMapVote(TeamInfo Winner) { local Controller P; local RegularPlayer RgPlayer; if(Winner == None) {Log("What the hell??"); return;} if(bMapVoting) {return;} for ( P=Level.ControllerList; P!=None; P=P.nextController ) { RgPlayer = RegularPlayer(P); if ( RgPlayer != None && RegularPRI(P.PlayerReplicationInfo).ChosenMap == "" ) { if(RgPlayer.PlayerReplicationInfo.Team == Winner) { RgPlayer.OpenMapTrader(); } else { RgPlayer.OpenMapViewer(); } } } bMapVoting = true; } state WaitingForVote extends MatchInProgress { function BeginState() { SetTimer(10.0,false); // Log("In WaitingForVote"); } function Timer() { local Controller P; local RegularPlayer RgPlayer; // Log("Hit WaitingForVote Timer"); bGameVoted = true; if(FinalWinner == None) {Log("What the hell?!!?"); return;} for ( P=Level.ControllerList; P!=None; P=P.nextController ) { RgPlayer = RegularPlayer(P); if ( RgPlayer != None && RgPlayer.PlayerReplicationInfo.Team == FinalWinner.Team ) { RegularRules.CastVote(RegularPRI(RgPlayer.PlayerReplicationInfo).ChosenMap); // LOG("Cast vote for "$RegularPRI(RgPlayer.PlayerReplicationInfo).ChosenMap); } } RegularRules.HandleRestartGame(); } } /* Restart the game. */ function RestartGame() { local string NextMap; local MapList MyList; //campaign check if(bCampaignGame) {return;} // allow voting handler to stop travel to next map if ( VotingHandler != None && !VotingHandler.HandleRestartGame() ) return; // these server travels should all be relative to the current URL if ( bChangeLevels && !bAlreadyChanged && (MapListType != "") ) { // open a the nextmap actor for this game type and get the next map bAlreadyChanged = true; MyList = GetMapList(MapListType); if (MyList != None) { NextMap = MyList.GetNextMap(); MyList.Destroy(); } if ( NextMap == "" ) NextMap = GetMapName(MapPrefix, NextMap,1); if ( NextMap != "" ) { Level.ServerTravel(NextMap, false); return; } } Level.ServerTravel( "?Restart", false ); } defaultproperties { GameName="RegularEngine Example" PlayerControllerClassName="RegularEngine.RegularPlayer" BotControllerClass=class'RegularBot' DefaultPlayerClassName="RegularEngine.RegularPawn" GameReplicationInfoClass=class'RegularGRI' ScoreboardType="RegularEngine.RegularScoreboard" HUDType="RegularEngine.RegularHUD" bCampaignGame=true Description="Example game on the RgEngine with optional campaign mode." }