diff --git a/binaries/data/mods/public/gui/session/input.js b/binaries/data/mods/public/gui/session/input.js index 5217793a79..c00cca1d91 100644 --- a/binaries/data/mods/public/gui/session/input.js +++ b/binaries/data/mods/public/gui/session/input.js @@ -1151,19 +1151,33 @@ function setCameraFollow(entity) } var lastIdleWorker = 0; +var currIdleClass = 0; function findIdleWorker() { - lastIdleWorker = Engine.GuiInterfaceCall("FindIdleWorker", lastIdleWorker); - if (lastIdleWorker) + // Cycle through idling classes before giving up + var idleClasses = ["Worker", "Trade", "CitizenSoldier"]; + for (var i = 0; i <= idleClasses.length; ++i) { - g_Selection.reset() - g_Selection.addList([lastIdleWorker]); - Engine.CameraFollow(lastIdleWorker); - } - else - { - // TODO: display a message or play a sound to indicate no more idle units, or something + var data = { prevWorker: lastIdleWorker, idleClass: idleClasses[currIdleClass] }; + lastIdleWorker = Engine.GuiInterfaceCall("FindIdleWorker", data); + + // Check if we have valid entity + if (lastIdleWorker) + { + g_Selection.reset() + g_Selection.addList([lastIdleWorker]); + Engine.CameraFollow(lastIdleWorker); + + return; + } + + lastIdleWorker = 0; + currIdleClass = (currIdleClass + 1) % idleClasses.length; } + + // TODO: display a message or play a sound to indicate no more idle units, or something + // Reset for next cycle + currIdleClass = 0; } function unload(garrisonHolder, entity) diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js index 898806e2fa..223c7bbccd 100644 --- a/binaries/data/mods/public/simulation/components/GuiInterface.js +++ b/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -445,32 +445,28 @@ GuiInterface.prototype.PlaySound = function(player, data) PlaySound(data.name, data.entity); }; -function isIdleWorker(ent) +function isIdleWorker(ent, idleClass) { var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); var cmpIdentity = Engine.QueryInterface(ent, IID_Identity); - return (cmpUnitAI && cmpIdentity && cmpUnitAI.IsIdle() && cmpIdentity.HasClass("Worker")); + return (cmpUnitAI && cmpIdentity && cmpUnitAI.IsIdle() && idleClass && cmpIdentity.HasClass(idleClass)); } -GuiInterface.prototype.FindIdleWorker = function(player, prevWorker) +GuiInterface.prototype.FindIdleWorker = function(player, data) { var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); var playerEntities = rangeMan.GetEntitiesByPlayer(player); - var firstUnit = 0; - // Find the first matching entity that is after the previous selection, // so that we cycle around in a predictable order for each (var ent in playerEntities) { - if (ent > prevWorker && isIdleWorker(ent)) + if (ent > data.prevWorker && isIdleWorker(ent, data.idleClass)) return ent; - else if (!firstUnit && isIdleWorker(ent)) - firstUnit = ent; } - // Nothing after the selection - just return the first entity - return firstUnit; + // No idle entities left in the class + return 0; }; GuiInterface.prototype.SetPathfinderDebugOverlay = function(player, enabled) diff --git a/binaries/data/mods/public/simulation/components/Identity.js b/binaries/data/mods/public/simulation/components/Identity.js index 5fff03f1d1..a38ce5ff22 100644 --- a/binaries/data/mods/public/simulation/components/Identity.js +++ b/binaries/data/mods/public/simulation/components/Identity.js @@ -86,6 +86,8 @@ Identity.prototype.Schema = "City" + "ConquestCritical" + "Worker" + + "CitizenSoldier" + + "Trade" + "Bow" + // TODO: what are these used for? "Javelin" + "Spear" + diff --git a/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml b/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml index dd248f3819..26e6b737d0 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml @@ -2,7 +2,7 @@ Cavalry - Cavalry Organic + Cavalry CitizenSoldier Organic Basic diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml index c83c3cf0d1..8e951f39f3 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml @@ -2,7 +2,7 @@ Infantry - Infantry Organic + Infantry CitizenSoldier Organic Basic diff --git a/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml b/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml index d5e02067e1..bc2611a81d 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml @@ -4,6 +4,7 @@ Trader Trade was a very important part of ancient civilisation - effective trading and control of trade routes equaled wealth. Trade took place by many forms from foot to caravans to merchant ships. One of the most notorious examples of the power of trade was the Silk Road. Trades resources between allied Markets. + Trade