Player.java

/*
 * Copyright © 2012 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */
package com.nokia.example.battletank.game.entities;

import com.nokia.example.battletank.game.Level;
import com.nokia.example.battletank.game.Point;
import com.nokia.example.battletank.game.Resources;
import com.nokia.example.battletank.game.TankImage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.lcdui.game.GameCanvas;

public class Player
    extends Tank {

    private final static int SUPER_AMMO_DURATION = 400;
    private final static int SUPER_TANK_DURATION = 400;
    private int superAmmoCounter = 0;
    private int superTankCounter = 0;

    public Player(Level l, Resources r, Listener listener) {
        super(new Point(l.getPlayerSpawnX(), l.getPlayerSpawnY()), r, listener);
    }

    protected TankImage getImage() {
        return resources.tank;
    }

    protected int getSpeed() {
        return superTankCounter > 0 ? 2 : 1;
    }

    public int getBulletRange() {
        int range = super.getBulletRange();
        return superAmmoCounter > 0 ? 2 * range : range;
    }

    public int getBulletSpeed() {
        int speed = super.getBulletSpeed();
        return superAmmoCounter > 0 ? 2 * speed : speed;
    }

    protected int getStateDuration(int state) {
        if (state == PROTECTED && superTankCounter > 0) {
            return superTankCounter;
        }
        return super.getStateDuration(state);
    }

    public void spawn() {
        superAmmoCounter = 0;
        superTankCounter = 0;
        super.spawn();
    }

    public void superAmmo() {
        superAmmoCounter = SUPER_AMMO_DURATION;
    }

    public void superTank() {
        superTankCounter = SUPER_TANK_DURATION;
        setState(PROTECTED);
    }

    public void update(int keyStates) {
        if (superAmmoCounter > 0) {
            superAmmoCounter--;
        }
        if (superTankCounter > 0) {
            superTankCounter--;
        }
        super.update();
        if (canMove()) {
            handleInput(keyStates);
        }
    }

    private void handleInput(int keyStates) {
        boolean moving = false;

        if ((keyStates & GameCanvas.LEFT_PRESSED) != 0 && !changeDirection(
            Tank.DIRECTION_LEFT)) {
            moving = true;
        }
        if ((keyStates & GameCanvas.RIGHT_PRESSED) != 0
            && !changeDirection(Tank.DIRECTION_RIGHT)) {
            moving = true;
        }
        if ((keyStates & GameCanvas.UP_PRESSED) != 0 && !changeDirection(
            Tank.DIRECTION_UP)) {
            moving = true;
        }
        if ((keyStates & GameCanvas.DOWN_PRESSED) != 0 && !changeDirection(
            Tank.DIRECTION_DOWN)) {
            moving = true;
        }
        this.moving = moving;
        if (moving) {
            move();
        }
        if ((keyStates & GameCanvas.FIRE_PRESSED) != 0) {
            fire();
        }
    }

    public void writeTo(DataOutputStream dout)
        throws IOException {
        super.writeTo(dout);
        dout.writeInt(superAmmoCounter);
        dout.writeInt(superTankCounter);
    }

    public void readFrom(DataInputStream din)
        throws IOException {
        super.readFrom(din);
        superAmmoCounter = din.readInt();
        superTankCounter = din.readInt();
    }
}