Changeset - r11974:ae01bf1630e3
[Not reviewed]
master
0 4 0
rubidium - 15 years ago 2009-05-22 18:57:11
rubidium@openttd.org
(svn r16385) -Codechange: move u.disaster to DisasterVehicle.
4 files changed with 52 insertions and 54 deletions:
0 comments (0 inline, 0 general)
src/disaster_cmd.cpp
Show inline comments
 
@@ -111,16 +111,16 @@ static const SpriteID * const _disaster_
 
	_disaster_images_4, _disaster_images_5,                     ///< small and big submarine sprites
 
};
 

	
 
static void DisasterVehicleUpdateImage(Vehicle *v)
 
static void DisasterVehicleUpdateImage(DisasterVehicle *v)
 
{
 
	SpriteID img = v->u.disaster.image_override;
 
	SpriteID img = v->image_override;
 
	if (img == 0) img = _disaster_images[v->subtype][v->direction];
 
	v->cur_image = img;
 
}
 

	
 
/** Initialize a disaster vehicle. These vehicles are of type VEH_DISASTER, are unclickable
 
 * and owned by nobody */
 
static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Direction direction, byte subtype)
 
static void InitializeDisasterVehicle(DisasterVehicle *v, int x, int y, byte z, Direction direction, byte subtype)
 
{
 
	v->x_pos = x;
 
	v->y_pos = y;
 
@@ -131,7 +131,7 @@ static void InitializeDisasterVehicle(Ve
 
	v->UpdateDeltaXY(INVALID_DIR);
 
	v->owner = OWNER_NONE;
 
	v->vehstatus = VS_UNCLICKABLE;
 
	v->u.disaster.image_override = 0;
 
	v->image_override = 0;
 
	v->current_order.Free();
 

	
 
	DisasterVehicleUpdateImage(v);
 
@@ -139,7 +139,7 @@ static void InitializeDisasterVehicle(Ve
 
	MarkSingleVehicleDirty(v);
 
}
 

	
 
static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
 
static void SetDisasterVehiclePos(DisasterVehicle *v, int x, int y, byte z)
 
{
 
	v->x_pos = x;
 
	v->y_pos = y;
 
@@ -149,7 +149,7 @@ static void SetDisasterVehiclePos(Vehicl
 
	DisasterVehicleUpdateImage(v);
 
	VehicleMove(v, true);
 

	
 
	Vehicle *u = v->Next();
 
	DisasterVehicle *u = v->Next();
 
	if (u != NULL) {
 
		int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
 
		int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
 
@@ -180,7 +180,7 @@ static void SetDisasterVehiclePos(Vehicl
 
 * 2: Clear the runway after some time and remove crashed zeppeliner
 
 * If not airport was found, only state 0 is reached until zeppeliner leaves map
 
 */
 
static bool DisasterTick_Zeppeliner(Vehicle *v)
 
static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
 
{
 
	v->tick_counter++;
 

	
 
@@ -248,9 +248,9 @@ static bool DisasterTick_Zeppeliner(Vehi
 
	if (++v->age == 1) {
 
		CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE);
 
		SndPlayVehicleFx(SND_12_EXPLOSION, v);
 
		v->u.disaster.image_override = SPR_BLIMP_CRASHING;
 
		v->image_override = SPR_BLIMP_CRASHING;
 
	} else if (v->age == 70) {
 
		v->u.disaster.image_override = SPR_BLIMP_CRASHED;
 
		v->image_override = SPR_BLIMP_CRASHED;
 
	} else if (v->age <= 300) {
 
		if (GB(v->tick_counter, 0, 3) == 0) {
 
			uint32 r = Random();
 
@@ -281,9 +281,9 @@ static bool DisasterTick_Zeppeliner(Vehi
 
 * 1: Home in on a road vehicle and crash it >:)
 
 * If not road vehicle was found, only state 0 is used and Ufo disappears after a while
 
 */
 
static bool DisasterTick_Ufo(Vehicle *v)
 
static bool DisasterTick_Ufo(DisasterVehicle *v)
 
{
 
	v->u.disaster.image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
 
	v->image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
 

	
 
	if (v->current_order.GetDestination() == 0) {
 
		/* Fly around randomly */
 
@@ -388,10 +388,10 @@ static void DestructIndustry(Industry *i
 
 * @param news_message The string that's used as news message.
 
 * @param industry_flag Only attack industries that have this flag set.
 
 */
 
static bool DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag)
 
static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag)
 
{
 
	v->tick_counter++;
 
	v->u.disaster.image_override = (v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0;
 
	v->image_override = (v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0;
 

	
 
	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
@@ -450,19 +450,19 @@ static bool DisasterTick_Aircraft(Vehicl
 
}
 

	
 
/** Airplane handling. */
 
static bool DisasterTick_Airplane(Vehicle *v)
 
static bool DisasterTick_Airplane(DisasterVehicle *v)
 
{
 
	return DisasterTick_Aircraft(v, SPR_F_15_FIRING, true, STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY, INDUSTRYBEH_AIRPLANE_ATTACKS);
 
}
 

	
 
/** Helicopter handling. */
 
static bool DisasterTick_Helicopter(Vehicle *v)
 
static bool DisasterTick_Helicopter(DisasterVehicle *v)
 
{
 
	return DisasterTick_Aircraft(v, SPR_AH_64A_FIRING, false, STR_NEWS_DISASTER_HELICOPTER_FACTORY, INDUSTRYBEH_CHOPPER_ATTACKS);
 
}
 

	
 
/** Helicopter rotor blades; keep these spinning */
 
static bool DisasterTick_Helicopter_Rotors(Vehicle *v)
 
static bool DisasterTick_Helicopter_Rotors(DisasterVehicle *v)
 
{
 
	v->tick_counter++;
 
	if (HasBit(v->tick_counter, 0)) return true;
 
@@ -480,7 +480,7 @@ static bool DisasterTick_Helicopter_Roto
 
 * 1: Land there and breakdown all trains in a radius of 12 tiles; and now we wait...
 
 *    because as soon as the Ufo lands, a fighter jet, a Skyranger, is called to clear up the mess
 
 */
 
static bool DisasterTick_Big_Ufo(Vehicle *v)
 
static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
 
{
 
	v->tick_counter++;
 

	
 
@@ -509,12 +509,12 @@ static bool DisasterTick_Big_Ufo(Vehicle
 

	
 
		v->current_order.SetDestination(2);
 

	
 
		Vehicle *u;
 
		FOR_ALL_VEHICLES(u) {
 
			if (u->type == VEH_TRAIN || u->type == VEH_ROAD) {
 
				if (Delta(u->x_pos, v->x_pos) + Delta(u->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
 
					u->breakdown_ctr = 5;
 
					u->breakdown_delay = 0xF0;
 
		Vehicle *target;
 
		FOR_ALL_VEHICLES(target) {
 
			if (target->type == VEH_TRAIN || target->type == VEH_ROAD) {
 
				if (Delta(target->x_pos, v->x_pos) + Delta(target->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
 
					target->breakdown_ctr = 5;
 
					target->breakdown_delay = 0xF0;
 
				}
 
			}
 
		}
 
@@ -530,12 +530,12 @@ static bool DisasterTick_Big_Ufo(Vehicle
 
			delete v;
 
			return false;
 
		}
 
		u = new DisasterVehicle();
 
		DisasterVehicle *u = new DisasterVehicle();
 

	
 
		InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_BIG_UFO_DESTROYER);
 
		u->u.disaster.big_ufo_destroyer_target = v->index;
 
		u->big_ufo_destroyer_target = v->index;
 

	
 
		Vehicle *w = new DisasterVehicle();
 
		DisasterVehicle *w = new DisasterVehicle();
 

	
 
		u->SetNext(w);
 
		InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_BIG_UFO_DESTROYER_SHADOW);
 
@@ -576,7 +576,7 @@ static bool DisasterTick_Big_Ufo(Vehicle
 
 * Skyranger destroying (Big) Ufo handling, v->current_order.dest states:
 
 * 0: Home in on landed Ufo and shoot it down
 
 */
 
static bool DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
 
static bool DisasterTick_Big_Ufo_Destroyer(DisasterVehicle *v)
 
{
 
	v->tick_counter++;
 

	
 
@@ -589,7 +589,7 @@ static bool DisasterTick_Big_Ufo_Destroy
 
	}
 

	
 
	if (v->current_order.GetDestination() == 0) {
 
		Vehicle *u = Vehicle::Get(v->u.disaster.big_ufo_destroyer_target);
 
		Vehicle *u = Vehicle::Get(v->big_ufo_destroyer_target);
 
		if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return true;
 
		v->current_order.SetDestination(1);
 

	
 
@@ -622,7 +622,7 @@ static bool DisasterTick_Big_Ufo_Destroy
 
 * Submarine, v->current_order.dest states:
 
 * Unused, just float around aimlessly and pop up at different places, turning around
 
 */
 
static bool DisasterTick_Submarine(Vehicle *v)
 
static bool DisasterTick_Submarine(DisasterVehicle *v)
 
{
 
	v->tick_counter++;
 

	
 
@@ -649,12 +649,12 @@ static bool DisasterTick_Submarine(Vehic
 
}
 

	
 

	
 
static bool DisasterTick_NULL(Vehicle *v)
 
static bool DisasterTick_NULL(DisasterVehicle *v)
 
{
 
	return true;
 
}
 

	
 
typedef bool DisasterVehicleTickProc(Vehicle *v);
 
typedef bool DisasterVehicleTickProc(DisasterVehicle *v);
 

	
 
static DisasterVehicleTickProc * const _disastervehicle_tick_procs[] = {
 
	DisasterTick_Zeppeliner, DisasterTick_NULL,
 
@@ -693,11 +693,11 @@ static void Disaster_Zeppeliner_Init()
 
		}
 
	}
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 
	InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_ZEPPELINER);
 

	
 
	/* Allocate shadow */
 
	Vehicle *u = new DisasterVehicle();
 
	DisasterVehicle *u = new DisasterVehicle();
 
	v->SetNext(u);
 
	InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_ZEPPELINER_SHADOW);
 
	u->vehstatus |= VS_SHADOW;
 
@@ -710,7 +710,7 @@ static void Disaster_Small_Ufo_Init()
 
{
 
	if (!Vehicle::CanAllocateItem(2)) return;
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 
	int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
 

	
 
	InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_SMALL_UFO);
 
@@ -718,7 +718,7 @@ static void Disaster_Small_Ufo_Init()
 
	v->age = 0;
 

	
 
	/* Allocate shadow */
 
	Vehicle *u = new DisasterVehicle();
 
	DisasterVehicle *u = new DisasterVehicle();
 
	v->SetNext(u);
 
	InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_SMALL_UFO_SHADOW);
 
	u->vehstatus |= VS_SHADOW;
 
@@ -741,7 +741,7 @@ static void Disaster_Airplane_Init()
 

	
 
	if (found == NULL) return;
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 

	
 
	/* Start from the bottom (south side) of the map */
 
	int x = (MapSizeX() + 9) * TILE_SIZE - 1;
 
@@ -749,7 +749,7 @@ static void Disaster_Airplane_Init()
 

	
 
	InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_AIRPLANE);
 

	
 
	Vehicle *u = new DisasterVehicle();
 
	DisasterVehicle *u = new DisasterVehicle();
 
	v->SetNext(u);
 
	InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_AIRPLANE_SHADOW);
 
	u->vehstatus |= VS_SHADOW;
 
@@ -772,19 +772,19 @@ static void Disaster_Helicopter_Init()
 

	
 
	if (found == NULL) return;
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 

	
 
	int x = -16 * TILE_SIZE;
 
	int y = TileY(found->xy) * TILE_SIZE + 37;
 

	
 
	InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_HELICOPTER);
 

	
 
	Vehicle *u = new DisasterVehicle();
 
	DisasterVehicle *u = new DisasterVehicle();
 
	v->SetNext(u);
 
	InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_HELICOPTER_SHADOW);
 
	u->vehstatus |= VS_SHADOW;
 

	
 
	Vehicle *w = new DisasterVehicle();
 
	DisasterVehicle *w = new DisasterVehicle();
 
	u->SetNext(w);
 
	InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_HELICOPTER_ROTORS);
 
}
 
@@ -796,7 +796,7 @@ static void Disaster_Big_Ufo_Init()
 
{
 
	if (!Vehicle::CanAllocateItem(2)) return;
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 
	int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
 
	int y = MapMaxX() * TILE_SIZE - 1;
 

	
 
@@ -805,7 +805,7 @@ static void Disaster_Big_Ufo_Init()
 
	v->age = 0;
 

	
 
	/* Allocate shadow */
 
	Vehicle *u = new DisasterVehicle();
 
	DisasterVehicle *u = new DisasterVehicle();
 
	v->SetNext(u);
 
	InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_BIG_UFO_SHADOW);
 
	u->vehstatus |= VS_SHADOW;
 
@@ -831,7 +831,7 @@ static void Disaster_Submarine_Init(Disa
 
	}
 
	if (!IsWaterTile(TileVirtXY(x, y))) return;
 

	
 
	Vehicle *v = new DisasterVehicle();
 
	DisasterVehicle *v = new DisasterVehicle();
 
	InitializeDisasterVehicle(v, x, y, 0, dir, subtype);
 
	v->age = 0;
 
}
src/saveload/oldloader_sl.cpp
Show inline comments
 
@@ -1131,8 +1131,8 @@ static const OldChunks vehicle_effect_ch
 
};
 

	
 
static const OldChunks vehicle_disaster_chunk[] = {
 
	OCL_SVAR( OC_UINT16, VehicleDisaster, image_override ),
 
	OCL_SVAR( OC_UINT16, VehicleDisaster, big_ufo_destroyer_target ),
 
	OCL_SVAR( OC_UINT16, DisasterVehicle, image_override ),
 
	OCL_SVAR( OC_UINT16, DisasterVehicle, big_ufo_destroyer_target ),
 

	
 
	OCL_NULL( 6 ), ///< Junk
 

	
 
@@ -1161,7 +1161,7 @@ static bool LoadOldVehicleUnion(Loadgame
 
			case VEH_SHIP    : res = LoadChunk(ls, v, vehicle_ship_chunk);     break;
 
			case VEH_AIRCRAFT: res = LoadChunk(ls, &v->u.air,      vehicle_air_chunk);      break;
 
			case VEH_EFFECT  : res = LoadChunk(ls, v, vehicle_effect_chunk);   break;
 
			case VEH_DISASTER: res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
 
			case VEH_DISASTER: res = LoadChunk(ls, v, vehicle_disaster_chunk); break;
 
		}
 
	}
 

	
src/saveload/vehicle_sl.cpp
Show inline comments
 
@@ -646,8 +646,8 @@ const SaveLoad *GetVehicleDescription(Ve
 
		 SLE_CONDVAR(Vehicle, age,                   SLE_INT32,                   31, SL_MAX_VERSION),
 
		     SLE_VAR(Vehicle, tick_counter,          SLE_UINT8),
 

	
 
		    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, image_override),            SLE_UINT16),
 
		    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, big_ufo_destroyer_target),  SLE_UINT16),
 
		     SLE_VAR(DisasterVehicle, image_override,            SLE_UINT16),
 
		     SLE_VAR(DisasterVehicle, big_ufo_destroyer_target,  SLE_UINT16),
 

	
 
		/* reserve extra space in savegame here. (currently 16 bytes) */
 
		SLE_CONDNULL(16,                                                           2, SL_MAX_VERSION),
src/vehicle_base.h
Show inline comments
 
@@ -175,11 +175,6 @@ struct VehicleRoad {
 
	RoadTypes compatible_roadtypes;
 
};
 

	
 
struct VehicleDisaster {
 
	uint16 image_override;
 
	VehicleID big_ufo_destroyer_target;
 
};
 

	
 
typedef Pool<Vehicle, VehicleID, 512, 64000> VehiclePool;
 
extern VehiclePool _vehicle_pool;
 

	
 
@@ -311,7 +306,6 @@ public:
 
		VehicleRail rail;
 
		VehicleAir air;
 
		VehicleRoad road;
 
		VehicleDisaster disaster;
 
	} u;
 

	
 
	/* cached oftenly queried NewGRF values */
 
@@ -621,6 +615,9 @@ public:
 
 * As side-effect the vehicle type is set correctly.
 
 */
 
struct DisasterVehicle : public Vehicle {
 
	uint16 image_override;
 
	VehicleID big_ufo_destroyer_target;
 

	
 
	/** Initializes the Vehicle to a disaster vehicle */
 
	DisasterVehicle() { this->type = VEH_DISASTER; }
 

	
 
@@ -630,6 +627,7 @@ struct DisasterVehicle : public Vehicle 
 
	const char *GetTypeString() const { return "disaster vehicle"; }
 
	void UpdateDeltaXY(Direction direction);
 
	bool Tick();
 
	DisasterVehicle *Next() { return (DisasterVehicle*)this->Vehicle::Next(); }
 
};
 

	
 
#define FOR_ALL_VEHICLES_FROM(var, start) FOR_ALL_ITEMS_FROM(Vehicle, vehicle_index, var, start)
0 comments (0 inline, 0 general)