//========================== class Transmitter extends Defense{ Transmitter(int gridx, int gridy){ super( gridx, gridy ); this.fxZ = 25; loadDefense("transmitter"); } //--------------- void fire(Enemy e){ cooldownTimer = cooldown + (int)( cooldown*random(-0.2,0.2) ); e.inflictDamage( attack ); game.objs.add( new Lightning(this,e) ); } } //========================== class Trinary extends Defense{ Trinary(int gridx, int gridy){ super( gridx, gridy ); this.fxZ = 25; loadDefense("trinary"); } //--------------- void fire(Enemy e){ cooldownTimer = cooldown + (int)( cooldown*random(-0.2,0.2) ); game.objs.add( new Seeker(x,y,z+fxZ,e,attack,splash) ); } } //========================== class Tesseract extends Defense{ int seed = 103; boolean[][] targetMask; Tesseract(int gridx, int gridy){ super( gridx, gridy ); this.fxZ = 30; loadDefense("tesseract"); description.technical[1][0] = "coverage"; description.technical[1][1] = range+"%"; generateTargetMask(); } //--------------- void generateTargetMask(){ // the Tesseract can only hit enemies that are inside the targetMask targetMask = new boolean[2*game.terrain.w][2*game.terrain.h]; randomSeed(seed); for(int x=0;x<2*game.terrain.w;x++) for(int y=0;y<2*game.terrain.h;y++) targetMask[x][y] = random(0,1) < range*0.01; // the number in the inequality decides the masks density } //--------------- boolean attemptUpgradeRange(){ if(game.cycles >= 20 && game.memory >= 20){ game.cycles -= 20; game.memory -= 20; range += (int)(10 - 0.1*range); generateTargetMask(); return true; } return false; } //--------------- void fire(Enemy e){ cooldownTimer = cooldown; e.inflictDamage( attack ); game.objs.add( new PhotonicPillar(e.x,e.y) ); game.objs.add( new PhotonicPillar(x,y) ); } //--------------- void drawRange(float x, float y){ fill(255,0,0,64); stroke(255,0,0,128); fill(192,192,255,64); stroke(192,192,255,128); int gx = game.terrain.xGrid(x); int gy = game.terrain.yGrid(y); // do not draw if cursor is outside board if(gx<1 || gx>=game.terrain.w-1 || gy<1 || gy>=game.terrain.h-1) return; float x2 = game.terrain.xPos( gx ); float y2 = game.terrain.yPos( gy ); pushMatrix(); translate(0,0,2); float cellSize = game.terrain.cellSize; Terrain t = game.terrain; for(int i=0;i= 20 && game.memory >= 10){ game.cycles -= 20; game.memory -= 20; attack += attack/5; return true; } return false; } //--------------- boolean attemptUpgradeRange(){ if(game.cycles >= 20 && game.memory >= 20){ game.cycles -= 20; game.memory -= 20; range += ((int) sqrt(range)*2 ); return true; } return false; } //--------------- boolean attemptUpgradeFirerate(){ if(game.cycles >= 20 && game.memory >= 20){ game.cycles -= 20; game.memory -= 20; cooldown -= (cooldown+9)/10; return true; } return false; } //--------------- Description getDescription(){ return description; } //--------------- void loadDefense(String filename){ String[] file = loadStrings("defenses/"+filename+".txt"); String descAbout="", descHeading=""; fillColor = color(192,192); lineStrokeColor = polyStrokeColor = color(255); for(int i=0 ; i