rott/kf_sources/XGame/Classes/UT2K4LadderInfo.uc
2026-07-14 20:27:09 +07:00

1015 lines
28 KiB
Ucode

//==============================================================================
// Single Player Ladder Info
//
// Written by Michiel Hendriks
// (c) 2003, 2004, Epic Games, Inc. All Rights Reserved
//==============================================================================
class UT2K4LadderInfo extends LadderInfo config;
var() editinline array<UT2K4MatchInfo> ASMatches;
/**
New constants for ladder ids
defined as vars for static outside access
*/
var int LID_DM, LID_TDM, LID_CTF, LID_BR, LID_DOM, LID_AS, LID_CHAMP;
/** custom ladders you can add to the game */
var config array< class<CustomLadderInfo> > AdditionalLadders;
/** challenge games */
var config array< class<ChallengeGame> > ChallengeGames;
// config breaks the array
/** for backward compatibility */
static function MatchInfo GetMatchInfo(int ladder, int rung)
{
return GetUT2K4MatchInfo(ladder, rung, 0, true);
}
/**
Retreives the match info and fills in the alternative map
path is used as a constant random to define the path, should be a very large number
if bSelect then path is the position in the AltLevels array to use
*/
static function UT2K4MatchInfo GetUT2K4MatchInfo(int ladder, int rung, optional int path, optional bool bSelect)
{
local array<MatchInfo> matcharray;
local UT2K4MatchInfo selmatch;
local string tmp;
local int i;
//log("GetUT2K4MatchInfo"@ladder@rung@path);
if (rung < 0)
{
Warn("rung < 0");
return none;
}
switch (ladder)
{
case default.LID_DM: matcharray = Default.DMMatches; break;
case default.LID_TDM: matcharray = Default.TDMMatches; break;
case default.LID_CTF: matcharray = Default.CTFMatches; break;
case default.LID_BR: matcharray = Default.BRMatches; break;
case default.LID_DOM: matcharray = Default.DOMMatches; break;
case default.LID_AS: matcharray = Default.ASMatches; break;
case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break;
default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10)))
{
matcharray = default.AdditionalLadders[ladder-10].default.Matches;
}
}
if ( matcharray.Length <= 0 )
{
Warn("matcharray.Length <= 0");
return none;
}
if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]);
else selmatch = UT2K4MatchInfo(matcharray[rung]);
if ((selmatch != none) && bSelect && (selmatch.AltLevels.length > 0))
{
tmp = selmatch.AltLevels[path % selmatch.AltLevels.length];
if (tmp != "") selmatch.LevelName = tmp;
}
else if ((selmatch != none) && (selmatch.AltLevels.length > 0)) // select one from the list
{
path = abs(path + ((rung+1) * (ladder+1)));
if (selmatch.Priority > 0) i = selmatch.Priority;
else i = selmatch.AltLevels.length;
tmp = selmatch.AltLevels[path % i];
if (tmp != "") selmatch.LevelName = tmp;
//Log("Set level name to:"@selmatch.LevelName);
}
if ( selmatch == none ) Warn("selmatch == none");
return selmatch;
}
/**
get the ID of the alternative level
match priority has no relevance here
*/
static function byte GetAltLevel(int ladder, int rung, int path, int selected)
{
local array<MatchInfo> matcharray;
local UT2K4MatchInfo selmatch;
local int origpath;
if (rung < 0) return -1;
switch (ladder)
{
case default.LID_DM: matcharray = Default.DMMatches; break;
case default.LID_TDM: matcharray = Default.TDMMatches; break;
case default.LID_CTF: matcharray = Default.CTFMatches; break;
case default.LID_BR: matcharray = Default.BRMatches; break;
case default.LID_DOM: matcharray = Default.DOMMatches; break;
case default.LID_AS: matcharray = Default.ASMatches; break;
case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break;
default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10)))
{
matcharray = default.AdditionalLadders[ladder-10].default.Matches;
}
}
if ( matcharray.Length <= 0 ) return -1;
if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]);
else selmatch = UT2K4MatchInfo(matcharray[rung]);
if ((selmatch != none) && (selmatch.AltLevels.length > 0))
{
origpath = abs(path + ((rung+1) * (ladder+1)));
if (selmatch.Priority > 0) origpath = origpath % selmatch.Priority;
else origpath = origpath % selmatch.AltLevels.length;
if (selected == origpath || selected == -1)
{
path = (abs(path + ((rung+1) * (ladder+1)))+1) % selmatch.AltLevels.length;
if (path == origpath) path = (path + 1) % selmatch.AltLevels.length;
//Log("GetAltLevel (path)"@path@origpath);
return path;
}
//Log("GetAltLevel (orig)"@origpath@selected);
return origpath;
}
return -1;
}
/** check if there is an alternative level */
static function bool HasAltLevel(int ladder, int rung)
{
local array<MatchInfo> matcharray;
local UT2K4MatchInfo selmatch;
if (rung < 0) return false;
switch (ladder)
{
case default.LID_DM: matcharray = Default.DMMatches; break;
case default.LID_TDM: matcharray = Default.TDMMatches; break;
case default.LID_CTF: matcharray = Default.CTFMatches; break;
case default.LID_BR: matcharray = Default.BRMatches; break;
case default.LID_DOM: matcharray = Default.DOMMatches; break;
case default.LID_AS: matcharray = Default.ASMatches; break;
case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break;
default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10)))
{
matcharray = default.AdditionalLadders[ladder-10].default.Matches;
}
}
if ( matcharray.Length <= 0 ) return false;
if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]);
else selmatch = UT2K4MatchInfo(matcharray[rung]);
if (selmatch == none) return false;
return (selmatch.AltLevels.length > 1);
}
static function MatchInfo GetCurrentMatchInfo(GameProfile G)
{
if (UT2K4GameProfile(G) != none ) return G.GetMatchInfo(G.CurrentLadder, G.CurrentMenuRung);
return GetUT2K4MatchInfo(G.CurrentLadder, G.CurrentMenuRung);
}
/**
Get the number of matches in a ladder
*/
static function int LengthOfLadder(int ladder)
{
switch (ladder)
{
case default.LID_DM: return Default.DMMatches.Length;
case default.LID_TDM: return Default.TDMMatches.Length;
case default.LID_CTF: return Default.CTFMatches.Length;
case default.LID_BR: return Default.BRMatches.Length;
case default.LID_DOM: return Default.DOMMatches.Length;
case default.LID_AS: return Default.ASMatches.Length;
case default.LID_CHAMP: return Default.ChampionshipMatches.Length;
default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10)))
{
return default.AdditionalLadders[ladder-10].default.Matches.Length;
}
return -1;
}
}
/**
Update the ladder
*/
static function string UpdateLadders(GameProfile G, int CurrentLadder)
{
local string SpecialEvent;
local UT2K4GameProfile GP;
local int i,j;
GP = UT2K4GameProfile(G);
if (GP == none)
{
Warn("PC Load Letter"); // wtf does that mean?
return "";
}
if (GP.bIsChallenge) return GP.ChallengeInfo.SpecialEvent;
if (CurrentLadder < 10)
{
if ( GP.LadderProgress[CurrentLadder] > G.CurrentMenuRung )
{
// they've chosen to play a match they've completed previously
return "";
}
}
// updates ladder rungs appropriately
switch( CurrentLadder )
{
case default.LID_DM:
SpecialEvent = Default.DMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_TDM:
SpecialEvent = Default.TDMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_CTF:
SpecialEvent = Default.CTFMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_BR:
SpecialEvent = Default.BRMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_DOM:
SpecialEvent = Default.DOMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_AS:
SpecialEvent = Default.ASMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
case default.LID_CHAMP:
SpecialEvent = Default.ChampionshipMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent;
break;
default: i = CurrentLadder-10;
if ((i >= 0) && (default.AdditionalLadders.length > i))
{
j = GP.GetCustomLadderProgress(string(default.AdditionalLadders[i]));
if ( j > G.CurrentMenuRung ) return "";
SpecialEvent = default.AdditionalLadders[i].default.Matches[j].SpecialEvent;
GP.SetCustomLadderProgress(string(default.AdditionalLadders[i]), 1);
return SpecialEvent;
}
return "";
}
GP.LadderProgress[CurrentLadder] += 1;
return SpecialEvent;
}
/**
Return the friendly name of the current match's gametype
*/
static function string GetMatchDescription (GameProfile G)
{
return GetLadderDescription(G.CurrentLadder, G.CurrentMenuRung);
}
static function string GetLadderDescription(int LadderId, optional int MatchId)
{
local string retval;
local CacheManager.GameRecord gr;
switch (LadderId)
{
case default.LID_DM:
retval = default.DMMatches[MatchId].GameType;
break;
case default.LID_TDM:
retval = default.TDMMatches[MatchId].GameType;
break;
case default.LID_CTF:
retval = default.CTFMatches[MatchId].GameType;
break;
case default.LID_BR:
retval = default.BRMatches[MatchId].GameType;
break;
case default.LID_DOM:
retval = default.DOMMatches[MatchId].GameType;
break;
case default.LID_AS:
retval = default.ASMatches[MatchId].GameType;
break;
case default.LID_CHAMP:
retval = default.ChampionshipMatches[MatchId].GameType;
break;
default: if ((LadderId >= 10) && (default.AdditionalLadders.length > (LadderId-10)))
{
retval = default.AdditionalLadders[LadderId-10].default.Matches[MatchId].GameType;
}
else return "";
}
gr = class'CacheManager'.static.GetGameRecord(retval);
return gr.GameName;
}
/** return the id of a random ladder */
static function int GetRandomLadder(optional bool bIncludeChamp)
{
// +1 because DM will never be returned
if (bIncludeChamp) return rand(default.LID_CHAMP)+1;
else return rand(default.LID_AS)+1;
}
/** create a URL for a selected profile */
static function string MakeURLFor(GameProfile G)
{
if ((UT2K4GameProfile(G) != none) && (UT2K4GameProfile(G).bIsChallenge))
return MakeURLFoMatchInfo(UT2K4GameProfile(G).ChallengeInfo, G);
return MakeURLFoMatchInfo(GetCurrentMatchInfo(G), G);
}
/** create a URL for the selected MatchInfo */
static function string MakeURLFoMatchInfo(MatchInfo M, GameProfile G)
{
local string URL;
if ( M == none ) {
Warn("MatchInfo == none");
return "";
}
G.EnemyTeam = M.EnemyTeamName;
G.Difficulty = G.BaseDifficulty + M.DifficultyModifier;
URL = M.LevelName$"?Name="$G.PlayerName$"?Character="$G.PlayerCharacter$"?SaveGame="$G.PackageName$M.URLString;
if ( M.GoalScore != 0 )
URL $= "?GoalScore="$M.GoalScore;
if ( M.NumBots > 0 )
URL $= "?NumBots="$M.NumBots;
if ( M.GameType != "" )
URL $= "?Game="$M.GameType;
URL $= "?Team=1?NoSaveDefPlayer?ResetDefPlayer";
// with ?NoSaveDefPlayer the DefaultPlayer properties won't be saved to the user.ini
// with ?ResetDefPlayer the DefaultPlayer properties will be restored from the saved settings
if (UT2K4MatchInfo(M) != none)
{
if (UT2K4MatchInfo(M).TimeLimit > 0)
{
URL $= "?TimeLimit="$string(UT2K4MatchInfo(M).TimeLimit);
}
}
return URL;
}
/** return a random or selected challenge game */
static function class<ChallengeGame> GetChallengeGame(optional string ClassName, optional UT2K4GameProfile GP)
{
local array< class<ChallengeGame> > chalgames;
local int i;
//log("GetChallengeGame"@ClassName);
if (ClassName == "")
{
chalgames = default.ChallengeGames;
while (chalgames.length > 0)
{
i = rand(chalgames.length);
if (chalgames[i].static.canChallenge(GP)) return chalgames[i];
chalgames.Remove(i, 1);
}
return none;
}
for (i = 0; i < default.ChallengeGames.length; i++)
{
if (string(default.ChallengeGames[i]) ~= ClassName)
{
if (default.ChallengeGames[i].static.canChallenge(GP)) return default.ChallengeGames[i];
return none;
}
}
return none;
}
defaultproperties
{
LID_DM=0
LID_TDM=1
LID_CTF=2
LID_BR=3
LID_DOM=4
LID_AS=5
LID_CHAMP=6
// Single Player Qualification
// Note: we always want ?TeamScreen=true in the url so our SP loading vignette will be used
Begin Object Class=UT2K4MatchInfo Name=DM0
LevelName="TUT-DM"
MenuName="Deathmatch Tutorial"
EnemyTeamName="xGame.UT2K4DMRoster"
SpecialEvent=""
DifficultyModifier=0.0
GoalScore=10
NumBots=0
GameType="xGame.xDeathmatch"
TimeLimit=15
URLString="?Quickstart=true?TeamScreen=true"
End Object
Begin Object Class=UT2K4MatchInfo Name=DM1
LevelName="DM-1on1-Idoma"
EnemyTeamName="xGame.UT2K4DMRoster"
SpecialEvent=""
DifficultyModifier=0.0
GoalScore=10
NumBots=1
GameType="xGame.xDeathmatch"
URLString="?WeaponStay=true?TeamScreen=true"
PrizeMoney=150
TimeLimit=10
EntryFee=50
End Object
Begin Object Class=UT2K4MatchInfo Name=DM2
LevelName=""
AltLevels(0)="DM-1on1-Spirit"
AltLevels(1)="DM-1on1-Trite"
EnemyTeamName="xGame.UT2K4DMRoster"
SpecialEvent=""
DifficultyModifier=0.2
GoalScore=10
NumBots=2
GameType="xGame.xDeathmatch"
URLString="?WeaponStay=true?TeamScreen=true"
PrizeMoney=250
TimeLimit=15
EntryFee=75
End Object
Begin Object Class=UT2K4MatchInfo Name=DM3
LevelName=""
AltLevels(0)="DM-1on1-Albatross"
AltLevels(1)="DM-1on1-Roughinery"
EnemyTeamName="xGame.UT2K4DMRoster"
SpecialEvent=""
DifficultyModifier=0.3
GoalScore=15
NumBots=2
GameType="xGame.xDeathmatch"
URLString="?WeaponStay=true?TeamScreen=true"
PrizeMoney=500
TimeLimit=15
EntryFee=100
End Object
Begin Object Class=UT2K4MatchInfo Name=DM4
LevelName="DM-1on1-Desolation"
EnemyTeamName="xGame.UT2K4DMRoster"
SpecialEvent="BALANCE 2000;DRAFT" // get 1500 bonus from the sponsor to form a team
DifficultyModifier=0.4
GoalScore=15
NumBots=4
URLString="?WeaponStay=true?TeamScreen=true"
GameType="xGame.xDeathmatch"
PrizeMoney=650
TimeLimit=15
EntryFee=200
End Object
Begin Object Class=UT2K4MatchInfo Name=DM5
LevelName="DM-1on1-Irondust"
EnemyTeamName="xGame.DMRosterBeatTeam"
Requirements="FULLTEAM"
SpecialEvent="OPEN TDM;QUALIFIED SINGLE"
DifficultyModifier=0.5
GoalScore=20
NumBots=5
URLString="?WeaponStay=true?TeamScreen=true"
GameType="xGame.xDeathmatch"
PrizeMoney=750
TimeLimit=15
EntryFee=250
End Object
DMMatches(0)=DM0
DMMatches(1)=DM1
DMMatches(2)=DM2
DMMatches(3)=DM3
DMMatches(4)=DM4
DMMatches(5)=DM5
/*
Special info about the EnemyTeamName usage below:
When the EnemyTeamName starts with a ';' it will apply special processing
;<enemy team class>;<special flag>
<enemy team class> has to be a subclass of xGame.UT2K4RosterGroup
<special flag> is parsed in UT2K4GameProfile
*/
// Team Qualification
Begin Object Class=UT2K4MatchInfo Name=TDM1
LevelName=""
AltLevels(0)="DM-Sulphur"
AltLevels(1)="DM-Curse4"
EnemyTeamName=";xGame.UT2K4TeamRosterEasy;least"
SpecialEvent=""
DifficultyModifier=0.5
GoalScore=30
NumBots=3
GameType="xGame.xTeamGame"
URLString="?TeamScreen=true"
TimeLimit=15
PrizeMoney=500
End Object
Begin Object Class=UT2K4MatchInfo Name=TDM2
LevelName=""
AltLevels(0)="DM-Rankin"
AltLevels(1)="DM-Rrajigar"
EnemyTeamName=";xGame.UT2K4TeamRosterEasy;least"
SpecialEvent=""
DifficultyModifier=0.75
GoalScore=40
NumBots=5
GameType="xGame.xTeamGame"
URLString="?TeamScreen=true"
TimeLimit=20
PrizeMoney=750
End Object
Begin Object Class=UT2K4MatchInfo Name=TDM3
LevelName=""
AltLevels(0)="DM-Corrugation"
AltLevels(1)="DM-Antalus"
EnemyTeamName=";xGame.UT2K4TeamRosterEasy;least"
SpecialEvent=""
Priority=1
DifficultyModifier=1.0
GoalScore=50
NumBots=7
GameType="xGame.xTeamGame"
URLString="?TeamScreen=true"
TimeLimit=20
PrizeMoney=1000
End Object
Begin Object Class=UT2K4MatchInfo Name=TDM4
LevelName=""
AltLevels(0)="DM-Morpheus3"
AltLevels(1)="DM-Goliath"
EnemyTeamName=";xGame.UT2K4TeamRosterEasy;best"
SpecialEvent="OPEN DOM;QUALIFIED TEAM;UPDATETEAMS"
DifficultyModifier=1.5
GoalScore=60
NumBots=9
GameType="xGame.xTeamGame"
URLString="?TeamScreen=true"
TimeLimit=20
PrizeMoney=1250
End Object
TDMMatches(0)=TDM1
TDMMatches(1)=TDM2
TDMMatches(2)=TDM3
TDMMatches(3)=TDM4
// 8 CTF
Begin Object Class=UT2K4MatchInfo Name=CTF1
LevelName=""
AltLevels(0)="CTF-FaceClassic"
AltLevels(1)="CTF-Maul"
AltLevels(2)="CTF-Citadel"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent=""
DifficultyModifier=0.75
GoalScore=2
GameType="xGame.xCTFGame"
NumBots=7
URLString="?TeamScreen=true"
PrizeMoney=1000
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF2
LevelName=""
AltLevels(0)="CTF-Grendelkeep"
AltLevels(1)="CTF-Magma"
AltLevels(2)="CTF-Geothermal"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="OPEN BR"
DifficultyModifier=1.0
GoalScore=2
GameType="xGame.xCTFGame"
NumBots=7
URLString="?TeamScreen=true"
PrizeMoney=1500
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF3
LevelName=""
AltLevels(0)="CTF-Smote"
AltLevels(1)="CTF-TwinTombs"
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=1.25
GoalScore=3
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=1750
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF4
LevelName=""
AltLevels(0)="CTF-Grassyknoll"
AltLevels(1)="CTF-Avaris"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=1.5
GoalScore=3
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2000
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF5
LevelName=""
AltLevels(0)="CTF-January"
AltLevels(1)="CTF-Lostfaith"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=1.75
GoalScore=3
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2250
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF6
LevelName=""
AltLevels(0)="CTF-MoonDragon"
AltLevels(1)="CTF-Orbital2"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=2.0
GoalScore=4
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2500
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF7
LevelName="CTF-BridgeOfFate"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent=""
DifficultyModifier=2.25
GoalScore=4
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=3000
TimeLimit=25
End Object
Begin Object Class=UT2K4MatchInfo Name=CTF8
LevelName=""
AltLevels(0)="CTF-AbsoluteZero"
AltLevels(1)="CTF-DoubleDammage"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent="COMPLETED CTF;UPDATETEAMS"
DifficultyModifier=2.5
GoalScore=4
GameType="xGame.xCTFGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=3500
TimeLimit=25
End Object
CTFMatches(0)=CTF1
CTFMatches(1)=CTF2
CTFMatches(2)=CTF3
CTFMatches(3)=CTF4
CTFMatches(4)=CTF5
CTFMatches(5)=CTF6
CTFMatches(6)=CTF7
CTFMatches(7)=CTF8
// 6 DDOM
Begin Object Class=UT2K4MatchInfo Name=DOM1
LevelName=""
AltLevels(0)="DOM-Atlantis"
AltLevels(1)="DOM-ScorchedEarth"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent=""
DifficultyModifier=0.75
GoalScore=2
NumBots=5
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=1000
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=DOM2
LevelName=""
AltLevels(0)="DOM-Renascent"
AltLevels(1)="DOM-Junkyard"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="OPEN CTF"
DifficultyModifier=1.25
GoalScore=2
NumBots=5
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=1500
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=DOM3
LevelName=""
AltLevels(0)="DOM-Access"
AltLevels(1)="DOM-Outrigger"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=1.75
GoalScore=2
NumBots=7
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=2000
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=DOM4
LevelName=""
AltLevels(0)="DOM-Ruination"
AltLevels(1)="DOM-Suntemple"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=2.0
GoalScore=3
NumBots=9
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=2500
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=DOM5
LevelName=""
AltLevels(0)="DOM-Conduit"
AltLevels(1)="DOM-Core"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=2.25
GoalScore=3
NumBots=9
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=3000
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=DOM6
LevelName=""
AltLevels(0)="DOM-Aswan"
AltLevels(1)="DOM-SepukkuGorge"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent="COMPLETED DOM;UPDATETEAMS"
DifficultyModifier=2.5
GoalScore=3
NumBots=9
GameType="xGame.xDoubleDom"
URLString="?TeamScreen=true"
PrizeMoney=3500
TimeLimit=20
End Object
DOMMatches(0)=DOM1
DOMMatches(1)=DOM2
DOMMatches(2)=DOM3
DOMMatches(3)=DOM4
DOMMatches(4)=DOM5
DOMMatches(5)=DOM6
// 8 BR
Begin Object Class=UT2K4MatchInfo Name=BR1
LevelName="BR-Serenity"
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent=""
DifficultyModifier=0.75
GoalScore=15
GameType="xGame.xBombingRun"
NumBots=5
URLString="?TeamScreen=true"
PrizeMoney=1000
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=BR2
AltLevels(0)="BR-Bifrost"
AltLevels(1)="BR-Anubis"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="OPEN AS"
DifficultyModifier=1.0
GoalScore=15
GameType="xGame.xBombingRun"
NumBots=7
URLString="?TeamScreen=true"
PrizeMoney=1500
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=BR3
LevelName=""
AltLevels(0)="BR-Canyon"
AltLevels(1)="BR-DE-ElecFields"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=1.25
GoalScore=20
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2000
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=BR4
LevelName="BR-Disclosure"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=1.5
GoalScore=20
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2250
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=BR5
LevelName="BR-TwinTombs"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=1.75
GoalScore=25
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2500
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=BR6
LevelName="BR-IceFields"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=2.0
GoalScore=25
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=2750
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=BR7
AltLevels(0)="BR-Skyline"
AltLevels(1)="BR-BridgeOfFate"
Priority=1
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent=""
DifficultyModifier=2.25
GoalScore=30
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=3000
TimeLimit=25
End Object
Begin Object Class=UT2K4MatchInfo Name=BR8
LevelName="BR-Colossus"
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent="COMPLETED BR;UPDATETEAMS"
DifficultyModifier=2.5
GoalScore=30
GameType="xGame.xBombingRun"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=3500
TimeLimit=25
End Object
BRMatches(0)=BR1
BRMatches(1)=BR2
BRMatches(2)=BR3
BRMatches(3)=BR4
BRMatches(4)=BR5
BRMatches(5)=BR6
BRMatches(6)=BR7
BRMatches(7)=BR8
// 6 AS
Begin Object Class=UT2K4MatchInfo Name=AS1
LevelName="AS-FallenCity"
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent=""
DifficultyModifier=0.75
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=10?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=1500
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=AS2
LevelName="AS-RobotFactory"
EnemyTeamName=";xGame.UT2K4TeamRosterWeak;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=1.25
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=11?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=1750
TimeLimit=15
End Object
Begin Object Class=UT2K4MatchInfo Name=AS3
LevelName="AS-Convoy"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=1.75
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=12?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=2000
TimeLimit=20
End Object
Begin Object Class=UT2K4MatchInfo Name=AS4
LevelName="AS-Glacier"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent=""
DifficultyModifier=2.0
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=13?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=2500
TimeLimit=25
End Object
Begin Object Class=UT2K4MatchInfo Name=AS5
LevelName="AS-Junkyard"
EnemyTeamName=";xGame.UT2K4TeamRosterMid;least"
SpecialEvent="UPDATETEAMS"
DifficultyModifier=2.25
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=14?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=3000
TimeLimit=30
End Object
Begin Object Class=UT2K4MatchInfo Name=AS6
LevelName="AS-MotherShip"
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;least"
SpecialEvent="COMPLETED AS;UPDATETEAMS"
DifficultyModifier=2.5
GoalScore=0
GameType="UT2k4Assault.ASGameInfo"
NumBots=9
URLString="?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=15?ReinforcementsFreq=7?RoundLimit=1"
PrizeMoney=3500
TimeLimit=30
End Object
ASMatches(0)=AS1
ASMatches(1)=AS2
ASMatches(2)=AS3
ASMatches(3)=AS4
ASMatches(4)=AS5
ASMatches(5)=AS6
// 2 Champ
Begin Object Class=UT2K4MatchInfo Name=CHAMP1
LevelName="DM-Deck17"
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;final"
SpecialEvent=""
DifficultyModifier=3.0
GoalScore=35
GameType="xGame.xTeamGame"
NumBots=9
URLString="?TeamScreen=true"
PrizeMoney=5000
End Object
Begin Object Class=UT2K4MatchInfo Name=CHAMP2
LevelName="DM-HyperBlast2"
EnemyTeamName=";xGame.UT2K4TeamRosterStrong;final"
SpecialEvent="COMPLETED CHAMP"
DifficultyModifier=3.0 // gametype will take care of this
GoalScore=20
GameType="xGame.BossDM"
NumBots=1
URLString="?TeamScreen=true"
PrizeMoney=10000
End Object
ChampionshipMatches(0)=CHAMP1
ChampionshipMatches(1)=CHAMP2
ChallengeGames(0)=class'xGame.BloodRites'
ChallengeGames(1)=class'xGame.ManoEMano'
//AdditionalLadders(0)=class'xGame.CLOnslaught' // if you find you may use it
}