Loading

Revision differences

Old revision #pwaldxdg9New revision #pntsd7s9a
  1Index: src/station_cmd.cpp  
  2===================================================================  
  3--- src/station_cmd.cpp    (revision 27632)  
  4+++ src/station_cmd.cpp    (working copy)  
  5@@ -2504,6 +2504,21 @@  
  6         return_cmd_error(STR_ERROR_SITE_UNSUITABLE);  
  7     }  
  8   
  9+    TileIndex tc = tile_cur;  
  10+    DiagDirection dir_rotate = ReverseDiagDir(direction);  
  11+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);  
  12+    if (ret.Failed()) return ret;  
  13+  
  14+    tc = dir_rotate == DIAGDIR_NE ? tc + TileDiffXY(-1, -1) : dir_rotate == DIAGDIR_NW ? tc + TileDiffXY(1, -1) : dir_rotate == DIAGDIR_SW ? tc + TileDiffXY(1, 1) : tc + TileDiffXY(-1, 1);  
  15+    dir_rotate = ChangeDiagDir(dir_rotate, DIAGDIRDIFF_90RIGHT);  
  16+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);  
  17+    if (ret.Failed()) return ret;  
  18+  
  19+    tc = dir_rotate == DIAGDIR_NE ? tc + TileDiffXY(-2, 0) : dir_rotate == DIAGDIR_NW ? tc + TileDiffXY(0, -2) : dir_rotate == DIAGDIR_SW ? tc + TileDiffXY(2, 0) : tc + TileDiffXY(0, 2);  
  20+    dir_rotate = ReverseDiagDir(dir_rotate);  
  21+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);  
  22+    if (ret.Failed()) return ret;  
  23+  
  24     TileArea dock_area = TileArea(tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),  
  25             _dock_w_chk[direction], _dock_h_chk[direction]);  
  26   
  27Index: src/vehicle.cpp  
  28===================================================================  
  29--- src/vehicle.cpp    (revision 27632)  
  30+++ src/vehicle.cpp    (working copy)  
  31@@ -484,6 +484,24 @@  
  32     return CommandCost();  
  33 }  
  34   
  35+/**  
  36+* Ensure there is no ship on the water at the given diagonal direction.  
  37+* @param tile Position to examine.  
  38+* @param diag_dir Diagonal direction  
  39+* @return Succeeded command (water is free) or failed command (a ship is found).  
  40+*/  
  41+CommandCost EnsureNoShipOnDiagDir(TileIndex tile, DiagDirection diag_dir)  
  42+{  
  43+    if (HasTileWaterClass(tile)) {  
  44+        TrackBits tb = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0));  
  45+        if (((diag_dir == DIAGDIR_NE && (tb & TRACK_BIT_3WAY_NE) != 0) || (diag_dir == DIAGDIR_SE && (tb & TRACK_BIT_3WAY_SE) != 0) || (diag_dir == DIAGDIR_NW && (tb & TRACK_BIT_3WAY_NW) != 0) || (diag_dir == DIAGDIR_SW && (tb & TRACK_BIT_3WAY_SW) != 0) && !IsShipDepotTile(tile) && IsTileType(tile, MP_WATER) && !IsLock(tile))) {  
  46+            CommandCost ret = EnsureNoVehicleOnGround(tile);  
  47+            if (ret.Failed()) return ret;  
  48+        }  
  49+    }  
  50+    return CommandCost();  
  51+}  
  52+  
  53 /** Procedure called for every vehicle found in tunnel/bridge in the hash map */  
  54 static Vehicle *GetVehicleTunnelBridgeProc(Vehicle *v, void *data)  
  55 {  
  56Index: src/vehicle_func.h  
  57===================================================================  
  58--- src/vehicle_func.h    (revision 27632)  
  59+++ src/vehicle_func.h    (working copy)  
  60@@ -165,6 +165,7 @@  
  61   
  62 CommandCost EnsureNoVehicleOnGround(TileIndex tile);  
  63 CommandCost EnsureNoTrainOnTrackBits(TileIndex tile, TrackBits track_bits);  
  64+CommandCost EnsureNoShipOnDiagDir(TileIndex tile, DiagDirection diag_dir);  
  65   
  66 extern VehicleID _new_vehicle_id;  
  67 extern uint16 _returned_refit_capacity;  
1Index: src/water_cmd.cpp  68Index: src/water_cmd.cpp  
2===================================================================  69===================================================================  
3--- src/water_cmd.cpp    (revision 27632)  70--- src/water_cmd.cpp    (revision 27632)  
4+++ src/water_cmd.cpp    (working copy)  71+++ src/water_cmd.cpp    (working copy)  
5@@ -135,6 +135,39 @@  5@@ -135,6 +135,24 @@
6         cost.AddCost(ret);  73         cost.AddCost(ret);  
7     }  74     }  
8   75   
9+    TrackBits tb;  9+    DiagDirection dir_rotate = axis == AXIS_X ? DIAGDIR_SE : DIAGDIR_NE;
10+    TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0));  77+    TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0));  
11+    if (HasTileWaterClass(tc)) {  11+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
12+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  12+    if (ret.Failed()) return ret;
13+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  13+
14+            ret = EnsureNoVehicleOnGround(tc);    
15+            if (ret.Failed()) return ret;    
16+        }    
17+    }    
18+    tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0));  81+    tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0));  
19+    if (HasTileWaterClass(tc)) {  19+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
20+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  20+    if (ret.Failed()) return ret;
21+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  21+
22+            ret = EnsureNoVehicleOnGround(tc);  22+    dir_rotate = ReverseDiagDir(dir_rotate);
23+            if (ret.Failed()) return ret;    
24+        }    
25+    }    
26+    tc = tile + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0));  86+    tc = tile + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0));  
27+    if (HasTileWaterClass(tc)) {  27+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
28+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  28+    if (ret.Failed()) return ret;
29+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  29+
30+            ret = EnsureNoVehicleOnGround(tc);    
31+            if (ret.Failed()) return ret;    
32+        }    
33+    }    
34+    tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0));  90+    tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0));  
35+    if (HasTileWaterClass(tc)) {  35+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
36+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  36+    if (ret.Failed()) return ret;
37+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  37+
38+            ret = EnsureNoVehicleOnGround(tc);    
39+            if (ret.Failed()) return ret;    
40+        }    
41+    }    
42     if (flags & DC_EXEC) {  94     if (flags & DC_EXEC) {  
43         Depot *depot = new Depot(tile);  95         Depot *depot = new Depot(tile);  
44         depot->build_date = _date;  96         depot->build_date = _date;  
45@@ -372,6 +405,41 @@  45@@ -372,6 +390,25 @@
46     DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile));  98     DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile));  
47     if (dir == INVALID_DIAGDIR) return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);  99     if (dir == INVALID_DIAGDIR) return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);  
48   100   
49+    Axis axis = DiagDirToAxis(dir);  101+    Axis axis = DiagDirToAxis(dir);  
50+    TrackBits tb;  50+    DiagDirection dir_rotate = (dir == DIAGDIR_NE || dir == DIAGDIR_NW) ? ChangeDiagDir(dir, DIAGDIRDIFF_90RIGHT) : ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT);
51+    CommandCost ret;    
52+    TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(-1, -1) : TileDiffXY(1, -1));  103+    TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(-1, -1) : TileDiffXY(1, -1));  
53+    if (HasTileWaterClass(tc)) {  53+    CommandCost ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
54+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  54+    if (ret.Failed()) return ret;
55+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  55+
56+            ret = EnsureNoVehicleOnGround(tc);    
57+            if (ret.Failed()) return ret;    
58+        }    
59+    }    
60+    tc = tile + (axis == AXIS_X ? TileDiffXY(1, -1) : TileDiffXY(1, 1));  107+    tc = tile + (axis == AXIS_X ? TileDiffXY(1, -1) : TileDiffXY(1, 1));  
61+    if (HasTileWaterClass(tc)) {  61+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
62+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  62+    if (ret.Failed()) return ret;
63+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  63+
64+            ret = EnsureNoVehicleOnGround(tc);  64+    dir_rotate = ReverseDiagDir(dir_rotate);
65+            if (ret.Failed()) return ret;    
66+        }    
67+    }    
68+    tc = tile + (axis == AXIS_X ? TileDiffXY(-1, 1) : TileDiffXY(-1, -1));  112+    tc = tile + (axis == AXIS_X ? TileDiffXY(-1, 1) : TileDiffXY(-1, -1));  
69+    if (HasTileWaterClass(tc)) {  69+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
70+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  70+    if (ret.Failed()) return ret;
71+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  71+
72+            ret = EnsureNoVehicleOnGround(tc);    
73+            if (ret.Failed()) return ret;    
74+        }    
75+    }    
76+    tc = tile + (axis == AXIS_X ? TileDiffXY(1, 1) : TileDiffXY(-1, 1));  116+    tc = tile + (axis == AXIS_X ? TileDiffXY(1, 1) : TileDiffXY(-1, 1));  
77+    if (HasTileWaterClass(tc)) {  77+    ret = EnsureNoShipOnDiagDir(tc, dir_rotate);
78+        tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0));  78+    if (ret.Failed()) return ret;
79+        if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) {  79+
80+            ret = EnsureNoVehicleOnGround(tc);    
81+            if (ret.Failed()) return ret;    
82+        }    
83+    }    
84     return DoBuildLock(tile, dir, flags);  120     return DoBuildLock(tile, dir, flags);  
85 } 121 }