Tower =
exports['Tower'] =
-Unit.subclass('Tower', function(Tower){
+Unit.subclass('Tower', {
+ isUnit : true,
+ isCombatant : true,
+ lootTable : '',
+
+ colors : {
+ body : '#980011',
+ barrel : '#244792'
+ },
+
+ hasBarrel : true,
+ barrel: {
+ width : 'unit.width * 0.75',
+ height : 'unit.height / 6',
+ originX : 2,
+ originY : '50%',
+ x : '50%',
+ y : '50%'
+ },
+
+ // Bounding box
+ width : REF_SIZE*0.55,
+ height : REF_SIZE*0.55,
+
+ // Attributes
+ stats : {},
+
+ // AI "Cooldowns" (max frequency of each action per sec)
+ ai : {},
+
+ projectile : 'bullet',
+ defaultProjectile : null,
+
+ /// Instance ///
+
+ align : null,
+ buffs : null,
+
+ nShots : 0,
- Y.core.descriptors(this, {
- isUnit : true,
- isCombatant : true,
- lootTable : '',
-
- colors : {
- body : '#980011',
- barrel : '#244792'
- },
-
- hasBarrel : true,
- barrel: {
- width : 'unit.width * 0.75',
- height : 'unit.height / 6',
- originX : 2,
- originY : '50%',
- x : '50%',
- y : '50%'
- },
-
- // Bounding box
- width : REF_SIZE*0.55,
- height : REF_SIZE*0.55,
-
- // Attributes
- stats : {},
-
- // AI "Cooldowns" (max frequency of each action per sec)
- ai : {},
-
- projectile : 'bullet',
- defaultProjectile : null,
-
- /// Instance ///
-
- align : null,
- buffs : null,
-
- nShots : 0
- });
- this['init'] =
- function initTower(align){
+ init : function initTower(align){
Unit.init.call(this, align);
// this.atkGauge = new CooldownGauge(this.cooldowns.attack, this.width+1,this.height+1);
- };
+ },
- // Lootable.mixInto(Tower);
-
- this['act'] =
- function act(elapsed, now){
+ act : function act(elapsed, now){
var ai = this.ai, map = this.game.map;
this.elapsed = elapsed;
this.now = now;
this.components.invoke('act', elapsed, now);
return this;
- };
-
-
- /**
- * Fires this agent's cannon. If a target location is omitted, the shot
- * will be fired in the direction of the tank's current barrel rotation.
- *
- * @param {Number} [x] Target X coordinate.
- * @param {Number} [y] Target Y coordinate.
- */
- this['shoot'] =
- function shoot(x,y){
- if ( this.nShots >= this.stats.shots.val || !this.cooldowns.attack.ready )
- return null;
-
- if (x instanceof Array) { y = x[_Y]; x = x[_X]; }
- var xydef = (x !== undefined && y !== undefined);
- if (xydef)
- this.rotateBarrel(x,y);
-
- // Additional space on each side which must be clear around the
- // shot to ensure we don't shoot ourself in the foot (literally)
- var WIGGLE = 2
- , Projectile = this.projectile
- , pw2 = Projectile.fn.width/2, ph2 = Projectile.fn.height/2
-
- , tloc = this.getTurretLoc()
- , tx = tloc.x, ty = tloc.y
-
- , x1 = tx - pw2 - WIGGLE, y1 = ty - ph2 - WIGGLE
- , x2 = tx + pw2 + WIGGLE, y2 = ty + ph2 + WIGGLE
- , blockers = this.game.map.get(x1,y1, x2,y2).filter(filterShoot, this)
- ;
-
- if ( blockers.size() )
- return null; // console.log('squelch!', blockers);
-
- if (!xydef) {
- var theta = this.barrelShape.transform.rotate
- , sin = Math.sin(theta), cos = Math.cos(theta);
- x = tx + REF_SIZE*cos;
- y = ty + REF_SIZE*sin;
- }
-
- this.cooldowns.attack.activate(this.now);
- this.nShots++;
-
- var p = new Projectile(this, tx,ty, x,y);
- p.on('destroy', this.onBulletDeath);
- return p;
- };
- function filterShoot(v){
- return (v !== this)
- && (v.density === DensityType.BOUNDARY || (v.isWall && v.density === DensityType.DENSE));
- }
+ },
- this['ableToShoot'] =
- function ableToShoot(){
- return this.nShots < this.stats.shots.val && this.cooldowns.attack.ready;
- };
- this['getTurretLoc'] =
- function getTurretLoc(){
+ getTurretLoc : function getTurretLoc(){
var WIGGLE = 2
, loc = this.loc
, barrel = this.barrelShape
, y = loc.y + len*sin
;
return new Vec(x,y);
- };
+ },
* Sets up unit appearance for minimal updates. Called once at start,
* or when the world needs to be redrawn from scratch.
*/
- this['render'] =
- function render(parent){
+ render : function render(parent){
if (this.shape) this.shape.remove();
var colors = this.colors
;
return this;
- };
+ },
- this['rotateBarrel'] =
- function rotateBarrel(x,y){
+ rotateBarrel : function rotateBarrel(x,y){
this.barrelShape.rotate(this.angleTo(x,y));
return this;
- };
+ },
- this['rotateBarrelRelPage'] =
- function rotateBarrelRelPage(pageX, pageY){
+ rotateBarrelRelPage : function rotateBarrelRelPage(pageX, pageY){
var shape = this.shape
, off = shape.offset()
, w = this.width, h = this.height
;
this.barrelShape.rotate(theta);
return this;
- };
+ }
});