package ships; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; import physics.Body; import physics.BodyForce; import render.BodyRenderNode; import render.RenderNode; import render.RenderPreferences; import dcpu.WorldPauseHandler; import dcpu.Dcpu; import dcpu.Hardware; import env.Entity; import env.Space; import equipment.PowerGrid; public class Ship implements Entity { List<Equipment> equipment; List<BodyForce> forces; RenderNode renderParts; public Dcpu cpu; public Body me; public PowerGrid power; int cpu_freeze; public Space space; public Ship(float mass, float ri) { me = new Body(0, 0, 0, mass, ri); cpu = new Dcpu(); renderParts = new BodyRenderNode(me) { public void draw(Graphics2D g, RenderPreferences prefs) { } }; forces = new ArrayList<BodyForce>(); equipment = new ArrayList<Equipment>(); power = new PowerGrid(0, 1000, 1, 'x'); power.addedTo(this); } public void addEquipment(Equipment e) { equipment.add(e); e.addedTo(this); } public RenderNode getVisuals() { return renderParts; } public void tickInternals(int msPerTick, WorldPauseHandler handler) { if (cpu_freeze <= 0) { cpu.step_cycles(msPerTick*50, handler); } else { cpu_freeze -=1; } } public void tickPhysics(int msPerTick, WorldPauseHandler handler) { for (Equipment e : equipment) { e.physicsTickPreForce(); } me.apply(forces, msPerTick); for (Equipment e : equipment) { e.physicsTickPostForce(); } } //Only equipment should call these: public void addRenderNode(RenderNode rn) { renderParts.addChild(rn); } public void addBgRenderNode(RenderNode rn) { renderParts.addBgChild(rn); } public void addPluginHardware(char id, Hardware hw) { cpu.addHardware(id, hw); } public void addBodyForce(BodyForce bf) { forces.add(bf); } public void triggerSynchronizedEvent(char id, int cyclesAgo) { for (Equipment e:equipment) { e.triggerSynchronizedEvent(id, cyclesAgo); } } public void reset() { for (Equipment e:equipment) { e.reset(); } me.reset(); cpu.reset(); } public void brownOut() { cpu.reset(); for (Equipment e:equipment) { e.reset(); } cpu_freeze = 500; } public int getCpuFreeze() { return cpu_freeze; } public void in(Space s) { this.space = s; s.cpus().add(cpu); } }