diff --git a/src/micropolisj/engine/Animate.java b/src/micropolisj/engine/Animate.java index f9f3c99..8e77d69 100644 --- a/src/micropolisj/engine/Animate.java +++ b/src/micropolisj/engine/Animate.java @@ -37,9 +37,6 @@ class Animate static int [] AniTabB = { 0, 0, 36, 44, 0, 0, 52, 60 }; static int [] AniTabC = { IND1, 0, IND2, IND4, 0, 0, IND6, IND8 }; static int [] AniTabD = { IND1, 0, IND3, IND5, 0, 0, IND7, IND9 }; - - static final int ASCBIT = (CONDBIT); - static final int REGBIT = (CONDBIT); } } diff --git a/src/micropolisj/engine/MapScanner.java b/src/micropolisj/engine/MapScanner.java index aac6819..1e15276 100644 --- a/src/micropolisj/engine/MapScanner.java +++ b/src/micropolisj/engine/MapScanner.java @@ -62,7 +62,7 @@ class MapScanner cchr9 = (char) (cchr & LOMASK); - if (city.newPower && ((cchr & CONDBIT) != 0)) + if (city.newPower && isConductive(cchr)) { setZonePower(); } @@ -118,7 +118,7 @@ class MapScanner // deteriorating roads if (PRNG.nextInt(512) == 0) { - if ((cchr & CONDBIT) == 0) + if (!isConductive(cchr)) { if (city.roadEffect < PRNG.nextInt(32)) { @@ -251,7 +251,7 @@ class MapScanner if (city.roadEffect < 30) { // deteriorating rail if (PRNG.nextInt(512) == 0) { - if ((cchr & CONDBIT) == 0) { + if (!isConductive(cchr)) { if (city.roadEffect < PRNG.nextInt(32)) { if (isOverWater(cchr)) { city.setTile(xpos,ypos,RIVER); @@ -509,7 +509,7 @@ class MapScanner { for (int x = xpos-1; x <= xpos+1; x++) { - city.setTile(x, y, (char)(base | CONDBIT | (x == xpos && y == ypos ? BULLBIT : 0))); + city.setTile(x, y, (char)(base | (x == xpos && y == ypos ? BULLBIT : 0))); base++; } } @@ -631,13 +631,13 @@ class MapScanner { if ((city.map[ypos-1][xpos+1] & LOMASK) == RADAR) { city.setTile(xpos+1,ypos-1, (char) - (RADAR_ANIM + CONDBIT) + (RADAR_ANIM) ); } } else { - city.setTile(xpos+1,ypos-1,(char)(RADAR + CONDBIT)); + city.setTile(xpos+1,ypos-1,(char)(RADAR)); } if (powerOn) { @@ -759,7 +759,7 @@ class MapScanner { //not rubble, radiactive, on fire or flooded city.setTile(xx,yy,(char) - (zoneBase+CONDBIT) + (zoneBase) ); } } @@ -849,12 +849,12 @@ class MapScanner if (powerOn) { if (t == Smoke.AniTabC[z]) //expected non-animated tile { - city.setTile(xx,yy,(char)(Smoke.ASCBIT | (SMOKEBASE + Smoke.AniTabA[z]))); + city.setTile(xx,yy,(char)(SMOKEBASE + Smoke.AniTabA[z])); } } else { if (t > Smoke.AniTabC[z]) { - city.setTile(xx,yy,(char)(Smoke.REGBIT | Smoke.AniTabC[z])); + city.setTile(xx,yy,(char)(Smoke.AniTabC[z])); } } } @@ -866,12 +866,12 @@ class MapScanner int t = city.map[yy][xx] & LOMASK; if (powerOn) { if (t == Smoke.AniTabD[z]) { - city.setTile(xx,yy,(char)(Smoke.ASCBIT | (SMOKEBASE + Smoke.AniTabB[z]))); + city.setTile(xx,yy,(char)(SMOKEBASE + Smoke.AniTabB[z])); } } else { if (t > Smoke.AniTabD[z]) { - city.setTile(xx,yy,(char)(Smoke.REGBIT | Smoke.AniTabD[z])); + city.setTile(xx,yy,(char)(Smoke.AniTabD[z])); } } } @@ -1080,7 +1080,7 @@ class MapScanner assert houseNumber >= 0 && houseNumber < 12; assert city.testBounds(xx, yy); - city.setTile(xx, yy, (char)((HOUSE + houseNumber) | BULLBIT | CONDBIT)); + city.setTile(xx, yy, (char)((HOUSE + houseNumber) | BULLBIT)); } } @@ -1207,7 +1207,7 @@ class MapScanner { // downgrade from full-size zone to 8 little houses - city.setTile(xpos, ypos, (char)(FREEZ | BULLBIT | CONDBIT)); + city.setTile(xpos, ypos, (char)(FREEZ | BULLBIT)); for (int x = xpos-1; x <= xpos+1; x++) { for (int y = ypos-1; y <= ypos+1; y++) @@ -1218,7 +1218,7 @@ class MapScanner { // pick a random small house int houseNumber = value * 3 + PRNG.nextInt(3); - city.setTile(x, y, (char) ((HOUSE + houseNumber) | BULLBIT | CONDBIT)); + city.setTile(x, y, (char) ((HOUSE + houseNumber) | BULLBIT)); } } } @@ -1243,7 +1243,7 @@ class MapScanner int loc = city.map[y][x] & LOMASK; if (loc >= LHTHR && loc <= HHTHR) { //little house - city.setTile(x, y, (char)((Brdr[z] + FREEZ - 4) | BULLBIT | CONDBIT)); + city.setTile(x, y, (char)((Brdr[z] + FREEZ - 4) | BULLBIT)); return; } } @@ -1342,7 +1342,7 @@ class MapScanner int tile = city.getTile(xpos+dx[z], ypos+dy[z]) & LOMASK; if (tile >= COALBASE && tile < COALBASE + 4*4) { city.setTile(xpos + dx[z], ypos + dy[z], - (char) (SmTb[z] | CONDBIT | PWRBIT) + (char) (SmTb[z] | PWRBIT) ); } } @@ -1374,7 +1374,7 @@ class MapScanner for (int x = 0; x < 4; x++, zoneBase++) { city.setTile(xpos - 1 + x, ypos - 1 + y, - (char) (zoneBase | CONDBIT | (x == 1 && y == 1 ? (PWRBIT) : 0))); + (char) (zoneBase | (x == 1 && y == 1 ? (PWRBIT) : 0))); } } } diff --git a/src/micropolisj/engine/Micropolis.java b/src/micropolisj/engine/Micropolis.java index e3eba46..1c09a45 100644 --- a/src/micropolisj/engine/Micropolis.java +++ b/src/micropolisj/engine/Micropolis.java @@ -906,11 +906,6 @@ public class Micropolis fireMapOverlayDataChanged(MapState.FIRE_OVERLAY); } - private boolean isConductive(int x, int y) - { - return (map[y][x] & CONDBIT) != 0; - } - private boolean testForCond(CityLocation loc, int dir) { int xsave = loc.x; @@ -920,7 +915,7 @@ public class Micropolis if (movePowerLocation(loc,dir)) { rv = ( - isConductive(loc.x, loc.y) && + isConductive(map[loc.y][loc.x]) && map[loc.y][loc.x] != NUCLEAR && map[loc.y][loc.x] != POWERPLANT && !hasPower(loc.x, loc.y) @@ -1965,7 +1960,7 @@ public class Micropolis for (int y = 0; y < DEFAULT_HEIGHT; y++) { int z = dis.readShort(); - z &= ~(1024 | 2048 | 8192); // clear ZONEBIT,ANIMBIT,BURNBIT on import + z &= ~(1024 | 2048 | 8192 | 16384); // clear ZONEBIT,ANIMBIT,BURNBIT,CONDBIT on import map[y][x] = (char) z; } } @@ -1979,6 +1974,9 @@ public class Micropolis for (int y = 0; y < DEFAULT_HEIGHT; y++) { int z = map[y][x]; + if (isConductive(z)) { + z |= 16384; //synthesize CONDBIT on export + } if (isCombustible(z)) { z |= 8192; //synthesize BURNBIT on export } @@ -2344,7 +2342,7 @@ public class Micropolis (t & LOMASK) >= COALSMOKE1 && (t & LOMASK) < COALSMOKE4+4) { // animated coal smoke - setTile(xtem, ytem, (char)(zoneBase | CONDBIT | BULLBIT)); + setTile(xtem, ytem, (char)(zoneBase | BULLBIT)); continue; } diff --git a/src/micropolisj/engine/RoadLikeTool.java b/src/micropolisj/engine/RoadLikeTool.java index 18b04c2..036bb3d 100644 --- a/src/micropolisj/engine/RoadLikeTool.java +++ b/src/micropolisj/engine/RoadLikeTool.java @@ -201,11 +201,11 @@ class RoadLikeTool extends ToolStroke return false; case LHPOWER: // rail on power - eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (RAILVPOWERH | BULLBIT)); break; case LVPOWER: // rail on power - eff.setTile(0, 0, (char) (RAILHPOWERV | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (RAILHPOWERV | BULLBIT)); break; case TileConstants.ROADS: // rail on road (case 1) @@ -304,11 +304,11 @@ class RoadLikeTool extends ToolStroke return false; case LHPOWER: //road on power - eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (VROADPOWER | BULLBIT)); break; case LVPOWER: //road on power #2 - eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (HROADPOWER | BULLBIT)); break; case LHRAIL: //road on rail @@ -363,12 +363,12 @@ class RoadLikeTool extends ToolStroke int tmp = eff.getTile(1, 0); char tmpn = neutralizeRoad(tmp); - if ((tmp & CONDBIT) != 0 && + if (isConductive(tmp) && tmpn != HROADPOWER && tmpn != RAILHPOWERV && tmpn != HPOWER) { - eff.setTile(0, 0, (char) (VPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (VPOWER | BULLBIT)); break; } } @@ -378,12 +378,12 @@ class RoadLikeTool extends ToolStroke int tmp = eff.getTile(-1, 0); char tmpn = neutralizeRoad(tmp); - if ((tmp & CONDBIT) != 0 && + if (isConductive(tmp) && tmpn != HROADPOWER && tmpn != RAILHPOWERV && tmpn != HPOWER) { - eff.setTile(0, 0, (char) (VPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (VPOWER | BULLBIT)); break; } } @@ -393,12 +393,12 @@ class RoadLikeTool extends ToolStroke int tmp = eff.getTile(0, 1); char tmpn = neutralizeRoad(tmp); - if ((tmp & CONDBIT) != 0 && + if (isConductive(tmp) && tmpn != VROADPOWER && tmpn != RAILVPOWERH && tmpn != VPOWER) { - eff.setTile(0, 0, (char) (HPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (HPOWER | BULLBIT)); break; } } @@ -408,12 +408,12 @@ class RoadLikeTool extends ToolStroke int tmp = eff.getTile(0, -1); char tmpn = neutralizeRoad(tmp); - if ((tmp & CONDBIT) != 0 && + if (isConductive(tmp) && tmpn != VROADPOWER && tmpn != RAILVPOWERH && tmpn != VPOWER) { - eff.setTile(0, 0, (char) (HPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (HPOWER | BULLBIT)); break; } } @@ -422,19 +422,19 @@ class RoadLikeTool extends ToolStroke return false; case TileConstants.ROADS: // wire on E/W road - eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (HROADPOWER | BULLBIT)); break; case ROADS2: // wire on N/S road - eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (VROADPOWER | BULLBIT)); break; case LHRAIL: // wire on E/W railroad tracks - eff.setTile(0, 0, (char) (RAILHPOWERV | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (RAILHPOWERV | BULLBIT)); break; case LVRAIL: // wire on N/S railroad tracks - eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (RAILVPOWERH | BULLBIT)); break; default: @@ -449,7 +449,7 @@ class RoadLikeTool extends ToolStroke } //wire on dirt - eff.setTile(0, 0, (char) (LHPOWER | CONDBIT | BULLBIT)); + eff.setTile(0, 0, (char) (LHPOWER | BULLBIT)); break; } diff --git a/src/micropolisj/engine/TileConstants.java b/src/micropolisj/engine/TileConstants.java index 2327d70..c2479d1 100644 --- a/src/micropolisj/engine/TileConstants.java +++ b/src/micropolisj/engine/TileConstants.java @@ -209,7 +209,7 @@ public class TileConstants // status bits // public static final char PWRBIT = 32768; // bit 15 ... currently powered - public static final char CONDBIT = 16384; // bit 14 ... can conduct power + // bit 14 ... unused // bit 13 ... unused public static final char BULLBIT = 4096; // bit 12 ... is bulldozable // bit 11 ... unused @@ -304,6 +304,12 @@ public class TileConstants return spec != null && spec.canBurn; } + public static boolean isConductive(int tile) + { + TileSpec spec = Tiles.get(tile & LOMASK); + return spec != null && spec.canConduct; + } + public static boolean isFire(int tile) { int tmp = tile & LOMASK; diff --git a/src/micropolisj/engine/TileSpec.java b/src/micropolisj/engine/TileSpec.java index 87b20e5..df6c1b8 100644 --- a/src/micropolisj/engine/TileSpec.java +++ b/src/micropolisj/engine/TileSpec.java @@ -7,6 +7,7 @@ public class TileSpec int tileNumber; TileSpec animNext; boolean canBurn; + boolean canConduct; boolean zone; Map attributes; @@ -71,6 +72,7 @@ public class TileSpec } this.canBurn = !getBooleanAttribute("noburn"); + this.canConduct = getBooleanAttribute("conducts"); this.zone = getBooleanAttribute("zone"); } diff --git a/src/micropolisj/engine/ToolStroke.java b/src/micropolisj/engine/ToolStroke.java index c02f4a4..8b66de5 100644 --- a/src/micropolisj/engine/ToolStroke.java +++ b/src/micropolisj/engine/ToolStroke.java @@ -182,7 +182,7 @@ public class ToolStroke for (int columnNum = 0; columnNum < width; columnNum++) { eff.setTile(columnNum, rowNum, (char) ( - tileBase | CONDBIT + tileBase )); tileBase++; } @@ -412,7 +412,7 @@ public class ToolStroke { tile = eff.getTile(0, -1); char ntile = neutralizeRoad(tile); - if ((tile & CONDBIT) != 0 && + if (isConductive(tile) && ntile != VPOWER && ntile != VROADPOWER && ntile != RAILVPOWERH) @@ -425,7 +425,7 @@ public class ToolStroke { tile = eff.getTile(1, 0); char ntile = neutralizeRoad(tile); - if ((tile & CONDBIT) != 0 && + if (isConductive(tile) && ntile != HPOWER && ntile != HROADPOWER && ntile != RAILHPOWERV) @@ -438,7 +438,7 @@ public class ToolStroke { tile = eff.getTile(0, 1); char ntile = neutralizeRoad(tile); - if ((tile & CONDBIT) != 0 && + if (isConductive(tile) && ntile != VPOWER && ntile != VROADPOWER && ntile != RAILVPOWERH) @@ -451,7 +451,7 @@ public class ToolStroke { tile = eff.getTile(-1, 0); char ntile = neutralizeRoad(tile); - if ((tile & CONDBIT) != 0 && + if (isConductive(tile) && ntile != HPOWER && ntile != HROADPOWER && ntile != RAILHPOWERV) @@ -460,7 +460,7 @@ public class ToolStroke } } - eff.setTile(0, 0, (WireTable[adjTile] | BULLBIT | CONDBIT)); + eff.setTile(0, 0, (WireTable[adjTile] | BULLBIT)); } //end if on a rail tile return; diff --git a/src/micropolisj/gui/OverlayMapView.java b/src/micropolisj/gui/OverlayMapView.java index 1746b89..e3da4af 100644 --- a/src/micropolisj/gui/OverlayMapView.java +++ b/src/micropolisj/gui/OverlayMapView.java @@ -260,7 +260,7 @@ public class OverlayMapView extends JComponent // zone pix = ((rawTile & PWRBIT) != 0) ? POWERED : UNPOWERED; } - else if ((rawTile & CONDBIT) != 0) { + else if (isConductive(rawTile)) { pix = CONDUCTIVE; } else {