Loading

Revision differences

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