diff --git a/src/Core/Entities/DockEntity.m b/src/Core/Entities/DockEntity.m index c5dc1a7b..78c507c1 100644 --- a/src/Core/Entities/DockEntity.m +++ b/src/Core/Entities/DockEntity.m @@ -1276,13 +1276,13 @@ MA 02110-1301, USA. } -- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other +- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier { if (virtual_dock) // can't be damaged { return; } - [super takeEnergyDamage:amount from:ent becauseOf:other]; + [super takeEnergyDamage:amount from:ent becauseOf:other weaponIdentifier:weaponIdentifier]; } diff --git a/src/Core/Entities/Entity.h b/src/Core/Entities/Entity.h index 863f48ae..86a4b403 100644 --- a/src/Core/Entities/Entity.h +++ b/src/Core/Entities/Entity.h @@ -270,7 +270,7 @@ enum OOScanClass - (void) applyVelocity:(OOTimeDelta)delta_t; - (BOOL) checkCloseCollisionWith:(Entity *)other; -- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other; +- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier; - (void) dumpState; // General "describe situtation verbosely in log" command. - (void) dumpSelfState; // Subclasses should override this, not -dumpState, and call throught to super first. diff --git a/src/Core/Entities/Entity.m b/src/Core/Entities/Entity.m index a0d2ca82..fc298151 100644 --- a/src/Core/Entities/Entity.m +++ b/src/Core/Entities/Entity.m @@ -987,7 +987,7 @@ static NSString * const kOOLogEntityVerificationError = @"entity.linkedList.ver } -- (void) takeEnergyDamage:(double) amount from:(Entity *) ent becauseOf:(Entity *) other +- (void) takeEnergyDamage:(double) amount from:(Entity *) ent becauseOf:(Entity *) other weaponIdentifier:(NSString *)weaponIdentifier { } diff --git a/src/Core/Entities/OOPlasmaShotEntity.m b/src/Core/Entities/OOPlasmaShotEntity.m index 8699c5c1..b194fed3 100644 --- a/src/Core/Entities/OOPlasmaShotEntity.m +++ b/src/Core/Entities/OOPlasmaShotEntity.m @@ -96,9 +96,12 @@ MA 02110-1301, USA. Entity *e = (Entity *)[collidingEntities objectAtIndex:i]; if ([e rootShipEntity] != [self owner]) { + // we're going to force the weapon id to be a phantom equipment key so there is something for + // the PlayerEntitySound to reference. it allow allows for the sound effects to be overridden by OXP. [e takeEnergyDamage:[self energy] * attenuation from:self - becauseOf:[self owner]]; + becauseOf:[self owner] + weaponIdentifier:@"EQ_WEAPON_PLASMA_SHOT"]; [UNIVERSE removeEntity:self]; // Spawn a plasma burst. diff --git a/src/Core/Entities/OOQuiriumCascadeEntity.m b/src/Core/Entities/OOQuiriumCascadeEntity.m index d4fb95d7..b620a9b4 100644 --- a/src/Core/Entities/OOQuiriumCascadeEntity.m +++ b/src/Core/Entities/OOQuiriumCascadeEntity.m @@ -99,13 +99,15 @@ MA 02110-1301, USA. _color[0] = 0.25f * tf * randf(); _color[1] = 0.0f; } - + // manage collisions Entity *owner = [self owner]; Entity *e = nil; foreach (e, collidingEntities) { - [e takeEnergyDamage:energy from:self becauseOf:owner]; + // we're going to force the weapon id to be the qbomb key here, because at this point the cascade entity isn't a ship any more + // and there's no link back to the original. + [e takeEnergyDamage:energy from:self becauseOf:owner weaponIdentifier:@"EQ_QC_MINE"]; } // expire after ttl diff --git a/src/Core/Entities/PlayerEntity.m b/src/Core/Entities/PlayerEntity.m index 4f9343e7..84ebfe0f 100644 --- a/src/Core/Entities/PlayerEntity.m +++ b/src/Core/Entities/PlayerEntity.m @@ -2211,6 +2211,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); [UNIVERSE setGalaxyTo:galaxy_number]; [UNIVERSE setSystemTo:system_id]; + [self setUpWeaponSounds]; [self setGalacticHyperspaceBehaviourTo:[[UNIVERSE globalSettings] oo_stringForKey:@"galactic_hyperspace_behaviour" defaultValue:@"BEHAVIOUR_STANDARD"]]; [self setGalacticHyperspaceFixedCoordsTo:[[UNIVERSE globalSettings] oo_stringForKey:@"galactic_hyperspace_fixed_coords" defaultValue:@"96 96"]]; @@ -5858,7 +5859,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); { firedMissile = [self launchMine:missile]; if (!replacingMissile) [self removeFromPylon:activeMissile]; - if (firedMissile != nil) [self playMineLaunched:[self missileLaunchPosition]]; + if (firedMissile != nil) [self playMineLaunched:[self missileLaunchPosition] weaponIdentifier:identifier]; } else { @@ -5869,7 +5870,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); if (firedMissile != nil) { if (!replacingMissile) [self removeFromPylon:activeMissile]; - [self playMissileLaunched:[self missileLaunchPosition]]; + [self playMissileLaunched:[self missileLaunchPosition] weaponIdentifier:identifier]; } } @@ -6135,7 +6136,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); { if (![weapon_to_be_fired isTurretLaser]) { - [self fireLaserShotInDirection:currentWeaponFacing]; + [self fireLaserShotInDirection:currentWeaponFacing weaponIdentifier:[[self currentWeapon] identifier]]; weaponFired = YES; } else @@ -6233,7 +6234,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); -- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other +- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier { HPVector rel_pos; OOScalar d_forward, d_right, d_up; @@ -6269,7 +6270,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); d_up = dot_product(HPVectorToVector(rel_pos), v_up); Vector relative = make_vector(d_right,d_up,d_forward); - [self playShieldHit:relative]; + [self playShieldHit:relative weaponIdentifier:weaponIdentifier]; // firing on an innocent ship is an offence if ([other isShip]) @@ -6309,7 +6310,7 @@ NSComparisonResult marketSorterByMassUnit(id a, id b, void *market); if (amount > 0.0) { energy -= amount; - [self playDirectHit:relative]; + [self playDirectHit:relative weaponIdentifier:weaponIdentifier]; if (ship_temperature < SHIP_MAX_CABIN_TEMP) { /* Heat increase from energy impacts will never directly cause diff --git a/src/Core/Entities/PlayerEntityControls.m b/src/Core/Entities/PlayerEntityControls.m index 2bb82202..cd438502 100644 --- a/src/Core/Entities/PlayerEntityControls.m +++ b/src/Core/Entities/PlayerEntityControls.m @@ -992,7 +992,7 @@ static NSTimeInterval time_last_frame; { if ([self fireMainWeapon]) { - [self playLaserHit:([self shipHitByLaser] != nil) offset:[[self currentLaserOffset] oo_vectorAtIndex:0]]; + [self playLaserHit:([self shipHitByLaser] != nil) offset:[[self currentLaserOffset] oo_vectorAtIndex:0] weaponIdentifier:[[self currentWeapon] identifier]]; } } diff --git a/src/Core/Entities/PlayerEntityLegacyScriptEngine.m b/src/Core/Entities/PlayerEntityLegacyScriptEngine.m index 45a49b73..8e8839df 100644 --- a/src/Core/Entities/PlayerEntityLegacyScriptEngine.m +++ b/src/Core/Entities/PlayerEntityLegacyScriptEngine.m @@ -2248,7 +2248,7 @@ static int shipsFound; if (mainStation != nil) { [UNIVERSE unMagicMainStation]; - [mainStation takeEnergyDamage:500000000.0 from:nil becauseOf:nil]; // 500 million should do it! + [mainStation takeEnergyDamage:500000000.0 from:nil becauseOf:nil weaponIdentifier:@""]; // 500 million should do it! } } diff --git a/src/Core/Entities/PlayerEntitySound.h b/src/Core/Entities/PlayerEntitySound.h index 4411525d..f0ef99fe 100644 --- a/src/Core/Entities/PlayerEntitySound.h +++ b/src/Core/Entities/PlayerEntitySound.h @@ -27,6 +27,7 @@ MA 02110-1301, USA. @interface PlayerEntity (Sound) - (void) setUpSound; +- (void) setUpWeaponSounds; - (void) destroySound; // Interface sounds; only one at a time @@ -117,15 +118,15 @@ MA 02110-1301, USA. - (void) playFuelLeak; // Damage sounds -- (void) playShieldHit:(Vector)attackVector; -- (void) playDirectHit:(Vector)attackVector; +- (void) playShieldHit:(Vector)attackVector weaponIdentifier:(NSString *)weaponIdentifier; +- (void) playDirectHit:(Vector)attackVector weaponIdentifier:(NSString *)weaponIdentifier; - (void) playScrapeDamage:(Vector)attackVector; // Weapon sounds -- (void) playLaserHit:(BOOL)hit offset:(Vector)weaponOffset; +- (void) playLaserHit:(BOOL)hit offset:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier; - (void) playWeaponOverheated:(Vector)weaponOffset; -- (void) playMissileLaunched:(Vector)weaponOffset; -- (void) playMineLaunched:(Vector)weaponOffset; +- (void) playMissileLaunched:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier; +- (void) playMineLaunched:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier; // Miscellaneous sounds - (void) playEscapePodScooped; diff --git a/src/Core/Entities/PlayerEntitySound.m b/src/Core/Entities/PlayerEntitySound.m index baa33462..d65f912c 100644 --- a/src/Core/Entities/PlayerEntitySound.m +++ b/src/Core/Entities/PlayerEntitySound.m @@ -28,6 +28,7 @@ MA 02110-1301, USA. #import "Universe.h" #import "OOSoundSourcePool.h" #import "OOMaths.h" +#import "OOEquipmentType.h" // Sizes of sound source pools @@ -52,6 +53,12 @@ static OOSoundSource *sBreakPatternSource; static OOSoundSourcePool *sBuySellSourcePool; static OOSoundSource *sAfterburnerSources[2]; +static NSDictionary *weaponShotMiss; +static NSDictionary *weaponShotHit; +static NSDictionary *weaponShieldHit; +static NSDictionary *weaponUnshieldedHit; +static NSDictionary *weaponLaunched; + static const Vector kInterfaceBeepPosition = { 0.0f, -0.2f, 0.5f }; static const Vector kInterfaceWarningPosition = { 0.0f, -0.2f, 0.4f }; static const Vector kBreakPatternPosition = { 0.0f, 0.0f, 1.0f }; @@ -94,6 +101,54 @@ static const Vector kAfterburner2Position = { 0.1f, 0.0f, -1.0f }; } +// sets up the sound key dictionaries for all the available weapons/missiles/mines defined. +- (void) setUpWeaponSounds +{ + NSArray *eqTypes = [OOEquipmentType allEquipmentTypes]; + NSMutableDictionary *shotMissSounds = [NSMutableDictionary dictionary]; + NSMutableDictionary *shotHitSounds = [NSMutableDictionary dictionary]; + NSMutableDictionary *shieldHitSounds = [NSMutableDictionary dictionary]; + NSMutableDictionary *unshieldedHitSounds = [NSMutableDictionary dictionary]; + NSMutableDictionary *weaponLaunchedSounds = [NSMutableDictionary dictionary]; + NSEnumerator *eqTypeEnum = nil; + OOEquipmentType *eqType = nil; + + // special case: turrets aren't defined with a "EQ_WEAPON" prefix, and plasma shots don't have a matching equipment item, + // so add a unique entry here. this could be overridden if an OXP creates an equipment item with this key. + // plasma shots don't make a sound when fired, so we only need to provide for the hit player sound keys. + [shieldHitSounds setObject:@"[player-hit-by-weapon]" forKey:@"EQ_WEAPON_PLASMA_SHOT"]; + [unshieldedHitSounds setObject:@"[player-direct-hit]" forKey:@"EQ_WEAPON_PLASMA_SHOT"]; + // grab a local copy of the sound identifiers for weapons to make the process of looking up a sound ref as fast as possible + for (eqTypeEnum = [eqTypes objectEnumerator]; (eqType = [eqTypeEnum nextObject]); ) + { + if ([[eqType identifier] hasPrefix:@"EQ_WEAPON"]) + { + [shotMissSounds setObject:[eqType fxShotMissName] forKey:[eqType identifier]]; + [shotHitSounds setObject:[eqType fxShotHitName] forKey:[eqType identifier]]; + [shieldHitSounds setObject:[eqType fxShieldHitName] forKey:[eqType identifier]]; + [unshieldedHitSounds setObject:[eqType fxUnshieldedHitName] forKey:[eqType identifier]]; + } + if ([eqType isMissileOrMine]) + { + [weaponLaunchedSounds setObject:[eqType fxWeaponLaunchedName] forKey:[eqType identifier]]; + [shieldHitSounds setObject:[eqType fxShieldHitName] forKey:[eqType identifier]]; + [unshieldedHitSounds setObject:[eqType fxUnshieldedHitName] forKey:[eqType identifier]]; + } + } + + DESTROY(weaponShotMiss); + DESTROY(weaponShotHit); + DESTROY(weaponShieldHit); + DESTROY(weaponUnshieldedHit); + DESTROY(weaponLaunched); + + weaponShotMiss = [[NSDictionary alloc] initWithDictionary:shotMissSounds]; + weaponShotHit = [[NSDictionary alloc] initWithDictionary:shotHitSounds]; + weaponShieldHit = [[NSDictionary alloc] initWithDictionary:shieldHitSounds]; + weaponUnshieldedHit = [[NSDictionary alloc] initWithDictionary:unshieldedHitSounds]; + weaponLaunched = [[NSDictionary alloc] initWithDictionary:weaponLaunchedSounds]; +} + - (void) destroySound { DESTROY(sInterfaceBeepSource); @@ -109,6 +164,12 @@ static const Vector kAfterburner2Position = { 0.1f, 0.0f, -1.0f }; DESTROY(sWeaponSoundPool); DESTROY(sDamageSoundPool); DESTROY(sMiscSoundPool); + + DESTROY(weaponShotMiss); + DESTROY(weaponShotHit); + DESTROY(weaponShieldHit); + DESTROY(weaponUnshieldedHit); + DESTROY(weaponLaunched); } @@ -575,15 +636,15 @@ static const Vector kAfterburner2Position = { 0.1f, 0.0f, -1.0f }; } -- (void) playShieldHit:(Vector)attackVector +- (void) playShieldHit:(Vector)attackVector weaponIdentifier:(NSString *)weaponIdentifier { - [sDamageSoundPool playSoundWithKey:@"[player-hit-by-weapon]" position:attackVector]; + [sDamageSoundPool playSoundWithKey:[weaponShieldHit objectForKey:weaponIdentifier] position:attackVector]; } -- (void) playDirectHit:(Vector)attackVector +- (void) playDirectHit:(Vector)attackVector weaponIdentifier:(NSString *) weaponIdentifier { - [sDamageSoundPool playSoundWithKey:@"[player-direct-hit]" position:attackVector]; + [sDamageSoundPool playSoundWithKey:[weaponUnshieldedHit objectForKey:weaponIdentifier] position:attackVector]; } @@ -593,15 +654,16 @@ static const Vector kAfterburner2Position = { 0.1f, 0.0f, -1.0f }; } -- (void) playLaserHit:(BOOL)hit offset:(Vector)weaponOffset +- (void) playLaserHit:(BOOL)hit offset:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier { if (hit) { - [sWeaponSoundPool playSoundWithKey:@"[player-laser-hit]" priority:1.0 expiryTime:0.05 overlap:YES position:weaponOffset]; + [sWeaponSoundPool playSoundWithKey:[weaponShotHit objectForKey:weaponIdentifier] priority:1.0 expiryTime:0.05 overlap:YES position:weaponOffset]; } else { - [sWeaponSoundPool playSoundWithKey:@"[player-laser-miss]" priority:1.0 expiryTime:0.05 overlap:YES position:weaponOffset]; + [sWeaponSoundPool playSoundWithKey:[weaponShotMiss objectForKey:weaponIdentifier] priority:1.0 expiryTime:0.05 overlap:YES position:weaponOffset]; + } } @@ -612,15 +674,15 @@ static const Vector kAfterburner2Position = { 0.1f, 0.0f, -1.0f }; } -- (void) playMissileLaunched:(Vector)weaponOffset +- (void) playMissileLaunched:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier { - [sWeaponSoundPool playSoundWithKey:@"[missile-launched]" position:weaponOffset]; + [sWeaponSoundPool playSoundWithKey:[weaponLaunched objectForKey:weaponIdentifier] position:weaponOffset]; } -- (void) playMineLaunched:(Vector)weaponOffset +- (void) playMineLaunched:(Vector)weaponOffset weaponIdentifier:(NSString *)weaponIdentifier { - [sWeaponSoundPool playSoundWithKey:@"[mine-launched]" position:weaponOffset]; + [sWeaponSoundPool playSoundWithKey:[weaponLaunched objectForKey:weaponIdentifier] position:weaponOffset]; } diff --git a/src/Core/Entities/ShipEntity.h b/src/Core/Entities/ShipEntity.h index 25c88c6e..e8c76f86 100644 --- a/src/Core/Entities/ShipEntity.h +++ b/src/Core/Entities/ShipEntity.h @@ -1115,7 +1115,7 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q - (BOOL) fireDirectLaserDefensiveShot; - (BOOL) fireDirectLaserShotAt:(Entity *)my_target; - (NSArray *) laserPortOffset:(OOWeaponFacing)direction; -- (BOOL) fireLaserShotInDirection:(OOWeaponFacing)direction; +- (BOOL) fireLaserShotInDirection:(OOWeaponFacing)direction weaponIdentifier:(NSString *)weaponIdentifier; - (void) adjustMissedShots:(int)delta; - (int) missedShots; - (void) considerFiringMissile:(double)delta_t; diff --git a/src/Core/Entities/ShipEntity.m b/src/Core/Entities/ShipEntity.m index 10db01e2..2ade638f 100644 --- a/src/Core/Entities/ShipEntity.m +++ b/src/Core/Entities/ShipEntity.m @@ -845,7 +845,7 @@ static ShipEntity *doOctreesCollide(ShipEntity *prime, ShipEntity *other); { [se setSuppressExplosion:NO]; [se setEnergy:1]; - [se takeEnergyDamage:500000000.0 from:nil becauseOf:nil]; + [se takeEnergyDamage:500000000.0 from:nil becauseOf:nil weaponIdentifier:@""]; } } } @@ -8881,11 +8881,11 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context) { if ([self owner]) { - [e2 takeEnergyDamage:damage from:self becauseOf:[self owner]]; + [e2 takeEnergyDamage:damage from:self becauseOf:[self owner] weaponIdentifier:[self primaryRole]]; } else { - [e2 takeEnergyDamage:damage from:self becauseOf:self]; + [e2 takeEnergyDamage:damage from:self becauseOf:self weaponIdentifier:[self primaryRole]]; } } } @@ -8923,7 +8923,7 @@ NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void* context) double ecr = [e2 collisionRadius]; double d = (magnitude(p2) - ecr) * 2.6; // 2.6 is a correction constant to stay in limits of the old code. double damage = (d > 0) ? weapon_damage * desired_range / (d * d) : weapon_damage; - [e2 takeEnergyDamage:damage from:self becauseOf:[self owner]]; + [e2 takeEnergyDamage:damage from:self becauseOf:[self owner] weaponIdentifier:[self primaryRole]]; } } } @@ -11496,7 +11496,7 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q } else { - [self fireLaserShotInDirection:direction]; + [self fireLaserShotInDirection:direction weaponIdentifier:[weapon_type identifier]]; fired = YES; } } @@ -11764,13 +11764,13 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q if (subent != nil && [victim isFrangible]) { // do 1% bleed-through damage... - [victim takeEnergyDamage:0.01 * weapon_damage from:self becauseOf:parent]; + [victim takeEnergyDamage:0.01 * weapon_damage from:self becauseOf:parent weaponIdentifier:[[self weaponTypeForFacing:WEAPON_FACING_FORWARD strict:YES] identifier]]; victim = subent; } if (hitAtRange < weaponRange) { - [victim takeEnergyDamage:weapon_damage from:self becauseOf:parent]; // a very palpable hit + [victim takeEnergyDamage:weapon_damage from:self becauseOf:parent weaponIdentifier:[[self weaponTypeForFacing:WEAPON_FACING_FORWARD strict:YES] identifier]]; // a very palpable hit [shot setRange:hitAtRange]; Vector vd = vector_forward_from_quaternion([shot orientation]); @@ -11889,13 +11889,13 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q if (subent != nil && [victim isFrangible]) { // do 1% bleed-through damage... - [victim takeEnergyDamage: 0.01 * weapon_damage from:self becauseOf:self]; + [victim takeEnergyDamage: 0.01 * weapon_damage from:self becauseOf:self weaponIdentifier:[[self weaponTypeForFacing:WEAPON_FACING_FORWARD strict:YES] identifier]]; victim = subent; } if (hit_at_range * hit_at_range < range_limit2) { - [victim takeEnergyDamage:weapon_damage from:self becauseOf:self]; // a very palpable hit + [victim takeEnergyDamage:weapon_damage from:self becauseOf:self weaponIdentifier:[[self weaponTypeForFacing:WEAPON_FACING_FORWARD strict:YES] identifier]]; // a very palpable hit [shot setRange:hit_at_range]; Vector vd = vector_forward_from_quaternion([shot orientation]); @@ -11938,7 +11938,7 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q } -- (BOOL) fireLaserShotInDirection:(OOWeaponFacing)direction +- (BOOL) fireLaserShotInDirection:(OOWeaponFacing)direction weaponIdentifier:(NSString *)weaponIdentifier { double range_limit2 = weaponRange * weaponRange; GLfloat hit_at_range; @@ -11997,13 +11997,13 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q if (subent != nil && [victim isFrangible]) { // do 1% bleed-through damage... - [victim takeEnergyDamage: 0.01 * effective_damage from:self becauseOf:self]; + [victim takeEnergyDamage: 0.01 * effective_damage from:self becauseOf:self weaponIdentifier:weaponIdentifier]; victim = subent; } if (hit_at_range * hit_at_range < range_limit2) { - [victim takeEnergyDamage:effective_damage from:self becauseOf:self]; // a very palpable hit + [victim takeEnergyDamage:effective_damage from:self becauseOf:self weaponIdentifier:weaponIdentifier]; // a very palpable hit [shot setRange:hit_at_range]; Vector vd = vector_forward_from_quaternion([shot orientation]); @@ -13120,7 +13120,7 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q } -- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other +- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier { if ([self status] == STATUS_DEAD) return; if (amount <= 0.0) return; diff --git a/src/Core/Entities/StationEntity.m b/src/Core/Entities/StationEntity.m index c51efe8b..201ca976 100644 --- a/src/Core/Entities/StationEntity.m +++ b/src/Core/Entities/StationEntity.m @@ -1296,7 +1296,7 @@ NSDictionary *OOMakeDockingInstructions(StationEntity *station, HPVector coords, return [super hasHostileTarget] || ([self primaryTarget] != nil && ((alertLevel == STATION_ALERT_LEVEL_YELLOW) || (alertLevel == STATION_ALERT_LEVEL_RED))); } -- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other +- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier { // stations must ignore friendly fire, otherwise the defenders' AI gets stuck. BOOL isFriend = NO; @@ -1339,7 +1339,7 @@ NSDictionary *OOMakeDockingInstructions(StationEntity *station, HPVector coords, if (!isFriend && (self != [UNIVERSE station] || amount < energy) ) { // Handle damage like a ship. - [super takeEnergyDamage:amount from:ent becauseOf:other]; + [super takeEnergyDamage:amount from:ent becauseOf:other weaponIdentifier:weaponIdentifier]; } } diff --git a/src/Core/OOEquipmentType.h b/src/Core/OOEquipmentType.h index e586b3ea..1a1a67fd 100644 --- a/src/Core/OOEquipmentType.h +++ b/src/Core/OOEquipmentType.h @@ -149,6 +149,11 @@ SOFTWARE. - (GLfloat) weaponShotTemperature; - (GLfloat) weaponThreatAssessment; - (OOColor *) weaponColor; +- (NSString *) fxShotMissName; +- (NSString *) fxShotHitName; +- (NSString *) fxShieldHitName; +- (NSString *) fxUnshieldedHitName; +- (NSString *) fxWeaponLaunchedName; @end diff --git a/src/Core/OOEquipmentType.m b/src/Core/OOEquipmentType.m index e3f613cf..87e94c6b 100644 --- a/src/Core/OOEquipmentType.m +++ b/src/Core/OOEquipmentType.m @@ -617,7 +617,6 @@ static NSDictionary *sMissilesRegistry = nil; } - // weapon properties follow - (BOOL) isTurretLaser { @@ -673,6 +672,36 @@ static NSDictionary *sMissilesRegistry = nil; } +- (NSString *) fxShotMissName +{ + return [_weaponInfo oo_stringForKey:@"fx_shot_miss_name" defaultValue:@"[player-laser-miss]"]; +} + + +- (NSString *) fxShotHitName +{ + return [_weaponInfo oo_stringForKey:@"fx_shot_hit_name" defaultValue:@"[player-laser-hit]"]; +} + + +- (NSString *) fxShieldHitName +{ + return [_weaponInfo oo_stringForKey:@"fx_hitplayer_shielded_name" defaultValue:@"[player-hit-by-weapon]"]; +} + + +- (NSString *) fxUnshieldedHitName +{ + return [_weaponInfo oo_stringForKey:@"fx_hitplayer_unshielded_name" defaultValue:@"[player-direct-hit]"]; +} + + +- (NSString *) fxWeaponLaunchedName +{ + return [_weaponInfo oo_stringForKey:@"fx_weapon_launch_name" defaultValue:([[self identifier] hasSuffix:@"_MINE"] ? @"[mine-launched]" : @"[missile-launched]")]; +} + + /* This method exists purely to suppress Clang static analyzer warnings that this ivar is unused (but may be used by categories, which it is). FIXME: there must be a feature macro we can use to avoid actually building diff --git a/src/Core/Scripting/OOJSShip.m b/src/Core/Scripting/OOJSShip.m index eb97d402..cd87c43a 100644 --- a/src/Core/Scripting/OOJSShip.m +++ b/src/Core/Scripting/OOJSShip.m @@ -3370,7 +3370,7 @@ static BOOL RemoveOrExplodeShip(JSContext *context, uintN argc, jsval *vp, BOOL { [thisEnt setSuppressExplosion:!explode]; [thisEnt setEnergy:1]; - [thisEnt takeEnergyDamage:500000000.0 from:nil becauseOf:nil]; + [thisEnt takeEnergyDamage:500000000.0 from:nil becauseOf:nil weaponIdentifier:@""]; } OOJS_RETURN_VOID;