Ticket #2749: t2749_ceasefire_v1.patch
File t2749_ceasefire_v1.patch, 32.1 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/gamesetup/gamesetup.js
12 12 const POPULATION_CAP_DEFAULTIDX = 5; 13 13 // Translation: Amount of starting resources. 14 14 const STARTING_RESOURCES = [translateWithContext("startingResources", "Very Low"), translateWithContext("startingResources", "Low"), translateWithContext("startingResources", "Medium"), translateWithContext("startingResources", "High"), translateWithContext("startingResources", "Very High"), translateWithContext("startingResources", "Deathmatch")]; 15 15 const STARTING_RESOURCES_DATA = [100, 300, 500, 1000, 3000, 50000]; 16 16 const STARTING_RESOURCES_DEFAULTIDX = 1; 17 // Translation: Ceasefire. 18 const CEASEFIRE = [translateWithContext("ceasefire", "No ceasefire"), translateWithContext("ceasefire", "15 seconds"), translateWithContext("ceasefire", "5 minutes"), translateWithContext("ceasefire", "10 minutes"), translateWithContext("ceasefire", "15 minutes"), translateWithContext("ceasefire", "20 minutes"), translateWithContext("ceasefire", "30 minutes"), translateWithContext("ceasefire", "45 minutes"), translateWithContext("ceasefire", "60 minutes")]; 19 const CEASEFIRE_DATA = [0, 0.25, 5, 10, 15, 20, 30, 45, 60]; 20 const CEASEFIRE_DEFAULTIDX = 0; 17 21 // Max number of players for any map 18 22 const MAX_PLAYERS = 8; 19 23 20 24 //////////////////////////////////////////////////////////////////////////////////////////////// 21 25 … … 203 207 g_GameAttributes.settings.StartingResources = STARTING_RESOURCES_DATA[this.selected]; 204 208 205 209 updateGameAttributes(); 206 210 } 207 211 212 var ceasefireL = Engine.GetGUIObjectByName("ceasefire"); 213 ceasefireL.list = CEASEFIRE; 214 ceasefireL.list_data = CEASEFIRE_DATA; 215 ceasefireL.selected = CEASEFIRE_DEFAULTIDX; 216 ceasefireL.onSelectionChange = function() { 217 if (this.selected != -1) 218 g_GameAttributes.settings.Ceasefire = CEASEFIRE_DATA[this.selected]; 219 220 updateGameAttributes(); 221 } 222 208 223 var victoryConditions = Engine.GetGUIObjectByName("victoryCondition"); 209 224 var victories = getVictoryConditions(); 210 225 victoryConditions.list = victories.text; 211 226 victoryConditions.list_data = victories.data; 212 227 victoryConditions.onSelectionChange = function() { … … 738 753 { 739 754 var startingResourcesBox = Engine.GetGUIObjectByName("startingResources"); 740 755 startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources); 741 756 } 742 757 758 if (mapSettings.Ceasefire) 759 { 760 var ceasefireBox = Engine.GetGUIObjectByName("ceasefire"); 761 ceasefireBox.selected = ceasefireBox.list_data.indexOf(mapSettings.Ceasefire); 762 } 763 743 764 if (attrs.gameSpeed) 744 765 { 745 766 var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed"); 746 767 gameSpeedBox.selected = g_GameSpeeds.speeds.indexOf(attrs.gameSpeed); 747 768 } … … 1028 1049 } 1029 1050 if (!g_GameAttributes.settings.TriggerScripts) 1030 1051 g_GameAttributes.settings.TriggerScripts = g_GameAttributes.settings.VictoryScripts; 1031 1052 else 1032 1053 g_GameAttributes.settings.TriggerScripts = g_GameAttributes.settings.VictoryScripts.concat(g_GameAttributes.settings.TriggerScripts); 1054 1033 1055 g_GameStarted = true; 1034 1056 g_GameAttributes.settings.mapType = g_GameAttributes.mapType; 1035 1057 var numPlayers = g_GameAttributes.settings.PlayerData.length; 1036 1058 // Assign random civilizations to players with that choice 1037 1059 // (this is synchronized because we're the host) … … 1141 1163 { 1142 1164 var startingResourcesBox = Engine.GetGUIObjectByName("startingResources"); 1143 1165 startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources); 1144 1166 } 1145 1167 1168 if (mapSettings.Ceasefire) 1169 { 1170 var ceasefireBox = Engine.GetGUIObjectByName("ceasefire"); 1171 ceasefireBox.selected = ceasefireBox.list_data.indexOf(mapSettings.Ceasefire); 1172 } 1173 1146 1174 initMapNameList(); 1147 1175 } 1148 1176 1149 1177 // Controls common to all map types 1150 1178 var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection"); … … 1156 1184 var mapSize = Engine.GetGUIObjectByName("mapSize"); 1157 1185 var enableCheats = Engine.GetGUIObjectByName("enableCheats"); 1158 1186 var enableRating = Engine.GetGUIObjectByName("enableRating"); 1159 1187 var populationCap = Engine.GetGUIObjectByName("populationCap"); 1160 1188 var startingResources = Engine.GetGUIObjectByName("startingResources"); 1189 var ceasefire = Engine.GetGUIObjectByName("ceasefire"); 1161 1190 1162 1191 var numPlayersText= Engine.GetGUIObjectByName("numPlayersText"); 1163 1192 var mapSizeDesc = Engine.GetGUIObjectByName("mapSizeDesc"); 1164 1193 var mapSizeText = Engine.GetGUIObjectByName("mapSizeText"); 1165 1194 var revealMapText = Engine.GetGUIObjectByName("revealMapText"); … … 1169 1198 var lockTeamsText = Engine.GetGUIObjectByName("lockTeamsText"); 1170 1199 var enableCheatsText = Engine.GetGUIObjectByName("enableCheatsText"); 1171 1200 var enableRatingText = Engine.GetGUIObjectByName("enableRatingText"); 1172 1201 var populationCapText = Engine.GetGUIObjectByName("populationCapText"); 1173 1202 var startingResourcesText = Engine.GetGUIObjectByName("startingResourcesText"); 1203 var ceasefireText = Engine.GetGUIObjectByName("ceasefireText"); 1174 1204 var gameSpeedText = Engine.GetGUIObjectByName("gameSpeedText"); 1175 1205 var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed"); 1176 1206 1177 1207 // We have to check for undefined on these properties as not all maps define them. 1178 1208 var sizeIdx = (mapSettings.Size !== undefined && g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]); … … 1195 1225 gameSpeedBox.selected = speedIdx; 1196 1226 populationCap.selected = (mapSettings.PopulationCap !== undefined && POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) != -1 ? POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) : POPULATION_CAP_DEFAULTIDX); 1197 1227 populationCapText.caption = POPULATION_CAP[populationCap.selected]; 1198 1228 startingResources.selected = (mapSettings.StartingResources !== undefined && STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) != -1 ? STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) : STARTING_RESOURCES_DEFAULTIDX); 1199 1229 startingResourcesText.caption = STARTING_RESOURCES[startingResources.selected]; 1230 ceasefire.selected = (mapSettings.Ceasefire !== undefined && CEASEFIRE_DATA.indexOf(mapSettings.Ceasefire) != -1 ? CEASEFIRE_DATA.indexOf(mapSettings.Ceasefire) : CEASEFIRE_DEFAULTIDX); 1231 ceasefireText.caption = CEASEFIRE[ceasefire.selected]; 1200 1232 1201 1233 // Update map preview 1202 1234 Engine.GetGUIObjectByName("mapPreview").sprite = "cropped:(0.78125,0.5859375)session/icons/mappreview/" + getMapPreview(mapName); 1203 1235 1204 1236 // Hide/show settings depending on whether we can change them or not … … 1220 1252 updateDisplay(disableTreasures, disableTreasuresText, g_IsController); 1221 1253 updateDisplay(victoryCondition, victoryConditionText, g_IsController); 1222 1254 updateDisplay(lockTeams, lockTeamsText, g_IsController); 1223 1255 updateDisplay(populationCap, populationCapText, g_IsController); 1224 1256 updateDisplay(startingResources, startingResourcesText, g_IsController); 1257 updateDisplay(ceasefire, ceasefireText, g_IsController); 1225 1258 1226 1259 if (g_IsController) 1227 1260 { 1228 1261 //Host 1229 1262 numPlayersSelection.selected = numPlayers - 1; … … 1262 1295 updateDisplay(disableTreasures, disableTreasuresText, g_IsController); 1263 1296 updateDisplay(victoryCondition, victoryConditionText, g_IsController); 1264 1297 updateDisplay(lockTeams, lockTeamsText, g_IsController); 1265 1298 updateDisplay(populationCap, populationCapText, g_IsController); 1266 1299 updateDisplay(startingResources, startingResourcesText, g_IsController); 1300 updateDisplay(ceasefire, ceasefireText, g_IsController); 1267 1301 1268 1302 if (g_IsController) 1269 1303 { 1270 1304 //Host 1271 1305 revealMap.checked = (mapSettings.RevealMap ? true : false); … … 1288 1322 1289 1323 1290 1324 case "scenario": 1291 1325 // For scenario just reflect settings for the current map 1292 1326 numPlayersSelection.hidden = true; 1293 mapSize.hidden = true;1294 revealMap.hidden = true;1295 exploreMap.hidden = true;1296 disableTreasures.hidden = true;1297 victoryCondition.hidden = true;1298 lockTeams.hidden = true;1299 1327 numPlayersText.hidden = false; 1328 mapSize.hidden = true; 1300 1329 mapSizeText.hidden = true; 1301 1330 mapSizeDesc.hidden = true; 1331 revealMap.hidden = true; 1302 1332 revealMapText.hidden = false; 1333 exploreMap.hidden = true; 1303 1334 exploreMapText.hidden = false; 1335 disableTreasures.hidden = true; 1304 1336 disableTreasuresText.hidden = false; 1337 victoryCondition.hidden = true; 1305 1338 victoryConditionText.hidden = false; 1339 lockTeams.hidden = true; 1306 1340 lockTeamsText.hidden = false; 1307 populationCap.hidden = true;1308 populationCapText.hidden = false;1309 1341 startingResources.hidden = true; 1310 1342 startingResourcesText.hidden = false; 1311 1343 populationCap.hidden = true; 1344 populationCapText.hidden = false; 1345 ceasefire.hidden = true; 1346 ceasefireText.hidden = false; 1347 1312 1348 numPlayersText.caption = numPlayers; 1313 1349 mapSizeText.caption = translate("Default"); 1314 1350 revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No")); 1315 1351 exploreMapText.caption = (mapSettings.ExploreMap ? translate("Yes") : translate("No")); 1316 1352 disableTreasuresText.caption = translate("No"); 1317 1353 victoryConditionText.caption = victories.text[victoryIdx]; 1318 1354 lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No")); 1319 Engine.GetGUIObjectByName("populationCap").selected = POPULATION_CAP_DEFAULTIDX;1320 1355 1356 startingResourcesText.caption = translate("Determined by scenario"); 1357 populationCapText.caption = translate("Determined by scenario"); 1358 ceasefireText.caption = translate("Determined by scenario"); 1321 1359 break; 1322 1360 1323 1361 default: 1324 1362 error(sprintf("onGameAttributesChange: Unexpected map type '%(mapType)s'", { mapType: g_GameAttributes.mapType })); 1325 1363 return; -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
268 268 <!-- End Options --> 269 269 </object> 270 270 271 271 <!-- More Options --> 272 272 <object hidden="true" name="moreOptionsFade" type="image" z="60" sprite="ModernFade"/> 273 <object name="moreOptions" type="image" sprite="ModernDialog" size="50%-200 50%-195 50%+200 50%+ 190" z="70" hidden="true">273 <object name="moreOptions" type="image" sprite="ModernDialog" size="50%-200 50%-195 50%+200 50%+220" z="70" hidden="true"> 274 274 <object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14"> 275 275 <translatableAttribute id="caption">More Options</translatableAttribute> 276 276 </object> 277 277 278 278 <object size="14 38 94% 66"> … … 315 315 </object> 316 316 </object> 317 317 318 318 <object size="14 158 94% 186"> 319 319 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 320 <translatableAttribute id="caption">Ceasefire:</translatableAttribute> 321 </object> 322 <object name="ceasefireText" size="40% 0 100% 100%" type="text" style="ModernLeftLabelText"/> 323 <object name="ceasefire" size="40%+10 0 100% 28" type="dropdown" style="ModernDropDown" hidden="true" tooltip_style="onscreenToolTip"> 324 <translatableAttribute id="tooltip">Set time where no attacks are possible.</translatableAttribute> 325 </object> 326 </object> 327 328 <object size="14 188 94% 216"> 329 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 320 330 <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Revealed Map:</translatableAttribute> 321 331 </object> 322 332 <object name="revealMapText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 323 333 <object name="revealMap" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 324 334 <translatableAttribute id="tooltip" comment="Make sure to differentiate between the revealed map and explored map options!">Toggle revealed map (see everything).</translatableAttribute> 325 335 </object> 326 336 </object> 327 337 328 <object size="14 188 94% 216">338 <object size="14 218 94% 246"> 329 339 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 330 340 <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Explored Map:</translatableAttribute> 331 341 </object> 332 342 <object name="exploreMapText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 333 343 <object name="exploreMap" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 334 344 <translatableAttribute id="tooltip" comment="Make sure to differentiate between the revealed map and explored map options!">Toggle explored map (see initial map).</translatableAttribute> 335 345 </object> 336 346 </object> 337 347 338 <object size="14 2 18 94% 246">348 <object size="14 248 94% 276"> 339 349 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 340 350 <translatableAttribute id="caption">Disable Treasures:</translatableAttribute> 341 351 </object> 342 352 <object name="disableTreasuresText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 343 353 <object name="disableTreasures" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 344 354 <translatableAttribute id="tooltip">Disable all treasures on the map.</translatableAttribute> 345 355 </object> 346 356 </object> 347 357 348 <object size="14 2 48 94% 276">358 <object size="14 278 94% 306"> 349 359 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 350 360 <translatableAttribute id="caption">Teams Locked:</translatableAttribute> 351 361 </object> 352 362 <object name="lockTeamsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 353 363 <object name="lockTeams" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 354 364 <translatableAttribute id="tooltip">Toggle locked teams.</translatableAttribute> 355 365 </object> 356 366 </object> 357 367 358 <object name="optionCheats" size="14 278 94% 306" hidden="true">368 <object name="optionCheats" size="14 308 94% 336" hidden="true"> 359 369 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 360 370 <translatableAttribute id="caption">Cheats:</translatableAttribute> 361 371 </object> 362 372 <object name="enableCheatsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 363 373 <object name="enableCheats" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 364 374 <translatableAttribute id="tooltip">Toggle the usability of cheats.</translatableAttribute> 365 375 </object> 366 376 </object> 367 377 368 <object name="optionRating" size="14 3 08 94% 336" hidden="true">378 <object name="optionRating" size="14 338 94% 366" hidden="true"> 369 379 <object size="0 0 40% 28" hidden="false" type="text" style="ModernRightLabelText"> 370 380 <translatableAttribute id="caption">Rated Game:</translatableAttribute> 371 381 </object> 372 382 <object name="enableRatingText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 373 383 <object name="enableRating" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> … … 378 388 <!-- Hide More Options Button --> 379 389 <object 380 390 name="hideMoreOptions" 381 391 type="button" 382 392 style="StoneButton" 383 size="50%-70 3 40 50%+70 366"393 size="50%-70 370 50%+70 396" 384 394 tooltip_style="onscreenToolTip" 385 395 > 386 396 <translatableAttribute id="caption">OK</translatableAttribute> 387 397 <translatableAttribute id="tooltip">Close more game options window</translatableAttribute> 388 398 <action on="Press">toggleMoreOptions();</action> -
binaries/data/mods/public/gui/options/options.js
11 11 [translate("Disable Welcome Screen"), translate("If you disable this screen completely, you may miss important announcements.\nYou can still launch it using the main menu."), {"config":"splashscreendisable"}, "boolean"], 12 12 [translate("Detailed Tooltips"), translate("Show detailed tooltips for trainable units in unit-producing buildings."), {"config":"showdetailedtooltips"}, "boolean"], 13 13 [translate("FPS Overlay"), translate("Show frames per second in top right corner."), {"config":"overlay.fps"}, "boolean"], 14 14 [translate("Realtime Overlay"), translate("Show current system time in top right corner."), {"config":"overlay.realtime"}, "boolean"], 15 15 [translate("Gametime Overlay"), translate("Show current simulation time in top right corner."), {"config":"gui.session.timeelapsedcounter"}, "boolean"], 16 [translate("Ceasefire Time Overlay"), translate("Always show the remaining ceasefire time."), {"config":"gui.session.ceasefirecounter"}, "boolean"], 16 17 [translate("Persist match settings"), translate("Save and restore match settings for quick reuse when hosting another game"), {"config":"persistmatchsettings"}, "boolean"], 17 18 ], 18 19 "graphicsSetting": 19 20 [ 20 21 [translate("Prefer GLSL"), translate("Use OpenGL 2.0 shaders (recommended)"), {"renderer":"PreferGLSL", "config":"preferglsl"}, "boolean"], -
binaries/data/mods/public/gui/session/diplomacy_window.xml
70 70 <object name="diplomacyAttackRequestImage[n]" type="image" size="0 0 100% 100%" sprite="stretched:session/icons/attack-request.png" ghost="true"/> 71 71 </object> 72 72 </object> 73 73 </repeat> 74 74 </object> 75 75 76 <object name="diplomacyCeasefireCounter" size="32 100%-90 100%-32 100%-62" type="text" style="chatPanel" ghost="true"></object> 77 76 78 <object size="50%-64 100%-50 50%+64 100%-22" type="button" style="StoneButton"> 77 79 <translatableAttribute id="caption">Close</translatableAttribute> 78 80 <action on="Press">closeDiplomacy();</action> 79 81 </object> 80 82 </object> -
binaries/data/mods/public/gui/session/menu.js
341 341 button.hidden = false; 342 342 button.tooltip = formatTributeTooltip(g_Players[i], resource, 100); 343 343 } 344 344 345 345 // Attack Request 346 var ceasefireActive = GetSimState().ceasefireTimeRemaining > 0 346 347 let button = Engine.GetGUIObjectByName("diplomacyAttackRequest["+(i-1)+"]"); 347 button.hidden = !(g_Players[i].isEnemy[we]);348 button.hidden = ceasefireActive && !(g_Players[i].isEnemy[we]); 348 349 button.tooltip = translate("request for your allies to attack this enemy"); 349 350 button.onpress = (function(i, we){ return function() { 350 351 Engine.PostNetworkCommand({"type": "attack-request", "source": we, "target": i}); 351 352 } })(i, we); 352 353 … … 360 361 { 361 362 let button = Engine.GetGUIObjectByName("diplomacyPlayer"+setting+"["+(i-1)+"]"); 362 363 363 364 button.caption = g_Players[we]["is"+setting][i] ? translate("x") : ""; 364 365 button.onpress = (function(e){ return function() { setDiplomacy(e) } })({"player": i, "to": setting.toLowerCase()}); 365 button.hidden = false;366 button.hidden = ceasefireActive; 366 367 } 367 368 } 368 369 369 370 Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false; 370 371 } -
binaries/data/mods/public/gui/session/session.js
535 535 updateDebug(); 536 536 updatePlayerDisplay(); 537 537 updateSelectionDetails(); 538 538 updateBuildingPlacementPreview(); 539 539 updateTimeElapsedCounter(); 540 updateCeasefireCounter(); 540 541 updateTimeNotifications(); 541 542 if (!g_IsObserver) 542 543 updateResearchDisplay(); 543 544 544 545 if (!g_IsObserver && !g_GameEnded) … … 776 777 // Hide unused buttons. 777 778 for (var i = numButtons; i < 10; ++i) 778 779 Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true; 779 780 } 780 781 782 function updateCeasefireCounter() 783 { 784 var remainingTime = GetSimState().ceasefireTimeRemaining; 785 var remainingTimeString = timeToString(remainingTime); 786 787 var ceasefireCounter = Engine.GetGUIObjectByName("ceasefireCounter"); 788 var diplomacyCeasefireCounter = Engine.GetGUIObjectByName("diplomacyCeasefireCounter"); 789 790 ceasefireCounter.hidden = remainingTime == 0 || Engine.ConfigDB_GetValue("user", "gui.session.ceasefirecounter") !== "true"; 791 diplomacyCeasefireCounter.hidden = remainingTime == 0; 792 793 ceasefireCounter.caption = remainingTimeString; 794 diplomacyCeasefireCounter.caption = sprintf(translateWithContext("ceasefire", "Time remaining until ceasefire is over: %(time)s."), {"time": remainingTimeString}); 795 } 796 781 797 function updateTimeElapsedCounter() 782 798 { 783 799 var simState = GetSimState(); 784 800 var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter"); 785 801 if (g_CurrentSpeed != 1.0) … … 1040 1056 reportObject.playerID = Engine.GetPlayerID(); 1041 1057 reportObject.matchID = g_MatchID; 1042 1058 reportObject.civs = playerCivs; 1043 1059 reportObject.teams = teams; 1044 1060 reportObject.teamsLocked = String(teamsLocked); 1061 reportObject.ceasefireTime = String(extendedSimState.ceasefireTimeRemaining); 1045 1062 reportObject.mapName = mapName; 1046 1063 reportObject.economyScore = playerStatistics.economyScore; 1047 1064 reportObject.militaryScore = playerStatistics.militaryScore; 1048 1065 reportObject.totalScore = playerStatistics.totalScore; 1049 1066 for each (var rct in resourcesCounterTypes) -
binaries/data/mods/public/gui/session/session.xml
153 153 </action> 154 154 <action on="Press"> 155 155 Engine.ConfigDB_CreateValue("user", "gui.session.timeelapsedcounter", ""+this.hidden); 156 156 </action> 157 157 </object> 158 <object size="100%-120 125 100%-10 145" type="text" name="ceasefireCounter" style="SettingsText" hotkey="ceasefirecounter.toggle" hidden="true"> 159 <action on="Press"> 160 Engine.ConfigDB_CreateValue("user", "gui.session.ceasefirecounter", ""+this.hidden); 161 </action> 162 </object> 158 163 159 164 <!-- ================================ ================================ --> 160 165 <!-- Pause Overlay --> 161 166 <!-- ================================ ================================ --> 162 167 <object type="button" -
binaries/data/mods/public/simulation/components/Capturable.js
67 67 // Before changing the value, activate Fogging if necessary to hide changes 68 68 var cmpFogging = Engine.QueryInterface(this.entity, IID_Fogging); 69 69 if (cmpFogging) 70 70 cmpFogging.Activate(); 71 71 72 var enemiesFilter = function(v, i) { return v > 0 && !cmpPlayerSource.IsAlly(i); };72 var enemiesFilter = function(v, i) { return v > 0 && cmpPlayerSource.IsEnemy(i); }; 73 73 var numberOfEnemies = this.cp.filter(enemiesFilter).length; 74 74 75 75 if (numberOfEnemies == 0) 76 76 return 0; 77 77 78 78 // distribute the capture points over all enemies 79 79 var distributedAmount = amount / numberOfEnemies; 80 80 for (let i in this.cp) 81 81 { 82 if ( cmpPlayerSource.IsAlly(i))82 if (!cmpPlayerSource.IsEnemy(i)) 83 83 continue; 84 84 if (this.cp[i] > distributedAmount) 85 85 this.cp[i] -= distributedAmount; 86 86 else 87 87 this.cp[i] = 0; … … 119 119 if (!cmpPlayerSource) 120 120 warn(playerID + " has no player component defined on its id"); 121 121 var cp = this.GetCapturePoints() 122 122 var sourceEnemyCp = 0; 123 123 for (let i in this.GetCapturePoints()) 124 if ( !cmpPlayerSource.IsAlly(i))124 if (cmpPlayerSource.IsEnemy(i)) 125 125 sourceEnemyCp += cp[i]; 126 126 return sourceEnemyCp > 0; 127 127 }; 128 128 129 129 //// Private functions //// -
binaries/data/mods/public/simulation/components/GuiInterface.js
128 128 129 129 // Add timeElapsed 130 130 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 131 131 ret.timeElapsed = cmpTimer.GetTime(); 132 132 133 // Copies the time from last player to simulation state 134 ret.ceasefireTime = cmpPlayer.GetCeasefireTime(); 135 ret.ceasefireTimeRemaining = Math.max(0, ret.ceasefireTime - ret.timeElapsed); 136 133 137 // Add the game type 134 138 var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); 135 139 ret.gameType = cmpEndGameManager.GetGameType(); 136 140 137 141 // Add bartering prices … … 710 714 GuiInterface.prototype.AddTimeNotification = function(notification, duration = 10000) 711 715 { 712 716 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 713 717 notification.endTime = duration + cmpTimer.GetTime(); 714 718 notification.id = ++this.timeNotificationID; 719 720 // Let all players receive the notification by default 721 if (notification.players == undefined) 722 { 723 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 724 var numPlayers = cmpPlayerManager.GetNumPlayers(); 725 notification.players = []; 726 for (var i = 1; i < numPlayers; i++) 727 notification.players.push(i); 728 } 729 715 730 this.timeNotifications.push(notification); 716 731 this.timeNotifications.sort(function (n1, n2){return n2.endTime - n1.endTime}); 717 732 718 733 cmpTimer.SetTimeout(this.entity, IID_GuiInterface, "DeleteTimeNotification", duration, this.timeNotificationID); 719 734 … … 1733 1748 var cmpTargetPlayer = QueryOwnerInterface(data.target, IID_Player); 1734 1749 if (!cmpEntityPlayer || !cmpTargetPlayer) 1735 1750 return false; 1736 1751 1737 1752 // if the owner is an enemy, it's up to the attack component to decide 1738 if ( !cmpEntityPlayer.IsAlly(cmpTargetPlayer.GetPlayerID()))1753 if (cmpEntityPlayer.IsEnemy(cmpTargetPlayer.GetPlayerID())) 1739 1754 return cmpAttack.CanAttack(data.target); 1740 1755 return false; 1741 1756 }; 1742 1757 1743 1758 /* -
binaries/data/mods/public/simulation/components/Player.js
25 25 { "goods": "metal", "proba": 35 } ]; 26 26 this.team = -1; // team number of the player, players on the same team will always have ally diplomatic status - also this is useful for team emblems, scoring, etc. 27 27 this.teamsLocked = false; 28 28 this.state = "active"; // game state - one of "active", "defeated", "won" 29 29 this.diplomacy = []; // array of diplomatic stances for this player with respect to other players (including gaia and self) 30 this.ceasefireTime = 0; // ceasefire timeout in milliseconds 30 31 this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class 31 32 this.formations = []; 32 33 this.startCam = undefined; 33 34 this.controlAllUnits = false; 34 35 this.isAI = false; … … 442 443 443 444 Engine.BroadcastMessage(MT_DiplomacyChanged, {"player": this.playerID}); 444 445 } 445 446 }; 446 447 448 Player.prototype.GetCeasefireTime = function() 449 { 450 return this.ceasefireTime; 451 }; 452 453 // This method should be called only once for triggering ceasefire 454 Player.prototype.StartCeasefire = function(ceasefireTime) 455 { 456 if (ceasefireTime == 0) 457 return; 458 459 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 460 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 461 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 462 var numPlayers = cmpPlayerManager.GetNumPlayers(); 463 464 // Save ceasefire time 465 this.ceasefireTime = ceasefireTime; 466 467 // Save original alliances 468 // Copy array with slice(), otherwise it will change 469 var diplomacyBeforeCeasefire = []; 470 for (var i = 1; i < numPlayers; i++) 471 { 472 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player); 473 diplomacyBeforeCeasefire.push(cmpPlayer.GetDiplomacy().slice()); 474 } 475 476 // Set every enemy (except gaia) to neutral 477 for (var i = 1; i < numPlayers; i++) 478 { 479 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player); 480 481 for (var j = 1; j < numPlayers; j++) 482 { 483 if (diplomacyBeforeCeasefire[i-1][j] < 0) 484 cmpPlayer.SetNeutral(j); 485 } 486 } 487 488 // Remove existing timer and messages 489 if (this.ceasefireCountdownMessageTimer) 490 cmpTimer.CancelTimer(this.ceasefireCountdownMessageTimer); 491 492 if (this.stopCeasefireTimer) 493 cmpTimer.CancelTimer(this.stopCeasefireTimer); 494 495 if (this.ceasefireCountdownMessage) 496 cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage); 497 498 if (this.ceasefireEndedMessage) 499 cmpGuiInterface.DeleteTimeNotification(this.ceasefireEndedMessage); 500 501 // Add countdown message for the last 10 seconds 502 var messageDuration = 10000; 503 this.stopCeasefireTimer = cmpTimer.SetTimeout(this.entity, IID_Player, "StopCeasefire", this.ceasefireTime, diplomacyBeforeCeasefire); 504 this.ceasefireCountdownMessageTimer = cmpTimer.SetTimeout(this.entity, IID_Player, "ShowCeasefireCountdownMessage", 505 this.ceasefireTime - messageDuration, messageDuration); 506 }; 507 508 Player.prototype.ShowCeasefireCountdownMessage = function(duration) 509 { 510 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 511 this.ceasefireCountdownMessage = cmpGuiInterface.AddTimeNotification({ 512 "message": markForTranslation("Ceasefire will end in %(time)s"), 513 "translateMessage": true 514 }, duration); 515 } 516 517 Player.prototype.StopCeasefire = function(diplomacyBeforeCeasefire) 518 { 519 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 520 521 // Remove previous message 522 if (this.ceasefireCountdownMessage) 523 cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage); 524 525 // Show new message 526 this.ceasefireEndedMessage = cmpGuiInterface.AddTimeNotification({ 527 "message": markForTranslation("Ceasefire has ended!"), 528 "translateMessage": true 529 }, 5000); 530 531 // Reset diplomacies to original settings 532 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 533 var numPlayers = cmpPlayerManager.GetNumPlayers(); 534 for (var i = 1; i < numPlayers; i++) 535 { 536 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player); 537 cmpPlayer.SetDiplomacy(diplomacyBeforeCeasefire[i-1]); 538 } 539 540 // Send messages in order to update the diplomacy screen 541 for (var i = 1; i < numPlayers; i++) 542 { 543 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player); 544 for (var j = 1; j < numPlayers; j++) 545 { 546 if (i != j && diplomacyBeforeCeasefire[i-1][j] != -1) 547 cmpGuiInterface.PushNotification({"type": "diplomacy", "players": [j], "player1": [i], "status": "enemy"}); 548 } 549 } 550 } 551 447 552 Player.prototype.UpdateSharedLos = function() 448 553 { 449 554 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 450 555 if (!cmpRangeManager) 451 556 return; -
binaries/data/mods/public/simulation/helpers/Player.js
153 153 var startCam = getSetting(playerData, playerDefaults, i, "StartingCamera"); 154 154 if (startCam !== undefined) 155 155 cmpPlayer.SetStartingCamera(startCam.Position, startCam.Rotation); 156 156 } 157 157 158 // set ceasefire only for last player -> TODO refactoring, move functions to an individual component 159 if (settings.Ceasefire !== undefined) 160 cmpPlayer.StartCeasefire(settings.Ceasefire * 60 * 1000); 161 158 162 // NOTE: We need to do the team locking here, as otherwise 159 163 // SetTeam can't ally the players. 160 164 if (settings.LockTeams) 161 165 for (var i = 0; i < numPlayers; ++i) 162 166 {