Ticket #2749: t2749_ceasefire_v3.2.patch

File t2749_ceasefire_v3.2.patch, 37.8 KB (added by elexis, 9 years ago)
  • binaries/data/mods/public/gui/common/global.xml

     
    2424            hidden="true"
    2525            hotkey="fps.toggle"
    2626            sprite="color: 0 0 0 200"
    2727            font="mono-stroke-10"
    2828            textcolor="white"
    29             size="100%-80 70 100%-10 90"
     29            size="100%-130 50 100%-60 70"
    3030            z="199"
    3131        >
    3232            <action on="Tick">
    3333                this.hidden = Engine.ConfigDB_GetValue("user", "overlay.fps") !== "true";
    3434                updateFPS();
     
    5050            hidden="true"
    5151            hotkey="realtime.toggle"
    5252            sprite="color: 0 0 0 200"
    5353            font="mono-stroke-10"
    5454            textcolor="white"
    55             size="100%-80 100 100%-10 120"
     55            size="100%-130 80 100%-60 100"
    5656            z="199"
    5757        >
    5858            <action on="Tick">
    5959                this.hidden = Engine.ConfigDB_GetValue("user", "overlay.realtime") !== "true";
    6060                this.caption = (new Date()).toLocaleTimeString();
  • 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    }
     
    11411162        {
    11421163            var startingResourcesBox = Engine.GetGUIObjectByName("startingResources");
    11431164            startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources);
    11441165        }
    11451166
     1167        if (mapSettings.Ceasefire)
     1168        {
     1169            var ceasefireBox = Engine.GetGUIObjectByName("ceasefire");
     1170            ceasefireBox.selected = ceasefireBox.list_data.indexOf(mapSettings.Ceasefire);
     1171        }
     1172
    11461173        initMapNameList();
    11471174    }
    11481175
    11491176    // Controls common to all map types
    11501177    var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
     
    11561183    var mapSize = Engine.GetGUIObjectByName("mapSize");
    11571184    var enableCheats = Engine.GetGUIObjectByName("enableCheats");
    11581185    var enableRating = Engine.GetGUIObjectByName("enableRating");
    11591186    var populationCap = Engine.GetGUIObjectByName("populationCap");
    11601187    var startingResources = Engine.GetGUIObjectByName("startingResources");
     1188    var ceasefire = Engine.GetGUIObjectByName("ceasefire");
    11611189
    11621190    var numPlayersText= Engine.GetGUIObjectByName("numPlayersText");
    11631191    var mapSizeDesc = Engine.GetGUIObjectByName("mapSizeDesc");
    11641192    var mapSizeText = Engine.GetGUIObjectByName("mapSizeText");
    11651193    var revealMapText = Engine.GetGUIObjectByName("revealMapText");
     
    11691197    var lockTeamsText = Engine.GetGUIObjectByName("lockTeamsText");
    11701198    var enableCheatsText = Engine.GetGUIObjectByName("enableCheatsText");
    11711199    var enableRatingText = Engine.GetGUIObjectByName("enableRatingText");
    11721200    var populationCapText = Engine.GetGUIObjectByName("populationCapText");
    11731201    var startingResourcesText = Engine.GetGUIObjectByName("startingResourcesText");
     1202    var ceasefireText = Engine.GetGUIObjectByName("ceasefireText");
    11741203    var gameSpeedText = Engine.GetGUIObjectByName("gameSpeedText");
    11751204    var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed");
    11761205
    11771206    // We have to check for undefined on these properties as not all maps define them.
    11781207    var sizeIdx = (mapSettings.Size !== undefined && g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]);
     
    11951224    gameSpeedBox.selected = speedIdx;
    11961225    populationCap.selected = (mapSettings.PopulationCap !== undefined && POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) != -1 ? POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) : POPULATION_CAP_DEFAULTIDX);
    11971226    populationCapText.caption = POPULATION_CAP[populationCap.selected];
    11981227    startingResources.selected = (mapSettings.StartingResources !== undefined && STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) != -1 ? STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) : STARTING_RESOURCES_DEFAULTIDX);
    11991228    startingResourcesText.caption = STARTING_RESOURCES[startingResources.selected];
     1229    ceasefire.selected = (mapSettings.Ceasefire !== undefined && CEASEFIRE_DATA.indexOf(mapSettings.Ceasefire) != -1 ? CEASEFIRE_DATA.indexOf(mapSettings.Ceasefire) : CEASEFIRE_DEFAULTIDX);
     1230    ceasefireText.caption = CEASEFIRE[ceasefire.selected];
    12001231
    12011232    // Update map preview
    12021233    Engine.GetGUIObjectByName("mapPreview").sprite = "cropped:(0.78125,0.5859375)session/icons/mappreview/" + getMapPreview(mapName);
    12031234
    12041235    // Hide/show settings depending on whether we can change them or not
     
    12201251        updateDisplay(disableTreasures, disableTreasuresText, g_IsController);
    12211252        updateDisplay(victoryCondition, victoryConditionText, g_IsController);
    12221253        updateDisplay(lockTeams, lockTeamsText, g_IsController);
    12231254        updateDisplay(populationCap, populationCapText, g_IsController);
    12241255        updateDisplay(startingResources, startingResourcesText, g_IsController);
     1256        updateDisplay(ceasefire, ceasefireText, g_IsController);
    12251257
    12261258        if (g_IsController)
    12271259        {
    12281260            //Host
    12291261            numPlayersSelection.selected = numPlayers - 1;
     
    12621294        updateDisplay(disableTreasures, disableTreasuresText, g_IsController);
    12631295        updateDisplay(victoryCondition, victoryConditionText, g_IsController);
    12641296        updateDisplay(lockTeams, lockTeamsText, g_IsController);
    12651297        updateDisplay(populationCap, populationCapText, g_IsController);
    12661298        updateDisplay(startingResources, startingResourcesText, g_IsController);
     1299        updateDisplay(ceasefire, ceasefireText, g_IsController);
    12671300
    12681301        if (g_IsController)
    12691302        {
    12701303            //Host
    12711304            revealMap.checked = (mapSettings.RevealMap ? true : false);
     
    12881321
    12891322
    12901323    case "scenario":
    12911324        // For scenario just reflect settings for the current map
    12921325        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;
    12991326        numPlayersText.hidden = false;
     1327        mapSize.hidden = true;
    13001328        mapSizeText.hidden = true;
    13011329        mapSizeDesc.hidden = true;
     1330        revealMap.hidden = true;
    13021331        revealMapText.hidden = false;
     1332        exploreMap.hidden = true;
    13031333        exploreMapText.hidden = false;
     1334        disableTreasures.hidden = true;
    13041335        disableTreasuresText.hidden = false;
     1336        victoryCondition.hidden = true;
    13051337        victoryConditionText.hidden = false;
     1338        lockTeams.hidden = true;
    13061339        lockTeamsText.hidden = false;
    1307         populationCap.hidden = true;
    1308         populationCapText.hidden = false;
    13091340        startingResources.hidden = true;
    13101341        startingResourcesText.hidden = false;
    1311 
     1342        populationCap.hidden = true;
     1343        populationCapText.hidden = false;
     1344        ceasefire.hidden = true;
     1345        ceasefireText.hidden = false;
     1346       
    13121347        numPlayersText.caption = numPlayers;
    13131348        mapSizeText.caption = translate("Default");
    13141349        revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No"));
    13151350        exploreMapText.caption = (mapSettings.ExploreMap ? translate("Yes") : translate("No"));
    13161351        disableTreasuresText.caption = translate("No");
    13171352        victoryConditionText.caption = victories.text[victoryIdx];
    13181353        lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No"));
    1319         Engine.GetGUIObjectByName("populationCap").selected = POPULATION_CAP_DEFAULTIDX;
    13201354
     1355        startingResourcesText.caption = translate("Determined by scenario");
     1356        populationCapText.caption = translate("Determined by scenario");
     1357        ceasefireText.caption = translate("Determined by scenario");
    13211358        break;
    13221359
    13231360    default:
    13241361        error(sprintf("onGameAttributesChange: Unexpected map type '%(mapType)s'", { mapType: g_GameAttributes.mapType }));
    13251362        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

     
    395395    var now = new Date;
    396396    var tickLength = new Date - lastTickTime;
    397397    lastTickTime = now;
    398398
    399399    checkPlayerState();
    400 
    401400    while (true)
    402401    {
    403402        var message = Engine.PollNetworkClient();
    404403        if (!message)
    405404            break;
     
    537536    updateDebug();
    538537    updatePlayerDisplay();
    539538    updateSelectionDetails();
    540539    updateBuildingPlacementPreview();
    541540    updateTimeElapsedCounter();
     541    updateCeasefireCounter();
    542542    updateTimeNotifications();
    543543    if (!g_IsObserver)
    544544        updateResearchDisplay();
    545545
    546546    if (!g_IsObserver && !g_GameEnded)
     
    778778    // Hide unused buttons.
    779779    for (var i = numButtons; i < 10; ++i)
    780780        Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
    781781}
    782782
     783function updateCeasefireCounter()
     784{
     785    var simState = GetSimState();
     786    var isActive = simState.ceasefireActive;
     787    var remainingTimeString = timeToString(simState.ceasefireTimeRemaining);
     788   
     789    var ceasefireCounter = Engine.GetGUIObjectByName("ceasefireCounter");
     790    var diplomacyCeasefireCounter = Engine.GetGUIObjectByName("diplomacyCeasefireCounter");
     791   
     792    ceasefireCounter.hidden = !isActive || Engine.ConfigDB_GetValue("user", "gui.session.ceasefirecounter") !== "true";
     793    diplomacyCeasefireCounter.hidden = !isActive;
     794   
     795    ceasefireCounter.caption = remainingTimeString;
     796    diplomacyCeasefireCounter.caption = sprintf(translateWithContext("ceasefire", "Time remaining until ceasefire is over: %(time)s."), {"time": remainingTimeString});
     797}
     798
    783799function updateTimeElapsedCounter()
    784800{
    785801    var simState = GetSimState();
    786802    var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter");
    787803    if (g_CurrentSpeed != 1.0)
     
    10421058    reportObject.playerID = Engine.GetPlayerID();
    10431059    reportObject.matchID = g_MatchID;
    10441060    reportObject.civs = playerCivs;
    10451061    reportObject.teams = teams;
    10461062    reportObject.teamsLocked = String(teamsLocked);
     1063    reportObject.ceasefireActive = String(extendedSimState.ceasefireActive);
     1064    reportObject.ceasefireTimeRemaining = String(extendedSimState.ceasefireTimeRemaining);
    10471065    reportObject.mapName = mapName;
    10481066    reportObject.economyScore = playerStatistics.economyScore;
    10491067    reportObject.militaryScore = playerStatistics.militaryScore;
    10501068    reportObject.totalScore = playerStatistics.totalScore;
    10511069    for each (var rct in resourcesCounterTypes)
  • binaries/data/mods/public/gui/session/session.xml

     
    145145
    146146    <!-- ================================  ================================ -->
    147147    <!-- Time elapsed counter -->
    148148    <!-- ================================  ================================ -->
    149149
    150     <object size="100%-120 45 100%-10 65" type="text" name="timeElapsedCounter" style="SettingsText" hotkey="timeelapsedcounter.toggle" hidden="true">
     150    <object size="100%-250 45 100%-140 65" type="text" name="timeElapsedCounter" style="SettingsText" hotkey="timeelapsedcounter.toggle" hidden="true">
    151151            <action on="Tick">
    152152                this.hidden = Engine.ConfigDB_GetValue("user", "gui.session.timeelapsedcounter") !== "true";
    153153            </action>
    154154            <action on="Press">
    155155                Engine.ConfigDB_CreateValue("user", "gui.session.timeelapsedcounter", ""+this.hidden);
    156156            </action>
    157157    </object>
     158    <object size="100%-250 80 100%-140 100" 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/gui/session/session_objects/research_progress.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    2 <object size="100%-50 85 100%-10 100%-200">
     2<object size="100%-50 40 100%-10 100%-200">
    33    <repeat count="10">
    44        <object name="researchStartedButton[n]" hidden="true" style="iconButton" type="button" size="0 0 40 40" tooltip_style="sessionToolTipBottom">
    55            <object name="researchStartedIcon[n]" ghost="true" type="image" size="3 3 37 37"/>
    66            <object name="researchStartedProgressSlider[n]" type="image" sprite="queueProgressSlider" ghost="true" size="3 3 37 37"/>
    77        </object>
  • binaries/data/mods/public/simulation/ai/petra/defenseManager.js

     
    121121
    122122m.DefenseManager.prototype.checkEnemyUnits = function(gameState)
    123123{
    124124    var nbPlayers = gameState.sharedScript.playersData.length;
    125125    var i = gameState.ai.playedTurn % nbPlayers;
    126     if (i === PlayerID || gameState.isPlayerAlly(i))
     126    if (i === PlayerID || !gameState.isPlayerEnemy(i))
    127127        return;
    128128
    129129    // loop through enemy units
    130130    for (let ent of gameState.getEnemyUnits(i).values())
    131131    {
     
    212212    for (var i = 0; i < this.armies.length; ++i)
    213213    {
    214214        var army = this.armies[i];
    215215        army.recalculatePosition(gameState);
    216216        var owner = this.territoryMap.getOwner(army.foePosition);
    217         if (gameState.isPlayerAlly(owner))
     217        if (!gameState.isPlayerEnemy(owner))
    218218            continue;
    219219        else if (owner !== 0)   // enemy army back in its territory
    220220        {
    221221            army.clear(gameState);
    222222            this.armies.splice(i--,1);
  • 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:help>Lists the sound groups associated with this unit.</a:help>" +
     5    "<a:example>" +
     6        "<SoundGroups>" +
     7            "<ceasefire>interface/alarm/alarm_alert_0.xml</ceasefire>" +
     8        "</SoundGroups>" +
     9    "</a:example>" +
     10    "<element name='SoundGroups'>" +
     11        "<zeroOrMore>" + /* TODO: make this more specific, like a list of specific elements */
     12            "<element>" +
     13                "<anyName/>" +
     14                "<text/>" +
     15            "</element>" +
     16        "</zeroOrMore>" +
     17    "</element>";
     18
     19CeasefireManager.prototype.Init = function()
     20{
     21    // Weather or not ceasefire is active currently.
     22    this.ceasefireIsActive = false;
     23   
     24    // Ceasefire timeout in milliseconds
     25    this.ceasefireTime = 0;
     26   
     27    // Time elapsed when the ceasefire was started
     28    this.ceasefireStartedTime = 0;
     29
     30    // diplomacy states before the ceasefire started
     31    this.diplomacyBeforeCeasefire = [];
     32
     33    // Message duration for the countdown in milliseconds
     34    this.countdownMessageDuration = 10000;
     35
     36    // Duration for the post ceasefire message in milliseconds
     37    this.postCountdownMessageDuration = 5000;
     38};
     39
     40CeasefireManager.prototype.IsCeasefireActive = function()
     41{
     42    return this.ceasefireIsActive;
     43};
     44
     45CeasefireManager.prototype.GetCeasefireStartedTime = function()
     46{
     47    return this.ceasefireStartedTime;
     48};
     49
     50CeasefireManager.prototype.GetCeasefireTime = function()
     51{
     52    return this.ceasefireTime;
     53};
     54
     55CeasefireManager.prototype.GetDiplomacyBeforeCeasefire = function()
     56{
     57    return this.diplomacyBeforeCeasefire;
     58};
     59
     60CeasefireManager.prototype.StartCeasefire = function(ceasefireTime)
     61{
     62    // If invalid timeout given, return
     63    if (ceasefireTime <= 0)
     64        return;
     65
     66    // Remove existing timers
     67    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
     68    if (this.ceasefireCountdownMessageTimer)
     69        cmpTimer.CancelTimer(this.ceasefireCountdownMessageTimer);
     70
     71    if (this.stopCeasefireTimer)
     72        cmpTimer.CancelTimer(this.stopCeasefireTimer);
     73
     74    // Remove existing messages
     75    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     76    if (this.ceasefireCountdownMessage)
     77        cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage);
     78
     79    if (this.ceasefireEndedMessage)
     80        cmpGuiInterface.DeleteTimeNotification(this.ceasefireEndedMessage);
     81
     82
     83    // Save diplomacy and set everyone neutral
     84    if (!this.ceasefireIsActive)
     85    {
     86        // Save diplomacy
     87        var playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
     88        for (var i = 1; i < playerEntities.length; i++)
     89        {
     90            // Copy array with slice(), otherwise it will change
     91            var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     92            this.diplomacyBeforeCeasefire.push(cmpPlayer.GetDiplomacy().slice());
     93        }
     94
     95        // Set every enemy (except gaia) to neutral
     96        for (var i = 1; i < playerEntities.length; i++)
     97        {
     98            var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     99            for (var j = 1; j < playerEntities.length; j++)
     100            {
     101                if (this.diplomacyBeforeCeasefire[i-1][j] < 0)
     102                    cmpPlayer.SetNeutral(j);
     103            }
     104        }
     105    }
     106   
     107    // Save other data
     108    this.ceasefireIsActive = true;
     109    this.ceasefireTime = ceasefireTime;
     110    this.ceasefireStartedTime = cmpTimer.GetTime();
     111
     112    // Send message
     113    Engine.PostMessage(SYSTEM_ENTITY, MT_CeasefireStarted);
     114
     115    // Add timers for countdown message and reseting diplomacy
     116    this.stopCeasefireTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_CeasefireManager, "StopCeasefire", this.ceasefireTime);
     117    this.ceasefireCountdownMessageTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_CeasefireManager, "ShowCeasefireCountdownMessage",
     118            this.ceasefireTime - this.countdownMessageDuration, this.countdownMessageDuration);
     119};
     120
     121CeasefireManager.prototype.ShowCeasefireCountdownMessage = function(duration)
     122{
     123    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     124    this.ceasefireCountdownMessage = cmpGuiInterface.AddTimeNotification({
     125        "message": markForTranslation("You can attack in %(time)s"),
     126        "translateMessage": true
     127    }, duration);
     128};
     129
     130CeasefireManager.prototype.StopCeasefire = function()
     131{
     132    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     133
     134    // Remove previous message
     135    if (this.ceasefireCountdownMessage)
     136        cmpGuiInterface.DeleteTimeNotification(this.ceasefireCountdownMessage);
     137   
     138    // Show new message
     139    this.ceasefireEndedMessage = cmpGuiInterface.AddTimeNotification({
     140        "message": markForTranslation("You can attack now!"),
     141        "translateMessage": true
     142    }, this.postCountdownMessageDuration);
     143   
     144    // Reset diplomacies to original settings
     145    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     146    var playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
     147    for (var i = 1; i < playerEntities.length; i++)
     148    {
     149        var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     150        cmpPlayer.SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]);
     151    }       
     152
     153    // Send chat notifications and update the diplomacy screen
     154    for (var i = 1; i < playerEntities.length; i++)
     155    {
     156        var cmpPlayer = Engine.QueryInterface(playerEntities[i], IID_Player);
     157        for (var j = 1; j < playerEntities.length; j++)
     158        {
     159            if (i != j && this.diplomacyBeforeCeasefire[i-1][j] == -1)
     160                cmpGuiInterface.PushNotification({"type": "diplomacy", "players": [j], "player1": [i], "status": "enemy"});
     161        }
     162    }   
     163   
     164    // Reset values
     165    this.ceasefireIsActive = false;
     166    this.ceasefireTime = 0;
     167    this.ceasefireStartedTime = 0;
     168    this.diplomacyBeforeCeasefire = [];
     169
     170    // Send message
     171    Engine.PostMessage(SYSTEM_ENTITY, MT_CeasefireEnded);
     172};
     173
     174Engine.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
     3Engine.RegisterMessageType("CeasefireStarted");
     4Engine.RegisterMessageType("CeasefireEnded");
     5 No newline at end of file
  • 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);