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; |