Index: ps/trunk/binaries/data/mods/public/gui/session/selection_details.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/selection_details.js +++ ps/trunk/binaries/data/mods/public/gui/session/selection_details.js @@ -248,13 +248,13 @@ }); } // And for number of workers - else if (entState.foundation && entState.visibility == "visible") + else if (entState.foundation && entState.visibility != "hidden") { Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false; Engine.GetGUIObjectByName("resourceCarryingText").hidden = false; Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png"; Engine.GetGUIObjectByName("resourceCarryingText").caption = entState.foundation.numBuilders + " "; - if (entState.foundation.numBuilders !== 0 && entState.buildTime) + if (entState.foundation.numBuilders !== 0 && entState.visibility == "visible" && entState.buildTime) Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = sprintf( translatePlural( "Number of builders.\nTasking another to this foundation would speed construction up by %(speedup)s second.", @@ -266,7 +266,7 @@ else Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = translate("Number of builders."); } - else if (entState.repairable && entState.repairable.numBuilders > 0 && entState.visibility == "visible") + else if (entState.repairable && entState.repairable.numBuilders > 0 && entState.visibility != "hidden") { Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false; Engine.GetGUIObjectByName("resourceCarryingText").hidden = false; Index: ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js +++ ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js @@ -1521,6 +1521,8 @@ // (TODO: maybe we eventually want to look at more, and be more context-sensitive? // e.g. prefer to attack an enemy unit, even if some friendly units are closer to the mouse) let targetState = GetEntityState(target); + if (!targetState) + return { "possible": false }; // Check if any entities in the selection can do some of the available actions with target for (let entityID of selection) Index: ps/trunk/binaries/data/mods/public/simulation/components/Fogging.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Fogging.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Fogging.js @@ -120,6 +120,10 @@ if (cmpFoundation) cmpMirage.CopyFoundation(cmpFoundation); + var cmpRepairable = Engine.QueryInterface(this.entity, IID_Repairable); + if (cmpRepairable && !cmpFoundation) + cmpMirage.CopyRepairable(cmpRepairable); + var cmpHealth = Engine.QueryInterface(this.entity, IID_Health); if (cmpHealth) cmpMirage.CopyHealth(cmpHealth); Index: ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js +++ ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -360,15 +360,21 @@ "progress": cmpFoundation.GetBuildPercentage(), "numBuilders": cmpFoundation.GetNumBuilders() }; - ret.buildRate = cmpFoundation.GetBuildRate(); - ret.buildTime = cmpFoundation.GetBuildTime(); + cmpFoundation = Engine.QueryInterface(ent, IID_Foundation); + if (cmpFoundation) + { + ret.buildRate = cmpFoundation.GetBuildRate(); + ret.buildTime = cmpFoundation.GetBuildTime(); + } } let cmpRepairable = QueryMiragedInterface(ent, IID_Repairable); if (cmpRepairable) { ret.repairable = { "numBuilders": cmpRepairable.GetNumBuilders() }; - ret.repairRate = cmpRepairable.GetRepairRate(); + cmpRepairable = Engine.QueryInterface(ent, IID_Repairable); + if (cmpRepairable) + ret.repairRate = cmpRepairable.GetRepairRate(); } let cmpOwnership = Engine.QueryInterface(ent, IID_Ownership); Index: ps/trunk/binaries/data/mods/public/simulation/components/Mirage.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Mirage.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Mirage.js @@ -84,6 +84,14 @@ Mirage.prototype.GetBuildPercentage = function() { return this.buildPercentage; }; Mirage.prototype.GetNumBuilders = function() { return this.numBuilders; }; +// Repairable data (numBuilders shared with foundation as entities can't have both) + +Mirage.prototype.CopyRepairable = function(cmpRepairable) +{ + this.miragedIids.add(IID_Repairable); + this.numBuilders = cmpRepairable.GetNumBuilders(); +}; + // Health data Mirage.prototype.CopyHealth = function(cmpHealth)