package audioProject.entities; import static audioProject.AudioProject.getFloat; import java.awt.Color; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; import toritools.additionaltypes.HealthBar; import toritools.entity.Entity; import toritools.entity.Level; import toritools.entity.sprite.AbstractSprite.AbstractSpriteAdapter; import toritools.math.MidpointChain; import toritools.math.Vector2; import toritools.pathing.interpolator.HermiteKeyFrameInterpolator; import toritools.pathing.interpolator.HermiteKeyFrameInterpolator.HermiteKeyFrame; import toritools.scripting.EntityScript.EntityScriptAdapter; import audioProject.AudioProject; public class BadShipFactory { public static Entity makeDefaultEnemy(final Vector2 screen) { List<HermiteKeyFrame> keyList = new ArrayList<HermiteKeyFrame>(); float time = 50000 * AudioProject.controller.getFeel() * (.5f + getFloat() * .5f); int selection = (int) (getFloat() * 6); keyList.add(new HermiteKeyFrame(new Vector2(screen.x, 100 + getFloat() * (screen.y - 200)), screen.scale(0, .02f * screen.y * (-.5f + getFloat())), 0)); boolean bulletChase = true; if (selection == 0) { // Float to top Vector2 mag = new Vector2(0, -.2f * getFloat() * screen.y); keyList.add(new HermiteKeyFrame(new Vector2(screen.x * getFloat() - 150, -150), mag, time)); } else if (selection == 1) { // Float to bottom Vector2 mag = new Vector2(0, .2f * getFloat() * screen.y); keyList.add(new HermiteKeyFrame(new Vector2(screen.x * getFloat() - 150, screen.y), mag, time)); } else if (selection > 1) { bulletChase = false; keyList.add(new HermiteKeyFrame(new Vector2(-150, 100 + getFloat() * (screen.y - 200)), time)); } return makePathedEnemy(new HermiteKeyFrameInterpolator(keyList.toArray(new HermiteKeyFrame[0])), bulletChase); } public static Entity makePathedEnemy(final HermiteKeyFrameInterpolator path, final boolean bulletChase) { final Entity entity = new Entity(); entity.setType("enemy"); entity.setLayer(1); entity.addScript(new EntityScriptAdapter() { float allTime; final float health = 10 + 200 * AudioProject.controller.getFeel(); @Override public void onSpawn(Entity self, Level level) { allTime = 0; self.setPos(path.getPositionDeltaAtTime(0)); self.getVariableCase().setVar("health", "" + health); entity.setDim(new Vector2(health * .30f)); } @Override public void onUpdate(Entity self, float time, Level level) { allTime += time * Math.abs(AudioProject.controller.getFeel()); if (allTime > path.getEndTime()) { level.despawnEntity(self); } if (AudioProject.win || self.getVariableCase().getFloat("health") <= 0) { level.despawnEntity(self); level.spawnEntity(new Explosion(self.getPos(), AudioProject.enemyColor, self.getDim().x, 30)); if (AudioProject.getFloat() < .10) level.spawnEntity(new HealthPickup(self.getPos())); } else { self.setPos(path.getPositionDeltaAtTime(allTime)); if (AudioProject.controller.isBeat()) { // Vector2 middle = // self.getPos().add(self.getDim().scale(.5f)); float scalar = .1f + Math.abs(AudioProject.controller.getFeel()) * .01f; float radius = self.getDim().x / 7 + 5; if (bulletChase) { Vector2 middle = self.getPos().add(self.getDim().scale(0, .5f)); level.spawnEntity(new BadBullet(middle, Vector2.toward(middle, level.getEntityWithId("player").getPos()).scale(scalar), radius)); } else { Vector2 middle = self.getPos().add(self.getDim().scale(0, .5f)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, 0).scale(scalar), radius)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, .7f).scale(scalar), radius)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, -.7f).scale(scalar), radius)); } } } } }); entity.setSprite(new AbstractSpriteAdapter() { @Override public void draw(Graphics2D g, Entity self) { g.setColor(AudioProject.enemyColor); g.fillOval((int) self.getPos().x, (int) (self.getPos().y), (int) self.getDim().x, (int) self.getDim().y); } }); return entity; } public static Entity makeBoss() { final Entity entity = new Entity(); entity.setType("enemy"); entity.setLayer(1); final HealthBar bar = new HealthBar(10 + 10000 * AudioProject.controller.getAverageFeel() * .50f, Color.RED, Color.RED); entity.addScript(new EntityScriptAdapter() { MidpointChain chain; boolean healthGone = false; @Override public void onSpawn(Entity self, Level level) { self.setPos(level.getDim().scale(.5f)); self.getVariableCase().setVar("health", "" + bar.getMaxHealth()); entity.setDim(new Vector2(100)); chain = new MidpointChain(level.getDim().scale(1.01f, .5f), 100); chain.setA(level.getDim().scale(.5f)); AudioProject.bossIsAlive = true; } @Override public void onUpdate(Entity self, float time, Level level) { if (AudioProject.getFloat() < .005 * AudioProject.controller.getFeel()) { float x = 100 + AudioProject.getFloat() * (level.getDim().x - 100); float y = 100 + AudioProject.getFloat() * (level.getDim().y - 100 - self.getDim().y); chain.setA(new Vector2(x, y)); } chain.smoothTowardA(); self.setPos(chain.getB()); float health; if ((health = self.getVariableCase().getFloat("health")) <= 0) { level.despawnEntity(self); healthGone = true; } else { if (AudioProject.controller.isBeat()) { Vector2 middle = self.getPos().add(self.getDim().scale(.5f)); float scalar = .1f + Math.abs(AudioProject.controller.getFeel()) * .01f; float radius = self.getDim().x / 2 + 5; level.spawnEntity(new BadBullet(middle, Vector2.toward(middle, level.getEntityWithId("player").getPos()).scale(scalar), radius)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, 0).scale(scalar), radius)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, .7f).scale(scalar), radius)); level.spawnEntity(new BadBullet(middle, new Vector2(-1, -.7f).scale(scalar), radius)); } } bar.setHealth(health); } @Override public void onDeath(Entity self, final Level level, boolean isRoomExit) { if (healthGone || AudioProject.win) { level.spawnEntity(new Explosion(self.getPos(), AudioProject.enemyColor, self.getDim().x, 300)); level.spawnEntity(new Explosion(self.getPos(), AudioProject.enemyColor, self.getDim().x / 2, 300)); level.spawnEntity(new Explosion(self.getPos(), AudioProject.enemyColor, self.getDim().x / 3, 300)); } AudioProject.bossIsAlive = false; } }); entity.setSprite(new AbstractSpriteAdapter() { @Override public void draw(Graphics2D g, Entity self) { bar.draw(g, new Vector2(10, 90), new Vector2(200, 30)); g.setColor(AudioProject.enemyColor); g.fillOval((int) self.getPos().x, (int) (self.getPos().y), (int) self.getDim().x, (int) self.getDim().y); } }); return entity; } }