Ticket #2749: t2749_ceasefire_v1.patch

File t2749_ceasefire_v1.patch, 32.1 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 ceasefireActive = GetSimState().ceasefireTimeRemaining > 0
    346347        let button = Engine.GetGUIObjectByName("diplomacyAttackRequest["+(i-1)+"]");
    347         button.hidden = !(g_Players[i].isEnemy[we]);
     348        button.hidden = 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 = ceasefireActive;
    366367        }
    367368    }
    368369
    369370    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false;
    370371}
  • binaries/data/mods/public/gui/session/session.js

     
    535535    updateDebug();
    536536    updatePlayerDisplay();
    537537    updateSelectionDetails();
    538538    updateBuildingPlacementPreview();
    539539    updateTimeElapsedCounter();
     540    updateCeasefireCounter();
    540541    updateTimeNotifications();
    541542    if (!g_IsObserver)
    542543        updateResearchDisplay();
    543544
    544545    if (!g_IsObserver && !g_GameEnded)
     
    776777    // Hide unused buttons.
    777778    for (var i = numButtons; i < 10; ++i)
    778779        Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
    779780}
    780781
     782function 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
    781797function updateTimeElapsedCounter()
    782798{
    783799    var simState = GetSimState();
    784800    var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter");
    785801    if (g_CurrentSpeed != 1.0)
     
    10401056    reportObject.playerID = Engine.GetPlayerID();
    10411057    reportObject.matchID = g_MatchID;
    10421058    reportObject.civs = playerCivs;
    10431059    reportObject.teams = teams;
    10441060    reportObject.teamsLocked = String(teamsLocked);
     1061    reportObject.ceasefireTime = String(extendedSimState.ceasefireTimeRemaining);
    10451062    reportObject.mapName = mapName;
    10461063    reportObject.economyScore = playerStatistics.economyScore;
    10471064    reportObject.militaryScore = playerStatistics.militaryScore;
    10481065    reportObject.totalScore = playerStatistics.totalScore;
    10491066    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/GuiInterface.js

     
    128128
    129129    // Add timeElapsed
    130130    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
    131131    ret.timeElapsed = cmpTimer.GetTime();
    132132
     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
    133137    // Add the game type
    134138    var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
    135139    ret.gameType = cmpEndGameManager.GetGameType();
    136140
    137141    // Add bartering prices
     
    710714GuiInterface.prototype.AddTimeNotification = function(notification, duration = 10000)
    711715{
    712716    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
    713717    notification.endTime = duration + cmpTimer.GetTime();
    714718    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   
    715730    this.timeNotifications.push(notification);
    716731    this.timeNotifications.sort(function (n1, n2){return n2.endTime - n1.endTime});
    717732
    718733    cmpTimer.SetTimeout(this.entity, IID_GuiInterface, "DeleteTimeNotification", duration, this.timeNotificationID);
    719734
     
    17331748    var cmpTargetPlayer = QueryOwnerInterface(data.target, IID_Player);
    17341749    if (!cmpEntityPlayer || !cmpTargetPlayer)
    17351750        return false;
    17361751
    17371752    // 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()))
    17391754        return cmpAttack.CanAttack(data.target);
    17401755    return false;
    17411756};
    17421757
    17431758/*
  • binaries/data/mods/public/simulation/components/Player.js

     
    2525        { "goods": "metal", "proba": 35 } ];
    2626    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.
    2727    this.teamsLocked = false;
    2828    this.state = "active"; // game state - one of "active", "defeated", "won"
    2929    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
    3031    this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
    3132    this.formations = [];
    3233    this.startCam = undefined;
    3334    this.controlAllUnits = false;
    3435    this.isAI = false;
     
    442443
    443444        Engine.BroadcastMessage(MT_DiplomacyChanged, {"player": this.playerID});
    444445    }
    445446};
    446447
     448Player.prototype.GetCeasefireTime = function()
     449{
     450    return this.ceasefireTime;
     451};
     452
     453// This method should be called only once for triggering ceasefire
     454Player.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
     508Player.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
     517Player.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
    447552Player.prototype.UpdateSharedLos = function()
    448553{
    449554    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    450555    if (!cmpRangeManager)
    451556        return;
  • binaries/data/mods/public/simulation/helpers/Player.js

     
    153153        var startCam = getSetting(playerData, playerDefaults, i, "StartingCamera");
    154154        if (startCam !== undefined)
    155155            cmpPlayer.SetStartingCamera(startCam.Position, startCam.Rotation);
    156156    }
    157157
     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
    158162    // NOTE: We need to do the team locking here, as otherwise
    159163    // SetTeam can't ally the players.
    160164    if (settings.LockTeams)
    161165        for (var i = 0; i < numPlayers; ++i)
    162166        {