src/ai/api/ai_order.cpp
branchnoai
changeset 9869 6404afe43575
parent 9837 c9ec4f82e0d0
child 10093 b3849a19d137
equal deleted inserted replaced
9868:3998f2e73dda 9869:6404afe43575
    66 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return INVALID_TILE;
    66 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return INVALID_TILE;
    67 
    67 
    68 	Order *order = ::GetVehicle(vehicle_id)->orders;
    68 	Order *order = ::GetVehicle(vehicle_id)->orders;
    69 	for (uint i = 0; i < order_id; i++) order = order->next;
    69 	for (uint i = 0; i < order_id; i++) order = order->next;
    70 
    70 
    71 	switch (order->type) {
    71 	switch (order->GetType()) {
    72 		case OT_GOTO_DEPOT:    return ::GetDepot(order->dest)->xy;
    72 		case OT_GOTO_DEPOT:    return ::GetDepot(order->GetDestination())->xy;
    73 		case OT_GOTO_STATION:  return ::GetStation(order->dest)->xy;
    73 		case OT_GOTO_STATION:  return ::GetStation(order->GetDestination())->xy;
    74 		case OT_GOTO_WAYPOINT: return ::GetWaypoint(order->dest)->xy;
    74 		case OT_GOTO_WAYPOINT: return ::GetWaypoint(order->GetDestination())->xy;
    75 		default:               return INVALID_TILE;
    75 		default:               return INVALID_TILE;
    76 	}
    76 	}
    77 }
    77 }
    78 
    78 
    79 /* static */ AIOrder::AIOrderFlags AIOrder::GetOrderFlags(VehicleID vehicle_id, uint32 order_id)
    79 /* static */ AIOrder::AIOrderFlags AIOrder::GetOrderFlags(VehicleID vehicle_id, uint32 order_id)
    81 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return AIOF_INVALID;
    81 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return AIOF_INVALID;
    82 
    82 
    83 	Order *order = ::GetVehicle(vehicle_id)->orders;
    83 	Order *order = ::GetVehicle(vehicle_id)->orders;
    84 	for (uint i = 0; i < order_id; i++) order = order->next;
    84 	for (uint i = 0; i < order_id; i++) order = order->next;
    85 
    85 
    86 	return (AIOrder::AIOrderFlags)order->flags;
    86 	AIOrderFlags order_flags= AIOF_NONE;
       
    87 	if (order->GetNonStopType() != OFB_NO_NON_STOP) order_flags |= AIOF_NON_STOP;
       
    88 	switch (order->GetType()) {
       
    89 		case OT_GOTO_DEPOT:
       
    90 			if (order->GetDepotOrderType() & OFB_SERVICE_IF_NEEDED) order_flags |= AIOF_SERVICE_IF_NEEDED;
       
    91 			break;
       
    92 
       
    93 		case OT_GOTO_STATION:
       
    94 			if (order->GetLoadType()   & OFB_FULL_LOAD) order_flags |= AIOF_FULL_LOAD;
       
    95 			if (order->GetUnloadType() & OFB_UNLOAD)    order_flags |= AIOF_UNLOAD;
       
    96 			if (order->GetUnloadType() & OFB_TRANSFER)  order_flags |= AIOF_TRANSFER;
       
    97 			break;
       
    98 
       
    99 		default: break;
       
   100 	}
       
   101 
       
   102 	return order_flags;
    87 }
   103 }
    88 
   104 
    89 /* static */ bool AIOrder::AppendOrder(VehicleID vehicle_id, TileIndex destination, AIOrderFlags order_flags)
   105 /* static */ bool AIOrder::AppendOrder(VehicleID vehicle_id, TileIndex destination, AIOrderFlags order_flags)
    90 {
   106 {
    91 	if (!AIVehicle::IsValidVehicle(vehicle_id)) return false;
   107 	if (!AIVehicle::IsValidVehicle(vehicle_id)) return false;
    97 	/* IsValidVehicleOrder is not good enough because it does not allow appending. */
   113 	/* IsValidVehicleOrder is not good enough because it does not allow appending. */
    98 	if (!AIVehicle::IsValidVehicle(vehicle_id) || order_id > ::GetVehicle(vehicle_id)->num_orders ||
   114 	if (!AIVehicle::IsValidVehicle(vehicle_id) || order_id > ::GetVehicle(vehicle_id)->num_orders ||
    99 		!AreOrderFlagsValid(destination, order_flags)) return false;
   115 		!AreOrderFlagsValid(destination, order_flags)) return false;
   100 
   116 
   101 	Order order;
   117 	Order order;
   102 	order.type  = ::GetOrderTypeByTile(destination);
   118 	switch (::GetOrderTypeByTile(destination)) {
   103 	order.flags = order_flags;
   119 		case OT_GOTO_DEPOT:
   104 	switch (order.type) {
   120 			order.MakeGoToDepot(::GetDepotByTile(destination)->index, true);
   105 		case OT_GOTO_DEPOT:    order.dest = ::GetDepotByTile(destination)->index; break;
   121 			if (order_flags & AIOF_SERVICE_IF_NEEDED) order.SetDepotOrderType(OFB_SERVICE_IF_NEEDED);
   106 		case OT_GOTO_STATION:  order.dest = ::GetStationIndex(destination);       break;
   122 			break;
   107 		case OT_GOTO_WAYPOINT: order.dest = ::GetWaypointIndex(destination);      break;
   123 
   108 		default: NOT_REACHED(); return false;
   124 		case OT_GOTO_STATION:
       
   125 			order.MakeGoToStation(::GetStationIndex(destination));
       
   126 			if (order_flags & AIOF_FULL_LOAD) order.SetLoadType(OFB_FULL_LOAD);
       
   127 			order.SetUnloadType(((order_flags & AIOF_TRANSFER) ? OFB_TRANSFER : 0) | ((order_flags & AIOF_UNLOAD) ? OFB_UNLOAD : 0));
       
   128 			break;
       
   129 
       
   130 		case OT_GOTO_WAYPOINT:
       
   131 			order.MakeGoToWaypoint(::GetWaypointIndex(destination));
       
   132 			break;
       
   133 
       
   134 		default:
       
   135 			return false;
   109 	}
   136 	}
   110 
   137 
   111 	return AIObject::DoCommand(0, vehicle_id | (order_id << 16), PackOrder(&order), CMD_INSERT_ORDER);
   138 	if (order_flags & AIOF_NON_STOP) order.SetNonStopType(OFB_NON_STOP);
       
   139 
       
   140 	return AIObject::DoCommand(0, vehicle_id | (order_id << 16), order.Pack(), CMD_INSERT_ORDER);
   112 }
   141 }
   113 
   142 
   114 /* static */ bool AIOrder::RemoveOrder(VehicleID vehicle_id, uint32 order_id)
   143 /* static */ bool AIOrder::RemoveOrder(VehicleID vehicle_id, uint32 order_id)
   115 {
   144 {
   116 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return false;
   145 	if (!IsValidVehicleOrder(vehicle_id, order_id)) return false;