Fix (ish) alloy behaviour

As far as I can tell, most alloys were being spawned from the wreckage
objects, not the ships themselves, and at some point in 1.77-1.80 ended
up properly inheriting their superheated temperature and exploding
instantly.

I've changed this around to give what seems to be roughly similar
behaviour to before - maybe 1 piece sometimes from light fighters,
probably 1, occasionally 2 from bigger ships. Wreckage now has its
fragment_chance set to 0, and a bug related to that setting is also
fixed.

Also increased the potential wreckage count from really big explosions,
if the graphics settings are high enough.
This commit is contained in:
cim 2014-07-23 23:01:42 +01:00
parent 182c5c1e23
commit 03bb19a730
2 changed files with 35 additions and 14 deletions

View File

@ -3773,7 +3773,7 @@
cargo_type = "CARGO_NOT_CARGO"; cargo_type = "CARGO_NOT_CARGO";
energy_recharge_rate = 0; energy_recharge_rate = 0;
forward_weapon_type = "WEAPON_NONE"; forward_weapon_type = "WEAPON_NONE";
fragment_chance = 0.2; fragment_chance = 0.0;
is_template = 1; is_template = 1;
max_energy = 2000; max_energy = 2000;
max_flight_pitch = 2; max_flight_pitch = 2;

View File

@ -216,7 +216,7 @@ static ShipEntity *doOctreesCollide(ShipEntity *prime, ShipEntity *other);
_nextAegisCheck = -0.1f; _nextAegisCheck = -0.1f;
aiScriptWakeTime = 0; aiScriptWakeTime = 0;
if (![self setUpShipFromDictionary:dict]) if (![self setUpShipFromDictionary:dict])
{ {
[self release]; [self release];
@ -853,7 +853,9 @@ static ShipEntity *doOctreesCollide(ShipEntity *prime, ShipEntity *other);
[subentity setPosition:subPosition]; [subentity setPosition:subPosition];
[subentity setOrientation:subOrientation]; [subentity setOrientation:subOrientation];
[subentity setReference:vector_forward_from_quaternion(subOrientation)]; [subentity setReference:vector_forward_from_quaternion(subOrientation)];
// subentities inherit parent personality
[subentity setEntityPersonalityInt:[self entityPersonalityInt]];
if (asTurret) if (asTurret)
{ {
[subentity setBehaviour:BEHAVIOUR_TRACK_AS_TURRET]; [subentity setBehaviour:BEHAVIOUR_TRACK_AS_TURRET];
@ -8060,6 +8062,10 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context)
float parentTemp = [self temperature]; float parentTemp = [self temperature];
float adjusted = parentTemp * (bellf(5) * (kRange * 2.0f) - kRange + factor); float adjusted = parentTemp * (bellf(5) * (kRange * 2.0f) - kRange + factor);
if (adjusted > SHIP_MAX_CABIN_TEMP)
{
adjusted = SHIP_MAX_CABIN_TEMP;
}
// Interpolate so that result == parentTemp when parentTemp is SHIP_MIN_CABIN_TEMP // Interpolate so that result == parentTemp when parentTemp is SHIP_MIN_CABIN_TEMP
float interp = OOClamp_0_1_f((parentTemp - SHIP_MIN_CABIN_TEMP) / (SHIP_MAX_CABIN_TEMP - SHIP_MIN_CABIN_TEMP)); float interp = OOClamp_0_1_f((parentTemp - SHIP_MIN_CABIN_TEMP) / (SHIP_MAX_CABIN_TEMP - SHIP_MIN_CABIN_TEMP));
@ -8405,8 +8411,9 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context)
Vector v; Vector v;
Quaternion q; Quaternion q;
int speed_low = 200; int speed_low = 200;
NSUInteger n_alloys = floorf(sqrtf(sqrtf(mass / 25000.0f))); GLfloat n_alloys = sqrtf(sqrtf(mass / 6000.0f));
NSUInteger numAlloys = 0;
if ([self status] == STATUS_DEAD) if ([self status] == STATUS_DEAD)
{ {
[UNIVERSE removeEntity:self]; [UNIVERSE removeEntity:self];
@ -8531,7 +8538,13 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context)
{ {
// Create wreckage only when UNIVERSE is less than half full. // Create wreckage only when UNIVERSE is less than half full.
// (condition set in r906 - was < 0.75 before) --Kaks 2011.10.17 // (condition set in r906 - was < 0.75 before) --Kaks 2011.10.17
n_wreckage = (n_alloys < 3)? n_alloys : 3; NSUInteger maxWrecks = 3;
// if it can cope with extra detail, allow more wreckage
if ([UNIVERSE detailLevel] >= DETAIL_LEVEL_EXTRAS)
{
maxWrecks = 8;
}
n_wreckage = (n_alloys < maxWrecks)? floorf(n_alloys) : maxWrecks;
} }
for (i = 0; i < n_wreckage; i++) for (i = 0; i < n_wreckage; i++)
@ -8563,19 +8576,26 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context)
[wreck release]; [wreck release];
} }
} }
n_alloys = ranrot_rand() % n_alloys; n_alloys = randf() * n_alloys;
} }
} }
// If UNIVERSE is almost full, don't create more than 1 piece of scrap metal. if (!canFragment)
if (!add_debris)
{ {
n_alloys = (n_alloys > 1) ? 1 : 0; n_alloys = 0.0;
} }
// If UNIVERSE is almost full, don't create more than 1 piece of scrap metal.
else if (!add_debris)
{
n_alloys = (n_alloys > 1.0) ? 1.0 : 0.0;
}
// now convert to uint
numAlloys = floorf(n_alloys);
// Throw out scrap metal // Throw out scrap metal
// //
for (i = 0; i < n_alloys; i++) for (i = 0; i < numAlloys; i++)
{ {
ShipEntity* plate = [UNIVERSE newShipWithRole:@"alloy"]; // retain count = 1 ShipEntity* plate = [UNIVERSE newShipWithRole:@"alloy"]; // retain count = 1
if (plate) if (plate)
@ -8598,6 +8618,7 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context)
[plate setScanClass: CLASS_CARGO]; [plate setScanClass: CLASS_CARGO];
[plate setCommodity:[UNIVERSE commodityForName:@"Alloys"] andAmount:1]; [plate setCommodity:[UNIVERSE commodityForName:@"Alloys"] andAmount:1];
[UNIVERSE addEntity:plate]; // STATUS_IN_FLIGHT, AI state GLOBAL [UNIVERSE addEntity:plate]; // STATUS_IN_FLIGHT, AI state GLOBAL
[plate release]; [plate release];
} }
} }