From cad2aa6b14ba10ca7e7d890228b3fb7245c0d6e3 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 26 Feb 2011 20:03:44 +0000 Subject: [PATCH] (svn r22150) [1.1] -Backport from trunk: - Fix: When a NOT_REACHED in saveload can be reached due to an invalid savegame, use SlErrorCorrupt instead. In other words, do not crash but show an error message (r22122) - Fix: In case of high frame_freq one could get commands executed after a new network game was started (r22121) - Fix: [NoAI] Prevent AIs from getting consistently over their allowed amount of operations by subtracting the amount they went over 'budget' from the budget for the next 'tick' (r22120) - Fix: The refit window was not correctly updated after selecting with Ctrl+Click [FS#4525] (r22118) - Fix: CanRemoveRoadWithStop() failed for _current_company = OWNER_TOWN, and for OWNER_NONE-owned road (r22117) --- src/network/network_command.cpp | 3 ++- src/saveload/vehicle_sl.cpp | 2 +- src/script/squirrel.cpp | 13 +++++++++++++ src/script/squirrel.hpp | 1 + src/station_cmd.cpp | 21 +++++++++++++-------- src/vehicle_gui.cpp | 7 ++++++- 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index d678fcfdf6..8e1fa077b5 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -221,10 +221,11 @@ void NetworkExecuteLocalCommandQueue() } /** - * Free the local command queue. + * Free the local command queues. */ void NetworkFreeLocalCommandQueue() { + _local_wait_queue.Free(); _local_execution_queue.Free(); } diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 4529dc50aa..2cfc704a14 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -326,7 +326,7 @@ void AfterLoadVehicles(bool part_of_load) rv->subtype = 0; rv->SetArticulatedPart(); } else { - NOT_REACHED(); + SlErrorCorrupt("Invalid road vehicle subtype"); } } } diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index 504f41a640..b9151e727e 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -188,7 +188,19 @@ bool Squirrel::MethodExists(HSQOBJECT instance, const char *method_name) bool Squirrel::Resume(int suspend) { assert(!this->crashed); + /* Did we use more operations than we should have in the + * previous tick? If so, subtract that from the current run. */ + if (this->overdrawn_ops > 0 && suspend > 0) { + this->overdrawn_ops -= suspend; + /* Do we need to wait even more? */ + if (this->overdrawn_ops >= 0) return true; + + /* We can now only run whatever is "left". */ + suspend = -this->overdrawn_ops; + } + this->crashed = !sq_resumecatch(this->vm, suspend); + this->overdrawn_ops = -this->vm->_ops_till_suspend; return this->vm->_suspended != 0; } @@ -310,6 +322,7 @@ Squirrel::Squirrel() this->print_func = NULL; this->global_pointer = NULL; this->crashed = false; + this->overdrawn_ops = 0; /* Handle compile-errors ourself, so we can display it nicely */ sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError); diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp index d50dc356aa..1ada519ccc 100644 --- a/src/script/squirrel.hpp +++ b/src/script/squirrel.hpp @@ -22,6 +22,7 @@ private: void *global_pointer; ///< Can be set by who ever initializes Squirrel SQPrintFunc *print_func; ///< Points to either NULL, or a custom print handler bool crashed; ///< True if the squirrel script made an error. + int overdrawn_ops; ///< The amount of operations we have overdrawn. /** * The internal RunError handler. It looks up the real error and calls RunError with it. diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 4d64b3c037..98b919870d 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3452,16 +3452,21 @@ static bool CanRemoveRoadWithStop(TileIndex tile, DoCommandFlag flags) /* Yeah... water can always remove stops, right? */ if (_current_company == OWNER_WATER) return true; - Owner road_owner = _current_company; - Owner tram_owner = _current_company; - RoadTypes rts = GetRoadTypes(tile); - if (HasBit(rts, ROADTYPE_ROAD)) road_owner = GetRoadOwner(tile, ROADTYPE_ROAD); - if (HasBit(rts, ROADTYPE_TRAM)) tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM); + if (HasBit(rts, ROADTYPE_TRAM)) { + Owner tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM); + if (tram_owner != OWNER_NONE && CheckOwnership(tram_owner).Failed()) return false; + } + if (HasBit(rts, ROADTYPE_ROAD)) { + Owner road_owner = GetRoadOwner(tile, ROADTYPE_ROAD); + if (road_owner != OWNER_TOWN) { + if (road_owner != OWNER_NONE && CheckOwnership(road_owner).Failed()) return false; + } else { + if (CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile, ROADTYPE_ROAD), OWNER_TOWN, ROADTYPE_ROAD, flags).Failed()) return false; + } + } - if ((road_owner != OWNER_TOWN && CheckOwnership(road_owner).Failed()) || CheckOwnership(tram_owner).Failed()) return false; - - return road_owner != OWNER_TOWN || CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile, ROADTYPE_ROAD), OWNER_TOWN, ROADTYPE_ROAD, flags).Succeeded(); + return true; } CommandCost ClearTile_Station(TileIndex tile, DoCommandFlag flags) diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 048af0e4cf..96580dac9f 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -795,7 +795,12 @@ struct RefitWindow : public Window { this->click_x = GetClickPosition(pt.x - nwi->pos_x); this->SetSelectedVehicles(pt.x - nwi->pos_x); this->SetWidgetDirty(VRW_VEHICLE_PANEL_DISPLAY); - if (!_ctrl_pressed) SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); + if (!_ctrl_pressed) { + SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); + } else { + /* The vehicle selection has changed. */ + this->InvalidateData(2); + } break; }