Changeset - r19078:1939682c5ebf
[Not reviewed]
master
0 3 0
michi_cc - 13 years ago 2012-02-14 17:04:01
michi_cc@openttd.org
(svn r23946) -Codechange: Pass a proper enum instead of a bit flag to CmdChangeTimetable for indicating what to change.
3 files changed with 60 insertions and 28 deletions:
0 comments (0 inline, 0 general)
src/order_type.h
Show inline comments
 
@@ -160,12 +160,22 @@ enum OrderDepotAction {
 
	DA_ALWAYS_GO, ///< Always go to the depot
 
	DA_SERVICE,   ///< Service only if needed
 
	DA_STOP,      ///< Go to the depot and stop there
 
	DA_END
 
};
 

	
 
/**
 
 * Enumeration for the data to set in CmdChangeTimetable.
 
 */
 
enum ModifyTimetableFlags {
 
	MTF_WAIT_TIME,    ///< Set wait time.
 
	MTF_TRAVEL_TIME,  ///< Set travel time.
 
	MTF_END
 
};
 
template <> struct EnumPropsT<ModifyTimetableFlags> : MakeEnumPropsT<ModifyTimetableFlags, byte, MTF_WAIT_TIME, MTF_END, MTF_END, 2> {};
 

	
 

	
 
/* Possible clone options */
 
enum CloneOptions {
 
	CO_SHARE   = 0,
 
	CO_COPY    = 1,
 
	CO_UNSHARE = 2
src/timetable_cmd.cpp
Show inline comments
 
@@ -12,59 +12,73 @@
 
#include "stdafx.h"
 
#include "command_func.h"
 
#include "company_func.h"
 
#include "date_func.h"
 
#include "window_func.h"
 
#include "vehicle_base.h"
 
#include "cmd_helper.h"
 

	
 
#include "table/strings.h"
 

	
 
/**
 
 * Change/update a particular timetable entry.
 
 * @param v            The vehicle to change the timetable of.
 
 * @param order_number The index of the timetable in the order list.
 
 * @param time         The new time of the timetable entry.
 
 * @param is_journey   Whether to set the waiting or travelling time.
 
 * @param val          The new data of the timetable entry.
 
 * @param mtf          Which part of the timetable entry to change.
 
 */
 
static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint16 time, bool is_journey)
 
static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint16 val, ModifyTimetableFlags mtf)
 
{
 
	Order *order = v->GetOrder(order_number);
 
	int delta;
 
	int delta = 0;
 

	
 
	switch (mtf) {
 
		case MTF_WAIT_TIME:
 
			delta = val - order->wait_time;
 
			order->wait_time = val;
 
			break;
 

	
 
	if (is_journey) {
 
		delta = time - order->travel_time;
 
		order->travel_time = time;
 
	} else {
 
		delta = time - order->wait_time;
 
		order->wait_time = time;
 
		case MTF_TRAVEL_TIME:
 
			delta = val - order->travel_time;
 
			order->travel_time = val;
 
			break;
 

	
 
		default:
 
			NOT_REACHED();
 
	}
 
	v->orders.list->UpdateOrderTimetable(delta);
 

	
 
	for (v = v->FirstShared(); v != NULL; v = v->NextShared()) {
 
		if (v->cur_real_order_index == order_number && v->current_order.Equals(*order)) {
 
			if (is_journey) {
 
				v->current_order.travel_time = time;
 
			} else {
 
				v->current_order.wait_time = time;
 
			switch (mtf) {
 
				case MTF_WAIT_TIME:
 
					v->current_order.wait_time = val;
 
					break;
 

	
 
				case MTF_TRAVEL_TIME:
 
					v->current_order.travel_time = val;
 
					break;
 

	
 
				default:
 
					NOT_REACHED();
 
			}
 
		}
 
		SetWindowDirty(WC_VEHICLE_TIMETABLE, v->index);
 
	}
 
}
 

	
 
/**
 
 * Add or remove waiting times from an order.
 
 * Change timetable data of an order.
 
 * @param tile Not used.
 
 * @param flags Operation to perform.
 
 * @param p1 Various bitstuffed elements
 
 * - p1 = (bit  0-19) - Vehicle with the orders to change.
 
 * - p1 = (bit 20-27) - Order index to modify.
 
 * - p1 = (bit    28) - Whether to change the waiting time or the travelling
 
 *                      time.
 
 * - p1 = (bit 28-29) - Timetable data to change (@see ModifyTimetableFlags)
 
 * @param p2 The amount of time to wait.
 
 * - p2 = (bit  0-15) - Waiting or travelling time as specified by p1 bit 28
 
 * - p2 = (bit  0-15) - The data to modify as specified by p1 bits 28-29.
 
 * @param text unused
 
 * @return the cost of this operation or an error
 
 */
 
CommandCost CmdChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
 
{
 
	VehicleID veh = GB(p1, 0, 20);
 
@@ -76,20 +90,28 @@ CommandCost CmdChangeTimetable(TileIndex
 
	if (ret.Failed()) return ret;
 

	
 
	VehicleOrderID order_number = GB(p1, 20, 8);
 
	Order *order = v->GetOrder(order_number);
 
	if (order == NULL || order->IsType(OT_IMPLICIT)) return CMD_ERROR;
 

	
 
	bool is_journey = HasBit(p1, 28);
 
	ModifyTimetableFlags mtf = Extract<ModifyTimetableFlags, 28, 2>(p1);
 
	if (mtf >= MTF_END) return CMD_ERROR;
 

	
 
	int wait_time   = order->wait_time;
 
	int travel_time = order->travel_time;
 
	if (is_journey) {
 
		travel_time = GB(p2, 0, 16);
 
	} else {
 
		wait_time   = GB(p2, 0, 16);
 
	switch (mtf) {
 
		case MTF_WAIT_TIME:
 
			wait_time = GB(p2, 0, 16);
 
			break;
 

	
 
		case MTF_TRAVEL_TIME:
 
			travel_time = GB(p2, 0, 16);
 
			break;
 

	
 
		default:
 
			NOT_REACHED();
 
	}
 

	
 
	if (wait_time != order->wait_time) {
 
		switch (order->GetType()) {
 
			case OT_GOTO_STATION:
 
				if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_ERROR_TIMETABLE_NOT_STOPPING_HERE);
 
@@ -102,14 +124,14 @@ CommandCost CmdChangeTimetable(TileIndex
 
		}
 
	}
 

	
 
	if (travel_time != order->travel_time && order->IsType(OT_CONDITIONAL)) return CMD_ERROR;
 

	
 
	if (flags & DC_EXEC) {
 
		if (wait_time   != order->wait_time)   ChangeTimetable(v, order_number, wait_time,   false);
 
		if (travel_time != order->travel_time) ChangeTimetable(v, order_number, travel_time, true);
 
		if (wait_time   != order->wait_time)   ChangeTimetable(v, order_number, wait_time,   MTF_WAIT_TIME);
 
		if (travel_time != order->travel_time) ChangeTimetable(v, order_number, travel_time, MTF_TRAVEL_TIME);
 
	}
 

	
 
	return CommandCost();
 
}
 

	
 
/**
 
@@ -288,13 +310,13 @@ void UpdateVehicleTimetable(Vehicle *v, 
 
			 * e.g. a depot order in the same tick, causing it to not fill
 
			 * the timetable entry like is done for road vehicles/ships.
 
			 * Thus always make sure at least one tick is used between the
 
			 * processing of different orders when filling the timetable. */
 
			time_taken = CeilDiv(max(time_taken, 1U), DAY_TICKS) * DAY_TICKS;
 

	
 
			ChangeTimetable(v, v->cur_real_order_index, time_taken, travelling);
 
			ChangeTimetable(v, v->cur_real_order_index, time_taken, travelling ? MTF_TRAVEL_TIME : MTF_WAIT_TIME);
 
		}
 

	
 
		if (v->cur_real_order_index == first_manual_order && travelling) {
 
			/* If we just started we would have returned earlier and have not reached
 
			 * this code. So obviously, we have completed our round: So turn autofill
 
			 * off again. */
src/timetable_gui.cpp
Show inline comments
 
@@ -490,17 +490,17 @@ struct TimetableWindow : Window {
 
		}
 
	}
 

	
 
	static inline uint32 PackTimetableArgs(const Vehicle *v, uint selected)
 
	{
 
		uint order_number = (selected + 1) / 2;
 
		uint is_journey   = (selected % 2 == 1) ? 1 : 0;
 
		ModifyTimetableFlags mtf = (selected % 2 == 1) ? MTF_TRAVEL_TIME : MTF_WAIT_TIME;
 

	
 
		if (order_number >= v->GetNumOrders()) order_number = 0;
 

	
 
		return v->index | (order_number << 20) | (is_journey << 28);
 
		return v->index | (order_number << 20) | (mtf << 28);
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget, int click_count)
 
	{
 
		const Vehicle *v = this->vehicle;
 

	
0 comments (0 inline, 0 general)