Ticket #3970: lastmanstanding_v4.patch

File lastmanstanding_v4.patch, 8.4 KB (added by Sandarac, 8 years ago)
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    494494        "ExploreMap": "exploreMap",
    495495        "DisableTreasures": "disableTreasures",
    496496        "LockTeams": "lockTeams",
     497        "LastManStanding" : "lastManStanding",
    497498        "CheatsEnabled": "enableCheats"
    498499    };
    499500
     
    511512        Engine.GetGUIObjectByName("lockTeams").enabled = !this.checked;
    512513        updateGameAttributes();
    513514    };
     515
     516    Engine.GetGUIObjectByName("lockTeams").onPress = function() {
     517        g_GameAttributes.settings.LockTeams = this.checked;
     518        g_GameAttributes.settings.LastManStanding = !this.checked ? this.checked : !this.checked;
     519        updateGameAttributes();
     520    };
    514521}
    515522
    516523/**
     
    11511158    }
    11521159
    11531160    if (g_GameAttributes.mapType == "scenario")
     1161    {
    11541162        delete g_GameAttributes.settings.WonderDuration;
     1163        delete g_GameAttributes.settings.LastManStanding;
     1164    }
    11551165
    11561166    if (mapSettings.PlayerData)
    11571167        sanitizePlayerData(mapSettings.PlayerData);
     
    13621372    setGUIBoolean("exploreMap", "exploreMapText", !!mapSettings.ExploreMap);
    13631373    setGUIBoolean("revealMap", "revealMapText", !!mapSettings.RevealMap);
    13641374    setGUIBoolean("lockTeams", "lockTeamsText", !!mapSettings.LockTeams);
     1375    setGUIBoolean("lastManStanding", "lastManStandingText", !!mapSettings.LastManStanding);
    13651376    setGUIBoolean("enableRating", "enableRatingText", !!mapSettings.RatingEnabled);
    13661377
    13671378    Engine.GetGUIObjectByName("optionWonderDuration").hidden =
     
    13721383
    13731384    Engine.GetGUIObjectByName("enableCheats").enabled = !mapSettings.RatingEnabled;
    13741385    Engine.GetGUIObjectByName("lockTeams").enabled = !mapSettings.RatingEnabled;
     1386    Engine.GetGUIObjectByName("optionLastManStanding").hidden = mapSettings.LockTeams;
    13751387
    13761388    // Mapsize completely hidden for non-random maps
    13771389    let isRandom = g_GameAttributes.mapType == "random";
     
    13841396
    13851397    for (let ctrl of ["victoryCondition", "wonderDuration", "populationCap",
    13861398                      "startingResources", "ceasefire", "revealMap",
    1387                       "exploreMap", "disableTreasures", "lockTeams"])
     1399                      "exploreMap", "disableTreasures", "lockTeams", "lastManStanding"])
    13881400        hideControl(ctrl, ctrl + "Text", notScenario);
    13891401
    13901402    Engine.GetGUIObjectByName("civResetButton").hidden = !notScenario;
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    386386                    </object>
    387387                </object>
    388388
    389                 <object name="optionCheats" size="14 338 94% 366" hidden="true">
     389                <object name="optionLastManStanding" size="14 338 94% 366">
    390390                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
     391                        <translatableAttribute id="caption">Last Man Standing:</translatableAttribute>
     392                    </object>
     393                    <object name="lastManStandingText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
     394                    <object name="lastManStanding" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
     395                        <translatableAttribute id="tooltip">Toggle whether the last remaining player or the last remaining set of allies wins.</translatableAttribute>
     396                    </object>
     397                </object>
     398
     399                <object name="optionCheats" size="14 368 94% 396" hidden="true">
     400                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    391401                        <translatableAttribute id="caption">Cheats:</translatableAttribute>
    392402                    </object>
    393403                    <object name="enableCheatsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
     
    396406                    </object>
    397407                </object>
    398408
    399                 <object name="optionRating" size="14 368 94% 396" hidden="true">
     409                <object name="optionRating" size="14 398 94% 426" hidden="true">
    400410                    <object size="0 0 40% 28" hidden="false" type="text" style="ModernRightLabelText">
    401411                        <translatableAttribute id="caption">Rated Game:</translatableAttribute>
    402412                    </object>
  • binaries/data/mods/public/simulation/components/EndGameManager.js

     
    1919    this.wonderDuration = 10 * 60 * 1000;
    2020
    2121    // Allied victory means allied players can win if victory conditions are met for each of them
    22     // Would be false for a "last man standing" game (when diplomacy is fully implemented)
     22    // False for a "last man standing" game
    2323    this.alliedVictory = true;
     24    this.noAlliesLeftMessage = {};
    2425};
    2526
    2627EndGameManager.prototype.GetGameType = function()
     
    7576    this.alliedVictory = flag;
    7677};
    7778
    78 EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
     79function LastManStandingCheck(onlyAlliesLeft)
    7980{
    80     if (msg.skip)
     81    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     82    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     83    var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
     84
     85    if (!cmpGuiInterface || !cmpPlayerManager)
    8186        return;
    8287
    83     var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
    84     var cmpPlayers = [];
     88    if (cmpEndGameManager.alliedVictory)
     89    {
     90        cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage);
     91        return;
     92    }
    8593
     94    if (!cmpEndGameManager.alliedVictory && onlyAlliesLeft)
     95    {
     96        cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage);
     97        cmpEndGameManager.noAlliesLeftMessage = cmpGuiInterface.AddTimeNotification({
     98            "message": markForTranslation("Last player remaining wins."),
     99            "translateMessage": true,
     100            }, 90 * 60 * 1000);
     101    }
     102
     103    else if (!cmpEndGameManager.alliedVictory && !onlyAlliesLeft)
     104        cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage);
     105
     106};
     107
     108function OnlyAlliesLeft(msg)
     109{
     110    var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
    86111    var allies = [];
    87112    var onlyAlliesLeft = true;
    88113
    89     var numPlayers = cmpPlayerManager.GetNumPlayers();
     114    var cmpPlayers = [];
    90115
    91116    for (var i = 1; i < numPlayers; ++i)
    92117    {
    93118        cmpPlayers[i] = QueryPlayerIDInterface(i);
    94         if (cmpPlayers[i].GetState() != "active" || i == msg.playerId) 
     119        if (cmpPlayers[i].GetState() != "active" || i == msg.playerId)
    95120            continue;
    96121
    97122        if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
    98123            allies.push(i);
    99124        else
    100             onlyAlliesLeft = false;
     125            return false;
    101126    }
     127    return allies;
     128}
    102129
     130EndGameManager.prototype.OnInitGame = function(msg)
     131{
     132    LastManStandingCheck(OnlyAlliesLeft(msg));
     133};
     134
     135EndGameManager.prototype.OnGlobalDiplomacyChanged = function(msg)
     136{
     137    LastManStandingCheck(OnlyAlliesLeft(msg));
     138};
     139
     140EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
     141{
     142    if (msg.skip)
     143        return;
     144
     145    var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
     146    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
     147    var cmpPlayers = [];
     148
     149    for (var i = 1; i < numPlayers; ++i)
     150        cmpPlayers[i] = QueryPlayerIDInterface(i);
     151
     152    let allies = OnlyAlliesLeft(msg);
     153    LastManStandingCheck(allies);
     154
    103155    // check if there are winners, or the game needs to continue
    104     if (!allies.length || !onlyAlliesLeft || !this.alliedVictory)
    105         return;
     156    if (!allies.length || !allies ||
     157        !this.alliedVictory && cmpPlayers.filter(pData => pData.GetState() == "active").length != 1)
     158        return;
    106159
     160    cmpGuiInterface.DeleteTimeNotification(this.noAlliesLeftMessage);
     161
    107162    for (var p of allies)
    108163        cmpPlayers[p].SetState("won");
    109164
  • binaries/data/mods/public/simulation/helpers/Setup.js

     
    5151        cmpEndGameManager.SetGameType(settings.GameType);
    5252    if (settings.WonderDuration)
    5353        cmpEndGameManager.SetWonderDuration(settings.WonderDuration * 60 * 1000);
     54    if (settings.LastManStanding)
     55        cmpEndGameManager.SetAlliedVictory(false);
    5456
    5557    if (settings.Garrison)
    5658    {