changeset 4346 | 66105d4f6e83 |
parent 4344 | 7e123fec5b0b |
child 4350 | 6c991aed2ede |
4345:1da147230c79 | 4346:66105d4f6e83 |
---|---|
27 */ |
27 */ |
28 static void OrderPoolNewBlock(uint start_item) |
28 static void OrderPoolNewBlock(uint start_item) |
29 { |
29 { |
30 Order *order; |
30 Order *order; |
31 |
31 |
32 FOR_ALL_ORDERS_FROM(order, start_item) order->index = start_item++; |
32 /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. |
33 * TODO - This is just a temporary stage, this will be removed. */ |
|
34 for (order = GetOrder(start_item); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) order->index = start_item++; |
|
33 } |
35 } |
34 |
36 |
35 /* Initialize the order-pool */ |
37 /* Initialize the order-pool */ |
36 MemoryPool _order_pool = { "Orders", ORDER_POOL_MAX_BLOCKS, ORDER_POOL_BLOCK_SIZE_BITS, sizeof(Order), &OrderPoolNewBlock, NULL, 0, 0, NULL }; |
38 MemoryPool _order_pool = { "Orders", ORDER_POOL_MAX_BLOCKS, ORDER_POOL_BLOCK_SIZE_BITS, sizeof(Order), &OrderPoolNewBlock, NULL, 0, 0, NULL }; |
37 |
39 |
110 */ |
112 */ |
111 static Order *AllocateOrder(void) |
113 static Order *AllocateOrder(void) |
112 { |
114 { |
113 Order *order; |
115 Order *order; |
114 |
116 |
115 FOR_ALL_ORDERS(order) { |
117 /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. |
116 if (order->type == OT_NOTHING) { |
118 * TODO - This is just a temporary stage, this will be removed. */ |
119 for (order = GetOrder(0); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) { |
|
120 if (!IsValidOrder(order)) { |
|
117 uint index = order->index; |
121 uint index = order->index; |
118 |
122 |
119 memset(order, 0, sizeof(*order)); |
123 memset(order, 0, sizeof(*order)); |
120 order->index = index; |
124 order->index = index; |
121 order->next = NULL; |
125 order->next = NULL; |
175 OrderID sel_ord = GB(p1, 16, 16); |
179 OrderID sel_ord = GB(p1, 16, 16); |
176 Order new_order = UnpackOrder(p2); |
180 Order new_order = UnpackOrder(p2); |
177 |
181 |
178 if (!IsVehicleIndex(veh)) return CMD_ERROR; |
182 if (!IsVehicleIndex(veh)) return CMD_ERROR; |
179 v = GetVehicle(veh); |
183 v = GetVehicle(veh); |
180 if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; |
184 if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR; |
181 |
185 |
182 /* Check if the inserted order is to the correct destination (owner, type), |
186 /* Check if the inserted order is to the correct destination (owner, type), |
183 * and has the correct flags if any */ |
187 * and has the correct flags if any */ |
184 switch (new_order.type) { |
188 switch (new_order.type) { |
185 case OT_GOTO_STATION: { |
189 case OT_GOTO_STATION: { |
438 OrderID sel_ord = p2; |
442 OrderID sel_ord = p2; |
439 Order *order; |
443 Order *order; |
440 |
444 |
441 if (!IsVehicleIndex(veh_id)) return CMD_ERROR; |
445 if (!IsVehicleIndex(veh_id)) return CMD_ERROR; |
442 v = GetVehicle(veh_id); |
446 v = GetVehicle(veh_id); |
443 if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; |
447 if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR; |
444 |
448 |
445 /* If we did not select an order, we maybe want to de-clone the orders */ |
449 /* If we did not select an order, we maybe want to de-clone the orders */ |
446 if (sel_ord >= v->num_orders) |
450 if (sel_ord >= v->num_orders) |
447 return DecloneOrder(v, flags); |
451 return DecloneOrder(v, flags); |
448 |
452 |
510 Vehicle *v; |
514 Vehicle *v; |
511 VehicleID veh_id = p1; |
515 VehicleID veh_id = p1; |
512 |
516 |
513 if (!IsVehicleIndex(veh_id)) return CMD_ERROR; |
517 if (!IsVehicleIndex(veh_id)) return CMD_ERROR; |
514 v = GetVehicle(veh_id); |
518 v = GetVehicle(veh_id); |
515 if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; |
519 if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR; |
516 |
520 |
517 if (flags & DC_EXEC) { |
521 if (flags & DC_EXEC) { |
518 /* Goto next order */ |
522 /* Goto next order */ |
519 OrderID b = v->cur_order_index + 1; |
523 OrderID b = v->cur_order_index + 1; |
520 if (b >= v->num_orders) b = 0; |
524 if (b >= v->num_orders) b = 0; |
559 |
563 |
560 if (!IsVehicleIndex(veh)) return CMD_ERROR; |
564 if (!IsVehicleIndex(veh)) return CMD_ERROR; |
561 if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR; |
565 if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR; |
562 |
566 |
563 v = GetVehicle(veh); |
567 v = GetVehicle(veh); |
564 if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; |
568 if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR; |
565 |
569 |
566 /* Is it a valid order? */ |
570 /* Is it a valid order? */ |
567 if (sel_ord >= v->num_orders) return CMD_ERROR; |
571 if (sel_ord >= v->num_orders) return CMD_ERROR; |
568 |
572 |
569 order = GetVehicleOrder(v, sel_ord); |
573 order = GetVehicleOrder(v, sel_ord); |
626 |
630 |
627 if (!IsVehicleIndex(veh_dst)) return CMD_ERROR; |
631 if (!IsVehicleIndex(veh_dst)) return CMD_ERROR; |
628 |
632 |
629 dst = GetVehicle(veh_dst); |
633 dst = GetVehicle(veh_dst); |
630 |
634 |
631 if (dst->type == 0 || !CheckOwnership(dst->owner)) return CMD_ERROR; |
635 if (IsValidVehicle(dst) || !CheckOwnership(dst->owner)) return CMD_ERROR; |
632 |
636 |
633 switch (p2) { |
637 switch (p2) { |
634 case CO_SHARE: { |
638 case CO_SHARE: { |
635 Vehicle *src; |
639 Vehicle *src; |
636 |
640 |
637 if (!IsVehicleIndex(veh_src)) return CMD_ERROR; |
641 if (!IsVehicleIndex(veh_src)) return CMD_ERROR; |
638 |
642 |
639 src = GetVehicle(veh_src); |
643 src = GetVehicle(veh_src); |
640 |
644 |
641 /* Sanity checks */ |
645 /* Sanity checks */ |
642 if (src->type == 0 || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) |
646 if (IsValidVehicle(src) || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) |
643 return CMD_ERROR; |
647 return CMD_ERROR; |
644 |
648 |
645 /* Trucks can't share orders with busses (and visa versa) */ |
649 /* Trucks can't share orders with busses (and visa versa) */ |
646 if (src->type == VEH_Road) { |
650 if (src->type == VEH_Road) { |
647 if (src->cargo_type != dst->cargo_type && (src->cargo_type == CT_PASSENGERS || dst->cargo_type == CT_PASSENGERS)) |
651 if (src->cargo_type != dst->cargo_type && (src->cargo_type == CT_PASSENGERS || dst->cargo_type == CT_PASSENGERS)) |
684 if (!IsVehicleIndex(veh_src)) return CMD_ERROR; |
688 if (!IsVehicleIndex(veh_src)) return CMD_ERROR; |
685 |
689 |
686 src = GetVehicle(veh_src); |
690 src = GetVehicle(veh_src); |
687 |
691 |
688 /* Sanity checks */ |
692 /* Sanity checks */ |
689 if (src->type == 0 || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) |
693 if (IsValidVehicle(src) || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) |
690 return CMD_ERROR; |
694 return CMD_ERROR; |
691 |
695 |
692 /* Trucks can't copy all the orders from busses (and visa versa) */ |
696 /* Trucks can't copy all the orders from busses (and visa versa) */ |
693 if (src->type == VEH_Road) { |
697 if (src->type == VEH_Road) { |
694 const Order *order; |
698 const Order *order; |
842 |
846 |
843 if (!IsVehicleIndex(p1)) return CMD_ERROR; |
847 if (!IsVehicleIndex(p1)) return CMD_ERROR; |
844 |
848 |
845 v = GetVehicle(p1); |
849 v = GetVehicle(p1); |
846 /* Check the vehicle type and ownership, and if the service interval and order are in range */ |
850 /* Check the vehicle type and ownership, and if the service interval and order are in range */ |
847 if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; |
851 if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR; |
848 if (serv_int != GetServiceIntervalClamped(serv_int) || cur_ord >= v->num_orders) return CMD_ERROR; |
852 if (serv_int != GetServiceIntervalClamped(serv_int) || cur_ord >= v->num_orders) return CMD_ERROR; |
849 |
853 |
850 if (flags & DC_EXEC) { |
854 if (flags & DC_EXEC) { |
851 v->cur_order_index = cur_ord; |
855 v->cur_order_index = cur_ord; |
852 v->service_interval = serv_int; |
856 v->service_interval = serv_int; |
961 Order *order; |
965 Order *order; |
962 bool need_invalidate; |
966 bool need_invalidate; |
963 |
967 |
964 /* Go through all vehicles */ |
968 /* Go through all vehicles */ |
965 FOR_ALL_VEHICLES(v) { |
969 FOR_ALL_VEHICLES(v) { |
966 if (v->type == 0 || v->orders == NULL) |
970 if (v->orders == NULL) continue; |
967 continue; |
|
968 |
971 |
969 /* Forget about this station if this station is removed */ |
972 /* Forget about this station if this station is removed */ |
970 if (v->last_station_visited == dest.station && dest.type == OT_GOTO_STATION) |
973 if (v->last_station_visited == dest.station && dest.type == OT_GOTO_STATION) |
971 v->last_station_visited = INVALID_STATION; |
974 v->last_station_visited = INVALID_STATION; |
972 |
975 |
1128 static void Save_ORDR(void) |
1131 static void Save_ORDR(void) |
1129 { |
1132 { |
1130 Order *order; |
1133 Order *order; |
1131 |
1134 |
1132 FOR_ALL_ORDERS(order) { |
1135 FOR_ALL_ORDERS(order) { |
1133 if (order->type != OT_NOTHING) { |
1136 SlSetArrayIndex(order->index); |
1134 SlSetArrayIndex(order->index); |
1137 SlObject(order, _order_desc); |
1135 SlObject(order, _order_desc); |
|
1136 } |
|
1137 } |
1138 } |
1138 } |
1139 } |
1139 |
1140 |
1140 static void Load_ORDR(void) |
1141 static void Load_ORDR(void) |
1141 { |
1142 { |