(svn r16525) -Codechange: Notify small ufos on deletion of road vehicles, so they can head for somewhere else instead of stumbling over a ghost.

This commit is contained in:
frosch 2009-06-06 14:46:50 +00:00
parent ec3ef70adb
commit 5b497d6b49
4 changed files with 38 additions and 4 deletions

View File

@ -314,10 +314,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
} else {
/* Target a vehicle */
Vehicle *u_tmp = Vehicle::Get(v->dest_tile);
if (u_tmp == NULL || u_tmp->type != VEH_ROAD || !IsRoadVehFront(u_tmp)) {
delete v;
return false;
}
assert(u_tmp != NULL && u_tmp->type == VEH_ROAD && IsRoadVehFront(u_tmp));
RoadVehicle *u = (RoadVehicle *)u_tmp;
uint dist = Delta(v->x_pos, u->x_pos) + Delta(v->y_pos, u->y_pos);
@ -948,6 +945,26 @@ void ReleaseDisastersTargetingIndustry(IndustryID i)
}
}
/** Notify disasters that we are about to delete a vehicle. So make them head elsewhere.
* @param vehicle deleted vehicle
*/
void ReleaseDisastersTargetingVehicle(VehicleID vehicle)
{
DisasterVehicle *v;
FOR_ALL_DISASTERVEHICLES(v) {
/* primary disaster vehicles that have chosen target */
if (v->subtype == ST_SMALL_UFO) {
if (v->current_order.GetDestination() != 0 && v->dest_tile == vehicle) {
/* Revert to target-searching */
v->current_order.SetDestination(0);
v->dest_tile = RandomTile();
v->z_pos = 135;
v->age = 0;
}
}
}
}
void DisasterVehicle::UpdateDeltaXY(Direction direction)
{
this->x_offs = -1;

View File

@ -1841,6 +1841,19 @@ bool AfterLoadGame()
}
}
if (CheckSavegameVersion(121)) {
/* Delete small ufos heading for non-existing vehicles */
Vehicle *v;
FOR_ALL_DISASTERVEHICLES(v) {
if (v->subtype == 2/*ST_SMALL_UFO*/ && v->current_order.GetDestination() != 0) {
const Vehicle *u = Vehicle::GetIfValid(v->dest_tile);
if (u == NULL || u->type != VEH_ROAD || !IsRoadVehFront(u)) {
delete v;
}
}
}
}
AfterLoadLabelMaps();
GamelogPrintDebug(1);

View File

@ -554,6 +554,8 @@ void Vehicle::PreDestructor()
extern void StopGlobalFollowVehicle(const Vehicle *v);
StopGlobalFollowVehicle(this);
ReleaseDisastersTargetingVehicle(this->index);
}
Vehicle::~Vehicle()

View File

@ -168,4 +168,6 @@ extern uint16 _returned_refit_capacity;
bool CanVehicleUseStation(EngineID engine_type, const struct Station *st);
bool CanVehicleUseStation(const Vehicle *v, const struct Station *st);
void ReleaseDisastersTargetingVehicle(VehicleID vehicle);
#endif /* VEHICLE_FUNC_H */