--- a/src/aircraft_cmd.cpp Sun Apr 15 17:04:44 2007 +0000
+++ b/src/aircraft_cmd.cpp Sat Apr 21 08:23:57 2007 +0000
@@ -393,6 +393,8 @@
v->vehicle_flags = 0;
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
+ UpdateAircraftCache(v);
+
VehiclePositionChanged(v);
VehiclePositionChanged(u);
@@ -569,6 +571,8 @@
}
if (flags & DC_EXEC) {
+ if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
v->current_order.type = OT_GOTO_DEPOT;
v->current_order.flags = OF_NON_STOP;
if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
@@ -715,7 +719,7 @@
if (v->vehstatus & VS_STOPPED) return;
- int32 cost = AircraftVehInfo(v->engine_type)->running_cost * _price.aircraft_running / 364;
+ int32 cost = GetVehicleProperty(v, 0x0E, AircraftVehInfo(v->engine_type)->running_cost) * _price.aircraft_running / 364;
v->profit_this_year -= cost >> 8;
@@ -862,6 +866,21 @@
}
}
+
+void UpdateAircraftCache(Vehicle *v)
+{
+ uint max_speed = GetVehicleProperty(v, 0x0C, 0);
+ if (max_speed != 0) {
+ /* Convert from original units to (approx) km/h */
+ max_speed = (max_speed * 129) / 10;
+
+ v->u.air.cached_max_speed = max_speed;
+ } else {
+ v->u.air.cached_max_speed = 0xFFFF;
+ }
+}
+
+
/**
* Special velocities for aircraft
*/
@@ -885,6 +904,11 @@
uint spd = v->acceleration * 16;
byte t;
+ if (v->u.air.cached_max_speed < speed_limit) {
+ if (v->cur_speed < speed_limit) hard_limit = false;
+ speed_limit = v->u.air.cached_max_speed;
+ }
+
speed_limit = min(speed_limit, v->max_speed);
v->subspeed = (t=v->subspeed) + (byte)spd;
@@ -1389,6 +1413,7 @@
}
Order b = v->current_order;
+ v->LeaveStation();
v->current_order.Free();
MarkAircraftDirty(v);
if (!(b.flags & OF_NON_STOP)) return;
@@ -1856,8 +1881,10 @@
/* we have arrived in an important state (eg terminal, hangar, etc.) */
if (current->heading == v->u.air.state) {
byte prev_pos = v->u.air.pos; // location could be changed in state, so save it before-hand
+ byte prev_state = v->u.air.state;
_aircraft_state_handlers[v->u.air.state](v, apc);
if (v->u.air.state != FLYING) v->u.air.previous_pos = prev_pos;
+ if (v->u.air.state != prev_state) UpdateAircraftCache(v);
return true;
}