/**
 * Copyright 2001 Jean-Francois Doue
 *
 * This file is part of Asteroid Zone. Asteroid Zone is free software;
 * you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or (at your option) any later version.
 * Asteroid Zone is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with Asteroid Zone; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA  02111-1307  USA
 */

package asteroids;

import javax.microedition.lcdui.*;

/**
 * Class to implement a rocket shot by the player's spaceship.
 * @author Jean-Francois Doue
 * @version 1.4, 2002/10/14
 */
public class Rocket extends Mobile {
    /**
     * The orientation of the rocket.
     */
    public byte angle;

   /**
    * The rockets currently existing in the game
    */
    public static Pool rockets;

    private int _rangex, _rangey;   // The distance travelled by the rocket.

   static {
        // Create and populate the rocket pool.
        Rocket[] array = new Rocket[10];
        for (int i = array.length - 1; i >= 0; i--) {
            array[i] = new Rocket();
        }
        rockets = new Pool(array);
   }

    public Rocket() {
    }

    /**
     * Initializes a Rocket instance by setting its position
     * and angle.
     */
    public final void init(int x, int y, byte angle, int vx, int vy) {
        moveTo(x, y);
        setVelocity((cos[angle] << 4) + vx, (sin[angle] << 4) + vy);
        this.angle = angle;
        _rangex = 0;
        _rangey = 0;
    }

    /**
     * Move the rockets and remove those which have expired.
     */
     public static final void move() {
      for (rockets.current = rockets.count - 1; rockets.current >= 0;) {
         Rocket r = (Rocket)rockets.pool[rockets.current--];

           int rangex = r._rangex >> 8;
           int rangey = r._rangey >> 8;
           int maxRange = (((width <= height) ? width : height) * 8) / 10;

          // Determines if the rocket has travelled its maximum distance
          // (80% of the screens smallest dimension).
         if ((rangex * rangex + rangey * rangey) > maxRange * maxRange) {
            rockets.removeCurrent();
            } else {

              r.xold = r.x;
              r.yold = r.y;
              r._x += r.vx;
              r._y += r.vy;
              r.x = r._x >> 8;
              r.y = r._y >> 8;

              // If a border has been hit, wrap the trajectory around
              // the screen. The new origin is the projection of the
              // intersection point on the opposite border.
              if (r.x <= 0) {
                  r.moveTo(width - 2, r.y);
              } else if (r.x >= width - 1) {
                  r.moveTo(1, r.y);
              } else if (r.y <= 0) {
                  r.moveTo(r.x, height - 2);
              } else if (r.y >= height - 1) {
                  r.moveTo(r.x, 1);
              }

              // Upgrade the range travelled.         
              r._rangex += r.vx;
              r._rangey += r.vy;

            }
        }
   }


    /**
     * Draws all the rockets of the supplied object pool using the
     * specified graphic context.
     */
    public static final void draw(Graphics g) {
      for (int i = 0; i < rockets.count; i++) {
         Rocket r = (Rocket)rockets.pool[i];
           g.drawLine(r.x, r.y, r.x, r.y);
       }
    }
}