00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "../../stdafx.h"
00013 #include "script_marine.hpp"
00014 #include "script_station.hpp"
00015 #include "../../station_base.h"
00016 #include "../../tile_cmd.h"
00017
00018
00019 bool ScriptMarine::IsWaterDepotTile(TileIndex tile)
00020 {
00021 if (!::IsValidTile(tile)) return false;
00022
00023 return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WATER_TILE_DEPOT;
00024 }
00025
00026 bool ScriptMarine::IsDockTile(TileIndex tile)
00027 {
00028 if (!::IsValidTile(tile)) return false;
00029
00030 return ::IsTileType(tile, MP_STATION) && ::IsDock(tile);
00031 }
00032
00033 bool ScriptMarine::IsBuoyTile(TileIndex tile)
00034 {
00035 if (!::IsValidTile(tile)) return false;
00036
00037 return ::IsTileType(tile, MP_STATION) && ::IsBuoy(tile);
00038 }
00039
00040 bool ScriptMarine::IsLockTile(TileIndex tile)
00041 {
00042 if (!::IsValidTile(tile)) return false;
00043
00044 return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WATER_TILE_LOCK;
00045 }
00046
00047 bool ScriptMarine::IsCanalTile(TileIndex tile)
00048 {
00049 if (!::IsValidTile(tile)) return false;
00050
00051 return ::IsTileType(tile, MP_WATER) && ::IsCanal(tile);
00052 }
00053
00054 bool ScriptMarine::AreWaterTilesConnected(TileIndex t1, TileIndex t2)
00055 {
00056 if (!::IsValidTile(t1)) return false;
00057 if (!::IsValidTile(t2)) return false;
00058
00059
00060 if (::DistanceManhattan(t1, t2) != 1) return false;
00061
00062 DiagDirection to_other_tile = ::DiagdirBetweenTiles(t2, t1);
00063
00064
00065 TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
00066 if (gtts1 == TRACK_BIT_NONE) return false;
00067
00068 to_other_tile = ReverseDiagDir(to_other_tile);
00069 TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
00070
00071 return gtts2 != TRACK_BIT_NONE;
00072 }
00073
00074 bool ScriptMarine::BuildWaterDepot(TileIndex tile, TileIndex front)
00075 {
00076 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00077 EnforcePrecondition(false, ::IsValidTile(tile));
00078 EnforcePrecondition(false, ::IsValidTile(front));
00079 EnforcePrecondition(false, (::TileX(front) == ::TileX(tile)) != (::TileY(front) == ::TileY(tile)));
00080
00081 return ScriptObject::DoCommand(tile, ::TileX(front) == ::TileX(tile), 0, CMD_BUILD_SHIP_DEPOT);
00082 }
00083
00084 bool ScriptMarine::BuildDock(TileIndex tile, StationID station_id)
00085 {
00086 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00087 EnforcePrecondition(false, ::IsValidTile(tile));
00088 EnforcePrecondition(false, station_id == ScriptStation::STATION_NEW || station_id == ScriptStation::STATION_JOIN_ADJACENT || ScriptStation::IsValidStation(station_id));
00089
00090 uint p1 = station_id == ScriptStation::STATION_JOIN_ADJACENT ? 0 : 1;
00091 uint p2 = (ScriptStation::IsValidStation(station_id) ? station_id : INVALID_STATION) << 16;
00092 return ScriptObject::DoCommand(tile, p1, p2, CMD_BUILD_DOCK);
00093 }
00094
00095 bool ScriptMarine::BuildBuoy(TileIndex tile)
00096 {
00097 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00098 EnforcePrecondition(false, ::IsValidTile(tile));
00099
00100 return ScriptObject::DoCommand(tile, 0, 0, CMD_BUILD_BUOY);
00101 }
00102
00103 bool ScriptMarine::BuildLock(TileIndex tile)
00104 {
00105 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00106 EnforcePrecondition(false, ::IsValidTile(tile));
00107
00108 return ScriptObject::DoCommand(tile, 0, 0, CMD_BUILD_LOCK);
00109 }
00110
00111 bool ScriptMarine::BuildCanal(TileIndex tile)
00112 {
00113 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00114 EnforcePrecondition(false, ::IsValidTile(tile));
00115
00116 return ScriptObject::DoCommand(tile, tile, WATER_CLASS_CANAL, CMD_BUILD_CANAL);
00117 }
00118
00119 bool ScriptMarine::RemoveWaterDepot(TileIndex tile)
00120 {
00121 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00122 EnforcePrecondition(false, ::IsValidTile(tile));
00123 EnforcePrecondition(false, IsWaterDepotTile(tile));
00124
00125 return ScriptObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00126 }
00127
00128 bool ScriptMarine::RemoveDock(TileIndex tile)
00129 {
00130 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00131 EnforcePrecondition(false, ::IsValidTile(tile));
00132 EnforcePrecondition(false, IsDockTile(tile));
00133
00134 return ScriptObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00135 }
00136
00137 bool ScriptMarine::RemoveBuoy(TileIndex tile)
00138 {
00139 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00140 EnforcePrecondition(false, ::IsValidTile(tile));
00141 EnforcePrecondition(false, IsBuoyTile(tile));
00142
00143 return ScriptObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00144 }
00145
00146 bool ScriptMarine::RemoveLock(TileIndex tile)
00147 {
00148 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00149 EnforcePrecondition(false, ::IsValidTile(tile));
00150 EnforcePrecondition(false, IsLockTile(tile));
00151
00152 return ScriptObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00153 }
00154
00155 bool ScriptMarine::RemoveCanal(TileIndex tile)
00156 {
00157 EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00158 EnforcePrecondition(false, ::IsValidTile(tile));
00159 EnforcePrecondition(false, IsCanalTile(tile));
00160
00161 return ScriptObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00162 }
00163
00164 Money ScriptMarine::GetBuildCost(BuildType build_type)
00165 {
00166 switch (build_type) {
00167 case BT_DOCK: return ::GetPrice(PR_BUILD_STATION_DOCK, 1, NULL);
00168 case BT_DEPOT: return ::GetPrice(PR_BUILD_DEPOT_SHIP, 1, NULL);
00169 case BT_BUOY: return ::GetPrice(PR_BUILD_WAYPOINT_BUOY, 1, NULL);
00170 default: return -1;
00171 }
00172 }