1
0
forked from 0ad/0ad

Various fixes to notifications and orders

Added escort--follow can be done by simply changing the default and
secondary actions from NOTIFY_ESCORT to NOTIFY_FOLLOW in
entityEventTargetchanged.

Bugs are: ranged units can't assist in attacking from some reason, and
when you tell a leading unit to run, the escorting unit doesn't.

This was SVN commit r3503.
This commit is contained in:
pyrolink 2006-02-13 03:28:36 +00:00
parent b0e7b7d03e
commit 9c739099fc
3 changed files with 122 additions and 18 deletions

View File

@ -15,11 +15,13 @@
// * Add code in entityEventGeneric() to deal with new generic order events of your type. Note that if you want to have your action handler in a separate function (is preferable), you need to also add this function to the entity object in entityInit() (its initialize event), e.g. this.processGather = entityEventGather.
const ACTION_NONE = 0;
const ACTION_ATTACK = 1;
const ACTION_GATHER = 2;
const ACTION_HEAL = 3;
const ACTION_ATTACK_RANGED = 4;
// ====================================================================
function entityInit()
@ -36,7 +38,6 @@ function entityInit()
// Exception to make the Romans into rome.
if (this.traits.id.civ_code == "roma") this.traits.id.civ_code = "rome"
// Exception to make the Hellenes into hele.
if (this.traits.id.civ_code == "hell") this.traits.id.civ_code = "hele"
}
@ -165,6 +166,7 @@ function entityInit()
this.performGather = performGather;
this.performHeal = performHeal;
this.damage = damage;
this.GotoInRange = GotoInRange;
// Attach Auras if the entity is entitled to them.
if( this.traits.auras )
@ -593,6 +595,7 @@ function entityEventGeneric( evt )
this.performHeal( evt ); break;
case ACTION_ATTACK_RANGED:
this.performAttackRanged( evt ); break;
default:
console.write( "Unknown generic action: " + evt.action );
}
@ -602,24 +605,29 @@ function entityEventGeneric( evt )
function entityEventNotification( evt )
{
switch( evt.type )
//Add "true" to the end of order() to indicate that this is a notification order.
switch( evt.notifyType )
{
case NOTIFY_GOTO:
this.GotoInRange( evt.location.x, evt.location.z, false);
break;
case NOTIFY_RUN:
this.Order( ORDER_GOTO, evt.location.x, evt.location.y );
this.GotoInRange( evt.location.x, evt.location.z, true );
break;
case NOTIFY_ATTACK:
case NOTIFY_DAMAGE:
this.Order( ORDER_GENERIC, evt.target, ACTION_ATTACK);
this.order( ORDER_GENERIC, evt.target, ACTION_ATTACK, true );
break;
case NOTIFY_HEAL:
this.Order( ORDER_GENERIC, evt.target, ACTION_HEAL );
this.order( ORDER_GENERIC, evt.target, ACTION_HEAL, true );
break;
case NOTIFY_GATHER:
this.Order( ORDER_GENERIC, evt.target, ACTION_GATHER );
this.order( ORDER_GENERIC, evt.target, ACTION_GATHER, true );
break;
default:
console.wrote( "Unknown notification request" + evt.type );
console.write( "Unknown notification request " + evt.notifyType );
break;
}
}
@ -627,11 +635,15 @@ function entityEventNotification( evt )
function getAttackAction( source, target )
{
if (!source.actions.attack)
return ACTION_NONE;
attack = source.actions.attack;
if( attack.melee )
if ( attack.melee )
return ACTION_ATTACK;
else
else if ( attack.ranged )
return ACTION_ATTACK_RANGED;
else
return ACTION_NONE;
}
// ====================================================================
@ -647,12 +659,14 @@ function entityEventTargetChanged( evt )
evt.defaultOrder = NMT_Goto;
evt.defaultCursor = "arrow-default";
evt.defaultAction = ACTION_NONE;
evt.secondaryAction = ACTION_NONE;
evt.secondaryCursor = "arrow-default";
if ( this.actions.run && this.actions.run.speed > 0 )
{
evt.secondaryOrder = NMT_Run;
}
if( evt.target && this.actions )
{
if( this.actions.attack &&
@ -668,7 +682,24 @@ function entityEventTargetChanged( evt )
evt.secondaryAction = getAttackAction( this, evt.target );
evt.secondaryCursor = "action-attack";
}
if( canGather( this, evt.target ) )
if ( this.actions.escort &&
this != evt.target &&
evt.target.player == this.player &&
evt.target.actions )
{
if (evt.target.actions.move)
{
//Send an empty order
evt.defaultOrder = NMT_NotifyRequest;
evt.secondaryOrder = NMT_NotifyRequest;
evt.defaultAction = NOTIFY_ESCORT;
evt.secondaryAction = NOTIFY_ESCORT;
}
}
if ( canGather( this, evt.target ) )
{
evt.defaultOrder = NMT_Generic;
evt.defaultAction = ACTION_GATHER;
@ -681,6 +712,8 @@ function entityEventTargetChanged( evt )
evt.secondaryCursor = "action-gather-" + evt.target.traits.supply.subtype;
}
}
}
// ====================================================================
@ -691,29 +724,62 @@ function entityEventPrepareOrder( evt )
// Not sure whether this really belongs here like this: the alternative is to override it in
// subtypes - then you wouldn't need to check tags, you could hardcode results.
if( !this.actions )
if ( !this.actions )
{
evt.preventDefault();
return;
}
//evt.notifySource is the entity order data will be obtained from, so if we're attacking and we
//want our listeners to copy us, then we will use our own order as the source.
switch( evt.orderType )
{
case ORDER_GOTO:
if( !this.actions.move )
if ( !this.actions.move )
evt.preventDefault();
break;
evt.notifyType = NOTIFY_GOTO;
evt.notifySource = this;
break
case ORDER_RUN:
if( !this.actions.move.run )
if ( !this.actions.move.run )
evt.preventDefault();
evt.notifyType = NOTIFY_RUN;
evt.notifySource = this;
break;
case ORDER_PATROL:
if( !this.actions.patrol )
if ( !this.actions.patrol )
evt.preventDefault();
break;
case ORDER_GENERIC:
// TODO: some checking here
evt.notifySource = this;
switch ( evt.action )
{
case ACTION_ATTACK:
case ACTION_ATTACK_RANGED:
evt.action = getAttackAction( this, evt.target );
if ( action == ACTION_NONE )
evt.preventDefault();
evt.notifyType = NOTIFY_ATTACK;
break;
case ACTION_GATHER:
if ( !this.actions.gather )
evt.preventDefault();
evt.notifyType = NOTIFY_GATHER;
break;
case ACTION_HEAL:
if ( !this.actions.heal )
evt.preventDefault();
evt.notifyType = NOTIFY_HEAL;
break;
}
break;
default:
//evt.preventDefault();
break;
@ -1096,3 +1162,13 @@ function InfidelityAura( source, time )
}
// ====================================================================
function GotoInRange( x, y, run )
{
if ( !this.actions || !this.actions.move )
return;
//Add "true" at the end to indicate that this is a notification order.
if (run && this.actions.move.run)
this.order( ORDER_RUN, x, y - this.actions.escort.distance, true);
else
this.order( ORDER_GOTO, x, y - this.actions.escort.distance, true);
}

View File

@ -67,6 +67,9 @@
</Move>
<Patrol />
<Escort>
<Distance>5.0</Distance>
</Escort>
</Actions>

View File

@ -37,7 +37,7 @@ function worldClickHandler(event)
{
return;
}
switch (cmd)
{
// location target commands
@ -70,6 +70,31 @@ function worldClickHandler(event)
else
args[1]=event.secondaryAction;
break;
case NMT_NotifyRequest:
if (event.clicks == 1)
action = event.action;
else
action = event.secondaryAction;
if (event.entity.isIdle())
{
for (i=0; i<selection.length;i++)
{
console.write("Requesting notification for " + event.entity);
selection[i].requestNotification( event.entity, action, true );
selection[i].order( ORDER_GOTO, event.entity.position.x, event.entity.position.z - selection[i].actions.escort.distance, true);
}
}
else
{
for (i=0; i<selection.length;i++)
{
console.write("Requesting notification for " + event.entity);
selection[i].requestNotification( event.entity, action, true );
}
}
return;
default:
console.write("worldClickHandler: Unknown order: "+cmd);
return;