toolstroke: convert RoadLikeTool completely to use ToolEffect
git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@639 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
parent
90ab295364
commit
422a6e96f9
1 changed files with 54 additions and 49 deletions
|
@ -13,42 +13,44 @@ class RoadLikeTool extends ToolStroke
|
||||||
@Override
|
@Override
|
||||||
public ToolResult apply()
|
public ToolResult apply()
|
||||||
{
|
{
|
||||||
ToolResult checkResult = check();
|
Rectangle b = getBounds();
|
||||||
if (checkResult != ToolResult.SUCCESS) {
|
ToolEffect eff = new ToolEffect(city, b.x, b.y);
|
||||||
return checkResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (!applyForward()) {
|
if (!applyForward(eff)) {
|
||||||
return checkResult;
|
break;
|
||||||
}
|
}
|
||||||
if (!applyBackward()) {
|
if (!applyBackward(eff)) {
|
||||||
return checkResult;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return eff.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applyBackward()
|
boolean applyBackward(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
boolean anyChange = false;
|
boolean anyChange = false;
|
||||||
|
|
||||||
Rectangle b = getBounds();
|
Rectangle b = getBounds();
|
||||||
for (int i = b.height - 1; i >= 0; i--) {
|
for (int i = b.height - 1; i >= 0; i--) {
|
||||||
for (int j = b.width - 1; j >= 0; j--) {
|
for (int j = b.width - 1; j >= 0; j--) {
|
||||||
anyChange = anyChange || applySingle(b.x + j, b.y + i);
|
TranslatedToolEffect tte = new TranslatedToolEffect(eff, j, i);
|
||||||
|
anyChange = anyChange || applySingle(tte);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return anyChange;
|
return anyChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applyForward()
|
boolean applyForward(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
boolean anyChange = false;
|
boolean anyChange = false;
|
||||||
|
|
||||||
Rectangle b = getBounds();
|
Rectangle b = getBounds();
|
||||||
for (int i = 0; i < b.height; i++) {
|
for (int i = 0; i < b.height; i++) {
|
||||||
for (int j = 0; j < b.width; j++) {
|
for (int j = 0; j < b.width; j++) {
|
||||||
anyChange = anyChange || applySingle(b.x + j, b.y + i);
|
TranslatedToolEffect tte = new TranslatedToolEffect(eff, j, i);
|
||||||
|
anyChange = anyChange || applySingle(tte);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return anyChange;
|
return anyChange;
|
||||||
|
@ -83,55 +85,58 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applySingle(int xpos, int ypos)
|
boolean applySingle(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
switch (tool)
|
switch (tool)
|
||||||
{
|
{
|
||||||
case RAIL:
|
case RAIL:
|
||||||
return applyRailTool(xpos, ypos);
|
return applyRailTool(eff);
|
||||||
|
|
||||||
case ROADS:
|
case ROADS:
|
||||||
return applyRoadTool(xpos, ypos);
|
return applyRoadTool(eff);
|
||||||
|
|
||||||
case WIRE:
|
case WIRE:
|
||||||
return applyWireTool(xpos, ypos);
|
return applyWireTool(eff);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error("Unexpected tool: " + tool);
|
throw new Error("Unexpected tool: " + tool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applyRailTool(int xpos, int ypos)
|
boolean applyRailTool(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
assert city.testBounds(xpos, ypos);
|
if (layRail(eff)) {
|
||||||
|
fixZone(eff);
|
||||||
ToolEffect eff = new ToolEffect(city, xpos, ypos);
|
return true;
|
||||||
layRail(eff);
|
}
|
||||||
fixZone(eff);
|
else {
|
||||||
return eff.apply() == ToolResult.SUCCESS;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applyRoadTool(int xpos, int ypos)
|
boolean applyRoadTool(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
assert city.testBounds(xpos, ypos);
|
if (layRoad(eff)) {
|
||||||
|
fixZone(eff);
|
||||||
ToolEffect eff = new ToolEffect(city, xpos, ypos);
|
return true;
|
||||||
layRoad(eff);
|
}
|
||||||
fixZone(eff);
|
else {
|
||||||
return eff.apply() == ToolResult.SUCCESS;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean applyWireTool(int xpos, int ypos)
|
boolean applyWireTool(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
assert city.testBounds(xpos, ypos);
|
if (layWire(eff)) {
|
||||||
|
fixZone(eff);
|
||||||
ToolEffect eff = new ToolEffect(city, xpos, ypos);
|
return true;
|
||||||
layWire(eff);
|
}
|
||||||
fixZone(eff);
|
else {
|
||||||
return eff.apply() == ToolResult.SUCCESS;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void layRail(ToolEffectIfc eff)
|
private boolean layRail(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
final int RAIL_COST = 20;
|
final int RAIL_COST = 20;
|
||||||
final int TUNNEL_COST = 100;
|
final int TUNNEL_COST = 100;
|
||||||
|
@ -196,7 +201,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
// cannot do road here
|
// cannot do road here
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
case LHPOWER: // rail on power
|
case LHPOWER: // rail on power
|
||||||
eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT));
|
eff.setTile(0, 0, (char) (RAILVPOWERH | CONDBIT | BURNBIT | BULLBIT));
|
||||||
|
@ -221,7 +226,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// cannot do rail here
|
// cannot do rail here
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,10 +236,10 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
eff.spend(cost);
|
eff.spend(cost);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void layRoad(ToolEffectIfc eff)
|
private boolean layRoad(ToolEffectIfc eff)
|
||||||
{
|
{
|
||||||
final int ROAD_COST = 10;
|
final int ROAD_COST = 10;
|
||||||
final int BRIDGE_COST = 50;
|
final int BRIDGE_COST = 50;
|
||||||
|
@ -299,7 +304,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
// cannot do road here
|
// cannot do road here
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
case LHPOWER: //road on power
|
case LHPOWER: //road on power
|
||||||
eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT));
|
eff.setTile(0, 0, (char) (VROADPOWER | CONDBIT | BURNBIT | BULLBIT));
|
||||||
|
@ -324,7 +329,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// cannot do road here
|
// cannot do road here
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,10 +340,10 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
eff.spend(cost);
|
eff.spend(cost);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void layWire(ToolEffectIfc eff)
|
private boolean 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;
|
||||||
|
@ -417,7 +422,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
// cannot do wire here
|
// cannot do wire here
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
case TileConstants.ROADS: // wire on E/W road
|
case TileConstants.ROADS: // wire on E/W road
|
||||||
eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT));
|
eff.setTile(0, 0, (char) (HROADPOWER | CONDBIT | BURNBIT | BULLBIT));
|
||||||
|
@ -442,7 +447,7 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//cannot do wire here
|
//cannot do wire here
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,6 +457,6 @@ class RoadLikeTool extends ToolStroke
|
||||||
}
|
}
|
||||||
|
|
||||||
eff.spend(cost);
|
eff.spend(cost);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue