1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\challenges_shared;
3 #using scripts\shared\demo_shared;
4 #using scripts\shared\gameobjects_shared;
5 #using scripts\shared\hostmigration_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\popups_shared;
8 #using scripts\shared\scoreevents_shared;
9 #using scripts\shared\sound_shared;
10 #using scripts\shared\util_shared;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
15 #using scripts\mp\gametypes\_globallogic;
16 #using scripts\mp\gametypes\_globallogic_audio;
17 #using scripts\mp\gametypes\_globallogic_score;
18 #using scripts\mp\gametypes\_globallogic_utils;
19 #using scripts\mp\gametypes\_hostmigration;
20 #using scripts\mp\gametypes\_spawning;
21 #using scripts\mp\gametypes\_spawnlogic;
23 #using scripts\mp\_challenges;
24 #using scripts\mp\_util;
25 #using scripts\mp\teams\_teams;
98 #precache( "string", "OBJECTIVES_DOM" );
99 #precache( "string", "OBJECTIVES_DOM_SCORE" );
100 #precache( "string", "OBJECTIVES_DOM_HINT" );
101 #precache( "string", "MP_CAPTURING_FLAG" );
102 #precache( "string", "MP_LOSING_FLAG" );
103 #precache( "string", "MP_DOM_YOUR_FLAG_WAS_CAPTURED" );
104 #precache( "string", "MP_DOM_ENEMY_FLAG_CAPTURED" );
105 #precache( "string", "MP_DOM_NEUTRAL_FLAG_CAPTURED" );
106 #precache( "string", "MP_ENEMY_FLAG_CAPTURED_BY" );
107 #precache( "string", "MP_NEUTRAL_FLAG_CAPTURED_BY" );
108 #precache( "string", "MP_FRIENDLY_FLAG_CAPTURED_BY" );
109 #precache( "string", "MP_DOM_FLAG_A_CAPTURED_BY" );
110 #precache( "string", "MP_DOM_FLAG_B_CAPTURED_BY" );
111 #precache( "string", "MP_DOM_FLAG_C_CAPTURED_BY" );
112 #precache( "string", "MP_DOM_FLAG_D_CAPTURED_BY" );
113 #precache( "string", "MP_DOM_FLAG_E_CAPTURED_BY" );
114 #precache( "fx", "ui/fx_ui_flagbase_blue" );
115 #precache( "fx", "ui/fx_ui_flagbase_orng" );
116 #precache( "fx", "ui/fx_ui_flagbase_wht" );
117 #precache( "objective", "dom_a" );
118 #precache( "objective", "dom_b" );
119 #precache( "objective", "dom_c" );
121 #define DIALOG_THROTTLE 10000
137 level.scoreRoundWinBased = ( GetGametypeSetting(
"cumulativeRoundScores" ) == false );
138 level.teamBased =
true;
139 level.overrideTeamScore =
true;
151 game[
"dialog"][
"securing_a"] =
"domFriendlySecuringA";
152 game[
"dialog"][
"securing_b"] =
"domFriendlySecuringB";
153 game[
"dialog"][
"securing_c"] =
"domFriendlySecuringC";
155 game[
"dialog"][
"secured_a"] =
"domFriendlySecuredA";
156 game[
"dialog"][
"secured_b"] =
"domFriendlySecuredB";
157 game[
"dialog"][
"secured_c"] =
"domFriendlySecuredC";
159 game[
"dialog"][
"secured_all"] =
"domFriendlySecuredAll";
161 game[
"dialog"][
"losing_a"] =
"domEnemySecuringA";
162 game[
"dialog"][
"losing_b"] =
"domEnemySecuringB";
163 game[
"dialog"][
"losing_c"] =
"domEnemySecuringC";
165 game[
"dialog"][
"lost_a"] =
"domEnemySecuredA";
166 game[
"dialog"][
"lost_b"] =
"domEnemySecuredB";
167 game[
"dialog"][
"lost_c"] =
"domEnemySecuredC";
169 game[
"dialog"][
"lost_all"] =
"domEnemySecuredAll";
171 game[
"dialog"][
"enemy_a"] =
"domEnemyHasA";
172 game[
"dialog"][
"enemy_b"] =
"domEnemyHasB";
173 game[
"dialog"][
"enemy_c"] =
"domEnemyHasC";
175 game[
"dialogTime"] = [];
176 game[
"dialogTime"][
"securing_a"] = 0;
177 game[
"dialogTime"][
"securing_b"] = 0;
178 game[
"dialogTime"][
"securing_c"] = 0;
179 game[
"dialogTime"][
"losing_a"] = 0;
180 game[
"dialogTime"][
"losing_b"] = 0;
181 game[
"dialogTime"][
"losing_c"] = 0;
184 if ( !SessionModeIsSystemlink() && !SessionModeIsOnlineGame() && IsSplitScreen() )
202 if ( !isdefined( game[
"switchedsides"] ) )
203 game[
"switchedsides"] =
false;
205 if ( game[
"switchedsides"] )
207 oldAttackers = game[
"attackers"];
208 oldDefenders = game[
"defenders"];
209 game[
"attackers"] = oldDefenders;
210 game[
"defenders"] = oldAttackers;
213 if ( level.splitscreen )
226 level.flagBaseFXid = [];
228 setClientNameMode(
"auto_change");
233 level.spawnMins = ( 0, 0, 0 );
234 level.spawnMaxs = ( 0, 0, 0 );
240 setMapCenter( level.mapCenter );
243 setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
247 level.spawn_start = [];
249 foreach( team
in level.teams )
257 level.startPos[
"allies"] = level.spawn_start[
"allies" ][0].origin;
258 level.startPos[
"axis"] = level.spawn_start[
"axis" ][0].origin;
266 level.spawnsystem.sideSwitching = 0;
277 for ( i = 0; i < level.domFlags.size; i++ )
279 domFlag = level.domFlags[i];
281 if ( isdefined( domFlag.singleOwner ) && domFlag.singleOwner ==
true )
292 if ( level.scoreRoundWinBased )
294 foreach( team
in level.teams )
296 [[level._setTeamScore]]( team, game[
"roundswon"][team] );
300 return [[level.determineWinner]]();
305 level.flagCaptureTime = GetGametypeSetting(
"captureTime" );
306 level.playerCaptureLPM = GetGametypeSetting(
"maxPlayerEventsPerMinute" );
307 level.flagCaptureLPM = GetGametypeSetting(
"maxObjectiveEventsPerMinute" );
308 level.playerOffensiveMax = GetGametypeSetting(
"maxPlayerOffensive" );
309 level.playerDefensiveMax = GetGametypeSetting(
"maxPlayerDefensive" );
310 level.flagCanBeNeutralized = GetGametypeSetting(
"flagCanBeNeutralized" );
315 level.lastStatus[
"allies"] = 0;
316 level.lastStatus[
"axis"] = 0;
318 level.flagModel[
"allies"] =
"tag_origin";
319 level.flagModel[
"axis"] =
"tag_origin";
320 level.flagModel[
"neutral"] =
"tag_origin";
322 primaryFlags = getEntArray(
"flag_primary",
"targetname" );
324 if ( (primaryFlags.size) < 2 )
326 /# printLn(
"^1Not enough domination flags found in level!" ); #/
332 foreach( dom_flag
in primaryFlags )
334 if ( isdefined( dom_flag.target ) )
336 trigger = getEnt( dom_flag.target,
"targetname" );
338 if ( isDefined( trigger ) )
340 trigger.visual = dom_flag;
341 trigger.script_label = dom_flag.script_label;
346 println(
"Trigger not available for flag " + dom_flag.script_label +
" with targetname " + dom_flag.target);
353 println(
"Trigger not available for flag " + dom_flag.script_label);
357 level.flags[level.flags.size] = trigger;
361 foreach( trigger
in level.flags )
363 trigger.visual setModel( level.flagModel[
"neutral"] );
365 name = istring(
"dom" + trigger.visual.script_label);
368 visuals[0] = trigger.visual;
372 if( level.flagCanBeNeutralized )
382 domFlag.label = label;
383 domFlag.flagIndex = trigger.visual.script_index;
390 domFlag.hasBeenCaptured =
false;
395 traceStart = visuals[0].origin + (0,0,32);
396 traceEnd = visuals[0].origin + (0,0,-32);
397 trace = bulletTrace( traceStart, traceEnd,
false, undefined );
399 upangles = vectorToAngles(
trace[
"normal"] );
400 domFlag.baseeffectforward = anglesToForward( upangles );
401 domFlag.baseeffectright = anglesToRight( upangles );
403 domFlag.baseeffectpos =
trace[
"position"];
406 trigger.useObj = domFlag;
407 trigger.adjflags = [];
408 trigger.nearbyspawns = [];
410 domFlag.levelFlag = trigger;
412 level.domFlags[level.domFlags.size] = domFlag;
416 level.bestSpawnFlag = [];
420 for ( index = 0; index < level.domFlags.size; index++ )
431 bestdistsq = undefined;
432 for ( i = 0; i < level.flags.size; i++ )
434 flag = level.flags[i];
439 distsq = distanceSquared( flag.origin, level.startPos[team] );
440 if ( (!isdefined( excludeFlag ) || flag != excludeFlag) && (!isdefined( best ) || distsq < bestdistsq) )
452 self.didStatusNotify =
false;
453 if ( ownerTeam ==
"allies" )
456 otherTeam =
"allies";
458 if ( ownerTeam ==
"neutral" )
461 statusDialog(
"securing"+
self.label, player.pers[
"team"],
"objective" +
self.label );
468 if ( progress > 0.05 &&
change && !
self.didStatusNotify )
471 if ( ownerTeam ==
"neutral" )
474 statusDialog(
"securing"+
self.label, team,
"objective" +
self.label );
478 statusDialog(
"losing"+
self.label, ownerTeam,
"objective" +
self.label );
479 statusDialog(
"securing"+
self.label, team,
"objective" +
self.label );
483 self.didStatusNotify =
true;
497 dialogTime = game[
"dialogTime"][dialog];
498 if ( isdefined( dialogTime) )
502 if ( dialogTime > time )
510 dialogKey = game[
"dialog"][dialog];
512 if( isdefined( objectiveKey ) )
514 if( objectiveKey !=
"objective_all" )
516 dialogBufferKey =
"domPointDialogBuffer";
534 self.singleOwner =
true;
547 statusDialog(
"secured"+
self.label, team,
"objective" +
self.label );
548 statusDialog(
"enemy"+
self.label, otherTeam,
"objective" +
self.label );
557 self.singleOwner =
false;
568 statusDialog(
"secured"+
self.label, team,
"objective" +
self.label );
571 statusDialog(
"lost"+
self.label, oldTeam,
"objective" +
self.label );
575 statusDialog(
"enemy"+
self.label, oldTeam,
"objective" +
self.label );
582 level.bestSpawnFlag[ oldTeam ] =
self.levelFlag;
587 self.singleOwner =
true;
597 statusDialog(
"lost"+
self.label, oldTeam,
"objective" +
self.label );
612 string = &
"MP_DOM_FLAG_A_NEUTRALIZED_BY";
615 string = &
"MP_DOM_FLAG_B_NEUTRALIZED_BY";
618 string = &
"MP_DOM_FLAG_C_NEUTRALIZED_BY";
621 string = &
"MP_DOM_FLAG_D_NEUTRALIZED_BY";
624 string = &
"MP_DOM_FLAG_E_NEUTRALIZED_BY";
635 string = &
"MP_DOM_FLAG_A_CAPTURED_BY";
638 string = &
"MP_DOM_FLAG_B_CAPTURED_BY";
641 string = &
"MP_DOM_FLAG_C_CAPTURED_BY";
644 string = &
"MP_DOM_FLAG_D_CAPTURED_BY";
647 string = &
"MP_DOM_FLAG_E_CAPTURED_BY";
659 team = player.pers[
"team"];
663 /#print(
"flag captured: " +
self.label );#/
665 level.useStartSpawns =
false;
667 assert( team !=
"neutral" );
670 if ( oldTeam ==
"neutral" )
672 level notify(
"flag_captured" );
674 level.bestSpawnFlag[ oldTeam ] =
self.levelFlag;
677 self.visuals[0] setModel( level.flagModel[team] );
684 level notify(
"flag_neutralized" );
688 self.visuals[0] setModel( level.flagModel[
"neutral"] );
693 assert (
string != &
"" );
697 touchKeys = GetArrayKeys(
self.touchList[team] );
698 for ( i = 0 ; i < touchKeys.size ; i++ )
699 touchList[touchKeys[i]] =
self.touchList[team][touchKeys[i]];
707 if( oldTeam ==
"neutral" )
724 level notify(
"flag_captured" );
725 team = player.pers[
"team"];
729 /#print(
"flag captured: " +
self.label );#/
732 self.visuals[0] setModel( level.flagModel[team] );
735 level.useStartSpawns =
false;
737 assert( team !=
"neutral" );
745 assert (
string != &
"" );
749 touchKeys = GetArrayKeys(
self.touchList[team] );
750 for ( i = 0 ; i < touchKeys.size ; i++ )
751 touchList[touchKeys[i]] =
self.touchList[team][touchKeys[i]];
755 if ( oldTeam ==
"neutral" )
773 if( level.flagCanBeNeutralized )
786 level endon(
"flag_captured" );
787 level endon(
"game_ended" );
797 level endon(
"game_ended" );
798 level endon(
"endWatchForBFlagCapAfterTime" );
803 level waittill(
"b_flag_captured", player );
810 level endon(
"game_ended" );
812 level notify(
"endWatchForBFlagCapAfterTime" );
823 players = getArrayKeys( touchList );
824 for ( i = 0; i < players.size; i++ )
826 player_from_touchlist = touchList[players[i]].player;
831 if (lastOwnerTeam ==
"neutral" && neutralizing &&
IS_TRUE(
self.hasBeenCaptured ) )
835 else if ( lastOwnerTeam ==
"neutral" )
851 self.hasBeenCaptured =
true;
853 player_from_touchlist RecordGameEvent(
"capture");
856 level notify(
"b_flag_captured", player_from_touchlist );
858 if( isdefined(player_from_touchlist.pers[
"captures"]) )
860 player_from_touchlist.pers[
"captures"]++;
861 player_from_touchlist.captures = player_from_touchlist.pers[
"captures"];
864 player_from_touchlist AddPlayerStatWithGameType(
"CAPTURES", 1 );
880 players = getArrayKeys( touchList );
881 for ( i = 0; i < players.size; i++ )
883 player_from_touchlist = touchList[players[i]].player;
889 player_from_touchlist RecordGameEvent(
"neutralized");
890 if( isdefined(player_from_touchlist.pers[
"neutralizes"]) )
892 player_from_touchlist.pers[
"neutralizes"]++;
893 player_from_touchlist.captures = player_from_touchlist.pers[
"neutralizes"];
907 if ( level.roundScoreLimit && !level.timeLimit )
910 warningScore = Max( 0, level.roundScoreLimit - 12 );
917 playedNearEndVo =
false;
919 alliesRoundStartScore = [[level._getTeamScore]](
"allies" );
920 axisRoundStartScore = [[level._getTeamScore]](
"axis" );
922 while ( !level.gameEnded )
930 if( ( totalFlags == 3 ) && ( game[
"teamScores"][
"allies"] == round_score_limit - 1 ) && ( game[
"teamScores"][
"axis"] == round_score_limit - 1 ) )
931 level.clampScoreLimit =
false;
934 numOwnedFlags += numFlags;
937 scoring_teams[scoring_teams.size] =
"allies";
942 numOwnedFlags += numFlags;
945 scoring_teams[scoring_teams.size] =
"axis";
952 if ( warningScore && !playedNearEndVo )
954 winningTeam = undefined;
956 alliesRoundScore = [[level._getTeamScore]](
"allies" ) - alliesRoundStartScore;
957 axisRoundScore = [[level._getTeamScore]](
"axis" ) - axisRoundStartScore;
959 if ( alliesRoundScore >= warningScore )
961 winningTeam =
"allies";
963 else if ( axisRoundScore >= warningScore )
965 winningTeam =
"axis";
968 if ( isdefined( winningTeam ) )
970 nearWinning =
"nearWinning";
971 nearLosing =
"nearLosing";
975 nearWinning =
"nearWinningFinal";
976 nearLosing =
"nearLosingFinal";
980 if ( RandomInt( 4 ) < 3 )
982 nearWinning =
"nearWinningFinal";
985 if ( RandomInt( 4 ) < 1 )
987 nearLosing =
"nearLosingFinal";
993 playedNearEndVo =
true;
1001 if ( (((timePassed / 1000) > 120 && numOwnedFlags < 2) || ((timePassed / 1000) > 300 && numOwnedFlags < 3)) && ( GameModeIsMode(
GAMEMODE_PUBLIC_MATCH ) ) )
1014 axisScore = [[level._getTeamScore]](
"axis" );
1015 alliedScore = [[level._getTeamScore]](
"allies" );
1016 scoreLimit = level.scoreLimit;
1017 scoreThreshold = scoreLimit * .1;
1018 scoreDif = abs(axisScore - alliedScore);
1019 scoreThresholdStart = abs(scoreLimit - scoreThreshold);
1020 scoreLimitCheck = scoreLimit - 10;
1022 if( !isdefined( level.playingActionMusic ) )
1023 level.playingActionMusic =
false;
1025 if( !isdefined( level.sndHalfway ) )
1026 level.sndHalfway =
false;
1028 if (alliedScore > axisScore)
1030 currentScore = alliedScore;
1034 currentScore = axisScore;
1037 halfwayScore = scoreLimit*.5;
1038 if( isdefined( level.roundScoreLimit ) )
1040 halfwayScore = level.roundScoreLimit*.5;
1041 if( game[
"roundsplayed" ] == 1 )
1043 halfwayScore += level.roundScoreLimit;
1047 if( ((axisScore >= halfwayScore) || (alliedScore >= halfwayScore)) && !level.sndHalfway )
1050 level notify(
"sndMusicHalfway" );
1051 level.sndHalfway =
true;
1058 if ( !isdefined( game[
"switchedsides"] ) )
1059 game[
"switchedsides"] =
false;
1061 game[
"switchedsides"] = !game[
"switchedsides"];
1063 if ( level.scoreRoundWinBased )
1065 [[level._setTeamScore]](
"allies", game[
"roundswon"][
"allies"] );
1066 [[level._setTeamScore]](
"axis", game[
"roundswon"][
"axis"] );
1070 function onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
1072 if ( isdefined( attacker ) && isplayer( attacker ) )
1074 scoreEventProcessed =
false;
1075 if ( attacker.touchTriggers.size && attacker.pers[
"team"] !=
self.pers[
"team"] )
1077 triggerIds = getArrayKeys( attacker.touchTriggers );
1078 ownerTeam = attacker.touchTriggers[triggerIds[0]].useObj.ownerTeam;
1079 team = attacker.pers[
"team"];
1080 if ( team != ownerTeam )
1083 scoreEventProcessed =
true;
1087 for ( index = 0; index < level.flags.size; index++ )
1089 flagTeam =
"invalidTeam";
1091 defendedFlag =
false;
1092 offendedFlag =
false;
1094 flagOrigin = level.flags[index].origin;
1096 offenseRadiusSQ = 300 * 300;
1097 dist = Distance2dSquared(
self.origin, flagOrigin);
1098 if ( dist < offenseRadiusSQ )
1101 if ( level.flags[index]
getFlagTeam() == attacker.pers[
"team"] || level.flags[index]
getFlagTeam() ==
"neutral" )
1102 defendedFlag =
true;
1104 offendedFlag =
true;
1106 dist = Distance2dSquared(attacker.origin, flagOrigin);
1107 if ( dist < offenseRadiusSQ )
1110 if ( level.flags[index]
getFlagTeam() == attacker.pers[
"team"] || level.flags[index]
getFlagTeam() ==
"neutral" )
1111 defendedFlag =
true;
1113 offendedFlag =
true;
1116 if ( inFlagZone && isPlayer( attacker ) && attacker.pers[
"team"] !=
self.pers[
"team"] )
1120 if ( !isdefined( attacker.dom_defends ) )
1121 attacker.dom_defends = 0;
1123 attacker.dom_defends++;
1124 if ( level.playerDefensiveMax >= attacker.dom_defends )
1127 if (!scoreeventprocessed)
1131 self RecordKillModifier(
"defending");
1142 if ( !isdefined( attacker.dom_offends ) )
1143 attacker.dom_offends = 0;
1147 attacker.dom_offends++;
1148 if ( level.playerOffensiveMax >= attacker.dom_offends )
1150 attacker.pers[
"defends"]++;
1151 attacker.defends = attacker.pers[
"defends"];
1153 attacker RecordGameEvent(
"return");
1155 if (!scoreeventprocessed)
1159 self RecordKillModifier(
"assaulting");
1169 if (
self.touchTriggers.size && attacker.pers[
"team"] !=
self.pers[
"team"] )
1171 triggerIds = getArrayKeys(
self.touchTriggers );
1172 ownerTeam =
self.touchTriggers[triggerIds[0]].useObj.ownerTeam;
1173 team =
self.pers[
"team"];
1174 if ( team != ownerTeam )
1176 flag =
self.touchTriggers[triggerIds[0]].useObj;
1177 if ( isdefined( flag.contested ) && flag.contested ==
true)
1188 self notify(
"killWhileContesting" );
1189 self endon(
"killWhileContesting" );
1190 self endon(
"disconnect" );
1192 killTime = getTime();
1193 playerteam =
self.pers[
"team"];
1194 if ( !isdefined (
self.clearEnemyCount ) )
1196 self.clearEnemyCount = 0;
1199 self.clearEnemyCount++;
1201 flag waittill(
"contest_over" );
1204 if (playerteam !=
self.pers[
"team"] || ( isdefined(
self.spawntime ) && ( killTime <
self.spawntime ) ) )
1206 self.clearEnemyCount = 0;
1209 if ( flag.ownerTeam != playerteam && flag.ownerTeam !=
"neutral" )
1211 self.clearEnemyCount = 0;
1215 if (
self.clearEnemyCount >= 2 && killTime + 200 > getTime() )
1219 self.clearEnemyCount = 0;
1225 self endon (
"disconnect" );
1226 level endon (
"game_ended" );
1228 self notify (
"updateDomRecentKills" );
1229 self endon (
"updateDomRecentKills" );
1230 if ( !isdefined (
self.recentDomAttackerKillCount) )
1232 self.recentDomAttackerKillCount = 0;
1234 self.recentDomAttackerKillCount++;
1239 if (
self.recentDomAttackerKillCount > 1 )
1242 self.recentDomAttackerKillCount = 0;
1250 for (i = 0; i < level.flags.size; i++)
1267 for (i = 0; i < level.flags.size; i++)
1269 for (j = 0; j < level.flags[i].adjflags.size; j++)
1273 bflags[bflags.size] = level.flags[i];
1287 for (i = 0; i < bflags.size; i++)
1289 if (isdefined(team) && bflags[i]
getFlagTeam() != team)
1292 for (j = 0; j < bflags[i].nearbyspawns.size; j++)
1293 spawns[spawns.size] = bflags[i].nearbyspawns[j];
1303 for (i = 0; i < level.flags.size; i++)
1305 flag = level.flags[i];
1306 if ( flag == avoidflag )
1310 for (j = 0; j < flag.adjflags.size; j++)
1312 if ( flag.adjflags[j] == avoidflag )
1322 for (j = 0; j < flag.nearbyspawns.size; j++)
1323 spawns[spawns.size] = flag.nearbyspawns[j];
1335 for (i = 0; i < level.flags.size; i++)
1340 for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
1341 spawns[spawns.size] = level.flags[i].nearbyspawns[s];
1345 for (j = 0; j < level.flags[i].adjflags.size; j++)
1347 if ( level.flags[i].adjflags[j]
getFlagTeam() == team )
1350 for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
1351 spawns[spawns.size] = level.flags[i].nearbyspawns[s];
1367 for (i = 0; i < level.flags.size; i++)
1372 for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
1373 spawns[spawns.size] = level.flags[i].nearbyspawns[s];
1383 descriptorsByLinkname = [];
1386 descriptors = getentarray(
"flag_descriptor",
"targetname");
1388 flags = level.flags;
1390 for (i = 0; i < level.domFlags.size; i++)
1392 closestdist = undefined;
1393 closestdesc = undefined;
1394 for (j = 0; j < descriptors.size; j++)
1396 dist = distance(flags[i].origin, descriptors[j].origin);
1397 if (!isdefined(closestdist) || dist < closestdist) {
1399 closestdesc = descriptors[j];
1403 if (!isdefined(closestdesc)) {
1404 maperrors[maperrors.size] =
"there is no flag_descriptor in the map! see explanation in dom.gsc";
1407 if (isdefined(closestdesc.flag)) {
1408 maperrors[maperrors.size] =
"flag_descriptor with script_linkname \"" + closestdesc.script_linkname +
"\" is nearby more than one flag; is there a unique descriptor near each flag?";
1411 flags[i].descriptor = closestdesc;
1412 closestdesc.flag = flags[i];
1413 descriptorsByLinkname[closestdesc.script_linkname] = closestdesc;
1416 if (maperrors.size == 0)
1419 for (i = 0; i < flags.size; i++)
1421 if (isdefined(flags[i].descriptor.script_linkto))
1422 adjdescs = strtok(flags[i].descriptor.script_linkto,
" ");
1425 for (j = 0; j < adjdescs.size; j++)
1427 otherdesc = descriptorsByLinkname[adjdescs[j]];
1428 if (!isdefined(otherdesc) || otherdesc.targetname !=
"flag_descriptor") {
1429 maperrors[maperrors.size] =
"flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname +
"\" linked to \"" + adjdescs[j] +
"\" which does not exist as a script_linkname of any other entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)";
1432 adjflag = otherdesc.flag;
1433 if (adjflag == flags[i]) {
1434 maperrors[maperrors.size] =
"flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname +
"\" linked to itself";
1437 flags[i].adjflags[flags[i].adjflags.size] = adjflag;
1444 for (i = 0; i < spawnpoints.size; i++)
1446 if (isdefined(spawnpoints[i].script_linkto)) {
1447 desc = descriptorsByLinkname[spawnpoints[i].script_linkto];
1448 if (!isdefined(desc) || desc.targetname !=
"flag_descriptor") {
1449 maperrors[maperrors.size] =
"Spawnpoint at " + spawnpoints[i].origin +
"\" linked to \"" + spawnpoints[i].script_linkto +
"\" which does not exist as a script_linkname of any entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)";
1452 nearestflag = desc.flag;
1455 nearestflag = undefined;
1456 nearestdist = undefined;
1457 for (j = 0; j < flags.size; j++)
1459 dist = distancesquared(flags[j].origin, spawnpoints[i].origin);
1460 if (!isdefined(nearestflag) || dist < nearestdist)
1462 nearestflag = flags[j];
1467 nearestflag.nearbyspawns[nearestflag.nearbyspawns.size] = spawnpoints[i];
1470 if (maperrors.size > 0)
1473 println(
"^1------------ Map Errors ------------");
1474 for(i = 0; i < maperrors.size; i++)
1475 println(maperrors[i]);
1476 println(
"^1------------------------------------");
1477 println(
"Map errors. See above");
1487 ss = level.spawnsystem;
1489 for (flag_index = 0; flag_index < level.flags.size; flag_index++)
1491 if ( level.domFlags[flag_index] ==
self )
1510 assert(isdefined(
self.neutral_flag_influencer));
1511 assert(isdefined(
self.owned_flag_influencer));
1512 assert(isdefined(
self.enemy_flag_influencer));
1514 if ( team ==
"neutral" )
1516 EnableInfluencer(
self.neutral_flag_influencer,
true);
1517 EnableInfluencer(
self.owned_flag_influencer,
false);
1518 EnableInfluencer(
self.enemy_flag_influencer,
false);
1522 EnableInfluencer(
self.neutral_flag_influencer,
false);
1523 EnableInfluencer(
self.owned_flag_influencer,
true);
1524 EnableInfluencer(
self.enemy_flag_influencer,
true);
1537 if ( game[
"switchedsides"] )
1542 if ( flag_team != otherTeam )
1557 flag_number = level.flags.size;
1560 for ( i = 0 ; i < flag_number ; i++ )
1563 flagSpawnName =
"mp_dom_spawn_flag" + label;
1570 for ( i = 0; i < flag_number; i++ )
1574 flagSpawnName =
"mp_dom_spawn_flag" + label;
1588 num_flags = level.flags.size;
1592 for ( i = 0 ; i < num_flags ; i++ )
1596 if ( flag_team ==
"allies" )
1600 else if ( flag_team ==
"axis" )
1609 if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) )
1618 num_flags = level.flags.size;
1622 for ( i = 0 ; i < num_flags ; i++ )
1626 if ( flag_team ==
"allies" )
1630 else if ( flag_team ==
"axis" )
1635 if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) )
1644 if ( !isdefined(
self.capsPerMinute ) )
1647 self.capsPerMinute = 0;
1652 if ( lastOwnerTeam ==
"neutral" )
1660 if ( IsPlayer(
self ) && isdefined(
self.timePlayed[
"total"]) )
1661 minutesPassed =
self.timePlayed[
"total"] / 60;
1663 self.capsPerMinute =
self.numCaps / minutesPassed;
1664 if (
self.capsPerMinute >
self.numCaps )
1665 self.capsPerMinute =
self.numCaps;
1670 if ( !level.rankedMatch )
1673 if ( player.capsPerMinute > level.playerCaptureLPM )
1676 if ( flag.capsPerMinute > level.flagCaptureLPM )
1685 if ( !isdefined(
self.contested ) )
1687 self.contested =
false;
1691 numOwners =
self.numTouching[
self.claimTeam];
1693 previousState =
self.contested;
1694 if ( numOther > 0 && numOwners > 0 )
1696 self.contested =
true;
1700 if ( previousState ==
true )
1702 self notify(
"contest_over" );
1704 self.contested =
false;