|
@@ -144,97 +144,97 @@ void AssignOrder(Order *order, Order dat
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Delete all news items regarding defective orders about a vehicle
|
|
|
* This could kill still valid warnings (for example about void order when just
|
|
|
* another order gets added), but assume the player will notice the problems,
|
|
|
* when (s)he's changing the orders.
|
|
|
*/
|
|
|
static void DeleteOrderWarnings(const Vehicle* v)
|
|
|
{
|
|
|
DeleteVehicleNews(v->index, STR_TRAIN_HAS_TOO_FEW_ORDERS + (v->type - VEH_Train) * 4);
|
|
|
DeleteVehicleNews(v->index, STR_TRAIN_HAS_VOID_ORDER + (v->type - VEH_Train) * 4);
|
|
|
DeleteVehicleNews(v->index, STR_TRAIN_HAS_DUPLICATE_ENTRY + (v->type - VEH_Train) * 4);
|
|
|
DeleteVehicleNews(v->index, STR_TRAIN_HAS_INVALID_ENTRY + (v->type - VEH_Train) * 4);
|
|
|
}
|
|
|
|
|
|
|
|
|
/** Add an order to the orderlist of a vehicle.
|
|
|
* @param tile unused
|
|
|
* @param p1 various bitstuffed elements
|
|
|
* - p1 = (bit 0 - 15) - ID of the vehicle
|
|
|
* - p1 = (bit 16 - 31) - the selected order (if any). If the last order is given,
|
|
|
* the order will be inserted before that one
|
|
|
* only the first 8 bits used currently (bit 16 - 23) (max 255)
|
|
|
* @param p2 packed order to insert
|
|
|
*/
|
|
|
int32 CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|
|
{
|
|
|
Vehicle *v;
|
|
|
VehicleID veh = GB(p1, 0, 16);
|
|
|
OrderID sel_ord = GB(p1, 16, 16);
|
|
|
Order new_order = UnpackOrder(p2);
|
|
|
|
|
|
if (!IsVehicleIndex(veh)) return CMD_ERROR;
|
|
|
v = GetVehicle(veh);
|
|
|
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR;
|
|
|
|
|
|
/* Check if the inserted order is to the correct destination (owner, type),
|
|
|
* and has the correct flags if any */
|
|
|
switch (new_order.type) {
|
|
|
case OT_GOTO_STATION: {
|
|
|
const Station *st;
|
|
|
|
|
|
if (!IsStationIndex(new_order.station)) return CMD_ERROR;
|
|
|
st = GetStation(new_order.station);
|
|
|
|
|
|
if (!IsValidStation(st) ||
|
|
|
(st->airport_type != AT_OILRIG && !(IsBuoy(st)) && !CheckOwnership(st->owner))) {
|
|
|
(st->airport_type != AT_OILRIG && !IsBuoy(st) && !CheckOwnership(st->owner))) {
|
|
|
return CMD_ERROR;
|
|
|
}
|
|
|
|
|
|
switch (v->type) {
|
|
|
case VEH_Train:
|
|
|
if (!(st->facilities & FACIL_TRAIN)) return CMD_ERROR;
|
|
|
break;
|
|
|
|
|
|
case VEH_Road:
|
|
|
if (v->cargo_type == CT_PASSENGERS) {
|
|
|
if (!(st->facilities & FACIL_BUS_STOP)) return CMD_ERROR;
|
|
|
} else {
|
|
|
if (!(st->facilities & FACIL_TRUCK_STOP)) return CMD_ERROR;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case VEH_Ship:
|
|
|
if (!(st->facilities & FACIL_DOCK)) return CMD_ERROR;
|
|
|
break;
|
|
|
|
|
|
case VEH_Aircraft:
|
|
|
if (!(st->facilities & FACIL_AIRPORT)) return CMD_ERROR;
|
|
|
break;
|
|
|
|
|
|
default: return CMD_ERROR;
|
|
|
}
|
|
|
|
|
|
/* Order flags can be any of the following for stations:
|
|
|
* [full-load | unload] [+ transfer] [+ non-stop]
|
|
|
* non-stop orders (if any) are only valid for trains */
|
|
|
switch (new_order.flags) {
|
|
|
case 0:
|
|
|
case OF_FULL_LOAD:
|
|
|
case OF_FULL_LOAD | OF_TRANSFER:
|
|
|
case OF_UNLOAD:
|
|
|
case OF_UNLOAD | OF_TRANSFER:
|
|
|
case OF_TRANSFER:
|
|
|
break;
|
|
|
|
|
|
case OF_NON_STOP:
|
|
|
case OF_NON_STOP | OF_FULL_LOAD:
|
|
|
case OF_NON_STOP | OF_FULL_LOAD | OF_TRANSFER:
|
|
|
case OF_NON_STOP | OF_UNLOAD:
|
|
|
case OF_NON_STOP | OF_UNLOAD | OF_TRANSFER:
|
|
|
case OF_NON_STOP | OF_TRANSFER:
|
|
|
if (v->type != VEH_Train) return CMD_ERROR;
|
|
|
break;
|
|
|
|