1
0
Fork 0

(svn r5105) - NewGRF: Move callbackmask from *VehicleInfo to EngineInfo. This simplifies code that works with more than one vehicle type.

release/0.5
peter1138 2006-06-04 18:22:32 +00:00
parent 0a623bc333
commit 5e3dd8dd78
4 changed files with 25 additions and 28 deletions

View File

@ -21,7 +21,6 @@ typedef struct RailVehicleInfo {
byte capacity; byte capacity;
CargoID cargo_type; CargoID cargo_type;
byte ai_rank; byte ai_rank;
byte callbackmask; // see CallbackMask enum
uint16 pow_wag_power; uint16 pow_wag_power;
byte pow_wag_weight; byte pow_wag_weight;
byte visual_effect; // NOTE: this is not 100% implemented yet, at the moment it is only used as a 'fallback' value byte visual_effect; // NOTE: this is not 100% implemented yet, at the moment it is only used as a 'fallback' value
@ -41,7 +40,6 @@ typedef struct ShipVehicleInfo {
byte running_cost; byte running_cost;
byte sfx; byte sfx;
byte refittable; byte refittable;
byte callbackmask;
} ShipVehicleInfo; } ShipVehicleInfo;
typedef struct AircraftVehicleInfo { typedef struct AircraftVehicleInfo {
@ -54,7 +52,6 @@ typedef struct AircraftVehicleInfo {
byte max_speed; byte max_speed;
byte mail_capacity; byte mail_capacity;
uint16 passenger_capacity; uint16 passenger_capacity;
byte callbackmask;
} AircraftVehicleInfo; } AircraftVehicleInfo;
typedef struct RoadVehicleInfo { typedef struct RoadVehicleInfo {
@ -65,7 +62,6 @@ typedef struct RoadVehicleInfo {
byte max_speed; byte max_speed;
byte capacity; byte capacity;
CargoID cargo_type; CargoID cargo_type;
byte callbackmask;
} RoadVehicleInfo; } RoadVehicleInfo;
/** Information about a vehicle /** Information about a vehicle
@ -80,6 +76,7 @@ typedef struct EngineInfo {
byte climates:4; byte climates:4;
uint32 refit_mask; uint32 refit_mask;
byte misc_flags; byte misc_flags;
byte callbackmask;
} EngineInfo; } EngineInfo;
typedef struct Engine { typedef struct Engine {

View File

@ -411,7 +411,7 @@ static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x1E: /* Callback */ case 0x1E: /* Callback */
FOR_EACH_OBJECT rvi[i].callbackmask = grf_load_byte(&buf); FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
break; break;
case 0x21: /* Shorter vehicle */ case 0x21: /* Shorter vehicle */
@ -549,7 +549,7 @@ static bool RoadVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x17: /* Callback mask */ case 0x17: /* Callback mask */
FOR_EACH_OBJECT rvi[i].callbackmask = grf_load_byte(&buf); FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
break; break;
case 0x1C: /* Miscellaneous flags */ case 0x1C: /* Miscellaneous flags */
@ -653,7 +653,7 @@ static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x12: /* Callback mask */ case 0x12: /* Callback mask */
FOR_EACH_OBJECT svi[i].callbackmask = grf_load_byte(&buf); FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
break; break;
case 0x17: /* Miscellaneous flags */ case 0x17: /* Miscellaneous flags */
@ -750,7 +750,7 @@ static bool AircraftVehicleChangeInfo(uint engine, int numinfo, int prop, byte *
break; break;
case 0x14: /* Callback mask */ case 0x14: /* Callback mask */
FOR_EACH_OBJECT avi[i].callbackmask = grf_load_byte(&buf); FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
break; break;
case 0x17: /* Miscellaneous flags */ case 0x17: /* Miscellaneous flags */

View File

@ -15,7 +15,7 @@
* @param e Rail Type of the vehicle * @param e Rail Type of the vehicle
* @param f Bitmask of the climates * @param f Bitmask of the climates
*/ */
#define MK(a, b, c, d, e, f) { a, b, c, d, e, f, 0, 0 } #define MK(a, b, c, d, e, f) { a, b, c, d, e, f, 0, 0, 0 }
/** Writes the properties of a train carriage into the EngineInfo struct. /** Writes the properties of a train carriage into the EngineInfo struct.
* @see EngineInfo * @see EngineInfo
* @param a Introduction date * @param a Introduction date
@ -23,7 +23,7 @@
* @param f Bitmask of the climates * @param f Bitmask of the climates
* @note the 0x80 in parameter b sets the "is carriage bit" * @note the 0x80 in parameter b sets the "is carriage bit"
*/ */
#define MW(a, b, c, d, e, f) { a, b | 0x80, c, d, e, f, 0, 0 } #define MW(a, b, c, d, e, f) { a, b | 0x80, c, d, e, f, 0, 0, 0 }
// Rail types // Rail types
// R = Conventional railway // R = Conventional railway
@ -324,7 +324,7 @@ const EngineInfo orig_engine_info[] = {
* @param j cargo_type * @param j cargo_type
* @param k ai_rank * @param k ai_rank
*/ */
#define RVI(a, b, c, d, e, f, g, h, i, j, k) { a, b, c, d, e, f, g, h, h, i, j, k, 0, 0, 0, 0, 0, 0 } #define RVI(a, b, c, d, e, f, g, h, i, j, k) { a, b, c, d, e, f, g, h, h, i, j, k, 0, 0, 0, 0, 0 }
#define M RVI_MULTIHEAD #define M RVI_MULTIHEAD
#define W RVI_WAGON #define W RVI_WAGON
#define S 0 #define S 0
@ -471,7 +471,7 @@ const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
* @param g sound effect * @param g sound effect
* @param h refittable * @param h refittable
*/ */
#define SVI(a, b, c, d, e, f, g, h) { a, b, c, d, e, f, g, h, 0 } #define SVI(a, b, c, d, e, f, g, h) { a, b, c, d, e, f, g, h }
const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES] = { const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES] = {
// image_index cargo_type cargo_amount refittable // image_index cargo_type cargo_amount refittable
// | base_cost | | running_cost | // | base_cost | | running_cost |
@ -503,7 +503,7 @@ const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES] = {
* @param h mail_capacity * @param h mail_capacity
* @param i passenger_capacity * @param i passenger_capacity
*/ */
#define AVI(a, b, c, d, e, f, g, h, i) { a, b, c, d, e, f, g, h, i, 0 } #define AVI(a, b, c, d, e, f, g, h, i) { a, b, c, d, e, f, g, h, i }
#define H 0 #define H 0
#define P 1 #define P 1
#define J 3 #define J 3
@ -570,7 +570,7 @@ const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES] = {
* @param f capacity * @param f capacity
* @param g cargo_type * @param g cargo_type
*/ */
#define RVI(a, b, c, d, e, f, g) { a, b, c, d, e, f, g, 0 } #define RVI(a, b, c, d, e, f, g) { a, b, c, d, e, f, g }
const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES] = { const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES] = {
// image_index sfx max_speed // image_index sfx max_speed
// | base_cost | | capacity // | base_cost | | capacity

View File

@ -167,7 +167,7 @@ void TrainConsistChanged(Vehicle* v)
CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON); CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
/* Check powered wagon / visual effect callback */ /* Check powered wagon / visual effect callback */
if (HASBIT(rvi_u->callbackmask, CBM_WAGON_POWER)) { if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_WAGON_POWER)) {
uint16 callback = GetVehicleCallback(CBID_TRAIN_WAGON_POWER, 0, 0, u->engine_type, u); uint16 callback = GetVehicleCallback(CBID_TRAIN_WAGON_POWER, 0, 0, u->engine_type, u);
if (callback != CALLBACK_FAILED) u->u.rail.cached_vis_effect = callback; if (callback != CALLBACK_FAILED) u->u.rail.cached_vis_effect = callback;
@ -194,10 +194,10 @@ void TrainConsistChanged(Vehicle* v)
// check the vehicle length (callback) // check the vehicle length (callback)
veh_len = CALLBACK_FAILED; veh_len = CALLBACK_FAILED;
if (HASBIT(rvi_u->callbackmask, CBM_VEHICLE_LENGTH)) if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
veh_len = GetVehicleCallback(CBID_TRAIN_VEHICLE_LENGTH, 0, 0, u->engine_type, u); veh_len = GetVehicleCallback(CBID_TRAIN_VEHICLE_LENGTH, 0, 0, u->engine_type, u);
if (veh_len == CALLBACK_FAILED) }
veh_len = rvi_u->shorten_factor; if (veh_len == CALLBACK_FAILED) veh_len = rvi_u->shorten_factor;
veh_len = clamp(veh_len, 0, u->next == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code veh_len = clamp(veh_len, 0, u->next == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code
u->u.rail.cached_veh_length = 8 - veh_len; u->u.rail.cached_veh_length = 8 - veh_len;
v->u.rail.cached_total_length += u->u.rail.cached_veh_length; v->u.rail.cached_total_length += u->u.rail.cached_veh_length;
@ -474,12 +474,12 @@ void DrawTrainEngine(int x, int y, EngineID engine, uint32 image_ormod)
DrawSprite(image | image_ormod, x, y); DrawSprite(image | image_ormod, x, y);
} }
static uint CountArticulatedParts(const RailVehicleInfo *rvi, EngineID engine_type) static uint CountArticulatedParts(EngineID engine_type)
{ {
uint16 callback; uint16 callback;
uint i; uint i;
if (!HASBIT(rvi->callbackmask, CBM_ARTIC_ENGINE)) return 0; if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
for (i = 1; i < 10; i++) { for (i = 1; i < 10; i++) {
callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL); callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
@ -489,7 +489,7 @@ static uint CountArticulatedParts(const RailVehicleInfo *rvi, EngineID engine_ty
return i - 1; return i - 1;
} }
static void AddArticulatedParts(const RailVehicleInfo *rvi, Vehicle **vl) static void AddArticulatedParts(Vehicle **vl)
{ {
const RailVehicleInfo *rvi_artic; const RailVehicleInfo *rvi_artic;
EngineID engine_type; EngineID engine_type;
@ -499,7 +499,7 @@ static void AddArticulatedParts(const RailVehicleInfo *rvi, Vehicle **vl)
bool flip_image; bool flip_image;
uint i; uint i;
if (!HASBIT(rvi->callbackmask, CBM_ARTIC_ENGINE)) return; if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
for (i = 1; i < 10; i++) { for (i = 1; i < 10; i++) {
callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, NULL); callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, NULL);
@ -557,7 +557,7 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
rvi = RailVehInfo(engine); rvi = RailVehInfo(engine);
value = (rvi->base_cost * _price.build_railwagon) >> 8; value = (rvi->base_cost * _price.build_railwagon) >> 8;
num_vehicles = 1 + CountArticulatedParts(rvi, engine); num_vehicles = 1 + CountArticulatedParts(engine);
if (!(flags & DC_QUERY_COST)) { if (!(flags & DC_QUERY_COST)) {
Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts. Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts.
@ -624,7 +624,7 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
v->cur_image = 0xAC2; v->cur_image = 0xAC2;
v->random_bits = VehicleRandomBits(); v->random_bits = VehicleRandomBits();
AddArticulatedParts(rvi, vl); AddArticulatedParts(vl);
_new_vehicle_id = v->index; _new_vehicle_id = v->index;
@ -730,7 +730,7 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
value = EstimateTrainCost(rvi); value = EstimateTrainCost(rvi);
num_vehicles = (rvi->flags & RVI_MULTIHEAD) ? 2 : 1; num_vehicles = (rvi->flags & RVI_MULTIHEAD) ? 2 : 1;
num_vehicles += CountArticulatedParts(rvi, p1); num_vehicles += CountArticulatedParts(p1);
if (!(flags & DC_QUERY_COST)) { if (!(flags & DC_QUERY_COST)) {
Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads
@ -800,7 +800,7 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
vl[0]->u.rail.other_multiheaded_part = vl[1]; vl[0]->u.rail.other_multiheaded_part = vl[1];
vl[1]->u.rail.other_multiheaded_part = vl[0]; vl[1]->u.rail.other_multiheaded_part = vl[0];
} else { } else {
AddArticulatedParts(rvi, vl); AddArticulatedParts(vl);
} }
TrainConsistChanged(v); TrainConsistChanged(v);
@ -1666,7 +1666,7 @@ int32 CmdReverseTrainDirection(TileIndex tile, uint32 flags, uint32 p1, uint32 p
// turn a single unit around // turn a single unit around
Vehicle *front; Vehicle *front;
if (IsMultiheaded(v) || HASBIT(RailVehInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) { if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) {
return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT); return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
} }
@ -1756,7 +1756,7 @@ int32 CmdRefitRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
const RailVehicleInfo *rvi = RailVehInfo(v->engine_type); const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
uint16 amount = CALLBACK_FAILED; uint16 amount = CALLBACK_FAILED;
if (HASBIT(rvi->callbackmask, CBM_REFIT_CAPACITY)) { if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
/* Check the 'refit capacity' callback */ /* Check the 'refit capacity' callback */
CargoID temp_cid = v->cargo_type; CargoID temp_cid = v->cargo_type;
v->cargo_type = new_cid; v->cargo_type = new_cid;