From 9241c4649db7e64b402beb910d251a654b8fdde1 Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 24 Apr 2008 14:33:18 +0000 Subject: [PATCH] (svn r12871) [0.6] -Backport from trunk r12819, r12818, r12759: - Fix: Inconsistent use of 8/15-bitness of NewGRF callback results with respect to TTDP's implementation of the specification (r12819, r12818, r12759) --- src/aircraft_cmd.cpp | 2 +- src/articulated_vehicles.cpp | 6 +++--- src/economy.cpp | 2 +- src/newgrf_generic.cpp | 4 +++- src/newgrf_house.cpp | 2 +- src/newgrf_spritegroup.cpp | 41 +----------------------------------- src/rail_gui.cpp | 8 +++---- src/roadveh_cmd.cpp | 9 +++----- src/ship_cmd.cpp | 9 +++----- src/station_cmd.cpp | 2 +- src/town_cmd.cpp | 2 +- src/train_cmd.cpp | 4 ++-- 12 files changed, 24 insertions(+), 67 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index cb053b923d..8f6487cd31 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -529,7 +529,7 @@ CommandCost CmdStartStopAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 /* Check if this aircraft can be started/stopped. The callback will fail or * return 0xFF if it can. */ uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); - if (callback != CALLBACK_FAILED && callback != 0xFF) { + if (callback != CALLBACK_FAILED && GB(callback, 0, 8) != 0xFF) { StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); return_cmd_error(error); } diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index c4947bc3b8..fabafb8c83 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -26,7 +26,7 @@ uint CountArticulatedParts(EngineID engine_type, bool purchase_window) uint i; for (i = 1; i < MAX_UVALUE(EngineID); i++) { uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v); - if (callback == CALLBACK_FAILED || callback == 0xFF) break; + if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; } delete v; @@ -53,7 +53,7 @@ uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type) for (uint i = 1; i < MAX_UVALUE(EngineID); i++) { uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL); - if (callback == CALLBACK_FAILED || callback == 0xFF) break; + if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; EngineID artic_engine = GetFirstEngineOfType(type) + GB(callback, 0, 7); @@ -79,7 +79,7 @@ void AddArticulatedParts(Vehicle **vl, VehicleType type) for (uint i = 1; i < MAX_UVALUE(EngineID); i++) { uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, v->engine_type, v); - if (callback == CALLBACK_FAILED || callback == 0xFF) return; + if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) return; /* Attempt to use pre-allocated vehicles until they run out. This can happen * if the callback returns different values depending on the cargo type. */ diff --git a/src/economy.cpp b/src/economy.cpp index 6430477649..c3d4dfda81 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1597,7 +1597,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left) byte load_amount = EngInfo(v->engine_type)->load_amount; if (_patches.gradual_loading && HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_LOAD_AMOUNT)) { uint16 cb_load_amount = GetVehicleCallback(CBID_VEHICLE_LOAD_AMOUNT, 0, 0, v->engine_type, v); - if (cb_load_amount != CALLBACK_FAILED && cb_load_amount != 0) load_amount = cb_load_amount & 0xFF; + if (cb_load_amount != CALLBACK_FAILED && GB(cb_load_amount, 0, 8) != 0) load_amount = GB(cb_load_amount, 0, 8); } GoodsEntry *ge = &st->goods[v->cargo_type]; diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp index 8d515d7137..ca47b6a35d 100644 --- a/src/newgrf_generic.cpp +++ b/src/newgrf_generic.cpp @@ -175,5 +175,7 @@ uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 defa object.u.generic.count = count; object.u.generic.station_size = station_size; - return GetGenericCallbackResult(feature, &object, file); + uint16 callback = GetGenericCallbackResult(feature, &object, file); + if (callback != CALLBACK_FAILED) callback = GB(callback, 0, 8); + return callback; } diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 1e6178650f..827b8be89b 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -521,7 +521,7 @@ bool NewHouseTileLoop(TileIndex tile) /* Check callback 21, which determines if a house should be destroyed. */ if (HasBit(hs->callback_mask, CBM_HOUSE_DESTRUCTION)) { uint16 callback_res = GetHouseCallback(CBID_HOUSE_DESTRUCTION, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile); - if (callback_res != CALLBACK_FAILED && callback_res > 0) { + if (callback_res != CALLBACK_FAILED && GB(callback_res, 0, 8) > 0) { ClearTownHouse(GetTownByTile(tile), tile); return false; } diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index f0820a25bd..57ca37790f 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -80,37 +80,6 @@ void InitializeSpriteGroupPool() TemporaryStorageArray _temp_store; -static inline bool Is8BitCallback(const ResolverObject *object) -{ - /* Var 0x7E procedure results are always 15 bit */ - if (object == NULL || object->procedure_call) return false; - - switch (object->callback) { - /* All these functions are 15 bit callbacks */ - case CBID_STATION_SPRITE_LAYOUT: - case CBID_VEHICLE_REFIT_CAPACITY: - case CBID_HOUSE_COLOUR: - case CBID_HOUSE_CARGO_ACCEPTANCE: - case CBID_INDUSTRY_LOCATION: - case CBID_HOUSE_ACCEPT_CARGO: - case CBID_INDTILE_CARGO_ACCEPTANCE: - case CBID_INDTILE_ACCEPT_CARGO: - case CBID_VEHICLE_COLOUR_MAPPING: - case CBID_HOUSE_PRODUCE_CARGO: - case CBID_INDTILE_SHAPE_CHECK: - case CBID_VEHICLE_SOUND_EFFECT: - case CBID_VEHICLE_MODIFY_PROPERTY: // depends on queried property - case CBID_CARGO_PROFIT_CALC: - case CBID_SOUNDS_AMBIENT_EFFECT: - case CBID_CARGO_STATION_RATING_CALC: - return false; - - /* The rest is a 8 bit callback, which should be truncated properly */ - default: - return true; - } -} - static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) { /* First handle variables common with Action7/9/D */ @@ -236,7 +205,7 @@ static inline const SpriteGroup *ResolveVariable(const SpriteGroup *group, Resol if (group->g.determ.num_ranges == 0) { /* nvar == 0 is a special case -- we turn our value into a callback result */ nvarzero.type = SGT_CALLBACK; - nvarzero.g.callback.result = GB(value, 0, Is8BitCallback(object) ? 8 : 15); + nvarzero.g.callback.result = value; return &nvarzero; } @@ -294,14 +263,6 @@ const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object) case SGT_REAL: return object->ResolveReal(object, group); case SGT_DETERMINISTIC: return ResolveVariable(group, object); case SGT_RANDOMIZED: return ResolveRandom(group, object); - case SGT_CALLBACK: { - if (!Is8BitCallback(object)) return group; - - static SpriteGroup result8bit; - result8bit.type = SGT_CALLBACK; - result8bit.g.callback.result = GB(group->g.callback.result, 0, 8); - return &result8bit; - } default: return group; } } diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 6aa6d947a9..a1cf666c6f 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -932,7 +932,7 @@ static void StationBuildWndProc(Window *w, WindowEvent *e) const StationSpec *statspec = GetCustomStationSpec(_railstation.station_class, i); if (statspec != NULL && statspec->name != 0) { - if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) { + if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) { GfxFillRect(8, y - 2, 127, y + 10, (1 << PALETTE_MODIFIER_GREYOUT)); } @@ -1077,7 +1077,7 @@ static void StationBuildWndProc(Window *w, WindowEvent *e) statspec = GetCustomStationSpec(_railstation.station_class, y); if (statspec != NULL && HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && - GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) return; + GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) return; _railstation.station_type = y; @@ -1495,7 +1495,7 @@ static void BuildWaypointWndProc(Window *w, WindowEvent *e) if (statspec != NULL && HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && - GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) { + GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) { GfxFillRect(4 + i * 68, 18, 67 + i * 68, 75, (1 << PALETTE_MODIFIER_GREYOUT)); } } @@ -1515,7 +1515,7 @@ static void BuildWaypointWndProc(Window *w, WindowEvent *e) const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, type); if (statspec != NULL && HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && - GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) return; + GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) return; _cur_waypoint_type = type; SndPlayFx(SND_15_BEEP); diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index a24bd25db0..2950604c19 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -292,19 +292,16 @@ CommandCost CmdBuildRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) */ CommandCost CmdStartStopRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Vehicle *v; - uint16 callback; - if (!IsValidVehicleID(p1)) return CMD_ERROR; - v = GetVehicle(p1); + Vehicle *v = GetVehicle(p1); if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; /* Check if this road veh can be started/stopped. The callback will fail or * return 0xFF if it can. */ - callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); - if (callback != CALLBACK_FAILED && callback != 0xFF) { + uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); + if (callback != CALLBACK_FAILED && GB(callback, 0, 8) != 0xFF) { StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); return_cmd_error(error); } diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 5b567a9c38..053cf69fe1 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -935,19 +935,16 @@ CommandCost CmdSellShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) */ CommandCost CmdStartStopShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Vehicle *v; - uint16 callback; - if (!IsValidVehicleID(p1)) return CMD_ERROR; - v = GetVehicle(p1); + Vehicle *v = GetVehicle(p1); if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR; /* Check if this ship can be started/stopped. The callback will fail or * return 0xFF if it can. */ - callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); - if (callback != CALLBACK_FAILED && callback != 0xFF) { + uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); + if (callback != CALLBACK_FAILED && GB(callback, 0, 8) != 0xFF) { StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); return_cmd_error(error); } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 06d2acb7f3..a62b6a0ed6 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1012,7 +1012,7 @@ CommandCost CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, } /* Check if the station is buildable */ - if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) { + if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) { return CMD_ERROR; } } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 49c79940ce..030e0295d5 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1905,7 +1905,7 @@ static bool BuildTownHouse(Town *t, TileIndex tile) if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) { uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile); - if (callback_res != CALLBACK_FAILED && callback_res == 0) continue; + if (callback_res != CALLBACK_FAILED && GB(callback_res, 0, 8) == 0) continue; } } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 54ce8456b8..f8a263a339 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -246,7 +246,7 @@ void TrainConsistChanged(Vehicle* v) if (HasBit(EngInfo(u->engine_type)->callbackmask, CBM_TRAIN_WAGON_POWER)) { 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 = GB(callback, 0, 8); } if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON && @@ -1302,7 +1302,7 @@ CommandCost CmdStartStopTrain(TileIndex tile, uint32 flags, uint32 p1, uint32 p2 /* Check if this train can be started/stopped. The callback will fail or * return 0xFF if it can. */ uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); - if (callback != CALLBACK_FAILED && callback != 0xFF) { + if (callback != CALLBACK_FAILED && GB(callback, 0, 8) != 0xFF) { StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); return_cmd_error(error); }