1
0
Fork 0

(svn r16481) [0.7] -Backport from trunk:

- Fix: [NoAI] Another try/catch related bug (r16454)
- Fix: Road vehicles ending up on the pavement when they are in a drive through station that got removed due to bankruptcy [FS#2909] (r16448)
- Fix: [NoAI] AIRail::GetRailStationDirection returned incorrect information (r16440)
- Fix: Crash when a company is deleted while a dropdown with company names is open (r16430)
- Change: [NoAI] Stop an AI when it takes too long to initialize or load [FS#2869] (r16425)
release/0.7
rubidium 2009-05-31 12:18:03 +00:00
parent 7742f8c080
commit 02f3d2d8af
7 changed files with 34 additions and 8 deletions

View File

@ -749,7 +749,16 @@ common_call:
case OT_NATIVECLOSURE: {
bool suspend;
_suspended_target = ct_target;
_GUARD(CallNative(_nativeclosure(clo), arg3, ct_stackbase, clo,suspend));
try {
_GUARD(CallNative(_nativeclosure(clo), arg3, ct_stackbase, clo,suspend));
} catch (...) {
_suspended = SQTrue;
_suspended_target = ct_target;
_suspended_root = ci->_root;
_suspended_traps = traps;
_suspend_varargs = ci->_vargs;
throw;
}
if(suspend){
_suspended = SQTrue;
_suspended_target = ct_target;

View File

@ -304,9 +304,17 @@ void AIInstance::GameLoop()
AIObject::SetAllowDoCommand(false);
/* Run the constructor if it exists. Don't allow any DoCommands in it. */
if (this->engine->MethodExists(*this->instance, "constructor")) {
if (!this->engine->CallMethod(*this->instance, "constructor")) { this->Died(); return; }
if (!this->engine->CallMethod(*this->instance, "constructor", 100000) || this->engine->IsSuspended()) {
if (this->engine->IsSuspended()) AILog::Error("This AI took too long to initialize. AI is not started.");
this->Died();
return;
}
}
if (!this->CallLoad() || this->engine->IsSuspended()) {
if (this->engine->IsSuspended()) AILog::Error("This AI took too long in the Load function. AI is not started.");
this->Died();
return;
}
if (!this->CallLoad()) { this->Died(); return; }
AIObject::SetAllowDoCommand(true);
/* Start the AI by calling Start() */
if (!this->engine->CallMethod(*this->instance, "Start", _settings_game.ai.ai_max_opcode_till_suspend) || !this->engine->IsSuspended()) this->Died();
@ -702,7 +710,7 @@ bool AIInstance::CallLoad()
/* Call the AI load function. sq_call removes the arguments (but not the
* function pointer) from the stack. */
if (SQ_FAILED(sq_call(vm, 3, SQFalse, SQFalse))) return false;
if (SQ_FAILED(sq_call(vm, 3, SQFalse, SQFalse, 100000))) return false;
/* Pop 1) The version, 2) the savegame data, 3) the object instance, 4) the function pointer. */
sq_pop(vm, 4);

View File

@ -110,7 +110,7 @@
{
if (!IsRailStationTile(tile)) return RAILTRACK_INVALID;
return (RailTrack)::GetRailStationTrack(tile);
return (RailTrack)::GetRailStationTrackBits(tile);
}
/* static */ bool AIRail::BuildRailDepot(TileIndex tile, TileIndex front)

View File

@ -209,7 +209,7 @@ bool Squirrel::CallMethod(HSQOBJECT instance, const char *method_name, HSQOBJECT
if (ret != NULL) sq_getstackobj(vm, -1, ret);
/* Reset the top, but don't do so for the AI main function, as we need
* a correct stack when resuming. */
if (suspend == -1) sq_settop(this->vm, top);
if (!this->IsSuspended()) sq_settop(this->vm, top);
/* Restore the return-value location. */
this->vm->_suspended_target = last_target;

View File

@ -1493,7 +1493,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
static Vehicle *ClearRoadStopStatusEnum(Vehicle *v, void *)
{
if (v->type == VEH_ROAD) ClrBit(v->u.road.state, RVS_IN_DT_ROAD_STOP);
if (v->type == VEH_ROAD) v->u.road.state &= RVSB_ROAD_STOP_TRACKDIR_MASK;
return NULL;
}

View File

@ -202,6 +202,11 @@ static inline Track GetRailStationTrack(TileIndex t)
return AxisToTrack(GetRailStationAxis(t));
}
static inline TrackBits GetRailStationTrackBits(TileIndex t)
{
return AxisToTrackBits(GetRailStationAxis(t));
}
static inline bool IsCompatibleTrainStationTile(TileIndex t1, TileIndex t2)
{
assert(IsRailwayStationTile(t2));
@ -245,7 +250,7 @@ static inline void SetRailwayStationReservation(TileIndex t, bool b)
*/
static inline TrackBits GetRailStationReservation(TileIndex t)
{
return GetRailwayStationReservation(t) ? AxisToTrackBits(GetRailStationAxis(t)) : TRACK_BIT_NONE;
return GetRailwayStationReservation(t) ? GetRailStationTrackBits(t) : TRACK_BIT_NONE;
}

View File

@ -167,6 +167,10 @@ public:
void Draw(int x, int y, uint width, uint height, bool sel, int bg_colour) const
{
CompanyID company = (CompanyID)result;
/* It's possible the company is deleted while the dropdown is open */
if (!IsValidCompanyID(company)) return;
DrawCompanyIcon(company, x + 2, y + 1);
SetDParam(0, company);