262 lines
6.6 KiB
JavaScript
262 lines
6.6 KiB
JavaScript
/*
|
|
DESCRIPTION : Functions for the world click handler and manipulating entities.
|
|
NOTES :
|
|
*/
|
|
// ====================================================================
|
|
|
|
addGlobalHandler ("worldClick", worldClickHandler);
|
|
|
|
// ====================================================================
|
|
|
|
// The world-click handler - called whenever the user clicks the terrain
|
|
function worldClickHandler(event)
|
|
{
|
|
args=new Array(null, null);
|
|
|
|
console.write("worldClickHandler: button "+event.button+", clicks "+event.clicks);
|
|
|
|
if (isSelecting())
|
|
{
|
|
getGlobal().selectionWorldClickHandler(event);
|
|
return;
|
|
}
|
|
|
|
|
|
// Right button single- or double-clicks
|
|
if (event.button == SDL_BUTTON_RIGHT && event.clicks <= 2)
|
|
{
|
|
if (event.clicks == 1)
|
|
cmd = event.order;
|
|
else if (event.clicks == 2)
|
|
{
|
|
console.write("Issuing secondary order");
|
|
cmd = event.secondaryOrder;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
//setting rally point
|
|
if ( getCursorName() == "cursor-rally" )
|
|
{
|
|
for ( var i=0; i<selection.length; i++ )
|
|
selection[i].setRallyPoint();
|
|
setCursor("arrow-default");
|
|
return;
|
|
}
|
|
switch (cmd)
|
|
{
|
|
// location target commands
|
|
case NMT_Goto:
|
|
case NMT_Run:
|
|
case NMT_Patrol:
|
|
if (event.queued)
|
|
{
|
|
cmd = NMT_AddWaypoint;
|
|
}
|
|
args[0]=event.x;
|
|
args[1]=event.y;
|
|
break;
|
|
case NMT_AddWaypoint:
|
|
args[0]=event.x;
|
|
args[1]=event.y;
|
|
break;
|
|
// entity target commands
|
|
// I'm guessing we no longer require these now that they have become generic events?
|
|
// case NMT_AttackMelee:
|
|
// case NMT_Gather:
|
|
// case NMT_Heal:
|
|
// args[0]=event.entity;
|
|
// args[1]=null;
|
|
// break;
|
|
case NMT_Generic:
|
|
args[0]=event.entity;
|
|
if ( event.clicks == 1)
|
|
args[1]=event.action;
|
|
else
|
|
args[1]=event.secondaryAction;
|
|
break;
|
|
//TODO: get rid of order() calls.
|
|
case NMT_NotifyRequest:
|
|
if (event.clicks == 1)
|
|
action = event.action;
|
|
else
|
|
action = event.secondaryAction;
|
|
|
|
if (event.entity.isIdle())
|
|
{
|
|
for (var i=0; i<selection.length;i++)
|
|
{
|
|
if (!selection[i].actions)
|
|
continue;
|
|
console.write("Requesting notification for " + event.entity);
|
|
selection[i].requestNotification( event.entity, action, true, false );
|
|
selection[i].order( ORDER_GOTO, event.entity.position.x, event.entity.position.z - selection[i].actions.escort.distance, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (var i=0; i<selection.length;i++)
|
|
{
|
|
if (!selection[i].actions)
|
|
continue;
|
|
console.write("Requesting notification for " + event.entity);
|
|
selection[i].requestNotification( event.entity, action, true, false );
|
|
}
|
|
}
|
|
|
|
return;
|
|
default:
|
|
console.write("worldClickHandler: Unknown order: "+cmd);
|
|
return;
|
|
}
|
|
|
|
if (event.clicks == 2)
|
|
triggerSelectionRun();
|
|
else
|
|
setSelectionRun();
|
|
|
|
issueCommand (selection, isOrderQueued(), cmd, args[0], args[1]);
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function selectEntity(handler)
|
|
{
|
|
endSelection();
|
|
startSelection(function (event) {
|
|
// Selection is performed when single-clicking the right mouse
|
|
// button.
|
|
if (event.button == SDL_BUTTON_RIGHT && event.clicks == 1)
|
|
{
|
|
handler(event.entity);
|
|
}
|
|
// End selection on first mouse-click
|
|
endSelection();
|
|
});
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function selectLocation(handler)
|
|
{
|
|
endSelection();
|
|
startSelection(function (event) {
|
|
// Selection is performed when single-clicking the right mouse
|
|
// button.
|
|
if (event.button == SDL_BUTTON_RIGHT && event.clicks == 1)
|
|
{
|
|
handler(event.x, event.y);
|
|
}
|
|
// End selection on first mouse-click
|
|
endSelection();
|
|
});
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function startSelection(handler)
|
|
{
|
|
gameView.startCustomSelection();
|
|
getGlobal().selectionWorldClickHandler=handler;
|
|
console.write("isSelecting(): "+isSelecting());
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function endSelection()
|
|
{
|
|
if (!isSelecting())
|
|
return;
|
|
|
|
gameView.endCustomSelection();
|
|
getGlobal().selectionWorldClickHandler = null;
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function isSelecting()
|
|
{
|
|
return getGlobal().selectionWorldClickHandler != null;
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function makeUnit (x, y, z, MakeUnitName)
|
|
{
|
|
// Spawn an entity at the given coordinates.
|
|
|
|
var dudeSpawnPoint = new Vector3D(x, y, z);
|
|
new Entity(getEntityTemplate(MakeUnitName), dudeSpawnPoint, 1.0);
|
|
// writeConsole(MakeUnitName + " created at " + DudeSpawnPoint);
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function selected()
|
|
{
|
|
// Returns how many units selected.
|
|
|
|
if( selection.length > 0 )
|
|
return( selection[0] );
|
|
return( null );
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function triggerSelectionRun()
|
|
{
|
|
for ( i=0; i< selection.length; i++ )
|
|
{
|
|
selection[i].triggerRun();
|
|
}
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function setSelectionRun()
|
|
{
|
|
for ( i=0; i< selection.length; i++ )
|
|
{
|
|
selection[i].setRun( false );
|
|
}
|
|
}
|
|
|
|
// ====================================================================
|
|
|
|
function validProperty (propertyName)
|
|
{
|
|
// Accepts a string representing an entity property (eg "selection[0].traits.id.generic")
|
|
// and checks if all the elements (selection[0].traits, selection[0].traits.id, etc) are valid properties.
|
|
// Returns false if any invalids are found. Returns true if the whole property is valid.
|
|
|
|
// An empty string is always successful.
|
|
if (propertyName == "") return true;
|
|
|
|
// An undefined string is always unsuccessful.
|
|
if (propertyName == undefined) return false;
|
|
|
|
// Store elements of the property as an array of strings.
|
|
var splitArray = propertyName.toString().split (".");
|
|
|
|
// Seek through elements in array.
|
|
var arrayString = "";
|
|
for (var i = 0; i < splitArray.length; i++)
|
|
{
|
|
// Test each element combination of the string to ensure they are all valid.
|
|
if (i > 0) arrayString += ".";
|
|
arrayString += splitArray[i];
|
|
|
|
// If the property name is not valid, return false.
|
|
if (!(eval (arrayString)))
|
|
return false;
|
|
}
|
|
// If we managed to check them all, every element in the property is valid. Return true.
|
|
return true;
|
|
}
|
|
|
|
// ====================================================================
|
|
|