refactor: make TileSpec do its own reference resolving
git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@905 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
parent
447a78b4d7
commit
ae13414b34
2 changed files with 63 additions and 30 deletions
|
@ -284,4 +284,65 @@ public class TileSpec
|
||||||
{
|
{
|
||||||
return "{tile#"+tileNumber+"}";
|
return "{tile#"+tileNumber+"}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resolveReferences(Map<String,TileSpec> tileMap)
|
||||||
|
{
|
||||||
|
String tmp = this.getAttribute("becomes");
|
||||||
|
if (tmp != null) {
|
||||||
|
this.animNext = tileMap.get(tmp);
|
||||||
|
}
|
||||||
|
tmp = this.getAttribute("onpower");
|
||||||
|
if (tmp != null) {
|
||||||
|
this.onPower = tileMap.get(tmp);
|
||||||
|
}
|
||||||
|
tmp = this.getAttribute("onshutdown");
|
||||||
|
if (tmp != null) {
|
||||||
|
this.onShutdown = tileMap.get(tmp);
|
||||||
|
}
|
||||||
|
tmp = this.getAttribute("building-part");
|
||||||
|
if (tmp != null) {
|
||||||
|
this.handleBuildingPart(tmp, tileMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleBuildingPart(String text, Map<String,TileSpec> tileMap)
|
||||||
|
{
|
||||||
|
String [] parts = text.split(",");
|
||||||
|
if (parts.length != 3) {
|
||||||
|
throw new Error("Invalid building-part specification");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.owner = tileMap.get(parts[0]);
|
||||||
|
this.ownerOffsetX = Integer.parseInt(parts[1]);
|
||||||
|
this.ownerOffsetY = Integer.parseInt(parts[2]);
|
||||||
|
|
||||||
|
assert this.owner != null;
|
||||||
|
assert this.ownerOffsetX != 0 || this.ownerOffsetY != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String [] generateTileNames(Properties recipe)
|
||||||
|
{
|
||||||
|
int ntiles = recipe.size();
|
||||||
|
String [] tileNames = new String[ntiles];
|
||||||
|
ntiles = 0;
|
||||||
|
for (int i = 0; recipe.containsKey(Integer.toString(i)); i++) {
|
||||||
|
tileNames[ntiles++] = Integer.toString(i);
|
||||||
|
}
|
||||||
|
int naturalNumberTiles = ntiles;
|
||||||
|
|
||||||
|
for (Object n_obj : recipe.keySet()) {
|
||||||
|
String n = (String)n_obj;
|
||||||
|
if (n.matches("^\\d+$")) {
|
||||||
|
int x = Integer.parseInt(n);
|
||||||
|
if (x >= 0 && x < naturalNumberTiles) {
|
||||||
|
assert tileNames[x].equals(n);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert ntiles < tileNames.length;
|
||||||
|
tileNames[ntiles++] = n;
|
||||||
|
}
|
||||||
|
assert ntiles == tileNames.length;
|
||||||
|
return tileNames;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,22 +54,8 @@ public class Tiles
|
||||||
tiles = tilesList.toArray(new TileSpec[0]);
|
tiles = tilesList.toArray(new TileSpec[0]);
|
||||||
|
|
||||||
for (int i = 0; i < tiles.length; i++) {
|
for (int i = 0; i < tiles.length; i++) {
|
||||||
String tmp = tiles[i].getAttribute("becomes");
|
tiles[i].resolveReferences(tilesByName);
|
||||||
if (tmp != null) {
|
|
||||||
tiles[i].animNext = get(Integer.parseInt(tmp));
|
|
||||||
}
|
|
||||||
tmp = tiles[i].getAttribute("onpower");
|
|
||||||
if (tmp != null) {
|
|
||||||
tiles[i].onPower = get(Integer.parseInt(tmp));
|
|
||||||
}
|
|
||||||
tmp = tiles[i].getAttribute("onshutdown");
|
|
||||||
if (tmp != null) {
|
|
||||||
tiles[i].onShutdown = get(Integer.parseInt(tmp));
|
|
||||||
}
|
|
||||||
tmp = tiles[i].getAttribute("building-part");
|
|
||||||
if (tmp != null) {
|
|
||||||
handleBuildingPart(tiles[i], tmp);
|
|
||||||
}
|
|
||||||
TileSpec.BuildingInfo bi = tiles[i].getBuildingInfo();
|
TileSpec.BuildingInfo bi = tiles[i].getBuildingInfo();
|
||||||
if (bi != null) {
|
if (bi != null) {
|
||||||
for (int j = 0; j < bi.members.length; j++) {
|
for (int j = 0; j < bi.members.length; j++) {
|
||||||
|
@ -90,20 +76,6 @@ public class Tiles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void handleBuildingPart(TileSpec partTile, String tmp)
|
|
||||||
{
|
|
||||||
String [] parts = tmp.split(",");
|
|
||||||
if (parts.length != 3) {
|
|
||||||
throw new Error("Invalid building-part specification");
|
|
||||||
}
|
|
||||||
|
|
||||||
partTile.owner = get(Integer.parseInt(parts[0]));
|
|
||||||
partTile.ownerOffsetX = Integer.parseInt(parts[1]);
|
|
||||||
partTile.ownerOffsetY = Integer.parseInt(parts[2]);
|
|
||||||
|
|
||||||
assert partTile.ownerOffsetX != 0 || partTile.ownerOffsetY != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TileSpec get(int tileNumber)
|
public static TileSpec get(int tileNumber)
|
||||||
{
|
{
|
||||||
if (tileNumber >= 0 && tileNumber < tiles.length) {
|
if (tileNumber >= 0 && tileNumber < tiles.length) {
|
||||||
|
|
Reference in a new issue