toolstroke: layRoad: convert to use ToolEffect

git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@637 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
jason@long.name 2013-05-16 23:44:12 +00:00
parent 5c85cd0a64
commit 81bc4319b3

View file

@ -114,9 +114,10 @@ class RoadLikeTool extends ToolStroke
{ {
assert city.testBounds(xpos, ypos); assert city.testBounds(xpos, ypos);
ToolResult result = layRoad(xpos, ypos); ToolEffect eff = new ToolEffect(city, xpos, ypos);
fixZone(xpos, ypos); layRoad(eff);
return result == ToolResult.SUCCESS; fixZone(eff);
return eff.apply() == ToolResult.SUCCESS;
} }
boolean applyWireTool(int xpos, int ypos) boolean applyWireTool(int xpos, int ypos)
@ -235,16 +236,14 @@ class RoadLikeTool extends ToolStroke
return ToolResult.SUCCESS; return ToolResult.SUCCESS;
} }
private ToolResult layRoad(int xpos, int ypos) private void layRoad(ToolEffectIfc eff)
{ {
final int ROAD_COST = 10; final int ROAD_COST = 10;
final int BRIDGE_COST = 50; final int BRIDGE_COST = 50;
int cost = ROAD_COST; int cost = ROAD_COST;
if (city.budget.totalFunds < cost)
return ToolResult.INSUFFICIENT_FUNDS;
char tile = (char) (city.getTile(xpos, ypos) & LOMASK); char tile = (char) (eff.getTile(0, 0) & LOMASK);
switch (tile) switch (tile)
{ {
case RIVER: // road on water case RIVER: // road on water
@ -252,74 +251,72 @@ class RoadLikeTool extends ToolStroke
case CHANNEL: // check how to build bridges, if possible. case CHANNEL: // check how to build bridges, if possible.
cost = BRIDGE_COST; cost = BRIDGE_COST;
if (city.budget.totalFunds < cost)
return ToolResult.INSUFFICIENT_FUNDS;
if (xpos + 1 < city.getWidth()) // check east
{ {
char eTile = neutralizeRoad(city.getTile(xpos + 1, ypos)); char eTile = neutralizeRoad(eff.getTile(1, 0));
if (eTile == VRAILROAD || if (eTile == VRAILROAD ||
eTile == HBRIDGE || eTile == HBRIDGE ||
(eTile >= TileConstants.ROADS && eTile <= HROADPOWER)) (eTile >= TileConstants.ROADS && eTile <= HROADPOWER))
{ {
city.setTile(xpos, ypos, (char) (HBRIDGE | BULLBIT)); eff.setTile(0, 0, (char) (HBRIDGE | BULLBIT));
break; break;
} }
} }
if (xpos > 0) // check west
{ {
char wTile = neutralizeRoad(city.getTile(xpos - 1, ypos)); char wTile = neutralizeRoad(eff.getTile(-1, 0));
if (wTile == VRAILROAD || if (wTile == VRAILROAD ||
wTile == HBRIDGE || wTile == HBRIDGE ||
(wTile >= TileConstants.ROADS && wTile <= INTERSECTION)) (wTile >= TileConstants.ROADS && wTile <= INTERSECTION))
{ {
city.setTile(xpos, ypos, (char) (HBRIDGE | BULLBIT)); eff.setTile(0, 0, (char) (HBRIDGE | BULLBIT));
break; break;
} }
} }
if (ypos + 1 < city.getHeight()) // check south
{ {
char sTile = neutralizeRoad(city.getTile(xpos, ypos + 1)); char sTile = neutralizeRoad(eff.getTile(0, 1));
if (sTile == HRAILROAD || if (sTile == HRAILROAD ||
sTile == VROADPOWER || sTile == VROADPOWER ||
(sTile >= VBRIDGE && sTile <= INTERSECTION)) (sTile >= VBRIDGE && sTile <= INTERSECTION))
{ {
city.setTile(xpos, ypos, (char) (VBRIDGE | BULLBIT)); eff.setTile(0, 0, (char) (VBRIDGE | BULLBIT));
break; break;
} }
} }
if (ypos > 0) // check north
{ {
char nTile = neutralizeRoad(city.getTile(xpos, ypos - 1)); char nTile = neutralizeRoad(eff.getTile(0, -1));
if (nTile == HRAILROAD || if (nTile == HRAILROAD ||
nTile == VROADPOWER || nTile == VROADPOWER ||
(nTile >= VBRIDGE && nTile <= INTERSECTION)) (nTile >= VBRIDGE && nTile <= INTERSECTION))
{ {
city.setTile(xpos, ypos, (char) (VBRIDGE | BULLBIT)); eff.setTile(0, 0, (char) (VBRIDGE | BULLBIT));
break; break;
} }
} }
// cannot do road here // cannot do road here
return ToolResult.NONE; return;
case LHPOWER: //road on power case LHPOWER: //road on power
city.setTile(xpos, ypos, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT));
break; break;
case LVPOWER: //road on power #2 case LVPOWER: //road on power #2
city.setTile(xpos, ypos, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT));
break; break;
case LHRAIL: //road on rail case LHRAIL: //road on rail
city.setTile(xpos, ypos, (char) (HRAILROAD | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (HRAILROAD | BURNBIT | BULLBIT));
break; break;
case LVRAIL: //road on rail #2 case LVRAIL: //road on rail #2
city.setTile(xpos, ypos, (char) (VRAILROAD | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (VRAILROAD | BURNBIT | BULLBIT));
break; break;
default: default:
@ -329,17 +326,18 @@ class RoadLikeTool extends ToolStroke
} }
else { else {
// cannot do road here // cannot do road here
return ToolResult.NONE; return;
} }
} }
// road on dirt // road on dirt;
city.setTile(xpos, ypos, (char) (TileConstants.ROADS | BULLBIT | BURNBIT)); // just build a plain road, fixZone will fix it.
eff.setTile(0, 0, (char) (TileConstants.ROADS | BULLBIT | BURNBIT));
break; break;
} }
city.spend(cost); eff.spend(cost);
return ToolResult.SUCCESS; return;
} }
private ToolResult layWire(int xpos, int ypos) private ToolResult layWire(int xpos, int ypos)