/* static */ bool AIRail::RemoveRail(TileIndex from, TileIndex tile, TileIndex to) { EnforcePrecondition(false, ::IsValidTile(from)); EnforcePrecondition(false, ::IsValidTile(tile)); EnforcePrecondition(false, ::IsValidTile(to)); EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1); EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1); int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile))); EnforcePrecondition(false, diag_offset <= 1 || (::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) || (::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to))); if (!IsRailTypeAvailable(GetCurrentRailType())) SetCurrentRailType(GetRailType(tile)); uint32 p2 = SimulateDrag(from, tile, &to); return AIObject::DoCommand(tile, to, p2, CMD_REMOVE_RAILROAD_TRACK); }
/* static */ bool ScriptRail::BuildRail(TileIndex from, TileIndex tile, TileIndex to) { EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY); EnforcePrecondition(false, ::IsValidTile(from)); EnforcePrecondition(false, ::IsValidTile(tile)); EnforcePrecondition(false, ::IsValidTile(to)); EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1); EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1); EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType())); int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile))); EnforcePrecondition(false, diag_offset <= 1 || (::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) || (::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to))); uint32 p2 = SimulateDrag(from, tile, &to) | 1 << 8; return ScriptObject::DoCommand(tile, to, p2, CMD_BUILD_RAILROAD_TRACK); }