Ticket #1807: garrison-v2.diff

File garrison-v2.diff, 16.7 KB (added by mimo, 11 years ago)

new version after changes in Command.js following leper's worries

  • binaries/data/mods/public/gui/session/utility_functions.js

     
    6262            "teamsLocked": playerState.teamsLocked,
    6363            "state": playerState.state,
    6464            "isAlly": playerState.isAlly,
     65            "isMutualAlly": playerState.isMutualAlly,
    6566            "isNeutral": playerState.isNeutral,
    6667            "isEnemy": playerState.isEnemy,
    6768            "guid": undefined, // network guid for players controlled by hosts
  • binaries/data/mods/public/gui/session/input.js

     
    217217        var playerState = simState.players[entState.player];
    218218        var playerOwned = (targetState.player == entState.player);
    219219        var allyOwned = playerState.isAlly[targetState.player];
     220        var mutualAllyOwned = playerState.isMutualAlly[targetState.player];
    220221        var enemyOwned = playerState.isEnemy[targetState.player];
    221222        var gaiaOwned = (targetState.player == 0);
    222223
     
    225226
    226227        // default to walking there
    227228        var data = {command: "walk"};
    228         if (targetState.garrisonHolder && playerOwned)
     229        if (targetState.garrisonHolder && (playerOwned || mutualAllyOwned))
    229230        {
    230231            data.command = "garrison";
    231232            data.target = target;
     
    297298        var playerState = simState.players[entState.player];
    298299        var playerOwned = (targetState.player == entState.player);
    299300        var allyOwned = playerState.isAlly[targetState.player];
     301        var mutualAllyOwned = playerState.isMutualAlly[targetState.player];
    300302        var neutralOwned = playerState.isNeutral[targetState.player];
    301303        var enemyOwned = playerState.isEnemy[targetState.player];
    302304        var gaiaOwned = (targetState.player == 0);
     
    308310        switch (action)
    309311        {
    310312        case "garrison":
    311             if (hasClass(entState, "Unit") && targetState.garrisonHolder && playerOwned)
     313            if (hasClass(entState, "Unit") && targetState.garrisonHolder && (playerOwned || mutualAllyOwned))
    312314            {
    313315                var allowedClasses = targetState.garrisonHolder.allowedClasses;
    314316                for each (var unitClass in entState.identity.classes)
     
    17321734        var unitName = getEntityName(template);
    17331735
    17341736        var playerID = Engine.GetPlayerID();
     1737        var simState = Engine.GuiInterfaceCall("GetSimulationState");
     1738
    17351739        if (entState.player == playerID || g_DevSettings.controlAll)
    17361740        {
    17371741            switch (commandName)
     
    17801784                break;
    17811785            }
    17821786        }
     1787        else if (simState.players[playerID].isMutualAlly[entState.player])
     1788        {
     1789            switch (commandName)
     1790            {
     1791            case "garrison":
     1792                inputState = INPUT_PRESELECTEDACTION;
     1793                preSelectedAction = ACTION_GARRISON;
     1794                break;
     1795            default:
     1796                break;
     1797            }
     1798        }
    17831799    }
    17841800}
    17851801
  • binaries/data/mods/public/gui/session/unit_commands.js

     
    689689                affordableMask.hidden = false;
    690690                affordableMask.sprite = "colour: 0 0 0 127";
    691691            }
     692
     693            if (guiName == GARRISON)
     694            {
     695                var ents = garrisonGroups.getEntsByName(item);
     696                var entplayer = GetEntityState(ents[0]).player;
     697                button.sprite = "colour: " + g_Players[entplayer].color.r + " " + g_Players[entplayer].color.g + " " + g_Players[entplayer].color.b;
     698
     699                var player = Engine.GetPlayerID();
     700                if(player != unitEntState.player && !g_DevSettings.controlAll)
     701                {
     702                    if (entplayer != player)
     703                    {
     704                        button.enabled = false;
     705                        grayscale = "grayscale:";
     706                    }
     707                }
     708            }
    692709           
    693710            icon.sprite = "stretched:" + grayscale + "session/portraits/" + template.icon;
    694711           
     
    10031020
    10041021    // If the selection is friendly units, add the command panels
    10051022    var player = Engine.GetPlayerID();
     1023    // Get player state to check some constraints
     1024    // e.g. presence of a hero or build limits
     1025    var simState = Engine.GuiInterfaceCall("GetSimulationState");
     1026    var playerState = simState.players[player];
     1027
    10061028    if (entState.player == player || g_DevSettings.controlAll)
    10071029    {
    1008         // Get player state to check some constraints
    1009         // e.g. presence of a hero or build limits
    1010         var simState = Engine.GuiInterfaceCall("GetSimulationState");
    1011         var playerState = simState.players[player];
    10121030
    10131031        if (selection.length > 1)
    10141032            setupUnitPanel(SELECTION, usedPanels, entState, playerState, g_Selection.groups.getTemplateNames(),
     
    10241042            var groups = new EntityGroups();
    10251043            for (var i in selection)
    10261044            {
    1027                 state = GetEntityState(selection[i]);
     1045                var state = GetEntityState(selection[i]);
    10281046                if (state.garrisonHolder)
    10291047                    groups.add(state.garrisonHolder.entities)
    10301048            }
     
    11911209        supplementalDetailsPanel.hidden = false;
    11921210        commandsPanel.hidden = false;
    11931211    }
     1212    else if (playerState.isMutualAlly[entState.player]) // owned by allied player
     1213    {
     1214
     1215        if (entState.garrisonHolder)
     1216        {
     1217            var groups = new EntityGroups();
     1218            for (var i in selection)
     1219            {
     1220                var state = GetEntityState(selection[i]);
     1221                if (state.garrisonHolder)
     1222                    groups.add(state.garrisonHolder.entities)
     1223            }
     1224
     1225            setupUnitPanel(GARRISON, usedPanels, entState, playerState, groups.getTemplateNames(),
     1226                function (item) { unloadTemplate(item); } );
     1227
     1228            supplementalDetailsPanel.hidden = false;
     1229        }
     1230        else
     1231        {
     1232            supplementalDetailsPanel.hidden = true;
     1233        }
     1234
     1235        commandsPanel.hidden = true;
     1236    }
    11941237    else // owned by another player
    11951238    {
    11961239        supplementalDetailsPanel.hidden = true;
  • binaries/data/mods/public/simulation/helpers/Player.js

     
    209209    if (cmpOwnership)
    210210        owner = cmpOwnership.GetOwner();
    211211
    212     // Figure out which player controls the foundation being built
     212    // Figure out which player controls the target entity
    213213    var targetOwner = 0;
    214214    var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
    215215    if (cmpOwnershipTarget)
     
    226226}
    227227
    228228/**
     229 * Returns true if the entity 'target' is owned by a mutual ally of
     230 * the owner of 'entity'.
     231 */
     232function IsOwnedByMutualAllyOfEntity(entity, target)
     233{
     234    // Figure out which player controls us
     235    var owner = 0;
     236    var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership);
     237    if (cmpOwnership)
     238        owner = cmpOwnership.GetOwner();
     239
     240    // Figure out which player controls the target entity
     241    var targetOwner = 0;
     242    var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
     243    if (cmpOwnershipTarget)
     244        targetOwner = cmpOwnershipTarget.GetOwner();
     245
     246    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     247    var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(owner), IID_Player);
     248
     249    // Check for allied diplomacy status
     250    if (cmpPlayer.IsMutualAlly(targetOwner))
     251        return true;
     252
     253    return false;
     254}
     255
     256/**
    229257 * Returns true if the entity 'target' is owned by player
    230258 */
    231259function IsOwnedByPlayer(player, target)
     
    264292}
    265293
    266294/**
     295 * Returns true if the entity 'target' is owned by a mutual ally of player
     296 */
     297function IsOwnedByMutualAllyOfPlayer(player, target)
     298{
     299    var targetOwner = 0;
     300    var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
     301    if (cmpOwnershipTarget)
     302        targetOwner = cmpOwnershipTarget.GetOwner();
     303
     304    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     305    var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(player), IID_Player);
     306
     307    // Check for allied diplomacy status
     308    if (cmpPlayer.IsMutualAlly(targetOwner))
     309        return true;
     310
     311    return false;
     312}
     313
     314/**
    267315 * Returns true if the entity 'target' is owned by someone neutral to player
    268316 */
    269317function IsOwnedByNeutralOfPlayer(player,target)
     
    307355Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface);
    308356Engine.RegisterGlobal("QueryPlayerIDInterface", QueryPlayerIDInterface);
    309357Engine.RegisterGlobal("IsOwnedByAllyOfEntity", IsOwnedByAllyOfEntity);
     358Engine.RegisterGlobal("IsOwnedByMutualAllyOfEntity", IsOwnedByMutualAllyOfEntity);
    310359Engine.RegisterGlobal("IsOwnedByPlayer", IsOwnedByPlayer);
    311360Engine.RegisterGlobal("IsOwnedByGaia", IsOwnedByGaia);
    312361Engine.RegisterGlobal("IsOwnedByAllyOfPlayer", IsOwnedByAllyOfPlayer);
     362Engine.RegisterGlobal("IsOwnedByMutualAllyOfPlayer", IsOwnedByMutualAllyOfPlayer);
    313363Engine.RegisterGlobal("IsOwnedByNeutralOfPlayer", IsOwnedByNeutralOfPlayer);
    314364Engine.RegisterGlobal("IsOwnedByEnemyOfPlayer", IsOwnedByEnemyOfPlayer);
  • binaries/data/mods/public/simulation/helpers/Commands.js

     
    314314        break;
    315315
    316316    case "garrison":
    317         // Verify that the building can be controlled by the player
    318         if (CanControlUnit(cmd.target, player, controlAllUnits))
     317        // Verify that the building can be controlled by the player or is mutualAlly
     318        if (CanControlUnitOrIsAlly(cmd.target, player, controlAllUnits))
    319319        {
    320320            var entities = FilterEntityList(cmd.entities, player, controlAllUnits);
    321321            GetFormationUnitAIs(entities, player).forEach(function(cmpUnitAI) {
     
    336336        break;
    337337
    338338    case "unload":
    339         // Verify that the building can be controlled by the player
    340         if (CanControlUnit(cmd.garrisonHolder, player, controlAllUnits))
     339        // Verify that the building can be controlled by the player or is mutualAlly
     340        if (CanControlUnitOrIsAlly(cmd.garrisonHolder, player, controlAllUnits))
    341341        {
    342342            var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder);
    343343            var notUngarrisoned = 0;
    344             for each (ent in cmd.entities)
     344            if (IsOwnedByPlayer(player, cmd.garrisonHolder))
     345                var entities = cmd.entities;
     346            else
     347                var entities = FilterEntityList(cmd.entities, player, controlAllUnits);
     348
     349            for each (var ent in entities)
    345350                if (!cmpGarrisonHolder || !cmpGarrisonHolder.Unload(ent))
    346351                    notUngarrisoned++;
    347352
     
    355360        break;
    356361
    357362    case "unload-template":
    358         var selected = FilterEntityList(cmd.garrisonHolders, player, controlAllUnits);
     363        var selected = FilterEntityListWithAllies(cmd.garrisonHolders, player, controlAllUnits);
     364        var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
    359365        for each (var garrisonHolder in selected)
    360366        {
    361367            var cmpGarrisonHolder = Engine.QueryInterface(garrisonHolder, IID_GarrisonHolder);
    362             if (!cmpGarrisonHolder || !cmpGarrisonHolder.UnloadTemplate(cmd.template, cmd.all))
    363                 notifyUnloadFailure(player, garrisonHolder)
     368            if (cmpGarrisonHolder)
     369            {
     370                // check that we are allowed to unload entities corresponding to this template
     371                if (IsOwnedByPlayer(player, garrisonHolder))
     372                    var entities = cmpGarrisonHolder.entities;
     373                else
     374                    var entities = FilterEntityList(cmpGarrisonHolder.entities, player, controlAllUnits);
     375
     376                for each (var ent in entities)
     377                {
     378                    // Units with multiple ranks are grouped together.
     379                    var cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
     380                    var name = cmpIdentity.GetSelectionGroupName();
     381                    if (!name)
     382                        name = cmpTemplateManager.GetCurrentTemplateName(ent);
     383                    if (name == cmd.template)
     384                    {
     385                        if (!cmpGarrisonHolder.UnloadTemplate(cmd.template, cmd.all))
     386                            notifyUnloadFailure(player, garrisonHolder);
     387                        break;
     388                    }
     389                }
     390            }
    364391        }
    365392        break;
    366393
     
    12721299
    12731300/**
    12741301 * Check if player can control this entity
    1275  * returns: true if the entity is valid and owned by the player if
    1276  *      or control all units is activated for the player, else false
     1302 * returns: true if the entity is valid and owned by the player
     1303 *      or control all units is activated, else false
    12771304 */
    12781305function CanControlUnit(entity, player, controlAll)
    12791306{
     
    12811308}
    12821309
    12831310/**
     1311 * Check if player can control this entity
     1312 * returns: true if the entity is valid and owned by the player
     1313 *              or  the entity is owned by an mutualAlly
     1314 *      or control all units is activated, else false
     1315 */
     1316function CanControlUnitOrIsAlly(entity, player, controlAll)
     1317{
     1318    return (IsOwnedByPlayer(player, entity) || IsOwnedByMutualAllyOfPlayer(player, entity) || controlAll);
     1319}
     1320
     1321/**
    12841322 * Filter entities which the player can control
    12851323 */
    12861324function FilterEntityList(entities, player, controlAll)
     
    12891327}
    12901328
    12911329/**
     1330 * Filter entities which the player can control or are mutualAlly
     1331 */
     1332function FilterEntityListWithAllies(entities, player, controlAll)
     1333{
     1334    return entities.filter(function(ent) { return CanControlUnitOrIsAlly(ent, player, controlAll);} );
     1335}
     1336
     1337/**
    12921338 * Try to transform a wall to a gate
    12931339 */
    12941340function TryTransformWallToGate(ent, cmpPlayer, template)
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    41424142    if (!cmpGarrisonHolder)
    41434143        return false;
    41444144
    4145     // Verify that the target is owned by this entity's player
     4145    // Verify that the target is owned by this entity's player or is mutual allied
    41464146    var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
    4147     if (!cmpOwnership || !IsOwnedByPlayer(cmpOwnership.GetOwner(), target))
     4147    if (!cmpOwnership || !(IsOwnedByPlayer(cmpOwnership.GetOwner(), target) || IsOwnedByMutualAllyOfPlayer(cmpOwnership.GetOwner(), target)))
    41484148        return false;
    41494149
    41504150    // Don't let animals garrison for now
  • binaries/data/mods/public/simulation/components/Player.js

     
    334334
    335335    var sharedLos = [];
    336336    for (var i = 0; i < cmpPlayerManager.GetNumPlayers(); ++i)
    337         if (this.IsAlly(i))
    338         {
    339             var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player);
    340             if (cmpPlayer && cmpPlayer.IsAlly(this.playerID))
    341                 sharedLos.push(i);
    342         }
     337        if (this.IsMutualAlly(i))
     338            sharedLos.push(i);
    343339
    344340    cmpRangeManager.SetSharedLos(this.playerID, sharedLos);
    345341};
     
    407403    return this.diplomacy[id] > 0;
    408404};
    409405
     406/**
     407 * Check if given player is our ally, and we are its ally
     408 */
     409Player.prototype.IsMutualAlly = function(id)
     410{
     411    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     412    if (!cmpPlayerManager)
     413        return false;
     414    var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(id), IID_Player);
     415    return this.IsAlly(id) && cmpPlayer && cmpPlayer.IsAlly(this.playerID);
     416};
     417
    410418Player.prototype.SetEnemy = function(id)
    411419{
    412420    this.SetDiplomacyIndex(id, -1);
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    6464       
    6565        // store player ally/neutral/enemy data as arrays
    6666        var allies = [];
     67        var mutualAllies = [];
    6768        var neutrals = [];
    6869        var enemies = [];
    6970        for (var j = 0; j < n; ++j)
    7071        {
    7172            allies[j] = cmpPlayer.IsAlly(j);
     73            mutualAllies[j] = cmpPlayer.IsMutualAlly(j);
    7274            neutrals[j] = cmpPlayer.IsNeutral(j);
    7375            enemies[j] = cmpPlayer.IsEnemy(j);
    7476        }
     
    8688            "teamsLocked": cmpPlayer.GetLockTeams(),
    8789            "phase": phase,
    8890            "isAlly": allies,
     91            "isMutualAlly": mutualAllies,
    8992            "isNeutral": neutrals,
    9093            "isEnemy": enemies,
    9194            "entityLimits": cmpPlayerEntityLimits.GetLimits(),
  • binaries/data/mods/public/simulation/components/GarrisonHolder.js

     
    469469    }
    470470};
    471471
     472
     473/**
     474 * Eject all foreign garrisoned entities which are no more allied
     475 */
     476GarrisonHolder.prototype.OnDiplomacyChanged = function()
     477{
     478    for (var i = this.entities.length; i > 0; --i)
     479    {
     480        if (!IsOwnedByMutualAllyOfEntity(this.entity, this.entities[i-1]))
     481            this.Eject(this.entities[i-1], true);
     482    }
     483    this.UpdateGarrisonFlag();
     484};
     485
    472486Engine.RegisterComponentType(IID_GarrisonHolder, "GarrisonHolder", GarrisonHolder);
    473487