src/ai/api/ai_road.cpp
branchnoai
changeset 10091 e4feb2f9fedf
parent 9833 89a64246458f
child 10094 e737405b06dd
equal deleted inserted replaced
10090:d6a6cac2fb25 10091:e4feb2f9fedf
    87 	return station + ::TileOffsByDiagDir(::ReverseDiagDir(::GetRoadStopDir(station)));
    87 	return station + ::TileOffsByDiagDir(::ReverseDiagDir(::GetRoadStopDir(station)));
    88 }
    88 }
    89 
    89 
    90 /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end)
    90 /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end)
    91 {
    91 {
    92 	if (start == end) return false;
    92 	EnforcePrecondition(false, start != end);
    93 	if (!::IsValidTile(start)) return false;
    93 	EnforcePrecondition(false, ::IsValidTile(start));
    94 	if (!::IsValidTile(end)) return false;
    94 	EnforcePrecondition(false, ::IsValidTile(end));
    95 	/* Not on one line */
    95 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
    96 	if (TileX(start) != TileX(end) &&
       
    97 			TileY(start) != TileY(end)) return false;
       
    98 
    96 
    99 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD);
    97 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD);
   100 }
    98 }
   101 
    99 
   102 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end)
   100 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end)
   103 {
   101 {
   104 	if (start == end) return false;
   102 	EnforcePrecondition(false, start != end);
   105 	if (!::IsValidTile(start)) return false;
   103 	EnforcePrecondition(false, ::IsValidTile(start));
   106 	if (!::IsValidTile(end)) return false;
   104 	EnforcePrecondition(false, ::IsValidTile(end));
   107 	/* Not on one line */
   105 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   108 	if (TileX(start) != TileX(end) &&
       
   109 			TileY(start) != TileY(end)) return false;
       
   110 
   106 
   111 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD);
   107 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD);
   112 }
   108 }
   113 
   109 
   114 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front)
   110 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front)
   115 {
   111 {
   116 	if (tile == front) return false;
   112 	EnforcePrecondition(false, tile != front);
   117 	if (!::IsValidTile(tile)) return false;
   113 	EnforcePrecondition(false, ::IsValidTile(tile));
   118 	if (!::IsValidTile(front)) return false;
   114 	EnforcePrecondition(false, ::IsValidTile(front));
   119 
   115 
   120 	uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   116 	uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0);
   121 
   117 
   122 	return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT);
   118 	return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT);
   123 }
   119 }
   124 
   120 
   125 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through)
   121 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through)
   126 {
   122 {
   127 	if (tile == front) return false;
   123 	EnforcePrecondition(false, tile != front);
   128 	if (!::IsValidTile(tile)) return false;
   124 	EnforcePrecondition(false, ::IsValidTile(tile));
   129 	if (!::IsValidTile(front)) return false;
   125 	EnforcePrecondition(false, ::IsValidTile(front));
   130 
   126 
   131 	uint entrance_dir;
   127 	uint entrance_dir;
   132 	if (drive_through) {
   128 	if (drive_through) {
   133 		entrance_dir = TileY(tile) != TileY(front);
   129 		entrance_dir = TileY(tile) != TileY(front);
   134 	} else {
   130 	} else {
   138 	return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP);
   134 	return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP);
   139 }
   135 }
   140 
   136 
   141 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end)
   137 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end)
   142 {
   138 {
   143 	if (!::IsValidTile(start)) return false;
   139 	EnforcePrecondition(false, ::IsValidTile(start));
   144 	if (!::IsValidTile(end)) return false;
   140 	EnforcePrecondition(false, ::IsValidTile(end));
   145 	/* Not on one line */
   141 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   146 	if (TileX(start) != TileX(end) &&
       
   147 			TileY(start) != TileY(end)) return false;
       
   148 
   142 
   149 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD);
   143 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD);
   150 }
   144 }
   151 
   145 
   152 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end)
   146 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end)
   153 {
   147 {
   154 	if (!::IsValidTile(start)) return false;
   148 	EnforcePrecondition(false, ::IsValidTile(start));
   155 	if (!::IsValidTile(end)) return false;
   149 	EnforcePrecondition(false, ::IsValidTile(end));
   156 	/* Not on one line */
   150 	EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end));
   157 	if (TileX(start) != TileX(end) &&
       
   158 			TileY(start) != TileY(end)) return false;
       
   159 
   151 
   160 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD);
   152 	return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD);
   161 }
   153 }
   162 
   154 
   163 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile)
   155 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile)
   164 {
   156 {
   165 	if (!::IsValidTile(tile)) return false;
   157 	EnforcePrecondition(false, ::IsValidTile(tile));
   166 	if (!IsTileType(tile, MP_ROAD) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false;
   158 	EnforcePrecondition(false, IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT);
   167 
   159 
   168 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
   160 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
   169 }
   161 }
   170 
   162 
   171 /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile)
   163 /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile)
   172 {
   164 {
   173 	if (!::IsValidTile(tile)) return false;
   165 	EnforcePrecondition(false, ::IsValidTile(tile));
   174 	if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile)) return false;
   166 	EnforcePrecondition(false, IsTileType(tile, MP_STATION) && IsRoadStop(tile));
   175 
   167 
   176 	return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP);
   168 	return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP);
   177 }
   169 }