src/ai/api/ai_road.cpp
branchnoai
changeset 10668 495789401303
parent 10513 33cb70ff2f5d
child 10774 2c882f0468f2
equal deleted inserted replaced
10667:1bacf27342bd 10668:495789401303
     1 /* $Id$ */
     1 /* $Id$ */
     2 
     2 
     3 /** @file ai_road.cpp Implementation of AIRoad. */
     3 /** @file ai_road.cpp Implementation of AIRoad. */
     4 
     4 
     5 #include "ai_road.hpp"
     5 #include "ai_road.hpp"
       
     6 #include "ai_map.hpp"
     6 #include "../../openttd.h"
     7 #include "../../openttd.h"
     7 #include "../../road_map.h"
     8 #include "../../road_map.h"
     8 #include "../../station_map.h"
     9 #include "../../station_map.h"
     9 #include "../../command_type.h"
    10 #include "../../command_type.h"
       
    11 #include "../../player_func.h"
    10 
    12 
    11 /* static */ bool AIRoad::IsRoadTile(TileIndex tile)
    13 /* static */ bool AIRoad::IsRoadTile(TileIndex tile)
    12 {
    14 {
    13 	if (!::IsValidTile(tile)) return false;
    15 	if (!::IsValidTile(tile)) return false;
    14 
    16 
    35 	if (!::IsValidTile(tile)) return false;
    37 	if (!::IsValidTile(tile)) return false;
    36 
    38 
    37 	return ::IsDriveThroughStopTile(tile);
    39 	return ::IsDriveThroughStopTile(tile);
    38 }
    40 }
    39 
    41 
       
    42 /* static */ bool AIRoad::IsRoadTypeAvailable(RoadType road_type)
       
    43 {
       
    44 	return ::HasRoadTypesAvail(_current_player, ::RoadTypeToRoadTypes((::RoadType)road_type));
       
    45 }
       
    46 
       
    47 /* static */ AIRoad::RoadType AIRoad::GetCurrentRoadType()
       
    48 {
       
    49 	return (RoadType)AIObject::GetRoadType();
       
    50 }
       
    51 
       
    52 /* static */ void AIRoad::SetCurrentRoadType(RoadType road_type)
       
    53 {
       
    54 	if (!IsRoadTypeAvailable(road_type)) return;
       
    55 
       
    56 	AIObject::SetRoadType((::RoadType)road_type);
       
    57 }
       
    58 
       
    59 /* static */ bool AIRoad::HasRoadType(TileIndex tile, RoadType road_type)
       
    60 {
       
    61 	if (!AIMap::IsValidTile(tile)) return false;
       
    62 	if (!IsRoadTypeAvailable(road_type)) return false;
       
    63 	return ::GetAnyRoadBits(tile, (::RoadType)road_type, false) != ROAD_NONE;
       
    64 }
       
    65 
    40 /* static */ bool AIRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2)
    66 /* static */ bool AIRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2)
    41 {
    67 {
    42 	if (!::IsValidTile(t1)) return false;
    68 	if (!::IsValidTile(t1)) return false;
    43 	if (!::IsValidTile(t2)) return false;
    69 	if (!::IsValidTile(t2)) return false;
    44 
    70 
    45 	/* Tiles not neighbouring */
    71 	/* Tiles not neighbouring */
    46 	if ((abs((int)::TileX(t1) - (int)::TileX(t2)) + abs((int)::TileY(t1) - (int)::TileY(t2))) != 1) return false;
    72 	if ((abs((int)::TileX(t1) - (int)::TileX(t2)) + abs((int)::TileY(t1) - (int)::TileY(t2))) != 1) return false;
    47 
    73 
    48 	RoadBits r1 = ::GetAnyRoadBits(t1, ROADTYPE_ROAD);
    74 	RoadBits r1 = ::GetAnyRoadBits(t1, AIObject::GetRoadType());
    49 	RoadBits r2 = ::GetAnyRoadBits(t2, ROADTYPE_ROAD);
    75 	RoadBits r2 = ::GetAnyRoadBits(t2, AIObject::GetRoadType());
    50 
    76 
    51 	DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3));
    77 	DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3));
    52 	DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
    78 	DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
    53 
    79 
    54 	return HasBit(r1, dir_1) && HasBit(r2, dir_2);
    80 	return HasBit(r1, dir_1) && HasBit(r2, dir_2);
    94 	EnforcePrecondition(false, start != end);
   120 	EnforcePrecondition(false, start != end);
    95 	EnforcePrecondition(false, ::IsValidTile(start));
   121 	EnforcePrecondition(false, ::IsValidTile(start));
    96 	EnforcePrecondition(false, ::IsValidTile(end));
   122 	EnforcePrecondition(false, ::IsValidTile(end));
    97 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   123 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
    98 
   124 
    99 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD);
   125 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (AIObject::GetRoadType() << 3), CMD_BUILD_LONG_ROAD);
   100 }
   126 }
   101 
   127 
   102 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end)
   128 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end)
   103 {
   129 {
   104 	EnforcePrecondition(false, start != end);
   130 	EnforcePrecondition(false, start != end);
   105 	EnforcePrecondition(false, ::IsValidTile(start));
   131 	EnforcePrecondition(false, ::IsValidTile(start));
   106 	EnforcePrecondition(false, ::IsValidTile(end));
   132 	EnforcePrecondition(false, ::IsValidTile(end));
   107 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   133 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   108 
   134 
   109 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD);
   135 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1) | (AIObject::GetRoadType() << 3), CMD_BUILD_LONG_ROAD);
   110 }
   136 }
   111 
   137 
   112 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front)
   138 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front)
   113 {
   139 {
   114 	EnforcePrecondition(false, tile != front);
   140 	EnforcePrecondition(false, tile != front);
   115 	EnforcePrecondition(false, ::IsValidTile(tile));
   141 	EnforcePrecondition(false, ::IsValidTile(tile));
   116 	EnforcePrecondition(false, ::IsValidTile(front));
   142 	EnforcePrecondition(false, ::IsValidTile(front));
   117 
   143 
   118 	uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   144 	uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   119 
   145 
   120 	return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT);
   146 	return AIObject::DoCommand(tile, entrance_dir, AIObject::GetRoadType() << 2, CMD_BUILD_ROAD_DEPOT);
   121 }
   147 }
   122 
   148 
   123 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through)
   149 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through)
   124 {
   150 {
   125 	EnforcePrecondition(false, tile != front);
   151 	EnforcePrecondition(false, tile != front);
   131 		entrance_dir = TileY(tile) != TileY(front);
   157 		entrance_dir = TileY(tile) != TileY(front);
   132 	} else {
   158 	} else {
   133 		entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   159 		entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   134 	}
   160 	}
   135 
   161 
   136 	return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP);
   162 	return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (::RoadTypeToRoadTypes(AIObject::GetRoadType()) << 2), CMD_BUILD_ROAD_STOP);
   137 }
   163 }
   138 
   164 
   139 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end)
   165 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end)
   140 {
   166 {
   141 	EnforcePrecondition(false, ::IsValidTile(start));
   167 	EnforcePrecondition(false, ::IsValidTile(start));
   142 	EnforcePrecondition(false, ::IsValidTile(end));
   168 	EnforcePrecondition(false, ::IsValidTile(end));
   143 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   169 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   144 
   170 
   145 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD);
   171 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (AIObject::GetRoadType() << 3), CMD_REMOVE_LONG_ROAD);
   146 }
   172 }
   147 
   173 
   148 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end)
   174 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end)
   149 {
   175 {
   150 	EnforcePrecondition(false, ::IsValidTile(start));
   176 	EnforcePrecondition(false, ::IsValidTile(start));
   151 	EnforcePrecondition(false, ::IsValidTile(end));
   177 	EnforcePrecondition(false, ::IsValidTile(end));
   152 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   178 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   153 
   179 
   154 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD);
   180 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1) | (AIObject::GetRoadType() << 3), CMD_REMOVE_LONG_ROAD);
   155 }
   181 }
   156 
   182 
   157 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile)
   183 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile)
   158 {
   184 {
   159 	EnforcePrecondition(false, ::IsValidTile(tile));
   185 	EnforcePrecondition(false, ::IsValidTile(tile));