behaviors: dispatch behavior from mapScan() method
git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@870 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
parent
fb4f1fee98
commit
4717c93039
2 changed files with 56 additions and 28 deletions
|
@ -18,22 +18,17 @@ import static micropolisj.engine.Micropolis.ZoneType;
|
||||||
* In each sim cycle each tile will get activated, and this
|
* In each sim cycle each tile will get activated, and this
|
||||||
* class contains the activation code.
|
* class contains the activation code.
|
||||||
*/
|
*/
|
||||||
class MapScanner
|
class MapScanner extends TileBehavior
|
||||||
{
|
{
|
||||||
final Micropolis city;
|
final B behavior;
|
||||||
final Random PRNG;
|
|
||||||
int xpos;
|
|
||||||
int ypos;
|
|
||||||
int rawTile;
|
|
||||||
int tile;
|
|
||||||
|
|
||||||
MapScanner(Micropolis city)
|
MapScanner(Micropolis city, B behavior)
|
||||||
{
|
{
|
||||||
this.city = city;
|
super(city);
|
||||||
this.PRNG = city.PRNG;
|
this.behavior = behavior;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum TileBehaviorEnum
|
public static enum B
|
||||||
{
|
{
|
||||||
FIRE,
|
FIRE,
|
||||||
FLOOD,
|
FLOOD,
|
||||||
|
@ -58,16 +53,9 @@ class MapScanner
|
||||||
/**
|
/**
|
||||||
* Activate the tile identified by xpos and ypos properties.
|
* Activate the tile identified by xpos and ypos properties.
|
||||||
*/
|
*/
|
||||||
public void scanTile()
|
public void apply()
|
||||||
{
|
{
|
||||||
tile = rawTile & LOMASK;
|
switch (behavior) {
|
||||||
|
|
||||||
String behaviorStr = getTileBehavior(rawTile);
|
|
||||||
if (behaviorStr == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (TileBehaviorEnum.valueOf(behaviorStr)) {
|
|
||||||
case FIRE:
|
case FIRE:
|
||||||
doFire();
|
doFire();
|
||||||
return;
|
return;
|
||||||
|
@ -124,7 +112,7 @@ class MapScanner
|
||||||
doSeaport();
|
doSeaport();
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
throw new Error("Unknown behavior: "+behaviorStr);
|
assert false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,6 +215,7 @@ public class Micropolis
|
||||||
PRNG = DEFAULT_PRNG;
|
PRNG = DEFAULT_PRNG;
|
||||||
evaluation = new CityEval(this);
|
evaluation = new CityEval(this);
|
||||||
init(width, height);
|
init(width, height);
|
||||||
|
initTileBehaviors();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void init(int width, int height)
|
protected void init(int width, int height)
|
||||||
|
@ -1388,23 +1389,62 @@ public class Micropolis
|
||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String,TileBehavior> tileBehaviors;
|
||||||
|
void initTileBehaviors()
|
||||||
|
{
|
||||||
|
HashMap<String,TileBehavior> bb;
|
||||||
|
bb = new HashMap<String,TileBehavior>();
|
||||||
|
|
||||||
|
bb.put("FIRE", new MapScanner(this, MapScanner.B.FIRE));
|
||||||
|
bb.put("FLOOD", new MapScanner(this, MapScanner.B.FLOOD));
|
||||||
|
bb.put("RADIOACTIVE", new MapScanner(this, MapScanner.B.RADIOACTIVE));
|
||||||
|
bb.put("ROAD", new MapScanner(this, MapScanner.B.ROAD));
|
||||||
|
bb.put("RAIL", new MapScanner(this, MapScanner.B.RAIL));
|
||||||
|
bb.put("EXPLOSION", new MapScanner(this, MapScanner.B.EXPLOSION));
|
||||||
|
bb.put("RESIDENTIAL", new MapScanner(this, MapScanner.B.RESIDENTIAL));
|
||||||
|
bb.put("HOSPITAL_CHURCH", new MapScanner(this, MapScanner.B.HOSPITAL_CHURCH));
|
||||||
|
bb.put("COMMERCIAL", new MapScanner(this, MapScanner.B.COMMERCIAL));
|
||||||
|
bb.put("INDUSTRIAL", new MapScanner(this, MapScanner.B.INDUSTRIAL));
|
||||||
|
bb.put("COAL", new MapScanner(this, MapScanner.B.COAL));
|
||||||
|
bb.put("NUCLEAR", new MapScanner(this, MapScanner.B.NUCLEAR));
|
||||||
|
bb.put("FIRESTATION", new MapScanner(this, MapScanner.B.FIRESTATION));
|
||||||
|
bb.put("POLICESTATION", new MapScanner(this, MapScanner.B.POLICESTATION));
|
||||||
|
bb.put("STADIUM_EMPTY", new MapScanner(this, MapScanner.B.STADIUM_EMPTY));
|
||||||
|
bb.put("STADIUM_FULL", new MapScanner(this, MapScanner.B.STADIUM_FULL));
|
||||||
|
bb.put("AIRPORT", new MapScanner(this, MapScanner.B.AIRPORT));
|
||||||
|
bb.put("SEAPORT", new MapScanner(this, MapScanner.B.SEAPORT));
|
||||||
|
|
||||||
|
this.tileBehaviors = bb;
|
||||||
|
}
|
||||||
|
|
||||||
void mapScan(int x0, int x1)
|
void mapScan(int x0, int x1)
|
||||||
{
|
{
|
||||||
MapScanner scanner = new MapScanner(this);
|
|
||||||
|
|
||||||
for (int x = x0; x < x1; x++)
|
for (int x = x0; x < x1; x++)
|
||||||
{
|
{
|
||||||
scanner.xpos = x;
|
|
||||||
|
|
||||||
for (int y = 0; y < getHeight(); y++)
|
for (int y = 0; y < getHeight(); y++)
|
||||||
{
|
{
|
||||||
scanner.ypos = y;
|
mapScanTile(x, y);
|
||||||
scanner.rawTile = map[y][x];
|
|
||||||
scanner.scanTile();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mapScanTile(int xpos, int ypos)
|
||||||
|
{
|
||||||
|
int rawTile = getTile(xpos, ypos);
|
||||||
|
String behaviorStr = getTileBehavior(rawTile & LOMASK);
|
||||||
|
if (behaviorStr == null) {
|
||||||
|
return; //nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
|
TileBehavior b = tileBehaviors.get(behaviorStr);
|
||||||
|
if (b != null) {
|
||||||
|
b.processTile(xpos, ypos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Error("Unknown behavior: "+behaviorStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void generateShip()
|
void generateShip()
|
||||||
{
|
{
|
||||||
int edge = PRNG.nextInt(4);
|
int edge = PRNG.nextInt(4);
|
||||||
|
|
Reference in a new issue