0ad/binaries/data/mods/official/entities/template_entity.xml

173 lines
6.0 KiB
XML
Executable File

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<Entity Tag="template_entity">
<Traits extant="true" corpse="template_corpse">
<Id
type="true"
/>
<!-- Defaults to no armour -->
<Armour
Value="0"
Crush="0.0"
Hack="0.0"
Pierce="0.0"
/>
<Health />
<Up
rank="0"
/>
</Traits>
<Event On="Attack">
<![CDATA[
curr_hit = getGUIGlobal().newRandomSound("voice", "hit", this.traits.audio.path);
curr_hit.play();
// Attack logic.
dmg = new DamageType();
dmg.crush = parseInt(this.actions.attack.damage * this.actions.attack.crush);
dmg.hack = parseInt(this.actions.attack.damage * this.actions.attack.hack);
dmg.pierce = parseInt(this.actions.attack.damage * this.actions.attack.pierce);
evt.target.damage( dmg, this );
]]>
</Event>
<Event On="TakesDamage">
<![CDATA[
// Apply armour and work out how much damage we actually take
crushDamage = parseInt(evt.damage.crush - this.traits.armour.value * this.traits.armour.crush);
if ( crushDamage < 0 ) crushDamage = 0;
pierceDamage = parseInt(evt.damage.pierce - this.traits.armour.value * this.traits.armour.pierce);
if ( pierceDamage < 0 ) pierceDamage = 0;
hackDamage = parseInt(evt.damage.hack - this.traits.armour.value * this.traits.armour.hack);
if ( hackDamage < 0 ) hackDamage = 0;
totalDamage = parseInt(evt.damage.typeless + crushDamage + pierceDamage + hackDamage);
// Minimum of 1 damage
if( totalDamage < 1 ) totalDamage = 1;
this.traits.health.curr -= totalDamage;
if( this.traits.health.curr <= 0 )
{
// If the inflictor gains promotions, and he's capable of earning more ranks,
if (evt.inflictor.traits.up && evt.inflictor.traits.up.curr && evt.inflictor.traits.up.req && evt.inflictor.traits.up.newentity && evt.inflictor.traits.up.newentity != "")
{
// Give him the fallen's upgrade points (if he has any).
if (this.traits.loot.up)
evt.inflictor.traits.up.curr = parseInt(evt.inflictor.traits.up.curr) + parseInt(this.traits.loot.up);
// Notify player.
if (this.traits.id.specific)
console.write(this.traits.id.specific + " has earned " + this.traits.loot.up + " upgrade points!");
else
console.write("One of your units has earned " + this.traits.loot.up + " upgrade points!");
// If he now has maximum upgrade points for his rank,
if (evt.inflictor.traits.up.curr >= evt.inflictor.traits.up.req)
{
// Notify the player.
if (this.traits.id.specific)
console.write(this.traits.id.specific + " has gained a promotion!");
else
console.write("One of your units has gained a promotion!");
// Reset his upgrade points.
evt.inflictor.traits.up.curr = 0;
// Transmogrify him into his next rank.
evt.inflictor.template = getEntityTemplate(evt.inflictor.traits.up.newentity);
}
}
// If the fallen is worth any loot,
if (this.traits.loot && (this.traits.loot.food || this.traits.loot.wood || this.traits.loot.stone || this.traits.loot.ore))
{
// Give the inflictor his resources.
if (this.traits.loot.food)
getGUIGlobal().GiveResources("Food", parseInt(this.traits.loot.food));
if (this.traits.loot.wood)
getGUIGlobal().GiveResources("Wood", parseInt(this.traits.loot.wood));
if (this.traits.loot.stone)
getGUIGlobal().GiveResources("Stone", parseInt(this.traits.loot.stone));
if (this.traits.loot.ore)
getGUIGlobal().GiveResources("Ore", parseInt(this.traits.loot.ore));
}
// Notify player.
if( evt.inflictor )
console.write( this.traits.id.generic + " got the point of " + evt.inflictor.traits.id.generic + "'s Gladius." );
else
console.write( this.traits.id.generic + " died in mysterious circumstances." );
// Make him cry out in pain.
curr_pain = getGUIGlobal().newRandomSound("voice", "pain", this.traits.audio.path);
curr_pain.play();
// We've taken what we need. Kill the swine.
this.kill();
}
else if( evt.inflictor && this.actions.attack )
{
// If we're not already doing something else, take a measured response - hit 'em back.
// You know, I think this is quite possibly the first AI code the AI divlead has written
// for 0 A.D....
if( this.isIdle() )
this.order( ORDER_ATTACK, evt.inflictor );
}
]]>
</Event>
<Event On="TargetChanged">
<![CDATA[
// This event lets us know when the user moves his/her cursor to a different unit (provided this
// unit is selected) - use it to tell the engine what context cursor should be displayed, given
// the target.
// Attack iff there's a target, it's our enemy, and we're armed. Otherwise move.
// ToString is needed because every property is actually an object (though that's usually
// hidden from you) and comparing an object to any other object in JavaScript (1.5, at least)
// yields false. ToString converts them to their actual values (i.e. the four character
// string) first.
if( evt.target &&
this.actions.attack &&
( evt.target.traits.id.civ_code != "gaia" ) &&
( evt.target.traits.id.civ_code.toString() != this.traits.id.civ_code.toString() ) )
evt.defaultAction = ORDER_ATTACK;
else
evt.defaultAction = ORDER_GOTO;
]]>
</Event>
<Event On="PrepareOrder">
<![CDATA[
// This event gives us a chance to veto any order we're given before we execute it.
// 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.
switch( evt.orderType )
{
case ORDER_GOTO:
if( !this.actions.move )
evt.preventDefault();
break;
case ORDER_PATROL:
if( !this.actions.patrol )
evt.preventDefault();
break;
case ORDER_ATTACK:
// If we can't attack, we're not targeting a unit, or that unit is the same civ as us.
// (Should of course be same /player/ as us - not ready yet.)
if( !this.actions.attack ||
!evt.target ||
( evt.target.traits.id.civ_code.toString() == this.traits.id.civ_code.toString() ) )
evt.preventDefault();
break;
default:
evt.preventDefault();
}
]]>
</Event>
<Actions>
</Actions>
</Entity>