1
0
forked from 0ad/0ad
0ad/binaries/data/mods/official/gui/test/functions_sim_entity.js
Ykkrosh 92b9c07f95 Restoring SVN repository:
Greek basket texture

# New Greek vases

# housekeeping
documentation fix: trailing / in directory names is mandatory

# Atlas: Sky texture selection; save with maps

Atlas code tidying: Slightly nicer syntax for defining command handlers,
and some explanation of how it works

Automated build.

This was SVN commit r4008.
2006-06-21 22:37:31 +00:00

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, 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;
}
// ====================================================================