order_cmd.c
changeset 4346 66105d4f6e83
parent 4344 7e123fec5b0b
child 4350 6c991aed2ede
equal deleted inserted replaced
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 {