Added garrison & repair button on the unit's command panel
This was SVN commit r8756.
This commit is contained in:
parent
1a1bed1294
commit
c09d6dcb83
BIN
binaries/data/mods/public/art/textures/cursors/action-garrison-disabled.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/cursors/action-garrison-disabled.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
1 1
|
BIN
binaries/data/mods/public/art/textures/cursors/action-repair-disabled.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/cursors/action-repair-disabled.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
1 1
|
@ -12,6 +12,11 @@ const SDLK_LALT = 308;
|
|||||||
// TODO: these constants should be defined somewhere else instead, in
|
// TODO: these constants should be defined somewhere else instead, in
|
||||||
// case any other code wants to use them too
|
// case any other code wants to use them too
|
||||||
|
|
||||||
|
const ACTION_NONE = 0;
|
||||||
|
const ACTION_GARRISON = 1;
|
||||||
|
const ACTION_REPAIR = 2;
|
||||||
|
var preSelectedAction = ACTION_NONE;
|
||||||
|
|
||||||
var INPUT_NORMAL = 0;
|
var INPUT_NORMAL = 0;
|
||||||
var INPUT_SELECTING = 1;
|
var INPUT_SELECTING = 1;
|
||||||
var INPUT_BANDBOXING = 2;
|
var INPUT_BANDBOXING = 2;
|
||||||
@ -19,6 +24,7 @@ var INPUT_BUILDING_PLACEMENT = 3;
|
|||||||
var INPUT_BUILDING_CLICK = 4;
|
var INPUT_BUILDING_CLICK = 4;
|
||||||
var INPUT_BUILDING_DRAG = 5;
|
var INPUT_BUILDING_DRAG = 5;
|
||||||
var INPUT_BATCHTRAINING = 6;
|
var INPUT_BATCHTRAINING = 6;
|
||||||
|
var INPUT_PRESELECTEDACTION = 7;
|
||||||
|
|
||||||
var inputState = INPUT_NORMAL;
|
var inputState = INPUT_NORMAL;
|
||||||
|
|
||||||
@ -43,15 +49,18 @@ var prevClickedEntity = 0;
|
|||||||
|
|
||||||
function updateCursor()
|
function updateCursor()
|
||||||
{
|
{
|
||||||
if (!mouseIsOverObject && inputState == INPUT_NORMAL)
|
if (!mouseIsOverObject)
|
||||||
{
|
{
|
||||||
var action = determineAction(mouseX, mouseY);
|
var action = determineAction(mouseX, mouseY);
|
||||||
if (action)
|
if (inputState == INPUT_NORMAL || inputState == INPUT_PRESELECTEDACTION)
|
||||||
{
|
{
|
||||||
if (action.cursor)
|
if (action)
|
||||||
{
|
{
|
||||||
Engine.SetCursor(action.cursor);
|
if (action.cursor)
|
||||||
return;
|
{
|
||||||
|
Engine.SetCursor(action.cursor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,6 +79,109 @@ function findGatherType(gatherer, supply)
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getActionInfo(action, target)
|
||||||
|
{
|
||||||
|
var selection = g_Selection.toList();
|
||||||
|
|
||||||
|
// If the selection doesn't exist, no action
|
||||||
|
var entState = GetEntityState(selection[0]);
|
||||||
|
if (!entState)
|
||||||
|
return {"possible": false};
|
||||||
|
|
||||||
|
// If the selection isn't friendly units, no action
|
||||||
|
var player = Engine.GetPlayerID();
|
||||||
|
if (entState.player != player && !g_DevSettings.controlAll)
|
||||||
|
return {"possible": false};
|
||||||
|
|
||||||
|
// Work out whether the selection can have rally points
|
||||||
|
var haveRallyPoints = selection.every(function(ent) {
|
||||||
|
var entState = GetEntityState(ent);
|
||||||
|
return entState && entState.rallyPoint;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (!target)
|
||||||
|
{
|
||||||
|
if (action == "set-rallypoint" && haveRallyPoints)
|
||||||
|
return {"possible": true};
|
||||||
|
else if (action == "move")
|
||||||
|
return {"possible": true};
|
||||||
|
else
|
||||||
|
return {"possible": false};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (haveRallyPoints && selection.indexOf(target) != -1 && action == "unset-rallypoint")
|
||||||
|
return {"possible": true};
|
||||||
|
|
||||||
|
// Look at the first targeted entity
|
||||||
|
// (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)
|
||||||
|
var targetState = GetEntityState(target);
|
||||||
|
|
||||||
|
// If we selected buildings with rally points, and then click on one of those selected
|
||||||
|
// buildings, we should remove the rally point
|
||||||
|
//if (haveRallyPoints && selection.indexOf(target) != -1)
|
||||||
|
// return {"type": "unset-rallypoint"};
|
||||||
|
|
||||||
|
// Check if the target entity is a resource, dropsite, foundation, or enemy unit.
|
||||||
|
// Check if any entities in the selection can gather the requested resource,
|
||||||
|
// can return to the dropsite, can build the foundation, or can attack the enemy
|
||||||
|
var simState = Engine.GuiInterfaceCall("GetSimulationState");
|
||||||
|
|
||||||
|
for each (var entityID in selection)
|
||||||
|
{
|
||||||
|
var entState = GetEntityState(entityID);
|
||||||
|
if (!entState)
|
||||||
|
continue;
|
||||||
|
// Get entity owner diplomacy array
|
||||||
|
var diplomacy = simState.players[entState.player].diplomacy;
|
||||||
|
|
||||||
|
var playerOwned = ((targetState.player == entState.player)? true : false);
|
||||||
|
var enemyOwned = ((targetState.player != entState.player && targetState.player && diplomacy[targetState.player - 1] < 0)? true : false);
|
||||||
|
var gaiaOwned = ((targetState.player == 0)? true : false);
|
||||||
|
|
||||||
|
// Find the resource type we're carrying, if any
|
||||||
|
var carriedType = undefined;
|
||||||
|
if (entState.resourceCarrying && entState.resourceCarrying.length)
|
||||||
|
carriedType = entState.resourceCarrying[0].type;
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case "garrison":
|
||||||
|
if (isUnit(entState) && targetState.garrisonHolder && playerOwned)
|
||||||
|
return {"possible": true};
|
||||||
|
break;
|
||||||
|
case "gather":
|
||||||
|
if (targetState.resourceSupply && (playerOwned || gaiaOwned))
|
||||||
|
{
|
||||||
|
var resource = findGatherType(entState.resourceGatherRates, targetState.resourceSupply);
|
||||||
|
if (resource)
|
||||||
|
return {"possible": true, "cursor": "action-gather-" + resource};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "returnresource":
|
||||||
|
if (targetState.resourceDropsite && playerOwned && carriedType && targetState.resourceDropsite.types.indexOf(carriedType) != -1)
|
||||||
|
return {"possible": true, "cursor": "action-return-" + carriedType};
|
||||||
|
break;
|
||||||
|
case "build":
|
||||||
|
if (targetState.foundation && entState.buildEntities && playerOwned)
|
||||||
|
return {"possible": true};
|
||||||
|
break;
|
||||||
|
case "repair":
|
||||||
|
if (entState.buildEntities && targetState.needsRepair && playerOwned)
|
||||||
|
return {"possible": true};
|
||||||
|
break;
|
||||||
|
case "attack":
|
||||||
|
if (entState.attack && (enemyOwned || gaiaOwned))
|
||||||
|
return {"possible": true};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (action == "move")
|
||||||
|
return {"possible": true};
|
||||||
|
else
|
||||||
|
return {"possible": false};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine the context-sensitive action that should be performed when the mouse is at (x,y)
|
* Determine the context-sensitive action that should be performed when the mouse is at (x,y)
|
||||||
*/
|
*/
|
||||||
@ -79,8 +191,11 @@ function determineAction(x, y, fromMinimap)
|
|||||||
|
|
||||||
// No action if there's no selection
|
// No action if there's no selection
|
||||||
if (!selection.length)
|
if (!selection.length)
|
||||||
|
{
|
||||||
|
preSelectedAction = ACTION_NONE;
|
||||||
return undefined;
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
// If the selection doesn't exist, no action
|
// If the selection doesn't exist, no action
|
||||||
var entState = GetEntityState(selection[0]);
|
var entState = GetEntityState(selection[0]);
|
||||||
if (!entState)
|
if (!entState)
|
||||||
@ -98,84 +213,64 @@ function determineAction(x, y, fromMinimap)
|
|||||||
});
|
});
|
||||||
|
|
||||||
var targets = [];
|
var targets = [];
|
||||||
|
var target = undefined;
|
||||||
|
var type = "none";
|
||||||
|
var cursor = "";
|
||||||
|
var targetState = undefined;
|
||||||
if (!fromMinimap)
|
if (!fromMinimap)
|
||||||
targets = Engine.PickEntitiesAtPoint(x, y);
|
targets = Engine.PickEntitiesAtPoint(x, y);
|
||||||
|
|
||||||
// If there's a target unit
|
|
||||||
if (targets.length)
|
if (targets.length)
|
||||||
{
|
{
|
||||||
// Look at the first targeted entity
|
target = targets[0];
|
||||||
// (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)
|
|
||||||
var targetState = GetEntityState(targets[0]);
|
|
||||||
|
|
||||||
// If we selected buildings with rally points, and then click on one of those selected
|
|
||||||
// buildings, we should remove the rally point
|
|
||||||
if (haveRallyPoints && selection.indexOf(targets[0]) != -1)
|
|
||||||
return {"type": "unset-rallypoint"};
|
|
||||||
|
|
||||||
// Check if the target entity is a resource, dropsite, foundation, or enemy unit.
|
|
||||||
// Check if any entities in the selection can gather the requested resource,
|
|
||||||
// can return to the dropsite, can build the foundation, or can attack the enemy
|
|
||||||
var simState = Engine.GuiInterfaceCall("GetSimulationState");
|
|
||||||
|
|
||||||
for each (var entityID in selection)
|
|
||||||
{
|
|
||||||
var entState = GetEntityState(entityID);
|
|
||||||
if (!entState)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Get entity owner diplomacy array
|
|
||||||
var diplomacy = simState.players[entState.player].diplomacy;
|
|
||||||
|
|
||||||
var playerOwned = ((targetState.player == entState.player)? true : false);
|
|
||||||
var enemyOwned = ((targetState.player != entState.player && targetState.player && diplomacy[targetState.player - 1] < 0)? true : false);
|
|
||||||
var gaiaOwned = ((targetState.player == 0)? true : false);
|
|
||||||
|
|
||||||
// Find the resource type we're carrying, if any
|
|
||||||
var carriedType = undefined;
|
|
||||||
if (entState.resourceCarrying && entState.resourceCarrying.length)
|
|
||||||
carriedType = entState.resourceCarrying[0].type;
|
|
||||||
|
|
||||||
if (targetState.garrisonHolder && playerOwned && Engine.HotkeyIsPressed("session.garrison"))
|
|
||||||
{
|
|
||||||
return {"type": "garrison", "cursor": "action-garrison", "target": targets[0]};
|
|
||||||
}
|
|
||||||
else if (targetState.resourceSupply && (playerOwned || gaiaOwned))
|
|
||||||
{
|
|
||||||
// If the target is a resource and we have the right kind of resource gatherers selected, then gather
|
|
||||||
// If the target is a foundation and we have builders selected, then build (or repair)
|
|
||||||
// If the target is an enemy, then attack
|
|
||||||
var resource = findGatherType(entState.resourceGatherRates, targetState.resourceSupply);
|
|
||||||
if (resource)
|
|
||||||
return {"type": "gather", "cursor": "action-gather-"+resource, "target": targets[0]};
|
|
||||||
}
|
|
||||||
else if (targetState.resourceDropsite && playerOwned && carriedType &&
|
|
||||||
targetState.resourceDropsite.types.indexOf(carriedType) != -1)
|
|
||||||
{
|
|
||||||
return {"type": "returnresource", "cursor": "action-return-"+carriedType, "target": targets[0]};
|
|
||||||
}
|
|
||||||
else if (targetState.foundation && entState.buildEntities && playerOwned)
|
|
||||||
{
|
|
||||||
return {"type": "build", "cursor": "action-build", "target": targets[0]};
|
|
||||||
}
|
|
||||||
else if (entState.buildEntities && targetState.needsRepair && playerOwned)
|
|
||||||
{
|
|
||||||
return {"type": "build", "cursor": "action-repair", "target": targets[0]};
|
|
||||||
}
|
|
||||||
else if (entState.attack && (enemyOwned || gaiaOwned))
|
|
||||||
{ // TODO: Decide how we want to treat gaia
|
|
||||||
return {"type": "attack", "cursor": "action-attack", "target": targets[0]};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't do anything more specific:
|
if (preSelectedAction != ACTION_NONE)
|
||||||
// If all selected entities are buildings, set rally points, else walk
|
{
|
||||||
if (haveRallyPoints)
|
switch (preSelectedAction)
|
||||||
return {"type": "set-rallypoint"};
|
{
|
||||||
|
case ACTION_GARRISON:
|
||||||
|
if (getActionInfo("garrison", target).possible)
|
||||||
|
return {"type": "garrison", "cursor": "action-garrison", "target": target};
|
||||||
|
else
|
||||||
|
return {"type": "none", "cursor": "action-garrison-disabled", "target": undefined};
|
||||||
|
break;
|
||||||
|
case ACTION_REPAIR:
|
||||||
|
if (getActionInfo("repair", target).possible)
|
||||||
|
return {"type": "repair", "cursor": "action-repair", "target": target};
|
||||||
|
else
|
||||||
|
return {"type": "none", "cursor": "action-repair-disabled", "target": undefined};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Engine.HotkeyIsPressed("session.garrison"))
|
||||||
|
{
|
||||||
|
if (getActionInfo("garrison", target).possible)
|
||||||
|
return {"type": "garrison", "cursor": "action-garrison", "target": target};
|
||||||
|
else
|
||||||
|
return {"type": "none", "cursor": "action-garrison-disabled", "target": undefined};
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return {"type": "move"};
|
{
|
||||||
|
var actionInfo = undefined;
|
||||||
|
if ((actionInfo = getActionInfo("gather", target)).possible)
|
||||||
|
return {"type": "gather", "cursor": actionInfo.cursor, "target": target};
|
||||||
|
else if ((actionInfo = getActionInfo("returnresource", target)).possible)
|
||||||
|
return {"type": "returnresource", "cursor": actionInfo.cursor, "target": target};
|
||||||
|
else if (getActionInfo("build", target).possible)
|
||||||
|
return {"type": "build", "cursor": "action-build", "target": target};
|
||||||
|
else if (getActionInfo("repair", target).possible)
|
||||||
|
return {"type": "build", "cursor": "action-repair", "target": target};
|
||||||
|
else if (getActionInfo("attack", target).possible)
|
||||||
|
return {"type": "attack", "cursor": "action-attack", "target": target};
|
||||||
|
else if(getActionInfo("set-rallypoint", target).possible)
|
||||||
|
return {"type": "set-rallypoint"};
|
||||||
|
else if(getActionInfo("unset-rallypoint", target).possible)
|
||||||
|
return {"type": "unset-rallypoint"};
|
||||||
|
else if (getActionInfo("move", target).possible)
|
||||||
|
return {"type": "move"};
|
||||||
|
}
|
||||||
|
return {"type": type, "cursor": cursor, "target": target};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -502,75 +597,32 @@ function handleInputAfterGui(ev)
|
|||||||
var action = determineAction(ev.x, ev.y);
|
var action = determineAction(ev.x, ev.y);
|
||||||
if (!action)
|
if (!action)
|
||||||
break;
|
break;
|
||||||
|
return doAction(action, ev);
|
||||||
var selection = g_Selection.toList();
|
|
||||||
|
|
||||||
// If shift is down, add the order to the unit's order queue instead
|
|
||||||
// of running it immediately
|
|
||||||
var queued = Engine.HotkeyIsPressed("session.queue");
|
|
||||||
|
|
||||||
switch (action.type)
|
|
||||||
{
|
|
||||||
case "move":
|
|
||||||
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
|
||||||
Engine.PostNetworkCommand({"type": "walk", "entities": selection, "x": target.x, "z": target.z, "queued": queued});
|
|
||||||
Engine.GuiInterfaceCall("PlaySound", { "name": "order_walk", "entity": selection[0] });
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "attack":
|
|
||||||
Engine.PostNetworkCommand({"type": "attack", "entities": selection, "target": action.target, "queued": queued});
|
|
||||||
Engine.GuiInterfaceCall("PlaySound", { "name": "order_attack", "entity": selection[0] });
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "build": // (same command as repair)
|
|
||||||
case "repair":
|
|
||||||
Engine.PostNetworkCommand({"type": "repair", "entities": selection, "target": action.target, "queued": queued});
|
|
||||||
Engine.GuiInterfaceCall("PlaySound", { "name": "order_repair", "entity": selection[0] });
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "gather":
|
|
||||||
Engine.PostNetworkCommand({"type": "gather", "entities": selection, "target": action.target, "queued": queued});
|
|
||||||
Engine.GuiInterfaceCall("PlaySound", { "name": "order_gather", "entity": selection[0] });
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "returnresource":
|
|
||||||
Engine.PostNetworkCommand({"type": "returnresource", "entities": selection, "target": action.target, "queued": queued});
|
|
||||||
Engine.GuiInterfaceCall("PlaySound", { "name": "order_gather", "entity": selection[0] });
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "garrison":
|
|
||||||
Engine.PostNetworkCommand({"type": "garrison", "entities": selection, "target": action.target, "queued": queued});
|
|
||||||
//Need to play some sound here??
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "set-rallypoint":
|
|
||||||
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
|
||||||
Engine.PostNetworkCommand({"type": "set-rallypoint", "entities": selection, "x": target.x, "z": target.z});
|
|
||||||
// Display rally point at the new coordinates, to avoid display lag
|
|
||||||
Engine.GuiInterfaceCall("DisplayRallyPoint", {
|
|
||||||
"entities": selection,
|
|
||||||
"x": target.x,
|
|
||||||
"z": target.z
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "unset-rallypoint":
|
|
||||||
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
|
||||||
Engine.PostNetworkCommand({"type": "unset-rallypoint", "entities": selection});
|
|
||||||
// Remove displayed rally point
|
|
||||||
Engine.GuiInterfaceCall("DisplayRallyPoint", {
|
|
||||||
"entities": []
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
|
|
||||||
default:
|
|
||||||
error("Invalid action.type "+action.type);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case INPUT_PRESELECTEDACTION:
|
||||||
|
switch (ev.type)
|
||||||
|
{
|
||||||
|
case "mousebuttondown":
|
||||||
|
if (ev.button == SDL_BUTTON_LEFT && preSelectedAction != ACTION_NONE)
|
||||||
|
{
|
||||||
|
var action = determineAction(ev.x, ev.y);
|
||||||
|
if (!action)
|
||||||
|
break;
|
||||||
|
preSelectedAction = ACTION_NONE;
|
||||||
|
inputState = INPUT_NORMAL;
|
||||||
|
return doAction(action, ev);
|
||||||
|
}
|
||||||
|
else if (ev.button == SDL_BUTTON_RIGHT && preSelectedAction != ACTION_NONE)
|
||||||
|
{
|
||||||
|
preSelectedAction = ACTION_NONE;
|
||||||
|
inputState = INPUT_NORMAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case INPUT_SELECTING:
|
case INPUT_SELECTING:
|
||||||
switch (ev.type)
|
switch (ev.type)
|
||||||
{
|
{
|
||||||
@ -725,6 +777,77 @@ function handleInputAfterGui(ev)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function doAction(action, ev)
|
||||||
|
{
|
||||||
|
var selection = g_Selection.toList();
|
||||||
|
|
||||||
|
// If shift is down, add the order to the unit's order queue instead
|
||||||
|
// of running it immediately
|
||||||
|
var queued = Engine.HotkeyIsPressed("session.queue");
|
||||||
|
|
||||||
|
switch (action.type)
|
||||||
|
{
|
||||||
|
case "move":
|
||||||
|
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
||||||
|
Engine.PostNetworkCommand({"type": "walk", "entities": selection, "x": target.x, "z": target.z, "queued": queued});
|
||||||
|
Engine.GuiInterfaceCall("PlaySound", { "name": "order_walk", "entity": selection[0] });
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "attack":
|
||||||
|
Engine.PostNetworkCommand({"type": "attack", "entities": selection, "target": action.target, "queued": queued});
|
||||||
|
Engine.GuiInterfaceCall("PlaySound", { "name": "order_attack", "entity": selection[0] });
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "build": // (same command as repair)
|
||||||
|
case "repair":
|
||||||
|
Engine.PostNetworkCommand({"type": "repair", "entities": selection, "target": action.target, "queued": queued});
|
||||||
|
Engine.GuiInterfaceCall("PlaySound", { "name": "order_repair", "entity": selection[0] });
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "gather":
|
||||||
|
Engine.PostNetworkCommand({"type": "gather", "entities": selection, "target": action.target, "queued": queued});
|
||||||
|
Engine.GuiInterfaceCall("PlaySound", { "name": "order_gather", "entity": selection[0] });
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "returnresource":
|
||||||
|
Engine.PostNetworkCommand({"type": "returnresource", "entities": selection, "target": action.target, "queued": queued});
|
||||||
|
Engine.GuiInterfaceCall("PlaySound", { "name": "order_gather", "entity": selection[0] });
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "garrison":
|
||||||
|
Engine.PostNetworkCommand({"type": "garrison", "entities": selection, "target": action.target, "queued": queued});
|
||||||
|
//Need to play some sound here??
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "set-rallypoint":
|
||||||
|
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
||||||
|
Engine.PostNetworkCommand({"type": "set-rallypoint", "entities": selection, "x": target.x, "z": target.z});
|
||||||
|
// Display rally point at the new coordinates, to avoid display lag
|
||||||
|
Engine.GuiInterfaceCall("DisplayRallyPoint", {
|
||||||
|
"entities": selection,
|
||||||
|
"x": target.x,
|
||||||
|
"z": target.z
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "unset-rallypoint":
|
||||||
|
var target = Engine.GetTerrainAtPoint(ev.x, ev.y);
|
||||||
|
Engine.PostNetworkCommand({"type": "unset-rallypoint", "entities": selection});
|
||||||
|
// Remove displayed rally point
|
||||||
|
Engine.GuiInterfaceCall("DisplayRallyPoint", {
|
||||||
|
"entities": []
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case "none":
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
error("Invalid action.type "+action.type);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function handleMinimapEvent(target)
|
function handleMinimapEvent(target)
|
||||||
{
|
{
|
||||||
// Partly duplicated from handleInputAfterGui(), but with the input being
|
// Partly duplicated from handleInputAfterGui(), but with the input being
|
||||||
@ -873,6 +996,14 @@ function performCommand(entity, commandName)
|
|||||||
g_SessionDialog.open("Delete", message, null, 340, 160, deleteFunction);
|
g_SessionDialog.open("Delete", message, null, 340, 160, deleteFunction);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "garrison":
|
||||||
|
inputState = INPUT_PRESELECTEDACTION;
|
||||||
|
preSelectedAction = ACTION_GARRISON;
|
||||||
|
break;
|
||||||
|
case "repair":
|
||||||
|
inputState = INPUT_PRESELECTEDACTION;
|
||||||
|
preSelectedAction = ACTION_REPAIR;
|
||||||
|
break;
|
||||||
case "unload-all":
|
case "unload-all":
|
||||||
unloadAll(entity);
|
unloadAll(entity);
|
||||||
break;
|
break;
|
||||||
|
@ -143,9 +143,7 @@ function isUnit(entState)
|
|||||||
{
|
{
|
||||||
var classes = entState.identity.classes;
|
var classes = entState.identity.classes;
|
||||||
if (classes && classes.length)
|
if (classes && classes.length)
|
||||||
for (var i = 0; i < classes.length; i++)
|
return (classes.indexOf("Unit") != -1);
|
||||||
if (classes[i] == "Unit")
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -156,9 +154,7 @@ function isAnimal(entState)
|
|||||||
{
|
{
|
||||||
var classes = entState.identity.classes;
|
var classes = entState.identity.classes;
|
||||||
if (classes && classes.length)
|
if (classes && classes.length)
|
||||||
for (var i = 0; i < classes.length; i++)
|
return (classes.indexOf("Animal") != -1);
|
||||||
if (classes[i] == "Animal")
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -169,9 +165,7 @@ function isStructure(entState)
|
|||||||
{
|
{
|
||||||
var classes = entState.identity.classes;
|
var classes = entState.identity.classes;
|
||||||
if (classes && classes.length)
|
if (classes && classes.length)
|
||||||
for (var i = 0; i < classes.length; i++)
|
return (classes.indexOf("Structure") != -1);
|
||||||
if (classes[i] == "Structure")
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -182,9 +176,7 @@ function isDefensive(entState)
|
|||||||
{
|
{
|
||||||
var classes = entState.identity.classes;
|
var classes = entState.identity.classes;
|
||||||
if (classes && classes.length)
|
if (classes && classes.length)
|
||||||
for (var i = 0; i < classes.length; i++)
|
return (classes.indexOf("Defensive") != -1);
|
||||||
if (classes[i] == "Defensive")
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -259,6 +251,10 @@ function getCommandImage(commandName)
|
|||||||
return "kill_small.png";
|
return "kill_small.png";
|
||||||
case "unload-all":
|
case "unload-all":
|
||||||
return "garrison.png";
|
return "garrison.png";
|
||||||
|
case "garrison":
|
||||||
|
return "garrison.png";
|
||||||
|
case "repair":
|
||||||
|
return "repair.png";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -290,6 +286,10 @@ function getEntityCommandsList(entState)
|
|||||||
if (entState.garrisonHolder)
|
if (entState.garrisonHolder)
|
||||||
commands.push("unload-all");
|
commands.push("unload-all");
|
||||||
commands.push("delete");
|
commands.push("delete");
|
||||||
|
if (isUnit(entState))
|
||||||
|
commands.push("garrison");
|
||||||
|
if (entState.buildEntities)
|
||||||
|
commands.push("repair");
|
||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,6 +234,12 @@ var UnitFsmSpec = {
|
|||||||
cmpFormation.Disband();
|
cmpFormation.Disband();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"Order.Garrison": function(msg) {
|
||||||
|
var cmpFormation = Engine.QueryInterface(this.entity, IID_Formation);
|
||||||
|
cmpFormation.CallMemberFunction("Garrison", [msg.data.target, false]);
|
||||||
|
cmpFormation.Disband();
|
||||||
|
},
|
||||||
|
|
||||||
"IDLE": {
|
"IDLE": {
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1175,6 +1181,7 @@ UnitAI.prototype.ComputeWalkingDistance = function()
|
|||||||
case "Gather":
|
case "Gather":
|
||||||
case "ReturnResource":
|
case "ReturnResource":
|
||||||
case "Repair":
|
case "Repair":
|
||||||
|
case "Garrison":
|
||||||
// Find the target unit's position
|
// Find the target unit's position
|
||||||
var cmpTargetPosition = Engine.QueryInterface(order.data.target, IID_Position);
|
var cmpTargetPosition = Engine.QueryInterface(order.data.target, IID_Position);
|
||||||
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
|
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
|
||||||
|
@ -175,15 +175,9 @@ function ProcessCommand(player, cmd)
|
|||||||
var targetCmpOwnership = Engine.QueryInterface(cmd.target, IID_Ownership);
|
var targetCmpOwnership = Engine.QueryInterface(cmd.target, IID_Ownership);
|
||||||
if (!targetCmpOwnership || targetCmpOwnership.GetOwner() != player)
|
if (!targetCmpOwnership || targetCmpOwnership.GetOwner() != player)
|
||||||
break;
|
break;
|
||||||
for each (var ent in cmd.entities)
|
var cmpUnitAI = GetFormationUnitAI(cmd.entities);
|
||||||
{
|
if (cmpUnitAI)
|
||||||
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
cmpUnitAI.Garrison(cmd.target);
|
||||||
if (!cmpOwnership || cmpOwnership.GetOwner() != player)
|
|
||||||
break;
|
|
||||||
var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
|
|
||||||
if (cmpUnitAI)
|
|
||||||
cmpUnitAI.Garrison(cmd.target);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "unload":
|
case "unload":
|
||||||
|
Loading…
Reference in New Issue
Block a user