toolstroke: layWire, layRail: convert to ToolEffect

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

View file

@ -105,9 +105,10 @@ class RoadLikeTool extends ToolStroke
{ {
assert city.testBounds(xpos, ypos); assert city.testBounds(xpos, ypos);
ToolResult result = layRail(xpos, ypos); ToolEffect eff = new ToolEffect(city, xpos, ypos);
fixZone(xpos, ypos); layRail(eff);
return result == ToolResult.SUCCESS; fixZone(eff);
return eff.apply() == ToolResult.SUCCESS;
} }
boolean applyRoadTool(int xpos, int ypos) boolean applyRoadTool(int xpos, int ypos)
@ -124,21 +125,20 @@ class RoadLikeTool extends ToolStroke
{ {
assert city.testBounds(xpos, ypos); assert city.testBounds(xpos, ypos);
ToolResult result = layWire(xpos, ypos); ToolEffect eff = new ToolEffect(city, xpos, ypos);
fixZone(xpos, ypos); layWire(eff);
return result == ToolResult.SUCCESS; fixZone(eff);
return eff.apply() == ToolResult.SUCCESS;
} }
private ToolResult layRail(int xpos, int ypos) private void layRail(ToolEffectIfc eff)
{ {
final int RAIL_COST = 20; final int RAIL_COST = 20;
final int TUNNEL_COST = 100; final int TUNNEL_COST = 100;
int cost = RAIL_COST; int cost = RAIL_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: // rail on water case RIVER: // rail on water
@ -146,74 +146,72 @@ class RoadLikeTool extends ToolStroke
case CHANNEL: case CHANNEL:
cost = TUNNEL_COST; cost = TUNNEL_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 == RAILHPOWERV || if (eTile == RAILHPOWERV ||
eTile == HRAIL || eTile == HRAIL ||
(eTile >= LHRAIL && eTile <= HRAILROAD)) (eTile >= LHRAIL && eTile <= HRAILROAD))
{ {
city.setTile(xpos, ypos, (char) (HRAIL | BULLBIT)); eff.setTile(0, 0, (char) (HRAIL | 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 == RAILHPOWERV || if (wTile == RAILHPOWERV ||
wTile == HRAIL || wTile == HRAIL ||
(wTile > VRAIL && wTile < VRAILROAD)) (wTile > VRAIL && wTile < VRAILROAD))
{ {
city.setTile(xpos, ypos, (char) (HRAIL | BULLBIT)); eff.setTile(0, 0, (char) (HRAIL | 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 == RAILVPOWERH || if (sTile == RAILVPOWERH ||
sTile == VRAILROAD || sTile == VRAILROAD ||
(sTile > HRAIL && sTile < HRAILROAD)) (sTile > HRAIL && sTile < HRAILROAD))
{ {
city.setTile(xpos, ypos, (char) (VRAIL | BULLBIT)); eff.setTile(0, 0, (char) (VRAIL | 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 == RAILVPOWERH || if (nTile == RAILVPOWERH ||
nTile == VRAILROAD || nTile == VRAILROAD ||
(nTile > HRAIL && nTile < HRAILROAD)) (nTile > HRAIL && nTile < HRAILROAD))
{ {
city.setTile(xpos, ypos, (char) (VRAIL | BULLBIT)); eff.setTile(0, 0, (char) (VRAIL | BULLBIT));
break; break;
} }
} }
// cannot do road here // cannot do road here
return ToolResult.NONE; return;
case LHPOWER: // rail on power case LHPOWER: // rail on power
city.setTile(xpos, ypos, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT));
break; break;
case LVPOWER: // rail on power case LVPOWER: // rail on power
city.setTile(xpos, ypos, (char) (RAILHPOWERV | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (RAILHPOWERV | CONDBIT | BURNBIT | BULLBIT));
break; break;
case TileConstants.ROADS: // rail on road (case 1) case TileConstants.ROADS: // rail on road (case 1)
city.setTile(xpos, ypos, (char) (VRAILROAD | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (VRAILROAD | BURNBIT | BULLBIT));
break; break;
case ROADS2: // rail on road (case 2) case ROADS2: // rail on road (case 2)
city.setTile(xpos, ypos, (char) (HRAILROAD | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (HRAILROAD | BURNBIT | BULLBIT));
break; break;
default: default:
@ -223,17 +221,17 @@ class RoadLikeTool extends ToolStroke
} }
else { else {
// cannot do rail here // cannot do rail here
return ToolResult.NONE; return;
} }
} }
//rail on dirt //rail on dirt
city.setTile(xpos, ypos, (char) (LHRAIL | BULLBIT | BURNBIT)); eff.setTile(0, 0, (char) (LHRAIL | BULLBIT | BURNBIT));
break; break;
} }
city.spend(cost); eff.spend(cost);
return ToolResult.SUCCESS; return;
} }
private void layRoad(ToolEffectIfc eff) private void layRoad(ToolEffectIfc eff)
@ -340,16 +338,14 @@ class RoadLikeTool extends ToolStroke
return; return;
} }
private ToolResult layWire(int xpos, int ypos) private void layWire(ToolEffectIfc eff)
{ {
final int WIRE_COST = 5; final int WIRE_COST = 5;
final int UNDERWATER_WIRE_COST = 25; final int UNDERWATER_WIRE_COST = 25;
int cost = WIRE_COST; int cost = WIRE_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);
tile = neutralizeRoad(tile); tile = neutralizeRoad(tile);
switch (tile) switch (tile)
@ -359,12 +355,10 @@ class RoadLikeTool extends ToolStroke
case CHANNEL: case CHANNEL:
cost = UNDERWATER_WIRE_COST; cost = UNDERWATER_WIRE_COST;
if (city.budget.totalFunds < cost)
return ToolResult.INSUFFICIENT_FUNDS;
if (xpos + 1 < city.getWidth()) // check east
{ {
char tmp = city.getTile(xpos + 1, ypos); int tmp = eff.getTile(1, 0);
char tmpn = neutralizeRoad(tmp); char tmpn = neutralizeRoad(tmp);
if ((tmp & CONDBIT) != 0 && if ((tmp & CONDBIT) != 0 &&
@ -372,14 +366,14 @@ class RoadLikeTool extends ToolStroke
tmpn != RAILHPOWERV && tmpn != RAILHPOWERV &&
tmpn != HPOWER) tmpn != HPOWER)
{ {
city.setTile(xpos, ypos, (char) (VPOWER | CONDBIT | BULLBIT)); eff.setTile(0, 0, (char) (VPOWER | CONDBIT | BULLBIT));
break; break;
} }
} }
if (xpos > 0) // check west
{ {
char tmp = city.getTile(xpos - 1, ypos); int tmp = eff.getTile(-1, 0);
char tmpn = neutralizeRoad(tmp); char tmpn = neutralizeRoad(tmp);
if ((tmp & CONDBIT) != 0 && if ((tmp & CONDBIT) != 0 &&
@ -387,14 +381,14 @@ class RoadLikeTool extends ToolStroke
tmpn != RAILHPOWERV && tmpn != RAILHPOWERV &&
tmpn != HPOWER) tmpn != HPOWER)
{ {
city.setTile(xpos, ypos, (char) (VPOWER | CONDBIT | BULLBIT)); eff.setTile(0, 0, (char) (VPOWER | CONDBIT | BULLBIT));
break; break;
} }
} }
if (ypos + 1 < city.getHeight()) // check south
{ {
char tmp = city.getTile(xpos, ypos + 1); int tmp = eff.getTile(0, 1);
char tmpn = neutralizeRoad(tmp); char tmpn = neutralizeRoad(tmp);
if ((tmp & CONDBIT) != 0 && if ((tmp & CONDBIT) != 0 &&
@ -402,14 +396,14 @@ class RoadLikeTool extends ToolStroke
tmpn != RAILVPOWERH && tmpn != RAILVPOWERH &&
tmpn != VPOWER) tmpn != VPOWER)
{ {
city.setTile(xpos, ypos, (char) (HPOWER | CONDBIT | BULLBIT)); eff.setTile(0, 0, (char) (HPOWER | CONDBIT | BULLBIT));
break; break;
} }
} }
if (ypos > 0) // check north
{ {
char tmp = city.getTile(xpos, ypos - 1); int tmp = eff.getTile(0, -1);
char tmpn = neutralizeRoad(tmp); char tmpn = neutralizeRoad(tmp);
if ((tmp & CONDBIT) != 0 && if ((tmp & CONDBIT) != 0 &&
@ -417,28 +411,28 @@ class RoadLikeTool extends ToolStroke
tmpn != RAILVPOWERH && tmpn != RAILVPOWERH &&
tmpn != VPOWER) tmpn != VPOWER)
{ {
city.setTile(xpos, ypos, (char) (HPOWER | CONDBIT | BULLBIT)); eff.setTile(0, 0, (char) (HPOWER | CONDBIT | BULLBIT));
break; break;
} }
} }
// cannot do wire here // cannot do wire here
return ToolResult.NONE; return;
case TileConstants.ROADS: // wire on E/W road case TileConstants.ROADS: // wire on E/W road
city.setTile(xpos, ypos, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT));
break; break;
case ROADS2: // wire on N/S road case ROADS2: // wire on N/S road
city.setTile(xpos, ypos, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT));
break; break;
case LHRAIL: // wire on E/W railroad tracks case LHRAIL: // wire on E/W railroad tracks
city.setTile(xpos, ypos, (char) (RAILHPOWERV | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (RAILHPOWERV | CONDBIT | BURNBIT | BULLBIT));
break; break;
case LVRAIL: // wire on N/S railroad tracks case LVRAIL: // wire on N/S railroad tracks
city.setTile(xpos, ypos, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT)); eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT));
break; break;
default: default:
@ -448,16 +442,16 @@ class RoadLikeTool extends ToolStroke
} }
else { else {
//cannot do wire here //cannot do wire here
return ToolResult.NONE; return;
} }
} }
//wire on dirt //wire on dirt
city.setTile(xpos, ypos, (char) (LHPOWER | CONDBIT | BULLBIT | BURNBIT)); eff.setTile(0, 0, (char) (LHPOWER | CONDBIT | BULLBIT | BURNBIT));
break; break;
} }
city.spend(cost); eff.spend(cost);
return ToolResult.SUCCESS; return;
} }
} }