Ticket #2749: t2749_ceasefire_v2.patch

File t2749_ceasefire_v2.patch, 34.0 KB (added by elexis, 9 years ago)
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    1212const POPULATION_CAP_DEFAULTIDX = 5;
    1313// Translation: Amount of starting resources.
    1414const STARTING_RESOURCES = [translateWithContext("startingResources", "Very Low"), translateWithContext("startingResources", "Low"), translateWithContext("startingResources", "Medium"), translateWithContext("startingResources", "High"), translateWithContext("startingResources", "Very High"), translateWithContext("startingResources", "Deathmatch")];
    1515const STARTING_RESOURCES_DATA = [100, 300, 500, 1000, 3000, 50000];
    1616const STARTING_RESOURCES_DEFAULTIDX = 1;
     17// Translation: Ceasefire.
     18const 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")];
     19const CEASEFIRE_DATA = [0, 0.25, 5, 10, 15, 20, 30, 45, 60];
     20const CEASEFIRE_DEFAULTIDX = 0;
    1721// Max number of players for any map
    1822const MAX_PLAYERS = 8;
    1923
    2024////////////////////////////////////////////////////////////////////////////////////////////////
    2125
     
    203207                g_GameAttributes.settings.StartingResources = STARTING_RESOURCES_DATA[this.selected];
    204208
    205209            updateGameAttributes();
    206210        }
    207211
     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
    208223        var victoryConditions = Engine.GetGUIObjectByName("victoryCondition");
    209224        var victories = getVictoryConditions();
    210225        victoryConditions.list = victories.text;
    211226        victoryConditions.list_data = victories.data;
    212227        victoryConditions.onSelectionChange = function() {
     
    738753    {
    739754        var startingResourcesBox = Engine.GetGUIObjectByName("startingResources");
    740755        startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources);
    741756    }
    742757
     758    if (mapSettings.Ceasefire)
     759    {
     760        var ceasefireBox = Engine.GetGUIObjectByName("ceasefire");
     761        ceasefireBox.selected = ceasefireBox.list_data.indexOf(mapSettings.Ceasefire);
     762    }
     763
    743764    if (attrs.gameSpeed)
    744765    {
    745766        var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed");
    746767        gameSpeedBox.selected = g_GameSpeeds.speeds.indexOf(attrs.gameSpeed);
    747768    }
     
    10281049    }
    10291050    if (!g_GameAttributes.settings.TriggerScripts)
    10301051        g_GameAttributes.settings.TriggerScripts = g_GameAttributes.settings.VictoryScripts;
    10311052    else
    10321053        g_GameAttributes.settings.TriggerScripts = g_GameAttributes.settings.VictoryScripts.concat(g_GameAttributes.settings.TriggerScripts);
     1054
    10331055    g_GameStarted = true;
    10341056    g_GameAttributes.settings.mapType = g_GameAttributes.mapType;
    10351057    var numPlayers = g_GameAttributes.settings.PlayerData.length;
    10361058    // Assign random civilizations to players with that choice
    10371059    //  (this is synchronized because we're the host)
     
    11411163        {
    11421164            var startingResourcesBox = Engine.GetGUIObjectByName("startingResources");
    11431165            startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources);
    11441166        }
    11451167
     1168        if (mapSettings.Ceasefire)
     1169        {
     1170            var ceasefireBox = Engine.GetGUIObjectByName("ceasefire");
     1171            ceasefireBox.selected = ceasefireBox.list_data.indexOf(mapSettings.Ceasefire);
     1172        }
     1173
    11461174        initMapNameList();
    11471175    }
    11481176
    11491177    // Controls common to all map types
    11501178    var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
     
    11561184    var mapSize = Engine.GetGUIObjectByName("mapSize");
    11571185    var enableCheats = Engine.GetGUIObjectByName("enableCheats");
    11581186    var enableRating = Engine.GetGUIObjectByName("enableRating");
    11591187    var populationCap = Engine.GetGUIObjectByName("populationCap");
    11601188    var startingResources = Engine.GetGUIObjectByName("startingResources");
     1189    var ceasefire = Engine.GetGUIObjectByName("ceasefire");
    11611190
    11621191    var numPlayersText= Engine.GetGUIObjectByName("numPlayersText");
    11631192    var mapSizeDesc = Engine.GetGUIObjectByName("mapSizeDesc");
    11641193    var mapSizeText = Engine.GetGUIObjectByName("mapSizeText");
    11651194    var revealMapText = Engine.GetGUIObjectByName("revealMapText");
     
    11691198    var lockTeamsText = Engine.GetGUIObjectByName("lockTeamsText");
    11701199    var enableCheatsText = Engine.GetGUIObjectByName("enableCheatsText");
    11711200    var enableRatingText = Engine.GetGUIObjectByName("enableRatingText");
    11721201    var populationCapText = Engine.GetGUIObjectByName("populationCapText");
    11731202    var startingResourcesText = Engine.GetGUIObjectByName("startingResourcesText");
     1203    var ceasefireText = Engine.GetGUIObjectByName("ceasefireText");
    11741204    var gameSpeedText = Engine.GetGUIObjectByName("gameSpeedText");
    11751205    var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed");
    11761206
    11771207    // We have to check for undefined on these properties as not all maps define them.
    11781208    var sizeIdx = (mapSettings.Size !== undefined && g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]);
     
    11951225    gameSpeedBox.selected = speedIdx;
    11961226    populationCap.selected = (mapSettings.PopulationCap !== undefined && POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) != -1 ? POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) : POPULATION_CAP_DEFAULTIDX);
    11971227    populationCapText.caption = POPULATION_CAP[populationCap.selected];
    11981228    startingResources.selected = (mapSettings.StartingResources !== undefined && STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) != -1 ? STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) : STARTING_RESOURCES_DEFAULTIDX);
    11991229    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];
    12001232
    12011233    // Update map preview
    12021234    Engine.GetGUIObjectByName("mapPreview").sprite = "cropped:(0.78125,0.5859375)session/icons/mappreview/" + getMapPreview(mapName);
    12031235
    12041236    // Hide/show settings depending on whether we can change them or not
     
    12201252        updateDisplay(disableTreasures, disableTreasuresText, g_IsController);
    12211253        updateDisplay(victoryCondition, victoryConditionText, g_IsController);
    12221254        updateDisplay(lockTeams, lockTeamsText, g_IsController);
    12231255        updateDisplay(populationCap, populationCapText, g_IsController);
    12241256        updateDisplay(startingResources, startingResourcesText, g_IsController);
     1257        updateDisplay(ceasefire, ceasefireText, g_IsController);
    12251258
    12261259        if (g_IsController)
    12271260        {
    12281261            //Host
    12291262            numPlayersSelection.selected = numPlayers - 1;
     
    12621295        updateDisplay(disableTreasures, disableTreasuresText, g_IsController);
    12631296        updateDisplay(victoryCondition, victoryConditionText, g_IsController);
    12641297        updateDisplay(lockTeams, lockTeamsText, g_IsController);
    12651298        updateDisplay(populationCap, populationCapText, g_IsController);
    12661299        updateDisplay(startingResources, startingResourcesText, g_IsController);
     1300        updateDisplay(ceasefire, ceasefireText, g_IsController);
    12671301
    12681302        if (g_IsController)
    12691303        {
    12701304            //Host
    12711305            revealMap.checked = (mapSettings.RevealMap ? true : false);
     
    12881322
    12891323
    12901324    case "scenario":
    12911325        // For scenario just reflect settings for the current map
    12921326        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;
    12991327        numPlayersText.hidden = false;
     1328        mapSize.hidden = true;
    13001329        mapSizeText.hidden = true;
    13011330        mapSizeDesc.hidden = true;
     1331        revealMap.hidden = true;
    13021332        revealMapText.hidden = false;
     1333        exploreMap.hidden = true;
    13031334        exploreMapText.hidden = false;
     1335        disableTreasures.hidden = true;
    13041336        disableTreasuresText.hidden = false;
     1337        victoryCondition.hidden = true;
    13051338        victoryConditionText.hidden = false;
     1339        lockTeams.hidden = true;
    13061340        lockTeamsText.hidden = false;
    1307         populationCap.hidden = true;
    1308         populationCapText.hidden = false;
    13091341        startingResources.hidden = true;
    13101342        startingResourcesText.hidden = false;
    1311 
     1343        populationCap.hidden = true;
     1344        populationCapText.hidden = false;
     1345        ceasefire.hidden = true;
     1346        ceasefireText.hidden = false;
     1347       
    13121348        numPlayersText.caption = numPlayers;
    13131349        mapSizeText.caption = translate("Default");
    13141350        revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No"));
    13151351        exploreMapText.caption = (mapSettings.ExploreMap ? translate("Yes") : translate("No"));
    13161352        disableTreasuresText.caption = translate("No");
    13171353        victoryConditionText.caption = victories.text[victoryIdx];
    13181354        lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No"));
    1319         Engine.GetGUIObjectByName("populationCap").selected = POPULATION_CAP_DEFAULTIDX;
    13201355
     1356        startingResourcesText.caption = translate("Determined by scenario");
     1357        populationCapText.caption = translate("Determined by scenario");
     1358        ceasefireText.caption = translate("Determined by scenario");
    13211359        break;
    13221360
    13231361    default:
    13241362        error(sprintf("onGameAttributesChange: Unexpected map type '%(mapType)s'", { mapType: g_GameAttributes.mapType }));
    13251363        return;
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    268268            <!-- End Options -->
    269269            </object>
    270270
    271271            <!-- More Options -->
    272272            <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">
    274274                <object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
    275275                    <translatableAttribute id="caption">More Options</translatableAttribute>
    276276                </object>
    277277
    278278                <object size="14 38 94% 66">
     
    315315                    </object>
    316316                </object>
    317317
    318318                <object size="14 158 94% 186">
    319319                    <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">
    320330                        <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Revealed Map:</translatableAttribute>
    321331                    </object>
    322332                    <object name="revealMapText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    323333                    <object name="revealMap" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    324334                        <translatableAttribute id="tooltip" comment="Make sure to differentiate between the revealed map and explored map options!">Toggle revealed map (see everything).</translatableAttribute>
    325335                    </object>
    326336                </object>
    327337
    328                 <object size="14 188 94% 216">
     338                <object size="14 218 94% 246">
    329339                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    330340                        <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Explored Map:</translatableAttribute>
    331341                    </object>
    332342                    <object name="exploreMapText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    333343                    <object name="exploreMap" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    334344                        <translatableAttribute id="tooltip" comment="Make sure to differentiate between the revealed map and explored map options!">Toggle explored map (see initial map).</translatableAttribute>
    335345                    </object>
    336346                </object>
    337347
    338                 <object size="14 218 94% 246">
     348                <object size="14 248 94% 276">
    339349                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    340350                        <translatableAttribute id="caption">Disable Treasures:</translatableAttribute>
    341351                    </object>
    342352                    <object name="disableTreasuresText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    343353                    <object name="disableTreasures" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    344354                        <translatableAttribute id="tooltip">Disable all treasures on the map.</translatableAttribute>
    345355                    </object>
    346356                </object>
    347357
    348                 <object size="14 248 94% 276">
     358                <object size="14 278 94% 306">
    349359                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    350360                        <translatableAttribute id="caption">Teams Locked:</translatableAttribute>
    351361                    </object>
    352362                    <object name="lockTeamsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    353363                    <object name="lockTeams" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    354364                        <translatableAttribute id="tooltip">Toggle locked teams.</translatableAttribute>
    355365                    </object>
    356366                </object>
    357367
    358                 <object name="optionCheats" size="14 278 94% 306" hidden="true">
     368                <object name="optionCheats" size="14 308 94% 336" hidden="true">
    359369                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    360370                        <translatableAttribute id="caption">Cheats:</translatableAttribute>
    361371                    </object>
    362372                    <object name="enableCheatsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    363373                    <object name="enableCheats" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    364374                        <translatableAttribute id="tooltip">Toggle the usability of cheats.</translatableAttribute>
    365375                    </object>
    366376                </object>
    367377
    368                 <object name="optionRating" size="14 308 94% 336" hidden="true">
     378                <object name="optionRating" size="14 338 94% 366" hidden="true">
    369379                    <object size="0 0 40% 28" hidden="false" type="text" style="ModernRightLabelText">
    370380                        <translatableAttribute id="caption">Rated Game:</translatableAttribute>
    371381                    </object>
    372382                    <object name="enableRatingText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    373383                    <object name="enableRating" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
     
    378388                <!-- Hide More Options Button -->
    379389                <object
    380390                    name="hideMoreOptions"
    381391                    type="button"
    382392                    style="StoneButton"
    383                     size="50%-70 340 50%+70 366"
     393                    size="50%-70 370 50%+70 396"
    384394                    tooltip_style="onscreenToolTip"
    385395                >
    386396                    <translatableAttribute id="caption">OK</translatableAttribute>
    387397                    <translatableAttribute id="tooltip">Close more game options window</translatableAttribute>
    388398                    <action on="Press">toggleMoreOptions();</action>
  • binaries/data/mods/public/gui/options/options.js

     
    1111        [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"],
    1212        [translate("Detailed Tooltips"), translate("Show detailed tooltips for trainable units in unit-producing buildings."), {"config":"showdetailedtooltips"}, "boolean"],
    1313        [translate("FPS Overlay"), translate("Show frames per second in top right corner."), {"config":"overlay.fps"}, "boolean"],
    1414        [translate("Realtime Overlay"), translate("Show current system time in top right corner."), {"config":"overlay.realtime"}, "boolean"],
    1515        [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"],
    1617        [translate("Persist match settings"), translate("Save and restore match settings for quick reuse when hosting another game"), {"config":"persistmatchsettings"}, "boolean"],
    1718    ],
    1819    "graphicsSetting":
    1920    [
    2021        [translate("Prefer GLSL"), translate("Use OpenGL 2.0 shaders (recommended)"), {"renderer":"PreferGLSL", "config":"preferglsl"}, "boolean"],
  • binaries/data/mods/public/gui/session/diplomacy_window.xml

     
    7070                    <object name="diplomacyAttackRequestImage[n]" type="image" size="0 0 100% 100%" sprite="stretched:session/icons/attack-request.png" ghost="true"/>
    7171                </object>
    7272            </object>
    7373        </repeat>
    7474    </object>
    75 
     75   
     76    <object name="diplomacyCeasefireCounter" size="32 100%-90 100%-32 100%-62" type="text" style="chatPanel" ghost="true"></object>
     77   
    7678    <object size="50%-64 100%-50 50%+64 100%-22" type="button" style="StoneButton">
    7779        <translatableAttribute id="caption">Close</translatableAttribute>
    7880        <action on="Press">closeDiplomacy();</action>
    7981    </object>
    8082</object>
  • binaries/data/mods/public/gui/session/menu.js

     
    341341            button.hidden = false;
    342342            button.tooltip = formatTributeTooltip(g_Players[i], resource, 100);
    343343        }
    344344
    345345        // Attack Request
     346        var simState = GetSimState();
    346347        let button = Engine.GetGUIObjectByName("diplomacyAttackRequest["+(i-1)+"]");
    347         button.hidden = !(g_Players[i].isEnemy[we]);
     348        button.hidden = simState.ceasefireActive && !(g_Players[i].isEnemy[we]);
    348349        button.tooltip = translate("request for your allies to attack this enemy");
    349350        button.onpress = (function(i, we){ return function() {
    350351            Engine.PostNetworkCommand({"type": "attack-request", "source": we, "target": i});
    351352        } })(i, we);
    352353
     
    360361        {
    361362            let button = Engine.GetGUIObjectByName("diplomacyPlayer"+setting+"["+(i-1)+"]");
    362363
    363364            button.caption = g_Players[we]["is"+setting][i] ? translate("x") : "";
    364365            button.onpress = (function(e){ return function() { setDiplomacy(e) } })({"player": i, "to": setting.toLowerCase()});
    365             button.hidden = false;
     366            button.hidden = simState.ceasefireActive;
    366367        }
    367368    }
    368369
    369370    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false;
    370371}
  • binaries/data/mods/public/gui/session/session.js

     
    537537    updateDebug();
    538538    updatePlayerDisplay();
    539539    updateSelectionDetails();
    540540    updateBuildingPlacementPreview();
    541541    updateTimeElapsedCounter();
     542    updateCeasefireCounter();
    542543    updateTimeNotifications();
    543544    if (!g_IsObserver)
    544545        updateResearchDisplay();
    545546
    546547    if (!g_IsObserver && !g_GameEnded)
     
    778779    // Hide unused buttons.
    779780    for (var i = numButtons; i < 10; ++i)
    780781        Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
    781782}
    782783
     784function updateCeasefireCounter()
     785{
     786    var simState = GetSimState();
     787    var isActive = simState.ceasefireActive;
     788    var remainingTimeString = timeToString(simState.ceasefireTimeRemaining);
     789   
     790    var ceasefireCounter = Engine.GetGUIObjectByName("ceasefireCounter");
     791    var diplomacyCeasefireCounter = Engine.GetGUIObjectByName("diplomacyCeasefireCounter");
     792   
     793    ceasefireCounter.hidden = !isActive || Engine.ConfigDB_GetValue("user", "gui.session.ceasefirecounter") !== "true";
     794    diplomacyCeasefireCounter.hidden = !isActive;
     795   
     796    ceasefireCounter.caption = remainingTimeString;
     797    diplomacyCeasefireCounter.caption = sprintf(translateWithContext("ceasefire", "Time remaining until ceasefire is over: %(time)s."), {"time": remainingTimeString});
     798}
     799
    783800function updateTimeElapsedCounter()
    784801{
    785802    var simState = GetSimState();
    786803    var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter");
    787804    if (g_CurrentSpeed != 1.0)
     
    10421059    reportObject.playerID = Engine.GetPlayerID();
    10431060    reportObject.matchID = g_MatchID;
    10441061    reportObject.civs = playerCivs;
    10451062    reportObject.teams = teams;
    10461063    reportObject.teamsLocked = String(teamsLocked);
     1064    reportObject.ceasefireActive = String(extendedSimState.ceasefireActive);
     1065    reportObject.ceasefireTimeRemaining = String(extendedSimState.ceasefireTimeRemaining);
    10471066    reportObject.mapName = mapName;
    10481067    reportObject.economyScore = playerStatistics.economyScore;
    10491068    reportObject.militaryScore = playerStatistics.militaryScore;
    10501069    reportObject.totalScore = playerStatistics.totalScore;
    10511070    for each (var rct in resourcesCounterTypes)
  • binaries/data/mods/public/gui/session/session.xml

     
    153153            </action>
    154154            <action on="Press">
    155155                Engine.ConfigDB_CreateValue("user", "gui.session.timeelapsedcounter", ""+this.hidden);
    156156            </action>
    157157    </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>
    158163
    159164    <!-- ================================  ================================ -->
    160165    <!-- Pause Overlay -->
    161166    <!-- ================================  ================================ -->
    162167    <object type="button"
  • binaries/data/mods/public/simulation/components/Capturable.js

     
    6767    // Before changing the value, activate Fogging if necessary to hide changes
    6868    var cmpFogging = Engine.QueryInterface(this.entity, IID_Fogging);
    6969    if (cmpFogging)
    7070        cmpFogging.Activate();
    7171
    72     var enemiesFilter = function(v, i) { return v > 0 && !cmpPlayerSource.IsAlly(i); };
     72    var enemiesFilter = function(v, i) { return v > 0 && cmpPlayerSource.IsEnemy(i); };
    7373    var numberOfEnemies = this.cp.filter(enemiesFilter).length;
    7474
    7575    if (numberOfEnemies == 0)
    7676        return 0;
    7777
    7878    // distribute the capture points over all enemies
    7979    var distributedAmount = amount / numberOfEnemies;
    8080    for (let i in this.cp)
    8181    {
    82         if (cmpPlayerSource.IsAlly(i))
     82        if (!cmpPlayerSource.IsEnemy(i))
    8383            continue;
    8484        if (this.cp[i] > distributedAmount)
    8585            this.cp[i] -= distributedAmount;
    8686        else
    8787            this.cp[i] = 0;
     
    119119    if (!cmpPlayerSource)
    120120        warn(playerID + " has no player component defined on its id");
    121121    var cp = this.GetCapturePoints()
    122122    var sourceEnemyCp = 0;
    123123    for (let i in this.GetCapturePoints())
    124         if (!cmpPlayerSource.IsAlly(i))
     124        if (cmpPlayerSource.IsEnemy(i))
    125125            sourceEnemyCp += cp[i];
    126126    return sourceEnemyCp > 0;
    127127};
    128128
    129129//// Private functions ////
  • binaries/data/mods/public/simulation/components/CeasefireManager.js

     
     1function CeasefireManager() {}
     2
     3CeasefireManager.prototype.Schema =
     4    "<a:component type='system'/><empty/>";
     5
     6CeasefireManager.prototype.Init = function()
     7{
     8    // Weather or not ceasefire is active currently.
     9    this.ceasefireIsActive = false;
     10   
     11    // Ceasefire timeout in milliseconds
     12    this.ceasefireTime = 0;
     13   
     14    // Time elapsed when the ceasefire was started
     15    this.ceasefireStartedTime = 0;
     16
     17    // diplomacy states before the ceasefire started
     18    this.diplomacyBeforeCeasefire = [];
     19
     20    // Message duration for the countdown in milliseconds
     21    this.countdownMessageDuration = 10000;
     22
     23    // Duration for the post ceasefire message in milliseconds
     24    this.postCountdownMessageDuration = 5000;
     25}
     26
     27CeasefireManager.prototype.IsCeasefireActive = function()
     28{
     29    return this.ceasefireIsActive;
     30};
     31
     32CeasefireManager.prototype.GetCeasefireStartedTime = function()
     33{
     34    return this.ceasefireStartedTime;
     35};
     36
     37CeasefireManager.prototype.GetCeasefireTime = function()
     38{
     39    return this.ceasefireTime;
     40};
     41
     42CeasefireManager.prototype.GetDiplomacyBeforeCeasefire = function()
     43{
     44    return this.diplomacyBeforeCeasefire;
     45};
     46
     47CeasefireManager.prototype.StartCeasefire = function(ceasefireTime)
     48{
     49    // if invalid timeout given or already running, return
     50    if (ceasefireTime <= 0)
     51        return;
     52   
     53    // Remove existing timers
     54    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
     55    if (this.ceasefireCountdownMessageTimer)
     56        cmpTimer.CancelTimer(this.ceasefireCountdownMessageTimer);
     57
     58    if (this.stopCeasefireTimer)
     59        cmpTimer.CancelTimer(this.stopCeasefireTimer);
     60
     61    // Remove existing messages
     62    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     63    if (this.ceasefireCountdownMessage)
     64        cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage);
     65
     66    if (this.ceasefireEndedMessage)
     67        cmpGuiInterface.DeleteTimeNotification(this.ceasefireEndedMessage);
     68
     69
     70    // Save diplomacy and set everyone neutral
     71    if (!this.ceasefireIsActive)
     72    {
     73        // Save diplomacy
     74        var playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
     75        for (var i = 1; i < playerEntities.length; i++)
     76        {
     77            // Copy array with slice(), otherwise it will change
     78            var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     79            this.diplomacyBeforeCeasefire.push(cmpPlayer.GetDiplomacy().slice());
     80        }
     81
     82        // Set every enemy (except gaia) to neutral
     83        for (var i = 1; i < playerEntities.length; i++)
     84        {
     85            var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     86            for (var j = 1; j < playerEntities.length; j++)
     87            {
     88                if (this.diplomacyBeforeCeasefire[i-1][j] < 0)
     89                    cmpPlayer.SetNeutral(j);
     90            }
     91        }
     92    }
     93   
     94    // Save other data
     95    this.ceasefireIsActive = true;
     96    this.ceasefireTime = ceasefireTime;
     97    this.ceasefireStartedTime = (typeof GetSimState == 'function') ? GetSimState().timeElapsed : 0;
     98
     99    // Add timers for countdown message and reseting diplomacy
     100    this.stopCeasefireTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_CeasefireManager, "StopCeasefire", this.ceasefireTime);
     101    this.ceasefireCountdownMessageTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_CeasefireManager, "ShowCeasefireCountdownMessage",
     102            this.ceasefireTime - this.countdownMessageDuration, this.countdownMessageDuration);
     103};
     104
     105CeasefireManager.prototype.ShowCeasefireCountdownMessage = function(duration)
     106{
     107    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     108    this.ceasefireCountdownMessage = cmpGuiInterface.AddTimeNotification({
     109        "message": markForTranslation("Ceasefire will end in %(time)s"),
     110        "translateMessage": true
     111    }, duration);
     112}
     113
     114CeasefireManager.prototype.StopCeasefire = function()
     115{
     116    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     117
     118    // Remove previous message
     119    if (this.ceasefireCountdownMessage)
     120        cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage);
     121   
     122    // Show new message
     123    this.ceasefireEndedMessage = cmpGuiInterface.AddTimeNotification({
     124        "message": markForTranslation("Ceasefire has ended!"),
     125        "translateMessage": true
     126    }, this.postCountdownMessageDuration);
     127   
     128    // Reset diplomacies to original settings
     129    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     130    var playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
     131    for (var i = 1; i < playerEntities.length; i++)
     132    {
     133        var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     134        cmpPlayer.SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]);
     135    }       
     136
     137    // Send messages in order to update the diplomacy screen
     138    for (var i = 1; i < playerEntities.length; i++)
     139    {
     140        var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     141        for (var j = 1; j < playerEntities.length; j++)
     142            if (i != j && this.diplomacyBeforeCeasefire[i-1][j] != -1)
     143                cmpGuiInterface.PushNotification({"type": "diplomacy", "players": [j], "player1": [i], "status": "enemy"});
     144    }   
     145   
     146    // reset values
     147    this.ceasefireIsActive = false;
     148    this.ceasefireTime = 0;
     149    this.ceasefireStartedTime = 0;
     150    this.diplomacyBeforeCeasefire = [];
     151}
     152
     153Engine.RegisterSystemComponentType(IID_CeasefireManager, "CeasefireManager", CeasefireManager);
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    116116            "classCounts": cmpTechnologyManager ? cmpTechnologyManager.GetClassCounts() : null,
    117117            "typeCountsByClass": cmpTechnologyManager ? cmpTechnologyManager.GetTypeCountsByClass() : null
    118118        };
    119119        ret.players.push(playerData);
    120120    }
    121 
     121   
    122122    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    123123    if (cmpRangeManager)
    124124        ret.circularMap = cmpRangeManager.GetLosCircular();
    125125
    126126    var cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
     
    128128        ret.mapSize = 4 * cmpTerrain.GetTilesPerSide();
    129129
    130130    // Add timeElapsed
    131131    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
    132132    ret.timeElapsed = cmpTimer.GetTime();
    133 
     133   
     134    // Add ceasefire info
     135    var cmpCeasefireManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_CeasefireManager);
     136    if (cmpCeasefireManager)
     137    {
     138        ret.ceasefireActive = cmpCeasefireManager.IsCeasefireActive();
     139        ret.ceasefireTimeRemaining = cmpCeasefireManager.GetCeasefireStartedTime() + cmpCeasefireManager.GetCeasefireTime() - ret.timeElapsed;
     140    }
     141   
    134142    // Add the game type
    135143    var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
    136144    ret.gameType = cmpEndGameManager.GetGameType();
    137145
    138146    // Add bartering prices
     
    685693GuiInterface.prototype.AddTimeNotification = function(notification, duration = 10000)
    686694{
    687695    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
    688696    notification.endTime = duration + cmpTimer.GetTime();
    689697    notification.id = ++this.timeNotificationID;
     698
     699    // Let all players receive the notification by default
     700    if (notification.players == undefined)
     701    {
     702        var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     703        var numPlayers = cmpPlayerManager.GetNumPlayers();
     704        notification.players = [];
     705        for (var i = 1; i < numPlayers; i++)
     706            notification.players.push(i);
     707    }
     708   
    690709    this.timeNotifications.push(notification);
    691710    this.timeNotifications.sort(function (n1, n2){return n2.endTime - n1.endTime});
    692711
    693712    cmpTimer.SetTimeout(this.entity, IID_GuiInterface, "DeleteTimeNotification", duration, this.timeNotificationID);
    694713
     
    17331752    var cmpTargetPlayer = QueryOwnerInterface(data.target, IID_Player);
    17341753    if (!cmpEntityPlayer || !cmpTargetPlayer)
    17351754        return false;
    17361755
    17371756    // if the owner is an enemy, it's up to the attack component to decide
    1738     if (!cmpEntityPlayer.IsAlly(cmpTargetPlayer.GetPlayerID()))
     1757    if (cmpEntityPlayer.IsEnemy(cmpTargetPlayer.GetPlayerID()))
    17391758        return cmpAttack.CanAttack(data.target);
    17401759    return false;
    17411760};
    17421761
    17431762/*
  • binaries/data/mods/public/simulation/components/interfaces/CeasefireManager.js

     
     1Engine.RegisterInterface("CeasefireManager");
     2
     3// TODO: send messages? maybe the AI could use it
     4//Engine.RegisterMessageType("CeasefireStarted");
     5//Engine.RegisterMessageType("CeasefireEnded");
  • binaries/data/mods/public/simulation/helpers/Setup.js

     
    5959                warn("Map error in Setup.js: entity " + holder + " can not garrison units");
    6060            else
    6161                cmpGarrisonHolder.initGarrison = settings.Garrison[holder];
    6262        }
    6363    }
     64   
     65    var cmpCeasefireManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_CeasefireManager);
     66    if (settings.Ceasefire)
     67        cmpCeasefireManager.StartCeasefire(settings.Ceasefire * 60 * 1000);
    6468}
    6569
    6670Engine.RegisterGlobal("LoadMapSettings", LoadMapSettings);