
package spacewar;


import java.util.Vector;
import java.util.Enumeration;
import java.awt.Graphics;
import java.awt.Color;


/**
 * This is the cheap Display aspect.
 */
class Display2 extends Display {

    Display2(Game game) {
        super(game);
        frame.setLocation(540, 20);
    }

    void noticeSizeChange() {
        super.noticeSizeChange();
        setBackground(Color.darkGray);
    }

    void paintObjects(Graphics g) {
        SpaceObject[] objects = game.getRegistry().getObjects();
        final int len = objects.length;
        for (int i = 0; i < len; i++) {
            objects[i].paint(g);
        }
    }

    static aspect SpaceObjectPainting {

        abstract private void SpaceObject.paint(Graphics g);

        /*
         * Ships are by far and away the most complex of the space Objects
         * to paint.
         */
        private Color Ship.color;

        after(Pilot pilot) returning (Ship ship): call(Ship Game.newShip(Pilot)) && args(pilot) {
            if (pilot.getNumber() == 1)
                ship.color = Color.white;
            else if (pilot.getNumber() == 2)
                ship.color = Color.gray;
            else
                ship.color = new Color(0xa00000);
        }

        private void Ship.paint(Graphics g) {
            if (this.getDamage() < this.MAX_DAMAGE) {
                double x        = this.getXPos();
                double y        = this.getYPos();
                double sinTheta = Math.sin(this.getOrientation());
                double cosTheta = Math.cos(this.getOrientation());

                g.setColor(color);
                g.drawLine((int)(x + 8*cosTheta), (int)(y + 8*sinTheta),
                           (int)(x - 8*cosTheta), (int)(y - 8*sinTheta));

                // if the ship is accelerating, draw thruster
                if (this.getRAcc() != 0) {
                    g.setColor(Color.red);
                    g.fillOval((int)(x - 8*cosTheta), (int)(y - 8*sinTheta), 6, 6);
                }
            }
        }

        private void Bullet.paint(Graphics g) {
            g.setColor(Color.green);
            g.fillOval((int)this.getXPos() - 1,
                       (int)this.getYPos() - 1,
                       3,
                       3);
        }

        private void EnergyPacket.paint(Graphics g) {
            g.setColor(Color.white);
            g.fillOval((int)this.getXPos() - 5,
                       (int)this.getYPos() - 5,
                       10,
                       10);
        }
    }

    void paintStatus(Graphics g) {
        int left1 = 60;
        int top1  = 0;

        int left2 = 200;
        int top2  = 0;

        g.setColor(Color.white);
        g.drawString("energy:", 5, top1 + 15);
        g.drawString("damage:", 5, top1 + 30);

        if (getPilot1() != null)
            paintLevels(g, getPilot1().getShip(), top1, left1);
        if (getPilot2() != null)
            paintLevels(g, getPilot2().getShip(), top2, left2);
    }

    void paintLevels(Graphics g, Ship ship, int top, int left) {
        if (ship == null)
            return;
        else if (ship.isAlive()) {
            g.drawString(Float.toString(ship.getEnergyLevel()*100), left+1, top+15);
            g.drawString(Float.toString(ship.getDamageLevel()*100), left+1, top+30);
        }
        else {
            g.setColor(Color.red);
            g.drawString("Ship is destroyed", left+1, top+15);
        }
    }
}
