This edition of Micropolis, written for the Java desktop platform, is fairly feature complete. I believe the only missing functionality is that of loading the built-in scenarios, and this can be implemented if there is any demand for it. I will soon update the home page at http://code.google.com/p/micropolis/ with downloadable packages of this edition of the software. git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@528 d9718cc8-9f43-0410-858b-315f434eb58c
101 lines
2.3 KiB
Java
101 lines
2.3 KiB
Java
// This file is part of MicropolisJ.
|
|
// Copyright (C) 2013 Jason Long
|
|
// Portions Copyright (C) 1989-2007 Electronic Arts Inc.
|
|
//
|
|
// MicropolisJ is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU GPLv3, with additional terms.
|
|
// See the README file, included in this distribution, for details.
|
|
|
|
package micropolisj.engine;
|
|
|
|
public class HelicopterSprite extends Sprite
|
|
{
|
|
int count;
|
|
int destX;
|
|
int destY;
|
|
int origX;
|
|
int origY;
|
|
|
|
static int [] CDx = { 0, 0, 3, 5, 3, 0, -3, -5, -3 };
|
|
static int [] CDy = { 0, -5, -3, 0, 3, 5, 3, 0, -3 };
|
|
static final int SOUND_FREQ = 200;
|
|
|
|
public HelicopterSprite(Micropolis engine, int xpos, int ypos)
|
|
{
|
|
super(engine, SpriteKind.COP);
|
|
this.x = xpos * 16 + 8;
|
|
this.y = ypos * 16 + 8;
|
|
this.width = 32;
|
|
this.height = 32;
|
|
this.offx = -16;
|
|
this.offy = -16;
|
|
|
|
this.destX = city.PRNG.nextInt(city.getWidth()) * 16 + 8;
|
|
this.destY = city.PRNG.nextInt(city.getHeight()) * 16 + 8;
|
|
|
|
this.origX = x;
|
|
this.origY = y;
|
|
this.count = 1500;
|
|
this.frame = 5;
|
|
}
|
|
|
|
@Override
|
|
public void moveImpl()
|
|
{
|
|
if (this.count > 0) {
|
|
this.count--;
|
|
}
|
|
|
|
if (this.count == 0) {
|
|
|
|
// attract copter to monster and tornado so it blows up more often
|
|
if (city.hasSprite(SpriteKind.GOD)) {
|
|
|
|
MonsterSprite monster = (MonsterSprite) city.getSprite(SpriteKind.GOD);
|
|
this.destX = monster.x;
|
|
this.destY = monster.y;
|
|
|
|
}
|
|
else if (city.hasSprite(SpriteKind.TOR)) {
|
|
|
|
TornadoSprite tornado = (TornadoSprite) city.getSprite(SpriteKind.TOR);
|
|
this.destX = tornado.x;
|
|
this.destY = tornado.y;
|
|
|
|
}
|
|
else {
|
|
this.destX = origX;
|
|
this.destY = origY;
|
|
}
|
|
|
|
if (getDis(x, y, origX, origY) < 30) {
|
|
// made it back to airport, go ahead and land.
|
|
this.frame = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (city.acycle % SOUND_FREQ == 0) {
|
|
// send report, if hovering over high traffic area
|
|
int xpos = this.x / 16;
|
|
int ypos = this.y / 16;
|
|
|
|
if (city.getTrafficDensity(xpos, ypos) > 170 &&
|
|
city.PRNG.nextInt(8) == 0)
|
|
{
|
|
city.sendMessageAt(MicropolisMessage.HEAVY_TRAFFIC_REPORT,
|
|
xpos, ypos);
|
|
city.makeSound(xpos, ypos, Sound.HEAVYTRAFFIC);
|
|
}
|
|
}
|
|
|
|
int z = this.frame;
|
|
if (city.acycle % 3 == 0) {
|
|
int d = getDir(x, y, destX, destY);
|
|
z = turnTo(z, d);
|
|
this.frame = z;
|
|
}
|
|
x += CDx[z];
|
|
y += CDy[z];
|
|
}
|
|
}
|