48#import "MyOpenGLView.h"
104#if MASS_DEPENDENT_FUEL_PRICES
105static GLfloat calcFuelChargeRate (GLfloat myMass)
107#define kMassCharge 0.65
108#define kBaseCharge (1.0 - kMassCharge)
110 GLfloat baseMass = [PLAYER baseMass];
112 if (myMass <= 0.0 || baseMass <=0.0)
return 1.0;
114 GLfloat result = (kMassCharge * myMass / baseMass) + kBaseCharge;
117 result = roundf(result * 100.0f) / 100.0f;
120 if (result > 3.0f) result = 3.0f;
121 else if (result < 0.33f) result = 0.33f;
131@interface ShipEntity (Private)
140- (void) rescaleBy:(GLfloat)factor;
141- (void) rescaleBy:(GLfloat)factor writeToCache:(BOOL)writeToCache;
143- (BOOL) setUpOneSubentity:(NSDictionary *) subentDict;
144- (BOOL) setUpOneFlasher:(NSDictionary *) subentDict;
148- (void) addSubEntity:(
Entity<OOSubEntity> *) subent;
151- (HPVector) coordinatesForEscortPosition:(
unsigned)idx;
153- (void) setUpOneEscort:(
ShipEntity *)escorter inGroup:(
OOShipGroup *)escortGroup withRole:(NSString *)escortRole atPosition:(HPVector)ex_pos andCount:(uint8_t)currentEscortCount;
155- (void) addSubentityToCollisionRadius:(
Entity<OOSubEntity> *) subent;
156- (
ShipEntity *) launchPodWithCrew:(NSArray *)podCrew;
159- (
OOEquipmentType *) generateMissileEquipmentTypeFrom:(NSString *)role;
163- (void) noteFrustration:(NSString *)context;
193- (id)initWithKey:(NSString *)key definition:(NSDictionary *)dict
197 NSParameterAssert(dict !=
nil);
200 if (
self ==
nil)
return nil;
222 if (![
self setUpShipFromDictionary:dict])
231 OOLog(
@"ship.sanityCheck.failed",
@"Ship %@ %@ infinite top speed, clamped to 300.",
self,
@"generated with");
193- (id)initWithKey:(NSString *)key definition:(NSDictionary *)dict {
…}
240- (BOOL) setUpFromDictionary:(NSDictionary *) shipDict
266 _scaleFactor = [
shipDict oo_floatForKey:@"model_scale_factor" defaultValue:1.0f];
269 float defaultSpeed = isStation ? 0.0f : 160.0f;
270 maxFlightSpeed = [
shipDict oo_floatForKey:@"max_flight_speed" defaultValue:defaultSpeed];
271 max_flight_roll = [
shipDict oo_floatForKey:@"max_flight_roll" defaultValue:2.0f];
272 max_flight_pitch = [
shipDict oo_floatForKey:@"max_flight_pitch" defaultValue:1.0f];
273 max_flight_yaw = [
shipDict oo_floatForKey:@"max_flight_yaw" defaultValue:max_flight_pitch];
274 cruiseSpeed = maxFlightSpeed*0.8f;
276 max_thrust = [
shipDict oo_floatForKey:@"thrust" defaultValue:15.0f];
279 afterburner_rate = [
shipDict oo_floatForKey:@"injector_burn_rate" defaultValue:AFTERBURNER_BURNRATE];
280 afterburner_speed_factor = [
shipDict oo_floatForKey:@"injector_speed_factor" defaultValue:7.0f];
281 if (afterburner_speed_factor < 1.0)
283 OOLog(
@"ship.setup.injectorSpeed",
@"injector_speed_factor cannot be lower than 1.0 for %@",
self);
284 afterburner_speed_factor = 1.0;
286#if OO_VARIABLE_TORUS_SPEED
289 OOLog(
@"ship.setup.injectorSpeed",
@"injector_speed_factor cannot be higher than minimum torus speed factor (%f) for %@.",
MIN_HYPERSPEED_FACTOR,
self);
295 OOLog(
@"ship.setup.injectorSpeed",
@"injector_speed_factor cannot be higher than torus speed factor (%f) for %@.",
HYPERSPEED_FACTOR,
self);
300 maxEnergy = [shipDict oo_floatForKey:@"max_energy" defaultValue:200.0f];
301 energy_recharge_rate = [shipDict oo_floatForKey:@"energy_recharge_rate" defaultValue:1.0f];
303 _showDamage = [shipDict oo_boolForKey:@"show_damage" defaultValue:(energy_recharge_rate > 0)];
305 [
self setThrowSparks:[shipDict oo_boolForKey:@"throw_sparks" defaultValue:NO]];
307 weapon_facings = [shipDict oo_intForKey:@"weapon_facings" defaultValue:VALID_WEAPON_FACINGS] &
VALID_WEAPON_FACINGS;
309 forward_weapon_type =
OOWeaponTypeFromString([shipDict oo_stringForKey:
@"forward_weapon_type" defaultValue:
@"EQ_WEAPON_NONE"]);
311 aft_weapon_type =
OOWeaponTypeFromString([shipDict oo_stringForKey:
@"aft_weapon_type" defaultValue:
@"EQ_WEAPON_NONE"]);
313 port_weapon_type =
OOWeaponTypeFromString([shipDict oo_stringForKey:
@"port_weapon_type" defaultValue:
@"EQ_WEAPON_NONE"]);
315 starboard_weapon_type =
OOWeaponTypeFromString([shipDict oo_stringForKey:
@"starboard_weapon_type" defaultValue:
@"EQ_WEAPON_NONE"]);
317 cloaking_device_active = NO;
318 military_jammer_active = NO;
319 cloakPassive = [shipDict oo_boolForKey:@"cloak_passive" defaultValue:YES];
320 cloakAutomatic = [shipDict oo_boolForKey:@"cloak_automatic" defaultValue:YES];
322 missiles = [shipDict oo_intForKey:@"missiles" defaultValue:0];
332 for (i = 0; i < missiles; i++)
334 missile_list[i] =
nil;
336 max_missiles = [shipDict oo_intForKey:@"max_missiles" defaultValue:missiles];
338 if (missiles > max_missiles) missiles = max_missiles;
339 missile_load_time = fmax(0.0, [shipDict oo_doubleForKey:
@"missile_load_time" defaultValue:0.0]);
340 missile_launch_time = [UNIVERSE getTime] + missile_load_time;
343 equipment_weight = 0;
344 if ([shipDict oo_fuzzyBooleanForKey:
@"has_ecm"]) [
self addEquipmentItem:@"EQ_ECM" inContext:@"npc"];
345 if ([shipDict oo_fuzzyBooleanForKey:
@"has_scoop"]) [
self addEquipmentItem:@"EQ_FUEL_SCOOPS" inContext:@"npc"];
346 if ([shipDict oo_fuzzyBooleanForKey:
@"has_escape_pod"]) [
self addEquipmentItem:@"EQ_ESCAPE_POD" inContext:@"npc"];
347 if ([shipDict oo_fuzzyBooleanForKey:
@"has_cloaking_device"]) [
self addEquipmentItem:@"EQ_CLOAKING_DEVICE" inContext:@"npc"];
348 if ([shipDict oo_floatForKey:
@"has_energy_bomb"] > 0)
358 if ([shipDict oo_fuzzyBooleanForKey:
@"has_energy_bomb"])
364 [
self addEquipmentItem:@"EQ_QC_MINE" inContext:@"npc"];
368 if ([shipDict oo_fuzzyBooleanForKey:
@"has_fuel_injection"]) [
self addEquipmentItem:@"EQ_FUEL_INJECTION" inContext:@"npc"];
371 if ([shipDict oo_fuzzyBooleanForKey:
@"has_military_jammer"]) [
self addEquipmentItem:@"EQ_MILITARY_JAMMER" inContext:@"npc"];
372 if ([shipDict oo_fuzzyBooleanForKey:
@"has_military_scanner_filter"]) [
self addEquipmentItem:@"EQ_MILITARY_SCANNER_FILTER" inContext:@"npc"];
377 canFragment = [shipDict oo_fuzzyBooleanForKey:@"fragment_chance" defaultValue:0.9];
381 isFrangible = [shipDict oo_boolForKey:@"frangible" defaultValue:YES];
383 max_cargo = [shipDict oo_unsignedIntForKey:@"max_cargo"];
384 extra_cargo = [shipDict oo_unsignedIntForKey:@"extra_cargo" defaultValue:15];
386 hyperspaceMotorSpinTime = [shipDict oo_floatForKey:@"hyperspace_motor_spin_time" defaultValue:DEFAULT_HYPERSPACE_SPIN_TIME];
387 if(![shipDict oo_boolForKey:
@"hyperspace_motor" defaultValue:YES]) hyperspaceMotorSpinTime = -1;
390 name = [[shipDict oo_stringForKey:@"name" defaultValue:@"?"] copy];
392 [shipUniqueName autorelease];
393 shipUniqueName = [[shipDict oo_stringForKey:@"ship_name" defaultValue:@""] copy];
395 [shipClassName autorelease];
396 shipClassName = [[shipDict oo_stringForKey:@"ship_class_name" defaultValue:name] copy];
398 [displayName autorelease];
399 displayName = [[shipDict oo_stringForKey:@"display_name" defaultValue:nil] copy];
402 NSString *modelName = [shipDict oo_stringForKey:@"model"];
403 if (modelName !=
nil)
408 cacheKey:[NSString stringWithFormat:@"%@-%.3f",_shipKey,_scaleFactor]
411 smooth:[shipDict oo_boolForKey:@"smooth" defaultValue:NO]
417 if (mesh ==
nil)
return NO;
421 float density = [shipDict oo_floatForKey:@"density" defaultValue:1.0f];
422 if (octree) mass = (GLfloat)(density * 20.0f * [octree volume]);
427 if (default_laser_color ==
nil)
433 [
self setLaserColor:default_laser_color];
436 OORGBAComponents defaultExhaustEmissiveColorComponents;
437 defaultExhaustEmissiveColorComponents.
r = 0.7f;
438 defaultExhaustEmissiveColorComponents.
g = 0.9f;
439 defaultExhaustEmissiveColorComponents.
b = 1.0f;
440 defaultExhaustEmissiveColorComponents.
a = 0.9f;
443 [
self setExhaustEmissiveColor:color];
445 [
self clearSubEntities];
446 [
self setUpSubEntities];
452 BOOL hasTurrets = NO;
453 NSEnumerator *subEnum = [
self shipSubEntityEnumerator];
454 ShipEntity *se =
nil;
455 while (
isWeaponNone(weapon_type) && (se = [subEnum nextObject]))
458 if (se->
behaviour == BEHAVIOUR_TRACK_AS_TURRET)
474 [
self setWeaponDataFromType:weapon_type];
479 [
self setWeaponDataFromType:forward_weapon_type];
484 if ([shipDict objectForKey:
@"rotational_velocity"])
486 subentityRotationalVelocity = [shipDict oo_quaternionForKey:@"rotational_velocity"];
490 NSString *weaponMountMode = [shipDict oo_stringForKey:@"weapon_mount_mode" defaultValue:@"single"];
491 _multiplyWeapons = [weaponMountMode isEqualToString:@"multiply"];
492 forwardWeaponOffset = [[
self getWeaponOffsetFrom:shipDict withKey:@"weapon_position_forward" inMode:weaponMountMode] retain];
493 aftWeaponOffset = [[
self getWeaponOffsetFrom:shipDict withKey:@"weapon_position_aft" inMode:weaponMountMode] retain];
494 portWeaponOffset = [[
self getWeaponOffsetFrom:shipDict withKey:@"weapon_position_port" inMode:weaponMountMode] retain];
495 starboardWeaponOffset = [[
self getWeaponOffsetFrom:shipDict withKey:@"weapon_position_starboard" inMode:weaponMountMode] retain];
498 tractor_position = vector_multiply_scalar([shipDict oo_vectorForKey:
@"scoop_position"],_scaleFactor);
503 [
self setSunGlareFilter:[shipDict oo_floatForKey:@"sun_glare_filter" defaultValue:0.97f]];
506 scriptInfo = [[shipDict oo_dictionaryForKey:@"script_info" defaultValue:nil] retain];
508 explosionType = [[shipDict oo_arrayForKey:@"explosion_type" defaultValue:nil] retain];
519- (BOOL) setUpShipFromDictionary:(NSDictionary *) shipDict
523 if (![
self setUpFromDictionary:shipDict])
return NO;
546 [scan_description autorelease];
551 if ([shipDict oo_fuzzyBooleanForKey:
@"has_shield_booster"]) [
self addEquipmentItem:@"EQ_SHIELD_BOOSTER"
inContext:@"npc"];
552 if ([shipDict oo_fuzzyBooleanForKey:
@"has_shield_enhancer"]) [
self addEquipmentItem:@"EQ_SHIELD_ENHANCER"
inContext:@"npc"];
573 scannerRange = [
shipDict oo_floatForKey:@"scanner_range" defaultValue:(float)SCANNER_MAX_RANGE];
584 [
self setAITo:[
shipDict oo_stringForKey:@"ai_type" defaultValue:@"nullAI.plist"]];
591 NSString *cargoString = [
shipDict oo_stringForKey:@"cargo_carried"];
592 if (cargoString !=
nil)
594 if ([cargoString isEqualToString:
@"SCARCE_GOODS"])
598 else if ([cargoString isEqualToString:
@"PLENTIFUL_GOODS"])
608 NSScanner *scanner = [
NSScanner scannerWithString:cargoString];
609 if ([scanner scanInt:&c_amount])
612 c_commodity = [[
scanner string] substringFromIndex:[
scanner scanLocation]];
613 if ([[
UNIVERSE commodities] goodDefined:c_commodity])
619 c_commodity = [[UNIVERSE commodities] goodNamed:c_commodity];
620 if ([[
UNIVERSE commodities] goodDefined:c_commodity])
629 c_commodity = [
shipDict oo_stringForKey:@"cargo_carried"];
630 if ([[
UNIVERSE commodities] goodDefined:c_commodity])
636 c_commodity = [[UNIVERSE commodities] goodNamed:c_commodity];
637 if ([[
UNIVERSE commodities] goodDefined:c_commodity])
646 cargoString = [
shipDict oo_stringForKey:@"cargo_type"];
649 if (
cargo !=
nil) [cargo autorelease];
656 if (
cargo !=
nil) [cargo autorelease];
667 [primaryRole release];
684 for (i = 0, j = 0; i <
missiles; i++)
711 if (accuracy < -5.0f || accuracy > 10.0f)
759 NSDictionary *cdict = [[UNIVERSE characters] objectForKey:[
shipDict oo_stringForKey:@"pilot"]];
772 reactionTime = [
shipDict oo_floatForKey: @"reaction_time" defaultValue: COMBAT_AI_STANDARD_REACTION_TIME];
519- (BOOL) setUpShipFromDictionary:(NSDictionary *) shipDict {
…}
780- (void) setSubIdx:(NSUInteger)value
780- (void) setSubIdx:(NSUInteger)value {
…}
798- (NSString *) repeatString:(NSString *)str times:(NSUInteger)times
800 if (times == 0)
return @"";
804 for (NSUInteger i = 0; i < times; i++)
806 [
result appendString:str];
798- (NSString *) repeatString:(NSString *)str times:(NSUInteger)times {
…}
816 NSEnumerator *subEnum =
nil;
818 NSUInteger diff, i = 0;
825 [
result appendString:@"1"];
833- (void) deserializeShipSubEntitiesFrom:(NSString *)string
836 NSInteger i,idx, start = [
subEnts count] - 1;
837 NSInteger strMaxIdx = [
string length] - 1;
841 for (i = start; i >= 0; i--)
845 if (idx <= strMaxIdx && [[
string substringWithRange:NSMakeRange(idx, 1)] isEqualToString:
@"0"])
833- (void) deserializeShipSubEntitiesFrom:(NSString *)string {
…}
861 NSArray *plumes = [
shipDict oo_arrayForKey:@"exhaust"];
866 for (i = 0; i < [
plumes count]; i++)
873 NSArray *subs = [
shipDict oo_arrayForKey:@"subentities"];
877 for (i = 0; i < [
subs count]; i++)
893 NSEnumerator *exEnum =
nil;
906- (BOOL) setUpOneSubentity:(NSDictionary *) subentDict
910 NSString *type =
nil;
913 if ([type isEqualToString:
@"flasher"])
906- (BOOL) setUpOneSubentity:(NSDictionary *) subentDict {
…}
926- (BOOL) setUpOneFlasher:(NSDictionary *) subentDict
926- (BOOL) setUpOneFlasher:(NSDictionary *) subentDict {
…}
936- (BOOL) setUpOneStandardSubentity:(NSDictionary *)subentDict asTurret:(BOOL)asTurret
939 NSString *subentKey =
nil;
940 HPVector subPosition;
941 Quaternion subOrientation;
943 subentKey = [
subentDict oo_stringForKey:@"subentity_key"];
944 if (subentKey ==
nil) {
945 OOLog(
@"setup.ship.badEntry.subentities",
@"Failed to set up entity - no subentKey in %@",subentDict);
949 if (!asTurret && [
self isStation] && [subentDict oo_boolForKey:
@"is_dock"])
951 subentity = [UNIVERSE newDockWithName:subentKey andScaleFactor:_scaleFactor];
955 subentity = [UNIVERSE newSubentityWithName:subentKey andScaleFactor:_scaleFactor];
957 if (subentity ==
nil) {
958 OOLog(
@"setup.ship.badEntry.subentities",
@"Failed to set up entity %@",subentKey);
962 subPosition = HPvector_multiply_scalar([subentDict oo_hpvectorForKey:
@"position"],
_scaleFactor);
963 subOrientation = [
subentDict oo_quaternionForKey:@"orientation"];
995 if (!asTurret && [
self isStation] && [subentDict oo_boolForKey:
@"is_dock"])
997 BOOL allow_docking = [
subentDict oo_boolForKey:@"allow_docking" defaultValue:YES];
998 BOOL ddc = [
subentDict oo_boolForKey:@"disallowed_docking_collides" defaultValue:NO];
999 BOOL allow_launching = [
subentDict oo_boolForKey:@"allow_launching" defaultValue:YES];
1001 BOOL virtual_dock = [
subentDict oo_boolForKey:@"_is_virtual_dock" defaultValue:NO];
936- (BOOL) setUpOneStandardSubentity:(NSDictionary *)subentDict asTurret:(BOOL)asTurret {
…}
1019 return [[
self primaryRole] isEqualToString:@"oolite-template-cargopod"];
1023- (void) setUpCargoType:(NSString *) cargoString
1023- (void) setUpCargoType:(NSString *) cargoString {
…}
1157 [subEntities makeObjectsPerformSelector:@selector(setOwner:) withObject:nil];
1158 [subEntities release];
1164 float density = [[
self shipInfoDictionary] oo_floatForKey:@"density" defaultValue:1.0f];
1175- (void) setSubEntityRotationalVelocity:(Quaternion)rv
1175- (void) setSubEntityRotationalVelocity:(Quaternion)rv {
…}
1190 NSString *subtype =
nil;
1191 if ([
self behaviour] == BEHAVIOUR_TRACK_AS_TURRET) subtype =
@"(turret)";
1192 else subtype =
@"(subentity)";
1194 return [
NSString stringWithFormat:@"\"%@\" position: %@ %@", [
self name], HPVectorDescription([
self position]), subtype];
1201 return [
NSString stringWithFormat:@"\"%@\"", [
self name]];
1211- (void) setSunGlareFilter:(GLfloat)newValue
1211- (void) setSunGlareFilter:(GLfloat)newValue {
…}
1223- (void) setAccuracy:(GLfloat) new_accuracy
1225 if (new_accuracy < 0.0f &&
scanClass == CLASS_MISSILE)
1229 else if (new_accuracy < -5.0f)
1231 new_accuracy = -5.0;
1233 else if (new_accuracy > 10.0f)
1235 new_accuracy = 10.0;
1223- (void) setAccuracy:(GLfloat) new_accuracy {
…}
1295- (void) setScriptedMisjump:(BOOL)newValue
1295- (void) setScriptedMisjump:(BOOL)newValue {
…}
1307- (void) setScriptedMisjumpRange:(GLfloat)newValue
1307- (void) setScriptedMisjumpRange:(GLfloat)newValue {
…}
1315 return [[subEntities copy] autorelease];
1321 return [subEntities count];
1325- (BOOL) hasSubEntity:(
Entity<OOSubEntity> *)sub
1327 return [subEntities containsObject:sub];
1325- (BOOL) hasSubEntity:(
Entity<OOSubEntity> *)sub {
…}
1339 return [[
self subEntities] objectEnumeratorFilteredWithSelector:@selector(isShip)];
1345 return [[
self subEntities] objectEnumeratorFilteredWithSelector:@selector(isFlasher)];
1351 return [[
self subEntities] objectEnumeratorFilteredWithSelector:@selector(isExhaust)];
1378 if (![
self hasSubEntity:sub])
1380 OOLog(
@"ship.subentity.sanityCheck.failed.details",
@"Attempt to set subentity taking damage of %@ to %@, which is not a subentity.", [
self shortDescription], sub);
1385 OOLog(
@"ship.subentity.sanityCheck.failed",
@"Attempt to set subentity taking damage of %@ to %@, which is not a ship.", [
self shortDescription], sub);
1420- (BoundingBox)findBoundingBoxRelativeToPosition:(HPVector)opv InVectors:(Vector) _i :(Vector) _j :(Vector) _k
1423 return [[
self mesh] findBoundingBoxRelativeToPosition:HPVectorToVector(opv)
1425 selfPosition:HPVectorToVector(position)
1426 selfBasis:v_right :v_up :v_forward];
1420- (BoundingBox)findBoundingBoxRelativeToPosition:(HPVector)opv InVectors:(Vector) _i :(Vector) _j :(Vector) _k {
…}
1442- (GLfloat) doesHitLine:(HPVector)v0 :(HPVector)v1
1444 Vector u0 = HPVectorToVector(HPvector_between(
position, v0));
1445 Vector u1 = HPVectorToVector(HPvector_between(
position, v1));
1446 Vector w0 = make_vector(dot_product(u0,
v_right), dot_product(u0,
v_up), dot_product(u0,
v_forward));
1447 Vector w1 = make_vector(dot_product(u1,
v_right), dot_product(u1,
v_up), dot_product(u1,
v_forward));
1448 return [
octree isHitByLine:w0 :w1];
1442- (GLfloat) doesHitLine:(HPVector)v0 :(HPVector)v1 {
…}
1452- (GLfloat) doesHitLine:(HPVector)v0 :(HPVector)v1 :(
ShipEntity **)hitEntity
1456 Vector u0 = HPVectorToVector(HPvector_between(
position, v0));
1457 Vector u1 = HPVectorToVector(HPvector_between(
position, v1));
1458 Vector w0 = make_vector(dot_product(u0,
v_right), dot_product(u0,
v_up), dot_product(u0,
v_forward));
1459 Vector w1 = make_vector(dot_product(u1,
v_right), dot_product(u1,
v_up), dot_product(u1,
v_forward));
1460 GLfloat hit_distance = [
octree isHitByLine:w0 :w1];
1464 hitEntity[0] =
self;
1467 NSEnumerator *subEnum =
nil;
1473 u0 = HPVectorToVector(HPvector_between(p0, v0));
1474 u1 = HPVectorToVector(HPvector_between(p0, v1));
1475 w0 = resolveVectorInIJK(u0, ijk);
1476 w1 = resolveVectorInIJK(u1, ijk);
1478 GLfloat hitSub = [
se->octree isHitByLine:w0 :w1];
1479 if (hitSub && (hit_distance == 0 || hit_distance > hitSub))
1481 hit_distance = hitSub;
1489 return hit_distance;
1452- (GLfloat) doesHitLine:(HPVector)v0 :(HPVector)v1 :(
ShipEntity **)hitEntity {
…}
1493- (GLfloat)doesHitLine:(HPVector)v0 :(HPVector)v1 withPosition:(HPVector)o andIJK:(Vector)i :(Vector)j :(Vector)k
1495 Vector u0 = HPVectorToVector(HPvector_between(o, v0));
1496 Vector u1 = HPVectorToVector(HPvector_between(o, v1));
1497 Vector w0 = make_vector(dot_product(u0, i), dot_product(u0, j), dot_product(u0, k));
1498 Vector w1 = make_vector(dot_product(u1, j), dot_product(u1, j), dot_product(u1, k));
1499 return [
octree isHitByLine:w0 :w1];
1493- (GLfloat)doesHitLine:(HPVector)v0 :(HPVector)v1 withPosition:(HPVector)o andIJK:(Vector)i :(Vector)j :(Vector)k {
…}
1528 [subEntities makeObjectsPerformSelector:@selector(wasAddedToUniverse)];
1536 [subEntities makeObjectsPerformSelector:@selector(wasRemovedFromUniverse)];
1552- (void) setBeaconCode:(NSString *)bcode
1554 if ([bcode length] == 0) bcode =
nil;
1558 [_beaconCode release];
1552- (void) setBeaconCode:(NSString *)bcode {
…}
1577- (void) setBeaconLabel:(NSString *)blabel
1579 if ([blabel length] == 0) blabel =
nil;
1583 [_beaconLabel release];
1577- (void) setBeaconLabel:(NSString *)blabel {
…}
1606 NSUInteger length = [beaconCode length];
1610 NSArray *iconData = [[UNIVERSE descriptions] oo_arrayForKey:beaconCode];
1616 if (length > 0)
_beaconDrawable = [[beaconCode substringToIndex:1] retain];
1637- (void) setPrevBeacon:(
Entity <OOBeaconEntity> *)beaconShip
1637- (void) setPrevBeacon:(
Entity <OOBeaconEntity> *)beaconShip {
…}
1647- (void) setNextBeacon:(
Entity <OOBeaconEntity> *)beaconShip
1647- (void) setNextBeacon:(
Entity <OOBeaconEntity> *)beaconShip {
…}
1657#define kBoulderRole (@"boulder")
1659- (void) setIsBoulder:(BOOL)flag
1661 if (flag) [
self addRole:kBoulderRole];
1659- (void) setIsBoulder:(BOOL)flag {
…}
1674 if ([
self hasRole:
@"asteroid"] || [
self isBoulder])
1698 OOLogWARN(
@"ship.setUp.escortShipCircularReference",
1699 @"Ship %@ requested escorts, when it is an escort ship itself. Avoiding possible circular reference overflow by ignoring escort setup.",
self);
1709 NSString *defaultRole =
@"escort";
1710 NSString *escortRole =
nil;
1711 NSString *escortShipKey =
nil;
1717 if ([
self hasPrimaryRole:
@"police"] || [
self hasPrimaryRole:
@"hunter"])
1728 if ([
self isPolice]) defaultRole =
@"wingman";
1730 escortRole = [shipinfoDictionary oo_stringForKey:@"escort_role" defaultValue:nil];
1731 if (escortRole ==
nil)
1732 escortRole = [shipinfoDictionary oo_stringForKey:@"escort-role" defaultValue:defaultRole];
1733 if (![escortRole isEqualToString: defaultRole])
1735 if (![[
UNIVERSE newShipWithRole:escortRole] autorelease])
1737 escortRole = defaultRole;
1741 escortShipKey = [shipinfoDictionary oo_stringForKey:@"escort_ship" defaultValue:nil];
1742 if (escortShipKey ==
nil)
1743 escortShipKey = [shipinfoDictionary oo_stringForKey:@"escort-ship"];
1745 if (escortShipKey !=
nil)
1747 if (![[
UNIVERSE newShipWithName:escortShipKey] autorelease])
1749 escortShipKey =
nil;
1753 escortRole = [
NSString stringWithFormat:@"[%@]",escortShipKey];
1775 escorter = [UNIVERSE newShipWithRole:escortRole];
1777 if (escorter ==
nil)
break;
1792 NSArray *escortRoles = [
shipinfoDictionary oo_arrayForKey:@"escort_roles" defaultValue:nil];
1793 if (escortRoles ==
nil)
1795 OOLogWARN(
@"eship.setUp.escortShipRoles",
1796 @"Ship %@ has bad escort_roles definition.",
self);
1799 NSEnumerator *edefEnumerator =
nil;
1800 NSDictionary *escortDefinition =
nil;
1801 NSDictionary *systeminfo =
nil;
1804 systeminfo = [UNIVERSE currentSystemData];
1805 government = [
systeminfo oo_unsignedCharForKey:KEY_GOVERNMENT];
1808 if ([
self group] ==
nil)
1818 _maxEscortCount = 0;
1820 for (edefEnumerator = [escortRoles objectEnumerator]; (escortDefinition = [
edefEnumerator nextObject]); )
1830 NSString *escortRole = [
escortDefinition oo_stringForKey:@"role" defaultValue:@"escort"];
1831 int8_t desired = max;
1834 for (i = min ; i < max ; i++)
1836 if (
Ranrot()%11 < government+2)
1842 for (i = 0; i < desired; i++)
1848 if (![escortRole isEqualToString:
@""])
1851 ShipEntity *escorter = [UNIVERSE newShipWithRole:escortRole];
1852 if (escorter ==
nil)
1859 currentEscortCount++;
1864 _pendingEscortCount = 0;
1868- (void) setUpOneEscort:(
ShipEntity *)escorter inGroup:(
OOShipGroup *)escortGroup withRole:(NSString *)escortRole atPosition:(HPVector)ex_pos andCount:(uint8_t)currentEscortCount
1870 NSString *autoAI =
nil;
1871 NSString *pilotRole =
nil;
1872 NSDictionary *autoAIMap =
nil;
1873 NSDictionary *escortShipDict =
nil;
1875 NSString *defaultRole =
@"escort";
1877 if ([
self isPolice])
1879 defaultRole =
@"wingman";
1880 pilotRole =
@"police";
1884 pilotRole = bounty ?
@"pirate" :
@"hunter";
1892 ex_pos.x += dd * 6.0 * (
randf() - 0.5);
1893 ex_pos.y += dd * 6.0 * (
randf() - 0.5);
1894 ex_pos.z += dd * 6.0 * (
randf() - 0.5);
1899 ex_pos.x += dd * 12.0 * (
randf() - 0.5);
1900 ex_pos.y += dd * 12.0 * (
randf() - 0.5);
1901 ex_pos.z += dd * 12.0 * (
randf() - 0.5);
1906 if ([escorter crew] ==
nil)
1914 if (scanClass == CLASS_NOT_SET)
1916 scanClass = CLASS_NEUTRAL;
1925 autoAI = [
autoAIMap oo_stringForKey:defaultRole];
1928 autoAI = [
autoAIMap oo_stringForKey:@"escort" defaultValue:@"nullAI.plist"];
1934 if ( (escortRole && [escortShipDict oo_fuzzyBooleanForKey:
@"auto_ai" defaultValue:YES])
1935 || ([[escortAI name] isEqualToString:
@"nullAI.plist"] && ![autoAI isEqualToString:
@"nullAI.plist"]) )
1944 if ([
self status] == STATUS_DOCKED)
1946 [[
self owner] addShipToLaunchQueue:escorter withPriority:NO];
1950 [UNIVERSE addEntity:escorter];
1956 if(([escorter maxFlightSpeed] < cruiseSpeed) && ([escorter maxFlightSpeed] > cruiseSpeed * 0.3))
1868- (void) setUpOneEscort:(
ShipEntity *)escorter inGroup:(
OOShipGroup *)escortGroup withRole:(NSString *)escortRole atPosition:(HPVector)ex_pos andCount:(uint8_t)currentEscortCount {
…}
1986- (void)setShipDataKey:(NSString *)key
1986- (void)setShipDataKey:(NSString *)key {
…}
1999#define MAKE_VECTOR_ARRAY(v) [[[OONativeVector alloc] initWithVector:v] autorelease]
2001- (NSArray *) getWeaponOffsetFrom:(NSDictionary *)dict withKey:(NSString *)key inMode:(NSString *)mode
2004 if ([
mode isEqualToString:
@"single"])
2007 return [
NSArray arrayWithObject:MAKE_VECTOR_ARRAY(offset)];
2011 NSArray *offsets = [
dict oo_arrayForKey:key defaultValue:nil];
2012 if (offsets ==
nil) {
2014 return [
NSArray arrayWithObject:MAKE_VECTOR_ARRAY(offset)];
2018 for (i=0;i<[
offsets count];i++) {
2020 [
output addObject:MAKE_VECTOR_ARRAY(offset)];
2022 return [
NSArray arrayWithArray:output];
2001- (NSArray *) getWeaponOffsetFrom:(NSDictionary *)dict withKey:(NSString *)key inMode:(NSString *)mode {
…}
2074 if (
status == STATUS_COCKPIT_DISPLAY ||
status == STATUS_DEAD ||
status == STATUS_BEING_SCOOPED)
2104 Vector relative_position_of_other = resolveVectorInIJK(HPVectorToVector(HPvector_between(prime_position, other_position)), prime_ijk);
2105 Triangle relative_ijk_of_other;
2106 relative_ijk_of_other.v[0] = resolveVectorInIJK(other_ijk.v[0], prime_ijk);
2107 relative_ijk_of_other.v[1] = resolveVectorInIJK(other_ijk.v[1], prime_ijk);
2108 relative_ijk_of_other.v[2] = resolveVectorInIJK(other_ijk.v[2], prime_ijk);
2112 withOrigin:relative_position_of_other
2113 andIJK:relative_ijk_of_other])
2123 for (i = 0; i < n_subs; i++)
2136 for (i = 0; i < n_subs; i++)
2145 if ((prime_subs)&&(other_subs))
2148 for (i = 0; i < n_osubs; i++)
2154 for (j = 0; j < n_psubs; j++)
2169- (BOOL) checkCloseCollisionWith:(
Entity *)other
2171 if (other ==
nil)
return NO;
2177 if ([
self canScoop:otherShip])
return YES;
2185 NSString *other_key = [
NSString stringWithFormat:@"%d", otherID];
2191 Vector dpos = HPVectorToVector(HPvector_between(
position, otherPos));
2192 Vector rpos = make_vector(dot_product(dpos,
v_right), dot_product(dpos,
v_up), dot_product(dpos,
v_forward));
2193 [closeContactsInfo setObject:[
NSString stringWithFormat:@"%f %f %f", rpos.x, rpos.y, rpos.z] forKey: other_key];
2215 if (otherShip !=
nil)
2169- (BOOL) checkCloseCollisionWith:(
Entity *)other {
…}
2241 while ((father)&&(father != last) && (father !=
NO_TARGET))
2256- (void) addSubentityToCollisionRadius:(
Entity<OOSubEntity> *)subent
2258 if (!subent)
return;
2260 double distance = HPmagnitude([subent position]) + [
subent findCollisionRadius];
2261 if ([subent isKindOfClass:[
ShipEntity class]])
2263 if (distance > collision_radius)
2265 collision_radius = distance;
2270 if (distance > _profileRadius)
2272 _profileRadius = distance;
2256- (void) addSubentityToCollisionRadius:(
Entity<OOSubEntity> *)subent {
…}
2281 pod = [UNIVERSE newShipWithRole:[
shipinfoDictionary oo_stringForKey:@"escape_pod_role"]];
2285 pod = [UNIVERSE newShipWithRole:[
shipinfoDictionary oo_stringForKey:@"escape_pod_model" defaultValue:@"escape-capsule"]];
2288 pod = [UNIVERSE newShipWithRole:@"escape-capsule"];
2289 OOLog(
@"shipEntity.noEscapePod",
@"Ship %@ has no correct escape_pod_role defined. Now using default capsule.",
self);
2312 OOLog(
@"shipEntity.notDict",
@"Ship %@ was not set up from dictionary.",
self);
2323 OOLog(
@"shipEntity.notDict",
@"Ship %@ was not set up from dictionary.",
self);
2324 [UNIVERSE removeEntity:
self];
2330 OOLog(
@"ship.sanityCheck.failed",
@"Ship %@ %@ infinite top speed, clamped to 300.",
self,
@"had");
2344 Quaternion q1 = make_quaternion(cos1, sin1*sqrt(3)/2, sin1/2, 0);
2345 Quaternion q2 = make_quaternion(cos2, -sin2*sqrt(4)/sqrt(5), 0, sin2*sqrt(1)/sqrt(5));
2346 [
self setOrientation: quaternion_multiply(q2, quaternion_multiply(q1, demoStartOrientation))];
2374 OOLog(
@"ship.sanityCheck.failed",
@"Ship %@ %@ with scanClass CLASS_NOT_SET; forced to CLASS_NEUTRAL.",
self, [
self primaryRole]);
2396 if ((target)&&([target
scanClass] == CLASS_POLICE))
2406 NSString *other_key =
nil;
2410 NSDictionary *closeContactsTemp = [[
NSDictionary alloc] initWithDictionary:closeContactsInfo];
2419 Vector dpos = HPVectorToVector(HPvector_between(
position, other->
position));
2420 Vector pos1 = make_vector(dot_product(dpos,
v_right), dot_product(dpos,
v_up), dot_product(dpos,
v_forward));
2421 Vector pos0 = {0, 0, 0};
2426 if ((pos0.x < 0.0)&&(pos1.x > 0.0))
2430 if ((pos0.x > 0.0)&&(pos1.x < 0.0))
2434 if ((pos0.y < 0.0)&&(pos1.y > 0.0))
2438 if ((pos0.y > 0.0)&&(pos1.y < 0.0))
2442 if ((pos0.z < 0.0)&&(pos1.z > 0.0))
2446 if ((pos0.z > 0.0)&&(pos1.z < 0.0))
2451 [closeContactsInfo removeObjectForKey: other_key];
2456 [closeContactsInfo removeObjectForKey: other_key];
2494 double external_temp = 0.0;
2501 double alt1 = sun_cr * sun_cr / sun_zd;
2503 if ([sun goneNova]) external_temp *= 100;
2620 status == STATUS_LAUNCHING ||
2621 status == STATUS_BEING_SCOOPED ||
2625 [PLAYER setScriptTarget:
self];
2627 if ([
self status] != STATUS_DEAD) [PLAYER doScriptEvent:OOJSID("shipSpawned") withArgument:
self];
2640 if ([
self status] == STATUS_LAUNCHING)
2644 StationEntity *stationLaunchedFrom = [UNIVERSE nearestEntityMatchingPredicate:IsStationPredicate parameter:NULL relativeToEntity:
self];
2687 if ([
self status] == STATUS_BEING_SCOOPED)
2701 if ([
self status] == STATUS_COCKPIT_DISPLAY)
2706 if ((range2 > 1.0)||(
velocity.z > 0.0)) range2 = 1.0;
2741 OOLog(
@"ship.sanityCheck.failed",
@"Ship %@ escorting %@ with wrong scanclass!",
self, leader);
2754 qf.w *= (1.0 - delta_t);
2795 BOOL applyThrust = YES;
2798 case BEHAVIOUR_TUMBLE :
2802 case BEHAVIOUR_STOP_STILL :
2803 case BEHAVIOUR_STATION_KEEPING :
2807 case BEHAVIOUR_IDLE :
2815 case BEHAVIOUR_TRACTORED :
2819 case BEHAVIOUR_TRACK_TARGET :
2823 case BEHAVIOUR_INTERCEPT_TARGET :
2824 case BEHAVIOUR_COLLECT_TARGET :
2828 case BEHAVIOUR_ATTACK_TARGET :
2832 case BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX :
2833 case BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE :
2837 case BEHAVIOUR_ATTACK_MINING_TARGET :
2841 case BEHAVIOUR_ATTACK_FLY_TO_TARGET :
2845 case BEHAVIOUR_ATTACK_FLY_FROM_TARGET :
2849 case BEHAVIOUR_ATTACK_BREAK_OFF_TARGET :
2853 case BEHAVIOUR_ATTACK_SLOW_DOGFIGHT :
2857 case BEHAVIOUR_RUNNING_DEFENSE :
2861 case BEHAVIOUR_ATTACK_BROADSIDE :
2865 case BEHAVIOUR_ATTACK_BROADSIDE_LEFT :
2869 case BEHAVIOUR_ATTACK_BROADSIDE_RIGHT :
2873 case BEHAVIOUR_CLOSE_TO_BROADSIDE_RANGE :
2877 case BEHAVIOUR_CLOSE_WITH_TARGET :
2881 case BEHAVIOUR_ATTACK_SNIPER :
2885 case BEHAVIOUR_EVASIVE_ACTION :
2886 case BEHAVIOUR_FLEE_EVASIVE_ACTION :
2890 case BEHAVIOUR_FLEE_TARGET :
2894 case BEHAVIOUR_FLY_RANGE_FROM_DESTINATION :
2898 case BEHAVIOUR_FACE_DESTINATION :
2902 case BEHAVIOUR_LAND_ON_PLANET :
2906 case BEHAVIOUR_FORMATION_FORM_UP :
2910 case BEHAVIOUR_FLY_TO_DESTINATION :
2914 case BEHAVIOUR_FLY_FROM_DESTINATION :
2915 case BEHAVIOUR_FORMATION_BREAK :
2919 case BEHAVIOUR_AVOID_COLLISION :
2923 case BEHAVIOUR_TRACK_AS_TURRET :
2928 case BEHAVIOUR_FLY_THRU_NAVPOINTS :
2932 case BEHAVIOUR_SCRIPTED_AI:
2933 case BEHAVIOUR_SCRIPTED_ATTACK_AI:
2937 case BEHAVIOUR_ENERGY_BOMB_COUNTDOWN:
2953- (void)noteFrustration:(NSString *)context
2955 [
shipAI reactToMessage:@"FRUSTRATED" context:context];
2953- (void)noteFrustration:(NSString *)context {
…}
2964 if ([other isKindOfClass:[
ShipEntity class]])
2993 if (hunter == groupLeader)
3022- (BOOL) hasOneEquipmentItem:(NSString *)itemKey includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading
3024 if ([
self hasOneEquipmentItem:itemKey includeMissiles:includeWeapons whileLoading:loading])
return YES;
3028 NSString *damaged = [
itemKey stringByAppendingString:@"_DAMAGED"];
3029 if ([
_equipment containsObject:damaged])
return YES;
3038 if ([
self hasPrimaryWeapon:weaponType])
return YES;
3022- (BOOL) hasOneEquipmentItem:(NSString *)itemKey includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading {
…}
3046- (BOOL) hasOneEquipmentItem:(NSString *)itemKey includeMissiles:(BOOL)includeMissiles whileLoading:(BOOL)loading
3048 if ([
_equipment containsObject:itemKey])
return YES;
3052 NSString *damaged = [
itemKey stringByAppendingString:@"_DAMAGED"];
3053 if ([
_equipment containsObject:damaged])
return YES;
3056 if (includeMissiles &&
missiles > 0)
3059 if ([itemKey isEqualToString:
@"thargon"]) itemKey =
@"EQ_THARGON";
3046- (BOOL) hasOneEquipmentItem:(NSString *)itemKey includeMissiles:(BOOL)includeMissiles whileLoading:(BOOL)loading {
…}
3072 NSEnumerator *subEntEnum =
nil;
3076 [[
aft_weapon_type identifier] isEqualToString:[weaponType identifier]] ||
3085 if ([subEntity hasPrimaryWeapon:weaponType])
return YES;
3092- (NSUInteger) countEquipmentItem:(NSString *)eqkey
3095 NSUInteger
count = 0;
3098 if ([eqkey isEqualToString:eq])
3092- (NSUInteger) countEquipmentItem:(NSString *)eqkey {
…}
3107- (BOOL) hasEquipmentItem:(
id)equipmentKeys includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading
3110 if ([equipmentKeys isKindOfClass:[NSString
class]])
3116 NSParameterAssert([equipmentKeys isKindOfClass:[NSArray
class]] || [equipmentKeys isKindOfClass:[NSSet
class]]);
3119 foreach (key, equipmentKeys)
3121 if ([
self hasOneEquipmentItem:key includeWeapons:includeWeapons whileLoading:loading])
return YES;
3107- (BOOL) hasEquipmentItem:(
id)equipmentKeys includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading {
…}
3129- (BOOL) hasEquipmentItem:(
id)equipmentKeys
3129- (BOOL) hasEquipmentItem:(
id)equipmentKeys {
…}
3137- (BOOL) hasEquipmentItemProviding:(NSString *)equipmentType
3139 NSString *key =
nil;
3141 if ([key isEqualToString:equipmentType])
3149 if (et !=
nil && [et provides:equipmentType])
3137- (BOOL) hasEquipmentItemProviding:(NSString *)equipmentType {
…}
3159- (NSString *) equipmentItemProviding:(NSString *)equipmentType
3161 NSString *key =
nil;
3163 if ([key isEqualToString:equipmentType])
3166 return [[
key copy] autorelease];
3171 if (et !=
nil && [et provides:equipmentType])
3173 return [[
key copy] autorelease];
3159- (NSString *) equipmentItemProviding:(NSString *)equipmentType {
…}
3181- (BOOL) hasAllEquipment:(
id)equipmentKeys includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading
3183 NSEnumerator *keyEnum =
nil;
3189 if ([equipmentKeys isKindOfClass:[NSString
class]]) equipmentKeys = [
NSArray arrayWithObject:equipmentKeys];
3190 else if (![equipmentKeys isKindOfClass:[NSArray
class]] && ![equipmentKeys isKindOfClass:[NSSet
class]])
return NO;
3192 for (keyEnum = [equipmentKeys objectEnumerator]; (key = [
keyEnum nextObject]); )
3194 if (![
self hasOneEquipmentItem:key includeWeapons:includeWeapons whileLoading:loading])
return NO;
3181- (BOOL) hasAllEquipment:(
id)equipmentKeys includeWeapons:(BOOL)includeWeapons whileLoading:(BOOL)loading {
…}
3201- (BOOL) hasAllEquipment:(
id)equipmentKeys
3201- (BOOL) hasAllEquipment:(
id)equipmentKeys {
…}
3219- (void) setHyperspaceSpinTime:(
float)new
3219- (void) setHyperspaceSpinTime:(
float)new {
…}
3225- (BOOL) canAddEquipment:(NSString *)equipmentKey inContext:(NSString *)context
3227 if ([equipmentKey hasSuffix:
@"_DAMAGED"])
3232 NSString * lcEquipmentKey = [
equipmentKey lowercaseString];
3233 if ([equipmentKey hasSuffix:
@"MISSILE"]||[equipmentKey hasSuffix:
@"MINE"]||([
self isThargoid] && ([lcEquipmentKey hasPrefix:
@"thargon"] || [lcEquipmentKey hasSuffix:
@"thargon"])))
3240 if (![eqType canCarryMultiple] && [
self hasEquipmentItem:equipmentKey])
return NO;
3241 if (![
self equipmentValidToAdd:equipmentKey inContext:context])
return NO;
3225- (BOOL) canAddEquipment:(NSString *)equipmentKey inContext:(NSString *)context {
…}
3268 while (
isWeaponNone(weaponType) && (subEntity = [subEntEnum nextObject]))
3343 NSArray *itemInfo = [
NSArray arrayWithObjects:@"100", @"100000", @"Missile", role, @"Unidentified missile type.",
3344 [
NSDictionary dictionaryWithObjectsAndKeys: @"true", @"is_external_store", nil], nil];
3355 NSEnumerator *eqTypeEnum =
nil;
3359 for (eqTypeEnum = [eqTypes objectEnumerator]; (eqType = [
eqTypeEnum nextObject]); )
3362 if ([eqType canCarryMultiple])
3364 NSString *damagedIdentifier = [[
eqType identifier] stringByAppendingString:@"_DAMAGED"];
3365 NSUInteger i,
count = 0;
3368 for (i=0;i<
count;i++)
3370 [
quip addObject:eqType];
3376 if ([
self hasEquipmentItem:[eqType identifier]] || isDamaged)
3378 [
quip addObject:eqType];
3388 [
quip addObject:eqType];
3391 return [[
quip copy] autorelease];
3395- (BOOL) equipmentValidToAdd:(NSString *)equipmentKey inContext:(NSString *)context
3395- (BOOL) equipmentValidToAdd:(NSString *)equipmentKey inContext:(NSString *)context {
…}
3401- (BOOL) equipmentValidToAdd:(NSString *)equipmentKey whileLoading:(BOOL)loading inContext:(NSString *)context
3404 BOOL validationForDamagedEquipment = NO;
3406 if ([equipmentKey hasSuffix:
@"_DAMAGED"])
3412 if (eqType ==
nil)
return NO;
3419 if ([
self hasEquipmentItem:[eqType damagedIdentifier]])
3421 validationForDamagedEquipment = YES;
3427 if ([eqType requiresMountedPylon] && [
self missileCount] == 0 && !loading)
return NO;
3428 if ([
self availableCargoSpace] < [eqType requiredCargoSpace] && !validationForDamagedEquipment && !loading)
return NO;
3429 if ([eqType requiresEquipment] !=
nil && ![
self hasAllEquipment:[eqType requiresEquipment] includeWeapons:YES whileLoading:loading])
return NO;
3430 if ([eqType requiresAnyEquipment] !=
nil && ![
self hasEquipmentItem:[eqType requiresAnyEquipment] includeWeapons:YES whileLoading:loading])
return NO;
3431 if ([eqType incompatibleEquipment] !=
nil && [
self hasEquipmentItem:[eqType incompatibleEquipment] includeWeapons:YES whileLoading:loading])
return NO;
3432 if ([eqType requiresCleanLegalRecord] && [
self legalStatus] != 0 && !loading)
return NO;
3433 if ([eqType requiresNonCleanLegalRecord] && [
self legalStatus] == 0 && !loading)
return NO;
3435 if ([eqType requiresFullFuel] && [
self fuel] < [
self fuelCapacity] && !loading)
return NO;
3436 if ([eqType requiresNonFullFuel] && [
self fuel] >= [
self fuelCapacity] && !loading)
return NO;
3441 if (condition_script !=
nil)
3443 OOJSScript *condScript = [UNIVERSE getConditionScript:condition_script];
3444 if (condScript !=
nil)
3448 JSBool allow_addition =
false;
3457 if (OK) OK = JS_ValueToBoolean(JScontext, result, &allow_addition);
3461 if (OK && !allow_addition)
3474 if (![eqType isAvailableToPlayer])
return NO;
3475 if (![eqType isAvailableToAll])
3481 [
options addObjectsFromArray:[[
shipyardInfo oo_dictionaryForKey:KEY_STANDARD_EQUIPMENT] oo_arrayForKey:KEY_EQUIPMENT_EXTRAS]];
3482 if (![options containsObject:equipmentKey])
return NO;
3487 if (![eqType isAvailableToNPCs])
return NO;
3401- (BOOL) equipmentValidToAdd:(NSString *)equipmentKey whileLoading:(BOOL)loading inContext:(NSString *)context {
…}
3531- (BOOL) addEquipmentItem:(NSString *)equipmentKey inContext:(NSString *)context
3531- (BOOL) addEquipmentItem:(NSString *)equipmentKey inContext:(NSString *)context {
…}
3537- (BOOL) addEquipmentItem:(NSString *)equipmentKey withValidation:(BOOL)validateAddition inContext:(NSString *)context
3540 NSString *lcEquipmentKey = [
equipmentKey lowercaseString];
3541 NSString *damagedKey;
3543 BOOL isRepairedEquipment = NO;
3545 if([lcEquipmentKey isEqualToString:
@"thargon"]) equipmentKey =
@"EQ_THARGON";
3548 if (validateAddition == YES && ![
self canAddEquipment:equipmentKey inContext:context])
return NO;
3550 if ([equipmentKey hasSuffix:
@"_DAMAGED"])
3558 if (![eqType canCarryMultiple])
3560 damagedKey = [
equipmentKey stringByAppendingString:@"_DAMAGED"];
3563 [_equipment removeObject:damagedKey];
3564 isRepairedEquipment = YES;
3570 if (eqType ==
nil)
return NO;
3573 if ([eqType isMissileOrMine] || ([
self isThargoid] && isEqThargon))
3583 if(isEqThargon)
return NO;
3586 if([equipmentKey hasPrefix:
@"EQ_WEAPON"] && ![equipmentKey hasSuffix:
@"_DAMAGED"])
3594 if (![equipmentKey isEqualToString:
@"EQ_PASSENGER_BERTH"] && !isRepairedEquipment)
3609 if ([equipmentKey isEqual:
@"EQ_CARGO_BAY"])
3613 else if([equipmentKey isEqualToString:
@"EQ_SHIELD_BOOSTER"])
3617 if([equipmentKey isEqualToString:
@"EQ_SHIELD_ENHANCER"])
3624 [_equipment addObject:equipmentKey];
3537- (BOOL) addEquipmentItem:(NSString *)equipmentKey withValidation:(BOOL)validateAddition inContext:(NSString *)context {
…}
3632 return [_equipment objectEnumerator];
3638 return [_equipment count];
3642- (void) removeEquipmentItem:(NSString *)equipmentKey
3644 NSString *equipmentTypeCheckKey = equipmentKey;
3645 NSString *lcEquipmentKey = [
equipmentKey lowercaseString];
3646 NSUInteger equipmentIndex = NSNotFound;
3648 if ([equipmentKey hasSuffix:
@"_DAMAGED"])
3653 if (eqType ==
nil)
return;
3655 if ([eqType isMissileOrMine] || ([
self isThargoid] && ([lcEquipmentKey hasSuffix:
@"thargon"] || [lcEquipmentKey hasPrefix:
@"thargon"])))
3661 if ([
_equipment containsObject:equipmentKey])
3663 if (![equipmentKey isEqualToString:
@"EQ_PASSENGER_BERTH"])
3668 if ([equipmentKey isEqualToString:
@"EQ_CLOAKING_DEVICE"])
3675 if([equipmentKey isEqualToString:
@"EQ_SHIELD_BOOSTER"])
3680 else if([equipmentKey isEqualToString:
@"EQ_SHIELD_ENHANCER"])
3686 else if ([equipmentKey isEqual:
@"EQ_CARGO_BAY"])
3693 if (![equipmentKey hasSuffix:
@"_DAMAGED"] && ![eqType canCarryMultiple])
3695 NSString *damagedKey = [
equipmentKey stringByAppendingString:@"_DAMAGED"];
3698 equipmentIndex = [_equipment indexOfObject:damagedKey];
3699 if (equipmentIndex != NSNotFound)
3702 [_equipment removeObjectAtIndex:equipmentIndex];
3707 equipmentIndex = [_equipment indexOfObject:equipmentKey];
3708 if (equipmentIndex != NSNotFound)
3710 [_equipment removeObjectAtIndex:equipmentIndex];
3642- (void) removeEquipmentItem:(NSString *)equipmentKey {
…}
3734 if ([[
missile_list[i] identifier] isEqualTo:identifier])
3749 NSString *eqRole =
nil;
3750 NSString *shipKey =
nil;
3753 BOOL isRandomMissile = [
role isEqualToString:@"missile"];
3755 if (isRandomMissile)
3759 shipKey = [UNIVERSE randomShipKeyForRoleRespectingConditions:role];
3762 OOLogWARN(
@"ship.setUp.missiles",
@"%@ \"%@\
" used in ship \"%@\" needs a valid %@.plist entry.%@",
@"random missile", shipKey, [
self name],
@"shipdata",
@"Trying another missile.");
3768 shipKey = [UNIVERSE randomShipKeyForRoleRespectingConditions:role];
3771 OOLogWARN(
@"ship.setUp.missiles",
@"%@ \"%@\
" used in ship \"%@\" needs a valid %@.plist entry.%@",
@"missile_role", role, [
self name],
@"shipdata",
@" Using defaults instead.");
3780 missile = [UNIVERSE newShipWithName:shipKey];
3783 if (isRandomMissile)
3784 OOLogWARN(
@"ship.setUp.missiles",
@"%@ \"%@\
" used in ship \"%@\" needs a valid %@.plist entry.%@",
@"random missile", shipKey, [
self name],
@"shipdata",
@"Trying another missile.");
3786 OOLogWARN(
@"ship.setUp.missiles",
@"%@ \"%@\
" used in ship \"%@\" needs a valid %@.plist entry.%@",
@"missile_role", role, [
self name],
@"shipdata",
@" Using defaults instead.");
3798 while ((value = [enumerator nextObject]))
3800 role = (NSString *)value;
3803 if ([missileType isMissileOrMine])
break;
3806 if (![missileType isMissileOrMine])
3816 OOLogWARN(
@"ship.setUp.missiles",
@"%@ \"%@\
" used in ship \"%@\" needs a valid %@.plist entry.%@", (isRandomMissile ?
@"random missile" :
@"missile_role"), role, [
self name],
@"equipment",
@" Enabling compatibility mode.");
3825 if ([eqRole isEqualToString:
@""])
3841 NSString *role =
nil;
3842 double chance =
randf();
3843 BOOL thargoidMissile = NO;
3848 if (missileType ==
nil) {
3857 float randomSelectionChance = chance;
3864 if (missileType ==
nil)
3872 if (chance > 0.8f) role =
@"missile";
3874 else role =
@"EQ_MISSILE";
3880 if (missileType ==
nil)
OOLogERR(
@"ship.setUp.missiles",
@"could not resolve missile / mine type for ship \"%@\
". Original missile role:\"%@\".", [
self name],
_missileRole);
3883 thargoidMissile = [
self isThargoid] && ([
role hasSuffix:@"thargon"] || [
role hasPrefix:@"thargon"]);
3885 if (thargoidMissile || (!thargoidMissile && [missileType isMissileOrMine]))
3891 OOLogWARN(
@"ship.setUp.missiles",
@"missile_role \"%@\
" is not a valid missile / mine type for ship \"%@\".%@", [missileType identifier] , [
self name],
@" No missile selected.");
3899 [_equipment release];
4062 float boostFactor = 1.0f;
4107- (void) setAfterburnerFactor:(GLfloat)new
4107- (void) setAfterburnerFactor:(GLfloat)new {
…}
4113- (void) setAfterburnerRate:(GLfloat)new
4113- (void) setAfterburnerRate:(GLfloat)new {
…}
4125- (void) setMaxThrust:(GLfloat)new
4125- (void) setMaxThrust:(GLfloat)new {
…}
4141- (void) behaviour_stop_still:(
double) delta_t
4141- (void) behaviour_stop_still:(
double) delta_t {
…}
4153- (void) behaviour_idle:(
double) delta_t
4153- (void) behaviour_idle:(
double) delta_t {
…}
4178- (void) behaviour_tumble:(
double) delta_t
4178- (void) behaviour_tumble:(
double) delta_t {
…}
4186- (void) behaviour_tractored:(
double) delta_t
4190 if ((hauler)&&([hauler
isShip]))
4204 GLfloat moment = delta_t * 0.25 * tf;
4211 moment = delta_t * 0.5 * tf;
4216 GLfloat d2 = HPmagnitude2(dp);
4217 moment = (d2 > 0.0)? delta_t * 5.0 * tf / d2 : 0.0;
4225 if ([
self status] == STATUS_BEING_SCOOPED)
4186- (void) behaviour_tractored:(
double) delta_t {
…}
4271- (void) behaviour_track_target:(
double) delta_t
4279 if ([
self hasProximityAlertIgnoringTarget:YES])
4271- (void) behaviour_track_target:(
double) delta_t {
…}
4287- (void) behaviour_intercept_target:(
double) delta_t
4290 if (
behaviour == BEHAVIOUR_INTERCEPT_TARGET)
4313 double eta = range / (
flightSpeed - target_speed);
4315 double last_distance = last_success_factor;
4346 if (distance < last_distance)
4362 if ([
self hasProximityAlertIgnoringTarget:YES])
4287- (void) behaviour_intercept_target:(
double) delta_t {
…}
4371- (void) behaviour_attack_break_off_target:(
double) delta_t
4397 if ([
self hasProximityAlertIgnoringTarget:NO])
4425 behaviour = BEHAVIOUR_ATTACK_SLOW_DOGFIGHT;
4432 behaviour = BEHAVIOUR_ATTACK_SLOW_DOGFIGHT;
4436 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4371- (void) behaviour_attack_break_off_target:(
double) delta_t {
…}
4444- (void) behaviour_attack_slow_dogfight:(
double) delta_t
4451 if ([
self hasProximityAlertIgnoringTarget:YES])
4468 else if (aspect < -0.5)
4473 else if (aspect < 0.3)
4485 behaviour = BEHAVIOUR_ATTACK_BREAK_OFF_TARGET;
4444- (void) behaviour_attack_slow_dogfight:(
double) delta_t {
…}
4511- (void) behaviour_evasive_action:(
double) delta_t
4541 if (
behaviour == BEHAVIOUR_FLEE_EVASIVE_ACTION)
4511- (void) behaviour_evasive_action:(
double) delta_t {
…}
4560- (void) behaviour_attack_target:(
double) delta_t
4579 BOOL hasTurrets = NO;
4582 while (
isWeaponNone(forward_weapon_real_type) && (se = [subEnum nextObject]))
4586 if (se->
behaviour == BEHAVIOUR_TRACK_AS_TURRET)
4591 if (
isWeaponNone(forward_weapon_real_type) && hasTurrets)
4598 if ([forward_weapon_real_type isTurretLaser])
4600 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
4611 BOOL weapons_heating = NO;
4612 if (!forward_weapon_ready && !aft_weapon_ready && !port_weapon_ready && !starboard_weapon_ready)
4614 weapons_heating = YES;
4624 if (!forward_weapon_ready && !aft_weapon_ready && !port_weapon_ready && !starboard_weapon_ready)
4633 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4635 else if (aspect > 0)
4645 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4651 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4659 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4661 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4669 float relativeSpeed = magnitude(vector_subtract([
self velocity], [target
velocity]));
4670 [
self setEvasiveJink:(range + COMBAT_JINK_OFFSET - relativeSpeed / max_flight_pitch)];
4671 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4679 if (nearby && aft_weapon_ready)
4684 else if (nearby && (port_weapon_ready || starboard_weapon_ready))
4700 float relativeSpeed = magnitude(vector_subtract([
self velocity], [target
velocity]));
4701 [
self setEvasiveJink:(range + COMBAT_JINK_OFFSET - relativeSpeed / max_flight_pitch)];
4706 behaviour = BEHAVIOUR_ATTACK_BREAK_OFF_TARGET;
4710 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4713 else if (forward_weapon_ready)
4725 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX;
4729 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
4733 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4736 else if (port_weapon_ready || starboard_weapon_ready)
4741 else if (aft_weapon_ready && midrange)
4749 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4560- (void) behaviour_attack_target:(
double) delta_t {
…}
4759- (void) behaviour_attack_broadside:(
double) delta_t
4785 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_RIGHT;
4790 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_LEFT;
4798 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_RIGHT;
4803 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_LEFT;
4814 behaviour = BEHAVIOUR_CLOSE_TO_BROADSIDE_RANGE;
4759- (void) behaviour_attack_broadside:(
double) delta_t {
…}
4825- (void) behaviour_attack_broadside_left:(
double) delta_t
4825- (void) behaviour_attack_broadside_left:(
double) delta_t {
…}
4831- (void) behaviour_attack_broadside_right:(
double) delta_t
4831- (void) behaviour_attack_broadside_right:(
double) delta_t {
…}
4837- (void) behaviour_attack_broadside_target:(
double) delta_t leftside:(BOOL) leftside
4851 behaviour = BEHAVIOUR_CLOSE_TO_BROADSIDE_RANGE;
4858 if (![
self hasProximityAlertIgnoringTarget:YES])
4881 if (range <= slow_down_range)
4894 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_RIGHT;
4905 behaviour = BEHAVIOUR_ATTACK_BROADSIDE_LEFT;
4929 behaviour = BEHAVIOUR_ATTACK_FLY_FROM_TARGET;
4837- (void) behaviour_attack_broadside_target:(
double) delta_t leftside:(BOOL) leftside {
…}
4956- (void) behaviour_close_to_broadside_range:(
double) delta_t
4963 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
4978 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
4994 behaviour = BEHAVIOUR_CLOSE_TO_BROADSIDE_RANGE;
4956- (void) behaviour_close_to_broadside_range:(
double) delta_t {
…}
4999- (void) behaviour_close_with_target:(
double) delta_t
5006 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
5020 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
5025 if (range <= COMBAT_IN_RANGE_FACTOR * weaponRange || frustration > 5.0)
5031 behaviour = BEHAVIOUR_CLOSE_WITH_TARGET;
4999- (void) behaviour_close_with_target:(
double) delta_t {
…}
5038- (void) behaviour_attack_sniper:(
double) delta_t
5038- (void) behaviour_attack_sniper:(
double) delta_t {
…}
5116- (void) behaviour_fly_to_target_six:(
double) delta_t
5128 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
5145 BOOL closeQuickly = (canBurn && range >
weaponRange);
5164 if (range < slow_down_range && (
behaviour == BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX))
5166 if (range < back_off_range)
5176 if ((range < 0.5 * distance)&&(
behaviour == BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX))
5177 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
5181 if (range < back_off_range)
5194 if (distance < 750.0 || (target_speed < 0.2 && ![
self isThargoid] && ([
self universalID] & 14) > 4))
5196 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
5202 if (
behaviour == BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX)
5209 if (
behaviour == BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE)
5216 GLfloat spacing = 2000.0;
5220 spacing = 2000.0 + (
accuracy * 500.0);
5244 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET;
5116- (void) behaviour_fly_to_target_six:(
double) delta_t {
…}
5262- (void) behaviour_attack_mining_target:(
double) delta_t
5262- (void) behaviour_attack_mining_target:(
double) delta_t {
…}
5303- (void) behaviour_attack_fly_to_target:(
double) delta_t
5325 if (![
self hasProximityAlertIgnoringTarget:YES])
5357 if (range <= slow_down_range)
5359 if (range < back_off_range)
5458 if ([target
behaviour] != BEHAVIOUR_FLEE_TARGET && [target
behaviour] != BEHAVIOUR_FLEE_EVASIVE_ACTION)
5303- (void) behaviour_attack_fly_to_target:(
double) delta_t {
…}
5470- (void) behaviour_attack_fly_from_target:(
double) delta_t
5492 if (
randf() < 0.3) {
5535 if ([
self hasProximityAlertIgnoringTarget:YES])
5543 if (aspect > 0.99999 || aspect < -0.999)
5470- (void) behaviour_attack_fly_from_target:(
double) delta_t {
…}
5553- (void) behaviour_running_defense:(
double) delta_t
5566 behaviour = BEHAVIOUR_CLOSE_WITH_TARGET;
5569 behaviour = BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE;
5584 if ([
self hasProximityAlertIgnoringTarget:YES])
5553- (void) behaviour_running_defense:(
double) delta_t {
…}
5602- (void) behaviour_flee_target:(
double) delta_t
5622 if (range > last_range)
5649 float qbomb_chance = 0.01 * delta_t;
5650 if (
randf() < qbomb_chance)
5602- (void) behaviour_flee_target:(
double) delta_t {
…}
5673- (void) behaviour_fly_range_from_destination:(
double) delta_t
5678 behaviour = BEHAVIOUR_FLY_FROM_DESTINATION;
5686 behaviour = BEHAVIOUR_FLY_TO_DESTINATION;
5688 if ([
self hasProximityAlertIgnoringTarget:YES])
5673- (void) behaviour_fly_range_from_destination:(
double) delta_t {
…}
5699- (void) behaviour_face_destination:(
double) delta_t
5710 if (confidenceFactor >= max_cos &&
flightPitch == 0.0)
5718 behaviour = BEHAVIOUR_FLY_TO_DESTINATION;
5744 if ([
self hasProximityAlertIgnoringTarget:YES])
5699- (void) behaviour_face_destination:(
double) delta_t {
…}
5753- (void) behaviour_land_on_planet:(
double) delta_t
5758 OOPlanetEntity* planet = [UNIVERSE entityForUniversalID:planetForLanding];
5777 if (confidenceFactor >= max_cos &&
flightSpeed == 0.0)
5788 if ([
self hasProximityAlertIgnoringTarget:YES])
5753- (void) behaviour_land_on_planet:(
double) delta_t {
…}
5797- (void) behaviour_formation_form_up:(
double) delta_t
5803 if(eta < 0) eta = 0;
5804 if ((eta < 5.0)&&(leadShip)&&(leadShip->
isShip))
5822 if (distance < last_distance)
5841 if ([
self hasProximityAlertIgnoringTarget:YES])
5797- (void) behaviour_formation_form_up:(
double) delta_t {
…}
5850- (void) behaviour_fly_to_destination:(
double) delta_t
5874 if(confidenceFactor < 0.2) confidenceFactor = 0.2;
5892 minTurnSpeedFactor /= 10.0;
5895 minTurnSpeedFactor /= 10.0;
5912 if ((station_for_docking)&&(station_for_docking->
isStation))
5914 float rollMatch = dot_product([station_for_docking portUpVectorForShip:
self],[
self upVector]);
5915 if (rollMatch < MAX_COS && rollMatch > -
MAX_COS)
5923 desired_speed = [dockingInstructions oo_floatForKey:@"speed"];
5930 if (distance < last_distance)
5946 if ([
self hasProximityAlertIgnoringTarget:YES])
5850- (void) behaviour_fly_to_destination:(
double) delta_t {
…}
5955- (void) behaviour_fly_from_destination:(
double) delta_t
5970 if ([
self hasProximityAlertIgnoringTarget:YES])
5955- (void) behaviour_fly_from_destination:(
double) delta_t {
…}
5979- (void) behaviour_avoid_collision:(
double) delta_t
5979- (void) behaviour_avoid_collision:(
double) delta_t {
…}
6005- (void) behaviour_track_as_turret:(
double) delta_t
6015 HPVector p = HPvector_subtract([turret_target
position], [turret_owner
position]);
6029 while ((target = [[targetEnum nextObject] weakRefUnderlyingObject]))
6044 HPVector p = HPvector_subtract([target
position], [turret_owner
position]);
6005- (void) behaviour_track_as_turret:(
double) delta_t {
…}
6067- (void) behaviour_fly_thru_navpoints:(
double) delta_t
6070 HPVector d1 =
navpoints[next_navpoint_index];
6073 HPVector rel = HPvector_between(d1,
position);
6074 HPVector ref = HPvector_between(d2, d1);
6075 ref = HPvector_normal(ref);
6077 HPVector xp = make_HPvector(ref.y * rel.z - ref.z * rel.y, ref.z * rel.x - ref.x * rel.z, ref.x * rel.y - ref.y * rel.x);
6081 GLfloat r0 = HPdot_product(rel, ref);
6085 GLfloat r1 = HPmagnitude(xp);
6087 BOOL in_cone = (r0 > 0.5 * r1);
6094 GLfloat dist2 = HPmagnitude2(rel);
6100 if (navpoint_plus_index == 0)
6110 double last_dist2 = last_success_factor;
6114 _destination = make_HPvector(d1.x + r1 * ref.x, d1.y + r1 * ref.y, d1.z + r1 * ref.z);
6127 if (dist2 < last_dist2)
6067- (void) behaviour_fly_thru_navpoints:(
double) delta_t {
…}
6153- (void) behaviour_scripted_ai:(
double) delta_t
6157 jsval rval = JSVAL_VOID;
6158 jsval deltaJS = JSVAL_VOID;
6159 NSDictionary *result =
nil;
6161 BOOL OK = JS_NewNumberValue(context, delta_t, &deltaJS);
6173 OOLog(
@"ai.error",
@"Could not call scriptedAI in ship script of %@, reverting to idle",
self);
6179 if (!JSVAL_IS_OBJECT(rval))
6181 OOLog(
@"ai.error",
@"Invalid return value of scriptedAI in ship script of %@, reverting to idle",
self);
6191 if ([result objectForKey:
@"stickRollFactor"] !=
nil)
6209 if ([result objectForKey:
@"stickPitchFactor"] !=
nil)
6227 if ([result objectForKey:
@"stickYawFactor"] !=
nil)
6248 if ([result objectForKey:
@"desiredSpeedFactor"] !=
nil)
6263 if (
behaviour == BEHAVIOUR_SCRIPTED_ATTACK_AI)
6265 NSString* chosen_weapon = [
result oo_stringForKey:@"chosenWeapon" defaultValue:@"FORWARD"];
6268 if ([chosen_weapon isEqualToString:
@"FORWARD"])
6272 else if ([chosen_weapon isEqualToString:
@"AFT"])
6276 else if ([chosen_weapon isEqualToString:
@"PORT"])
6280 else if ([chosen_weapon isEqualToString:
@"STARBOARD"])
6153- (void) behaviour_scripted_ai:(
double) delta_t {
…}
6293- (void) setReactionTime: (
float) newReactionTime
6293- (void) setReactionTime: (
float) newReactionTime {
…}
6386- (void) drawImmediate:(
bool)immediate translucent:(
bool)translucent
6418 NSAssert3([subEntity
owner] ==
self,
@"Subentity ownership broke - %@ should be owned by %@ but is owned by %@.", subEntity,
self, [subEntity
owner]);
6386- (void) drawImmediate:(
bool)immediate translucent:(
bool)translucent {
…}
6430 if (0 && reportAIMessages)
6439 OODebugDrawColoredLine(HPVectorToVector([
self position]), HPVectorToVector([pTarget position]), [
OOColor colorWithRed:0.2 green:0.0 blue:0.0 alpha:1.0]);
6443 if (sTarget != pTarget && [sTarget isStation])
6449 if (fTarget !=
nil && fTarget != pTarget && fTarget != sTarget)
6458- (void) drawSubEntityImmediate:(
bool)immediate translucent:(
bool)translucent
6458- (void) drawSubEntityImmediate:(
bool)immediate translucent:(
bool)translucent {
…}
6498- (GLfloat *) scannerDisplayColorForShip:(
ShipEntity*)otherShip :(BOOL)isHostile :(BOOL)flash :(
OOColor *)scannerDisplayColor1 :(
OOColor *)scannerDisplayColor2 :(
OOColor *)scannerDisplayColorH1 :(
OOColor *)scannerDisplayColorH2
6505 if (scannerDisplayColorH1 || scannerDisplayColorH2)
6507 if (scannerDisplayColorH1 && !scannerDisplayColorH2)
6509 [
scannerDisplayColorH1 getRed:&scripted_color[0] green:&scripted_color[1] blue:&scripted_color[2] alpha:&scripted_color[3]];
6512 if (!scannerDisplayColorH1 && scannerDisplayColorH2)
6517 if (scannerDisplayColorH1 && scannerDisplayColorH2)
6520 [
scannerDisplayColorH1 getRed:&scripted_color[0] green:&scripted_color[1] blue:&scripted_color[2] alpha:&scripted_color[3]];
6577 case CLASS_THARGOID :
6582 case CLASS_MISSILE :
6584 case CLASS_STATION :
6592 case CLASS_MILITARY :
6593 if ((isHostile)&&(flash))
6498- (GLfloat *) scannerDisplayColorForShip:(
ShipEntity*)otherShip :(BOOL)isHostile :(BOOL)flash :(
OOColor *)scannerDisplayColor1 :(
OOColor *)scannerDisplayColor2 :(
OOColor *)scannerDisplayColorH1 :(
OOColor *)scannerDisplayColorH2 {
…}
6640- (void)setScannerDisplayColorHostile1:(
OOColor *)color
6640- (void)setScannerDisplayColorHostile1:(
OOColor *)color {
…}
6649- (void)setScannerDisplayColorHostile2:(
OOColor *)color
6649- (void)setScannerDisplayColorHostile2:(
OOColor *)color {
…}
266 _scaleFactor = [
shipDict oo_floatForKey:@"model_scale_factor" defaultValue:1.0f]; {
…}
6682- (void)setCloaked:(BOOL)cloak
6682- (void)setCloaked:(BOOL)cloak {
…}
6695- (void)setAutoCloak:(BOOL)automatic
6695- (void)setAutoCloak:(BOOL)automatic {
…}
6707- (void) addSubEntity:(
Entity<OOSubEntity> *)sub
6709 if (sub ==
nil)
return;
6707- (void) addSubEntity:(
Entity<OOSubEntity> *)sub {
…}
6737- (void) applyThrust:(
double) delta_t
6748 GLfloat velmag = magnitude(
velocity);
6751 GLfloat vscale = fmaxf((velmag - dt_thrust) / velmag, 0.0f);
6756 if (
behaviour == BEHAVIOUR_TUMBLE)
return;
6775 if (isUsingAfterburner)
6737- (void) applyThrust:(
double) delta_t {
…}
6797- (void) applyRoll:(GLfloat) roll1 andClimb:(GLfloat) climb1
6801 if (!roll1 && !climb1 && !
hasRotated)
return;
6797- (void) applyRoll:(GLfloat) roll1 andClimb:(GLfloat) climb1 {
…}
6811- (void) applyRoll:(GLfloat) roll1 climb:(GLfloat) climb1 andYaw:(GLfloat) yaw1
6813 if ((roll1 == 0.0)&&(climb1 == 0.0)&&(yaw1 == 0.0)&&(!
hasRotated))
6811- (void) applyRoll:(GLfloat) roll1 climb:(GLfloat) climb1 andYaw:(GLfloat) yaw1 {
…}
6830- (void) applyAttitudeChanges:(
double) delta_t
6830- (void) applyAttitudeChanges:(
double) delta_t {
…}
6847 [previousCondition release];
6853 [previousCondition oo_setInteger:behaviour forKey:@"behaviour"];
6857 [previousCondition setObject:[[
self primaryTarget] weakSelf] forKey:@"primaryTarget"];
6859 [previousCondition oo_setFloat:desired_range forKey:@"desired_range"];
6860 [previousCondition oo_setFloat:desired_speed forKey:@"desired_speed"];
6861 [previousCondition oo_setHPVector:_destination forKey:@"destination"];
6878 behaviour = [previousCondition oo_intForKey:@"behaviour"];
6880 _primaryTarget = [[previousCondition objectForKey:@"primaryTarget"] weakRetain];
6882 desired_range = [previousCondition oo_floatForKey:@"desired_range"];
6883 desired_speed = [previousCondition oo_floatForKey:@"desired_speed"];
6884 _destination = [previousCondition oo_hpvectorForKey:@"destination"];
6886 [previousCondition release];
6902- (void) setMessageTime:(
double) value
6902- (void) setMessageTime:(
double) value {
…}
6959 return _escortGroup;
7010- (void) setPendingEscortCount:(uint8_t)count
7010- (void) setPendingEscortCount:(uint8_t)count {
…}
7022- (void) setMaxEscortCount:(uint8_t)newCount
7022- (void) setMaxEscortCount:(uint8_t)newCount {
…}
7030 NSUInteger
count = 0;
7033 while ((se = [subEnum nextObject]))
7063 if ([other
mass] < 2000)
7081 Vector vdiff = HPVectorToVector(HPvector_between(
position, other->
position));
7082 GLfloat d_forward = dot_product(vdiff,
v_forward);
7083 GLfloat d_up = dot_product(vdiff,
v_up);
7084 GLfloat d_right = dot_product(vdiff,
v_right);
7087 double d2 = d_forward * d_forward + d_up * d_up + d_right * d_right;
7093 if (
behaviour == BEHAVIOUR_AVOID_COLLISION)
7096 if ((prox)&&(prox != other))
7101 if (sa_prox < sa_other)
return;
7146 return [
NSString stringWithFormat:@"%@: %@",name,shipUniqueName];
7150 return [
NSString stringWithFormat:@"%@: %@",shipClassName,shipUniqueName];
7173 NSString *desc =
nil;
7182 legal_i = (legal <= 50) ? 1 : 2;
7184 desc = [[[UNIVERSE descriptions] oo_arrayForKey:@"legal_status"] oo_stringAtIndex:legal_i];
7188 case CLASS_THARGOID:
7189 desc =
DESC(
@"legal-desc-alien");
7193 desc =
DESC(
@"legal-desc-system-vessel");
7196 case CLASS_MILITARY:
7197 desc =
DESC(
@"legal-desc-military-vessel");
7208- (void) setName:(NSString *)inName
7208- (void) setName:(NSString *)inName {
…}
7215- (void) setShipUniqueName:(NSString *)inName
7217 [shipUniqueName release];
7215- (void) setShipUniqueName:(NSString *)inName {
…}
7222- (void) setShipClassName:(NSString *)inName
7224 [shipClassName release];
7222- (void) setShipClassName:(NSString *)inName {
…}
7229- (void) setDisplayName:(NSString *)inName
7231 [displayName release];
7229- (void) setDisplayName:(NSString *)inName {
…}
7236- (void) setScanDescription:(NSString *)inName
7238 [scan_description release];
7236- (void) setScanDescription:(NSString *)inName {
…}
7247 return DESC(
@"unknown-target");
7253- (BOOL) hasRole:(NSString *)role
7253- (BOOL) hasRole:(NSString *)role {
…}
7266- (void) addRole:(NSString *)role
7266- (void) addRole:(NSString *)role {
…}
7272- (void) addRole:(NSString *)role withProbability:(
float)probability
7274 if (![
self hasRole:role])
7279 if (newRoles !=
nil)
7272- (void) addRole:(NSString *)role withProbability:(
float)probability {
…}
7288- (void) removeRole:(NSString *)role
7290 if ([
self hasRole:role])
7293 if (newRoles !=
nil)
7288- (void) removeRole:(NSString *)role {
…}
7308 [primaryRole retain];
7309 OOLog(
@"ship.noPrimaryRole",
@"%@ had no primary role, randomly selected \"%@\
".", [
self name],
primaryRole);
7317- (void)setPrimaryRole:(NSString *)role
7321 [primaryRole release];
7317- (void)setPrimaryRole:(NSString *)role {
…}
7327- (BOOL)hasPrimaryRole:(NSString *)role
7327- (BOOL)hasPrimaryRole:(NSString *)role {
…}
7336 return [
self scanClass] == CLASS_POLICE;
7341 return [
self scanClass] == CLASS_THARGOID;
7347 return [UNIVERSE role:[
self primaryRole] isInCategory:@"oolite-trader"];
7353 return [UNIVERSE role:[
self primaryRole] isInCategory:@"oolite-pirate"];
7359 return ([[
self primaryRole] hasSuffix:
@"MISSILE"] || [
self hasPrimaryRole:
@"missile"]);
7377 return [UNIVERSE role:[
self primaryRole] isInCategory:@"oolite-escort"];
7383 return [UNIVERSE role:[
self primaryRole] isInCategory:@"oolite-shuttle"];
7389 return behaviour == BEHAVIOUR_TRACK_AS_TURRET;
7395 return [UNIVERSE roleIsPirateVictim:[
self primaryRole]];
7415 case BEHAVIOUR_ATTACK_TARGET:
7416 case BEHAVIOUR_ATTACK_FLY_TO_TARGET:
7417 case BEHAVIOUR_ATTACK_FLY_FROM_TARGET:
7418 case BEHAVIOUR_RUNNING_DEFENSE:
7419 case BEHAVIOUR_FLEE_TARGET:
7420 case BEHAVIOUR_ATTACK_BREAK_OFF_TARGET:
7421 case BEHAVIOUR_ATTACK_SLOW_DOGFIGHT:
7422 case BEHAVIOUR_EVASIVE_ACTION:
7423 case BEHAVIOUR_FLEE_EVASIVE_ACTION:
7424 case BEHAVIOUR_ATTACK_FLY_TO_TARGET_SIX:
7426 case BEHAVIOUR_ATTACK_FLY_TO_TARGET_TWELVE:
7427 case BEHAVIOUR_ATTACK_BROADSIDE:
7428 case BEHAVIOUR_ATTACK_BROADSIDE_LEFT:
7429 case BEHAVIOUR_ATTACK_BROADSIDE_RIGHT:
7430 case BEHAVIOUR_CLOSE_TO_BROADSIDE_RANGE:
7431 case BEHAVIOUR_CLOSE_WITH_TARGET:
7432 case BEHAVIOUR_ATTACK_SNIPER:
7433 case BEHAVIOUR_SCRIPTED_ATTACK_AI:
7458 int old_behaviour = [previousCondition oo_intForKey:@"behaviour"];
7476- (void) setWeaponRange: (GLfloat) value
7476- (void) setWeaponRange: (GLfloat) value {
…}
7508- (void) setEnergyRechargeRate:(GLfloat)new
7508- (void) setEnergyRechargeRate:(GLfloat)new {
…}
7520- (void) setWeaponRechargeRate:(
float)value
7520- (void) setWeaponRechargeRate:(
float)value {
…}
7526- (void) setWeaponEnergy:(
float)value
7526- (void) setWeaponEnergy:(
float)value {
…}
7544- (void) setScannerRange: (GLfloat) value
7544- (void) setScannerRange: (GLfloat) value {
…}
7556- (void) setReference:(Vector) v
7556- (void) setReference:(Vector) v {
…}
7568- (void) setReportAIMessages:(BOOL) yn
7568- (void) setReportAIMessages:(BOOL) yn {
…}
7604 float centerDistance = HPmagnitude2(HPvector_subtract([stellar
position],
reference));
7609 return centerDistance - 1.35 * r * r;
7622 OOPlanetEntity* e1 = i1;
7623 OOPlanetEntity* e2 = i2;
7628 if (p1 < p2)
return NSOrderedAscending;
7629 if (p1 > p2)
return NSOrderedDescending;
7631 return NSOrderedSame;
7642 OOPlanetEntity *planet =
nil, *bestPlanet =
nil;
7643 float bestRange = INFINITY;
7644 HPVector myPosition = [
self position];
7649 foreach (planet, [
UNIVERSE planets])
7655 if (range < bestRange)
7657 bestPlanet = planet;
7686 OOPlanetEntity *result =
nil;
7687 OOPlanetEntity *planet =
nil;
7688 NSArray *bodies =
nil;
7689 NSArray *planets =
nil;
7692 bodies = [UNIVERSE planets];
7695 for (i=0; i < [
bodies count]; i++)
7697 planet = [
bodies objectAtIndex:i];
7699 planets = [
planets arrayByAddingObject:planet];
7702 if ([planets
count] == 0)
return nil;
7704 planets = [
planets sortedArrayUsingFunction:ComparePlanetsBySurfaceDistance context:
self];
7705 result = [
planets objectAtIndex:0];
7714 BOOL sunGoneNova = [[UNIVERSE sun] goneNova];
7727 float cr2 = cr * cr;
7729 float d2 = HPmagnitude2(HPvector_subtract([nearest
position], [
self position]));
7756 sd2 = HPmagnitude2(HPvector_subtract([the_station
position], [
self position]));
7776 OOPlanetEntity *mainPlanet = [UNIVERSE planet];
7777 d2 = HPmagnitude2(HPvector_subtract([mainPlanet
position], [
self position]));
7780 if (d2 < cr2 * 9.0f)
7782 nearest = mainPlanet;
7891 _lastAegisLock =
nil;
7898- (void) setLastAegisLock:(
Entity<OOStellarBody> *)lastAegisLock
7898- (void) setLastAegisLock:(
Entity<OOStellarBody> *)lastAegisLock {
…}
7931 if ([
self status] == stat)
return;
7933 if (stat == STATUS_LAUNCHING)
7939- (void) setLaunchDelay:(
double)delay
7939- (void) setLaunchDelay:(
double)delay {
…}
7951- (void) setCrew:(NSArray *)crewArray
7951- (void) setCrew:(NSArray *)crewArray {
…}
7967- (void) setSingleCrewWithRole:(NSString *)crewRole
7967- (void) setSingleCrewWithRole:(NSString *)crewRole {
…}
7986 foreach (crewMember,
crew)
7989 [
result addObject:crewDict];
7996- (void) setStateMachine:(NSString *)smName
7996- (void) setStateMachine:(NSString *)smName {
…}
8022 return [[
self shipInfoDictionary] oo_fuzzyBooleanForKey:@"auto_ai" defaultValue:YES];
8028 return [[[
self getAI]
name] isEqualToString:@"nullAI.plist"];
8034 return [[
self shipInfoDictionary] oo_fuzzyBooleanForKey:@"auto_weapons" defaultValue:NO];
8038- (void) setShipScript:(NSString *)script_name
8040 NSMutableDictionary *properties =
nil;
8041 NSArray *actions =
nil;
8051 actions = [shipinfoDictionary oo_arrayForKey:@"launch_actions"];
8057 [
properties setObject:actions forKey:@"legacy_launchActions"];
8061 actions = [shipinfoDictionary oo_arrayForKey:@"script_actions"];
8067 [
properties setObject:actions forKey:@"legacy_scriptActions"];
8071 actions = [shipinfoDictionary oo_arrayForKey:@"death_actions"];
8077 [
properties setObject:actions forKey:@"legacy_deathActions"];
8081 actions = [shipinfoDictionary oo_arrayForKey:@"setup_actions"];
8087 [
properties setObject:actions forKey:@"legacy_setupActions"];
8038- (void) setShipScript:(NSString *)script_name {
…}
8129#if MASS_DEPENDENT_FUEL_PRICES
8133 rate = calcFuelChargeRate(
mass);
8136 OOLog(
@"fuelPrices",
@"\"%@\
" fuel charge rate: %.2f (mass ratio: %.2f/%.2f)", [
self shipDataKey], rate,
mass, [
PLAYER baseMass]);
8143- (void) applySticks:(
double)delta_t
8146 double rate1 = 2.0 * delta_t;
8147 double rate2 = 4.0 * delta_t;
8148 double rate3 = 4.0 * delta_t;
8143- (void) applySticks:(
double)delta_t {
…}
8210- (void) setRoll:(
double) amount
8210- (void) setRoll:(
double) amount {
…}
8216- (void) setRawRoll:(
double) amount
8216- (void) setRawRoll:(
double) amount {
…}
8222- (void) setPitch:(
double) amount
8222- (void) setPitch:(
double) amount {
…}
8228- (void) setYaw:(
double) amount
8228- (void) setYaw:(
double) amount {
…}
8234- (void) setThrust:(
double) amount
8234- (void) setThrust:(
double) amount {
…}
8240- (void) setThrustForDemo:(
float) factor
8240- (void) setThrustForDemo:(
float) factor {
…}
8260 if ((
scanClass == CLASS_THARGOID ||
scanClass == CLASS_STATION) && reason != kOOLegalStatusReasonSetup && reason != kOOLegalStatusReasonByScript)
8264 if (
scanClass == CLASS_POLICE && amount != 0)
8283 jsval amountVal = JSVAL_VOID;
8284 JS_NewNumberValue(context, (
int)amount-(
int)
bounty, &amountVal);
8290 ShipScriptEvent(context,
self,
"shipBountyChanged", amountVal, reasonVal);
8318 return (
int)[
self bounty];
8329 NSString *tmp = [
co_type copy];
8348 OOMassUnit unit = [[UNIVERSE commodityMarket] massUnitForGood:co_type];
8349 if (unit ==
UNITS_TONS && co_amount > 1) co_amount = 1;
8350 else if (unit ==
UNITS_KILOGRAMS && co_amount > 1000) co_amount = 1000;
8351 else if (unit ==
UNITS_GRAMS && co_amount > 1000000) co_amount = 1000000;
8390 NSUInteger result = [[
self cargo] count];
8391 NSAssert(result < UINT32_MAX,
@"Cargo quantity out of bounds.");
8416 NSArray *goods = [[UNIVERSE commodityMarket] goods];
8417 NSUInteger i, j, commodityCount = [
goods count];
8420 for (i = 0; i < commodityCount; i++)
8422 quantityInHold[
i] = 0;
8424 for (i = 0; i < [cargo count]; i++)
8426 ShipEntity *container = [cargo objectAtIndex:i];
8431 for (i = 0; i < commodityCount; i++)
8433 if (quantityInHold[i] > 0)
8436 good = [
goods objectAtIndex:i];
8438 [
commodity setObject:good forKey:@"commodity"];
8439 [
commodity setObject:[
NSNumber numberWithUnsignedInt:quantityInHold[
i]] forKey:@"quantity"];
8440 [
commodity setObject:[[UNIVERSE commodityMarket] nameForGood:good] forKey:@"displayName"];
8441 [
commodity setObject:DisplayStringForMassUnitForCommodity(good) forKey:@"unit"];
8442 [
list addObject:commodity];
8446 return [[
list copy] autorelease];
8449- (void) setCargo:(NSArray *) some_cargo
8451 [cargo removeAllObjects];
8452 [cargo addObjectsFromArray:some_cargo];
8449- (void) setCargo:(NSArray *) some_cargo {
…}
8456- (BOOL) addCargo:(NSArray *) some_cargo
8464 [cargo addObjectsFromArray:some_cargo];
8456- (BOOL) addCargo:(NSArray *) some_cargo {
…}
8474 foreach (pod,
cargo)
8487 NSUInteger i = [cargo count] - 1;
8494 [cargo removeObjectAtIndex:i];
8522 NSArray *newCargo =
nil;
8549 newCargo = [UNIVERSE getContainersOfCommodity:[shipinfoDictionary oo_stringForKey:@"cargo_carried"] :num];
8552 newCargo = [UNIVERSE getContainersOfGoods:num scarce:NO legal:YES];
8555 newCargo = [UNIVERSE getContainersOfGoods:num scarce:YES legal:YES];
8558 newCargo = [UNIVERSE getContainersOfCommodity:@"Narcotics" :num];
8561 newCargo = [UNIVERSE getContainersOfGoods:num scarce:YES legal:NO];
8564 newCargo = [UNIVERSE getContainersOfGoods:(Ranrot() % (1+num/2)) scarce:YES legal:NO];
8578- (void) setSpeed:(
double) amount
8578- (void) setSpeed:(
double) amount {
…}
8584- (void) setDesiredSpeed:(
double) amount
8584- (void) setDesiredSpeed:(
double) amount {
…}
8602- (void) setDesiredRange:(
double) amount
8602- (void) setDesiredRange:(
double) amount {
…}
8614- (void) increase_flight_speed:(
double) delta
8616 double factor = 1.0;
8614- (void) increase_flight_speed:(
double) delta {
…}
8626- (void) decrease_flight_speed:(
double) delta
8628 double factor = 1.0;
8626- (void) decrease_flight_speed:(
double) delta {
…}
8645- (void) increase_flight_roll:(
double) delta
8645- (void) increase_flight_roll:(
double) delta {
…}
8655- (void) decrease_flight_roll:(
double) delta
8655- (void) decrease_flight_roll:(
double) delta {
…}
8665- (void) increase_flight_pitch:(
double) delta
8665- (void) increase_flight_pitch:(
double) delta {
…}
8675- (void) decrease_flight_pitch:(
double) delta
8675- (void) decrease_flight_pitch:(
double) delta {
…}
8685- (void) increase_flight_yaw:(
double) delta
8685- (void) increase_flight_yaw:(
double) delta {
…}
8695- (void) decrease_flight_yaw:(
double) delta
8695- (void) decrease_flight_yaw:(
double) delta {
…}
8753- (void) setMaxFlightPitch:(GLfloat)new
8753- (void) setMaxFlightPitch:(GLfloat)new {
…}
8759- (void) setMaxFlightSpeed:(GLfloat)new
8759- (void) setMaxFlightSpeed:(GLfloat)new {
…}
8765- (void) setMaxFlightRoll:(GLfloat)new
8765- (void) setMaxFlightRoll:(GLfloat)new {
…}
8771- (void) setMaxFlightYaw:(GLfloat)new
8771- (void) setMaxFlightYaw:(GLfloat)new {
…}
8790- (void) setTemperature:(GLfloat) value
8790- (void) setTemperature:(GLfloat) value {
…}
8802- (float) randomEjectaTemperatureWithMaxFactor:(
float)factor
8804 const float kRange = 0.02f;
8808 float adjusted = parentTemp * (
bellf(5) * (kRange * 2.0f) - kRange + factor);
8802- (float) randomEjectaTemperatureWithMaxFactor:(
float)factor {
…}
8827- (void) setHeatInsulation:(GLfloat) value
8827- (void) setHeatInsulation:(GLfloat) value {
…}
8839- (void) dealEnergyDamage:(GLfloat) baseDamage atRange:(GLfloat) range withBias:(GLfloat) velocityBias
8844 OOLog(
@"missile.damage.calc",
@"Range: %f | Damage: %f | MaxRange: %f",range,baseDamage,maxRange);
8846 NSArray *targets = [UNIVERSE entitiesWithinRange:maxRange ofEntity:
self];
8847 if ([targets
count] > 0)
8850 for (i = 0; i < [
targets count]; i++)
8855 double d = (magnitude(p2) - ecr) / range;
8857 double localDamage = baseDamage;
8858 OOLog(
@"missile.damage.calc",
@"Base damage: %f",baseDamage);
8859 if (velocityBias > 0)
8862 double vSign = dot_product(vector_normal([
self velocity]), vector_normal(p2));
8867 double vMag = vSign * magnitude(v2);
8868 if (vMag > 1000.0) {
8874 localDamage += vMag * velocityBias;
8875 OOLog(
@"missile.damage.calc",
@"Velocity magnitude + sign: %f , %f",magnitude(v2),vSign);
8876 OOLog(
@"missile.damage.calc",
@"Velocity magnitude factor: %f",vMag);
8877 OOLog(
@"missile.damage.calc",
@"Velocity corrected damage: %f",localDamage);
8879 double damage = (d > 1) ? localDamage / (d * d) : localDamage;
8880 OOLog(
@"missile.damage.calc",
@"%f at range %f (d=%f)",
damage,magnitude(p2)-ecr,d);
8904 NSDictionary *explosion = [UNIVERSE explosionSetting:@"oolite-default-ship-explosion"];
8839- (void) dealEnergyDamage:(GLfloat) baseDamage atRange:(GLfloat) range withBias:(GLfloat) velocityBias {
…}
8914 OOStandardsDeprecated([NSString stringWithFormat:
@"dealEnergyDamageWithinDesiredRange is deprecated for %@",
self]);
8916 NSArray* targets = [UNIVERSE entitiesWithinRange:(desired_range < SCANNER_MAX_RANGE ? desired_range : SCANNER_MAX_RANGE) ofEntity:
self];
8917 if ([targets
count] > 0)
8920 for (i = 0; i < [
targets count]; i++)
8925 double d = (magnitude(p2) - ecr) * 2.6;
8933- (void) dealMomentumWithinDesiredRange:(
double)amount
8935 NSArray* targets = [UNIVERSE entitiesWithinRange:desired_range ofEntity:
self];
8936 if ([targets
count] > 0)
8939 for (i = 0; i < [
targets count]; i++)
8946 double d2 = magnitude2(p2) - ecr * ecr;
8933- (void) dealMomentumWithinDesiredRange:(
double)amount {
…}
8966- (void) setHulk:(BOOL)isNowHulk
8966- (void) setHulk:(BOOL)isNowHulk {
…}
8977 if (amount < 0 || (amount == 0 && [[
UNIVERSE gameController] isGamePaused]))
return;
8981 jsval amountVal = JSVAL_VOID;
8982 JS_NewNumberValue(context, amount, &amountVal);
8986 ShipScriptEvent(context,
self,
"shipTakingDamage", amountVal, entityVal, typeVal);
8997 behaviour = BEHAVIOUR_FLEE_EVASIVE_ACTION;
9012 if ([
self status] == STATUS_DEAD)
return;
9014 [PLAYER setScriptTarget:
self];
9043- (void) rescaleBy:(GLfloat)factor
9043- (void) rescaleBy:(GLfloat)factor {
…}
9049- (void) rescaleBy:(GLfloat)factor writeToCache:(BOOL)writeToCache
9051 _scaleFactor *= factor;
9055 NSString *modelName = [
shipDict oo_stringForKey:@"model"];
9056 if (modelName !=
nil)
9068 if (mesh ==
nil)
return;
9074 foreach (se, [
self subEntities])
9081 mass *= factor * factor * factor;
9049- (void) rescaleBy:(GLfloat)factor writeToCache:(BOOL)writeToCache {
…}
9091 int speed_low = 200;
9093 NSArray *jetsam =
nil;
9094 unsigned cargo_chance = 70;
9095 jetsam = [
NSArray arrayWithArray:cargo];
9096 [cargo removeAllObjects];
9097 unsigned limit = 15;
9099 NSUInteger n_jetsam = [
jetsam count];
9101 for (i = 0; i < n_jetsam; i++)
9103 if (
Ranrot() % 100 < cargo_chance)
9106 if (cargo_chance > 10)
9119 ShipEntity* container = [UNIVERSE reifyCargoPod:cargoObj];
9123 HPVector rpos = xposition;
9125 rpos.x += rrand.x; rpos.y += rrand.y; rpos.z += rrand.z;
9130 v.x = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9131 v.y = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9132 v.z = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9139 [UNIVERSE addEntity:container];
9142 if ([containerAI hasSuspendedStateMachines])
9158- (void) setIsWreckage:(BOOL)isw
9158- (void) setIsWreckage:(BOOL)isw {
…}
9182 [UNIVERSE addEntity:this_ship];
9196 int speed_low = 200;
9197 GLfloat n_alloys = sqrtf(sqrtf(
mass / 6000.0f));
9198 NSUInteger numAlloys = 0;
9201 if ([
self status] == STATUS_DEAD)
9203 [UNIVERSE removeEntity:
self];
9219 [UNIVERSE addEntity:ring];
9247 NSString *explosionKey =
@"oolite-default-ship-explosion";
9248 NSDictionary *explosion =
nil;
9251 explosion = [UNIVERSE explosionSetting:explosionKey];
9256 for (NSUInteger i=0;i<[explosionType count];i++)
9258 explosionKey = [explosionType oo_stringAtIndex:i defaultValue:nil];
9259 if (explosionKey !=
nil)
9262 if ([explosionKey isEqualToString:
@"oolite-builtin-flash"])
9266 else if ([explosionKey isEqualToString:
@"oolite-builtin-slowcloud"])
9270 else if ([explosionKey isEqualToString:
@"oolite-builtin-fastspark"])
9276 explosion = [UNIVERSE explosionSetting:explosionKey];
9293 if ([
self hasRole:
@"asteroid"] || [
self isBoulder])
9297 NSString *defaultRole =
@"boulder";
9298 float defaultSpeed = 50.0;
9301 defaultRole =
@"splinter";
9302 defaultSpeed = 20.0;
9310 [PLAYER addRoleForMining];
9314 NSString *debrisRole = [[
self shipInfoDictionary] oo_stringForKey:@"debris_role" defaultValue:defaultRole];
9315 for (i = 0; i < n_rocks; i++)
9317 ShipEntity* rock = [UNIVERSE newShipWithRole:debrisRole];
9322 v.x = ((
randf() * r_speed) - r_speed / 2);
9323 v.y = ((
randf() * r_speed) - r_speed / 2);
9324 v.z = ((
randf() * r_speed) - r_speed / 2);
9326 HPVector rpos = HPvector_add(xposition,vectorToHPVector(vector_multiply_scalar(vector_normal(v),cr)));
9346 [UNIVERSE addEntity:rock];
9356 if ((n_alloys &&
canFragment) || canReleaseSubWreckage)
9358 NSUInteger n_wreckage = 0;
9364 NSUInteger maxWrecks = 3;
9368 n_wreckage = (
mass > 600.0 &&
randf() < 0.2)?2:0;
9372 n_wreckage = (n_alloys < maxWrecks)? floorf(
randf()*(n_alloys+2)) : maxWrecks;
9376 for (i = 0; i < n_wreckage; i++)
9380 HPVector rpos = HPvector_add(vectorToHPVector(dir), xposition);
9381 GLfloat lifetime = 750.0 *
randf() + 250.0 * i + 100.0;
9382 ShipEntity *wreck = [UNIVERSE addWreckageFrom:
self withRole:@"wreckage" at:rpos scale:1.0 lifetime:lifetime/2];
9387 n_alloys =
randf() * n_alloys;
9396 else if (!add_debris)
9398 n_alloys = (n_alloys > 1.0) ? 1.0 : 0.0;
9402 numAlloys = floorf(n_alloys);
9406 for (i = 0; i < numAlloys; i++)
9408 ShipEntity* plate = [UNIVERSE newShipWithRole:@"alloy"];
9411 HPVector rpos = xposition;
9413 rpos.x += rrand.x; rpos.y += rrand.y; rpos.z += rrand.z;
9418 v.x = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9419 v.y = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9420 v.z = 0.1 *((
ranrot_rand() % speed_low) - speed_low / 2);
9428 [UNIVERSE addEntity:plate];
9436 NSEnumerator *subEnum =
nil;
9457 OOLog(
@"becomeExplosion.suspectedGhost.confirm",
@"%@",
@"Ship spotted with isPlayer set when not actually the player.");
9467 [UNIVERSE removeEntity:
self];
9479 [UNIVERSE removeEntity:
self];
9487 NSArray* targets = [UNIVERSE entitiesWithinRange:SCANNER_MAX_RANGE ofEntity:
self];
9488 if ([targets
count] > 0)
9491 for (i = 0; i < [
targets count]; i++)
9508 [subEntities removeObject:exhaust];
9515 [subEntities removeObject:flasher];
9536 if ([
self hasSubEntity:sub])
9538 OOLogERR(
@"shipEntity.bug.subEntityRetainUnderflow",
@"Subentity of %@ died while still in subentity list! This is bad. Leaking subentity list to avoid crash. %@",
self,
@"This is an internal error, please report it.");
9546- (Vector) positionOffsetForAlignment:(NSString*) align
9548 NSString* padAlign = [
NSString stringWithFormat:@"%@---", align];
9550 switch ([padAlign characterAtIndex:0])
9563 switch ([padAlign characterAtIndex:1])
9576 switch ([padAlign characterAtIndex:2])
9546- (Vector) positionOffsetForAlignment:(NSString*) align {
…}
9595 NSString* padAlign = [
NSString stringWithFormat:@"%@---", align];
9601 switch ([padAlign characterAtIndex:0])
9605 result.x = 0.5 * (arbb.min.x + arbb.max.x);
9608 result.x = arbb.max.x;
9611 result.x = arbb.min.x;
9614 switch ([padAlign characterAtIndex:1])
9618 result.y = 0.5 * (arbb.min.y + arbb.max.y);
9621 result.y = arbb.max.y;
9624 result.y = arbb.min.y;
9627 switch ([padAlign characterAtIndex:2])
9631 result.z = 0.5 * (arbb.min.z + arbb.max.z);
9634 result.z = arbb.max.z;
9637 result.z = arbb.min.z;
9644- (void) becomeLargeExplosion:(
double)factor
9647 if ([
self status] == STATUS_DEAD)
return;
9654 float how_many = factor;
9655 while (how_many > 0.5f)
9662 while (how_many > 0.5f)
9670 NSEnumerator *subEnum =
nil;
9682 if (!
isPlayer) [UNIVERSE removeEntity:
self];
9644- (void) becomeLargeExplosion:(
double)factor {
…}
9696- (NSComparisonResult) compareBeaconCodeWith:(
Entity<OOBeaconEntity> *) other
9698 return [[
self beaconCode] compare:[
other beaconCode] options: NSCaseInsensitiveSearch];
9696- (NSComparisonResult) compareBeaconCodeWith:(
Entity<OOBeaconEntity> *) other {
…}
9706 return OOClamp_0_1_f(result);
9713 return OOClamp_0_1_f(result);
9720 return OOClamp_0_1_f(result);
9732 while (
isWeaponNone(forward_weapon_real_type) && (se = [subEnum nextObject]))
9741 return OOClamp_0_1_f(result);
9748 return OOClamp_0_1_f(result);
9755 return OOClamp_0_1_f(result);
9762 return OOClamp_0_1_f(result);
9784- (void) setEntityPersonalityInt:(uint16_t)value
9784- (void) setEntityPersonalityInt:(uint16_t)value {
…}
9794- (void)setSuppressExplosion:(BOOL)suppress
9794- (void)setSuppressExplosion:(BOOL)suppress {
…}
9802 NSEnumerator *exEnum =
nil;
9835 scan = scan->z_previous;
while ((scan)&&(scan->isShip == NO)) scan = scan->z_previous;
9847 scan = scan->z_next;
while ((scan)&&(scan->isShip == NO)) scan = scan->z_next;
9921 if (result ==
nil || ![
self isValidTarget:result])
9930- (void) setFoundTarget:(
Entity *) targetEntity
9930- (void) setFoundTarget:(
Entity *) targetEntity {
…}
9940 if (result ==
nil || ![
self isValidTarget:result])
9949- (void) setPrimaryAggressor:(
Entity *) targetEntity
9949- (void) setPrimaryAggressor:(
Entity *) targetEntity {
…}
9959 if (result ==
nil || ![
self isValidTarget:result])
9968- (void) setLastEscortTarget:(
Entity *) targetEntity
9968- (void) setLastEscortTarget:(
Entity *) targetEntity {
…}
9978 if (result ==
nil || ![
self isValidTarget:result])
9987- (void) setThankedShip:(
Entity *) targetEntity
9987- (void) setThankedShip:(
Entity *) targetEntity {
…}
9997 if (result ==
nil || ![
self isValidTarget:result])
10006- (void) setRememberedShip:(
Entity *) targetEntity
10016 if (result ==
nil || ![
self isValidTarget:result])
10043 if (tstatus == STATUS_ENTERING_WITCHSPACE || tstatus == STATUS_IN_HOLD || tstatus == STATUS_DOCKED || tstatus == STATUS_DEAD)
10060 if (targetEntity ==
self)
return;
10061 if (targetEntity !=
nil)
10080 [[
self shipSubEntityEnumerator] makeObjectsPerformSelector:@selector(removeTarget:) withObject:targetEntity];
10102 if (![
self isValidTarget:target])
10106 double range2 = HPmagnitude2(HPvector_subtract([target
position],
position));
10125 || ![
self isValidTarget:result])
10159 BOOL isFriendly = NO;
10163 if ((otherShip ==
self) ||
10166 (myGroup !=
nil && otherGroup !=
nil && (myGroup == otherGroup || [otherGroup leader] ==
self)) ||
10184 if (ship != [
self shipHitByLaser])
10198 if ([
self isDefenseTarget:ship])
10235 if ([
self isDefenseTarget:target])
10270- (void) setCoordinate:(HPVector) coord
10270- (void) setCoordinate:(HPVector) coord {
…}
10275- (HPVector) distance_six: (GLfloat) dist
10275- (HPVector) distance_six: (GLfloat) dist {
…}
10283- (HPVector) distance_twelve: (GLfloat) dist withOffset:(GLfloat)offset
10286 twelve.x += dist *
v_up.x; twelve.y += dist *
v_up.y; twelve.z += dist *
v_up.z;
10283- (HPVector) distance_twelve: (GLfloat) dist withOffset:(GLfloat)offset {
…}
10292- (void) trackOntoTarget:(
double) delta_t withDForward: (GLfloat) dp
10294 Vector vector_to_target;
10295 Quaternion q_minarc;
10302 vector_to_target = [
self vectorTo:target];
10304 GLfloat range2 = magnitude2(vector_to_target);
10306 GLfloat max_cos = sqrt(1 - targetRadius*targetRadius/range2);
10311 if (vector_to_target.x||vector_to_target.y||vector_to_target.z)
10312 vector_to_target = vector_normal(vector_to_target);
10314 vector_to_target.z = 1.0;
10292- (void) trackOntoTarget:(
double) delta_t withDForward: (GLfloat) dp {
…}
10330- (double) ballTrackLeadingTarget:(
double) delta_t atTarget:(
Entity *)target
10337 Vector vector_to_target;
10338 Vector axis_to_track_by;
10341 double aim_cos, ref_cos;
10346 vector_to_target = HPVectorToVector(HPvector_subtract([target
position], my_position));
10353 while ((father)&&(father != last) && (father !=
NO_TARGET))
10368 q = quaternion_conjugate(q);
10376 if (magnitude(vector_to_target) >
weaponRange * 1.01)
10383 vector_to_target = vector_add(vector_to_target, vector_multiply_scalar(leading, lead));
10384 vector_to_target = vector_normal_or_fallback(vector_to_target,
kBasisZVector);
10387 aim_cos = dot_product(vector_to_target, my_aim);
10388 ref_cos = dot_product(vector_to_target, my_ref);
10393 axis_to_track_by = cross_product(vector_to_target, my_aim);
10330- (double) ballTrackLeadingTarget:(
double) delta_t atTarget:(
Entity *)target {
…}
10409- (void) setEvasiveJink:(GLfloat) z
10409- (void) setEvasiveJink:(GLfloat) z {
…}
10442- (void) evasiveAction:(
double) delta_t
10454 double agreement = dot_product(
v_right,target->v_right);
10455 if (agreement > -0.3 && agreement < 0.3)
10442- (void) evasiveAction:(
double) delta_t {
…}
10477- (double) trackPrimaryTarget:(
double) delta_t :(BOOL) retreat
10500 GLfloat d_forward, d_up, d_right;
10504 double range2 = HPmagnitude2(HPvector_subtract([target
position],
position));
10514 vy = targetShip->
v_up;
10529 if (!vector_equal(relPos,
kZeroVector)) targetDirection = vector_normal(relPos);
10533 GLfloat dist_adjust_factor = 1.0;
10536 double range = magnitude(relPos);
10537 if (range > 2000.0)
10539 dist_adjust_factor = range / 2000.0;
10542 dist_adjust_factor *= 3;
10545 if (
jink.x == 0.0 &&
behaviour != BEHAVIOUR_RUNNING_DEFENSE)
10553 relPos.x += (
jink.x * vx.x +
jink.y * vy.x +
jink.z * vz.x) * dist_adjust_factor;
10554 relPos.y += (
jink.x * vx.y +
jink.y * vy.y +
jink.z * vz.y) * dist_adjust_factor;
10555 relPos.z += (
jink.x * vx.z +
jink.y * vy.z +
jink.z * vz.z);
10560 if (!vector_equal(relPos,
kZeroVector)) relPos = vector_normal(relPos);
10561 else relPos.z = 1.0;
10568 double reverse = (retreat)? -1.0: 1.0;
10570 double min_d = 0.004;
10571 int max_factor = 8;
10572 double r_max_factor = 0.125;
10581 r_max_factor = 1.0/max_factor;
10585 r_max_factor /= 3.0;
10595 r_max_factor /= 2.0;
10600 d_right = dot_product(relPos,
v_right);
10601 d_up = dot_product(relPos,
v_up);
10602 d_forward = dot_product(relPos,
v_forward);
10604 if (d_forward * reverse > max_cos)
10619 if (reverse * d_up > 0)
10627 if ((d_forward < max_cos)||(retreat))
10629 if (d_forward < -max_cos)
10631 d_up = min_d * 2.0;
10636 int factor = sqrt(fabs(d_right) / fabs(min_d));
10637 if (factor > max_factor)
10638 factor = max_factor;
10639 if (d_right > min_d)
10641 if (d_right < -min_d)
10646 int factor = sqrt(fabs(d_right) / fabs(min_d));
10647 if (factor > max_factor)
10648 factor = max_factor;
10649 if (d_right > min_d)
10651 if (d_right < -min_d)
10657 int factor = sqrt(fabs(d_up) / fabs(min_d));
10658 if (factor > max_factor)
10659 factor = max_factor;
10669 if (fabs(d_right) < fabs(
stick_roll) * delta_t)
10699 d_forward *= d_forward;
10701 if (d_forward < 0.0)
10477- (double) trackPrimaryTarget:(
double) delta_t :(BOOL) retreat {
…}
10711- (double) trackSideTarget:(
double) delta_t :(BOOL) leftside
10731 GLfloat d_forward, d_up, d_right;
10736 if (!vector_equal(relPos,
kZeroVector)) relPos = vector_normal(relPos);
10737 else relPos.z = 1.0;
10747 double reverse = (leftside)? -1.0: 1.0;
10749 double min_d = 0.004;
10754 int max_factor = 8;
10755 double r_max_factor = 0.125;
10757 d_right = dot_product(relPos,
v_right);
10758 d_up = dot_product(relPos,
v_up);
10759 d_forward = dot_product(relPos,
v_forward);
10761 if (d_right * reverse > max_cos)
10763 return d_right * reverse;
10772 if ((d_right * reverse < max_cos))
10774 if (d_right < -max_cos)
10776 d_forward = min_d * 2.0;
10779 if (d_forward > min_d)
10781 int factor = sqrt(fabs(d_up) / fabs(min_d));
10782 if (factor > max_factor)
10783 factor = max_factor;
10789 if (d_forward < -min_d)
10791 int factor = sqrt(fabs(d_up) / fabs(min_d));
10792 if (factor > max_factor)
10793 factor = max_factor;
10800 if (fabs(
stick_pitch) == 0.0 || fabs(d_forward) > 0.5)
10803 int factor = sqrt(fabs(d_forward) / fabs(min_d));
10804 if (factor > max_factor)
10805 factor = max_factor;
10806 if (d_forward > min_d)
10808 if (d_forward < -min_d)
10810 if (factor < max_factor/2.0)
10825 return d_right * reverse;
10711- (double) trackSideTarget:(
double) delta_t :(BOOL) leftside {
…}
10830- (double) missileTrackPrimaryTarget:(
double) delta_t
10833 GLfloat d_forward, d_up, d_right;
10835 BOOL inPursuit = YES;
10837 if (!target || ![target
isShip])
10840 double damping = 0.5 * delta_t;
10851 float missileSpeed = (float)[
self speed];
10857 if (missileSpeed > 0.01f &&
accuracy > 0.0f)
10863 float lead = magnitude(relPos) / missileSpeed;
10867 relPos.x += (lead * leading.x * (
accuracy / 10.0f));
10868 relPos.y += (lead * leading.y * (
accuracy / 10.0f));
10869 relPos.z += (lead * leading.z * (
accuracy / 10.0f));
10873 if (!vector_equal(relPos,
kZeroVector)) relPos = vector_normal(relPos);
10874 else relPos.z = 1.0;
10876 d_right = dot_product(relPos,
v_right);
10877 d_up = dot_product(relPos,
v_up);
10878 d_forward = dot_product(relPos,
v_forward);
10924 if (d_forward < 0.0)
10830- (double) missileTrackPrimaryTarget:(
double) delta_t {
…}
10930- (double) trackDestination:(
double) delta_t :(BOOL) retreat
10933 GLfloat d_forward, d_up, d_right;
10941 double reverse = 1.0;
10942 double reversePlayer = 1.0;
10944 double min_d = 0.004;
10946 double precision = we_are_docking ? 0.25 : 0.9025;
10949 reverse = -reverse;
10953 reverse = -reverse;
10954 reversePlayer = -1;
10958 double range2 = magnitude2(relPos);
10967 if (range2 > desired_range2)
10969 max_cos = sqrt(1 - precision * desired_range2/range2);
10970 if (max_cos >= 0.99999)
10976 if (!vector_equal(relPos,
kZeroVector)) relPos = vector_normal(relPos);
10977 else relPos.z = 1.0;
10979 d_right = dot_product(relPos,
v_right);
10980 d_up = dot_product(relPos,
v_up);
10981 d_forward = dot_product(relPos,
v_forward);
10991 if (reverse * d_up > 0)
10999 if ((d_forward < max_cos)||(retreat))
11002 if (d_forward <= -max_cos || (retreat && d_forward >= max_cos))
11004 d_up = min_d * 2.0;
11009 int factor = sqrt(fabs(d_right) / fabs(min_d));
11012 if (d_right > min_d)
11014 if (d_right < -min_d)
11016 if (fabs(d_right) < fabs(
stick_roll) * delta_t)
11022 int factor = sqrt(fabs(d_right) / fabs(min_d));
11025 if (d_right > min_d)
11027 if (d_right < -min_d)
11029 if (fabs(d_right) < fabs(
stick_roll) * delta_t)
11035 int factor = sqrt(fabs(d_up) / fabs(min_d));
11059 if ((station_for_docking)&&(station_for_docking->
isStation))
11070 d_forward *= d_forward;
11072 if (d_forward < 0.0)
10930- (double) trackDestination:(
double) delta_t :(BOOL) retreat {
…}
11082- (GLfloat) rollToMatchUp:(Vector)up_vec rotating:(GLfloat)match_roll
11084 GLfloat cosTheta = dot_product(up_vec,
v_up);
11085 GLfloat sinTheta = dot_product(up_vec,
v_right);
11089 match_roll = -match_roll;
11090 sinTheta = -sinTheta;
11093 if (cosTheta < 0.0f)
11095 cosTheta = -cosTheta;
11096 sinTheta = -sinTheta;
11099 if (sinTheta > 0.0f)
11102 return cosTheta * cosTheta * match_roll + sinTheta * sinTheta *
max_flight_roll;
11107 return cosTheta * cosTheta * match_roll - sinTheta * sinTheta *
max_flight_roll;
11082- (GLfloat) rollToMatchUp:(Vector)up_vec rotating:(GLfloat)match_roll {
…}
11184 if (target ==
nil || [
self isDefenseTarget:target] || ![target
isShip])
11208 while ((target = [[defTargets nextObject] weakRefUnderlyingObject]))
11210 if ([target
status] == STATUS_DEAD)
11243- (double) rangeToSecondaryTarget:(
Entity *)target
11250 dist = magnitude(delta);
11269 return dot_product(vector_normal(delta), ship_target->
v_forward);
11273- (BOOL) hasProximityAlertIgnoringTarget:(BOOL)ignore_target
11273- (BOOL) hasProximityAlertIgnoringTarget:(BOOL)ignore_target {
…}
11288 GLfloat best_cos = 0.99999;
11292 best_cos = 0.999999;
11294 basic_aim /= 1.0 + ((GLfloat)[
self missedShots] / 4.0);
11299 best_cos = 0.9999999;
11311 basic_aim *= 1.3 +
randf();
11323 GLfloat sunGlareAngularSize = atan([sun radius]/HPdistance([
self position], [sun
position])) * SUN_GLARE_MULT_FACTOR + (SUN_GLARE_ADD_FACTOR);
11325 if (glareLevel > 0.1f)
11328 basic_aim *= (1.0 + glareLevel*3.0);
11330 if (glareLevel > 0.5f)
11333 best_cos = 0.99999;
11340 GLfloat max_cos = sqrt(1-(basic_aim * basic_aim / 100000000.0));
11342 if (max_cos < best_cos)
11351- (GLfloat) lookingAtSunWithThresholdAngleCos:(GLfloat) thresholdAngleCos
11354 GLfloat measuredCos = 999.0f, measuredCosAbs;
11355 GLfloat sunBrightness = 0.0f;
11365 measuredCos = -dot_product(unitRelativePosition,
v_forward);
11368 measuredCos = +dot_product(unitRelativePosition,
v_forward);
11371 measuredCos = +dot_product(unitRelativePosition,
v_right);
11374 measuredCos = -dot_product(unitRelativePosition,
v_right);
11379 measuredCosAbs = fabs(measuredCos);
11380 if (thresholdAngleCos <= measuredCosAbs && measuredCosAbs <= 1.0f)
11382 sunBrightness = (measuredCos - thresholdAngleCos) / (1.0f - thresholdAngleCos);
11383 if (sunBrightness < 0.0f) sunBrightness = 0.0f;
11385 return sunBrightness * sunBrightness * sunBrightness;
11351- (GLfloat) lookingAtSunWithThresholdAngleCos:(GLfloat) thresholdAngleCos {
…}
11393 GLfloat dq = -1.0f;
11394 GLfloat d2, radius, astq;
11395 Vector rel_pos, urp;
11396 if ([weapon_type isTurretLaser])
11402 if (target ==
nil)
return NO;
11403 if ([target
status] == STATUS_DEAD)
return NO;
11411 d2 = magnitude2(rel_pos);
11412 urp = vector_normal_or_zbasis(rel_pos);
11425 dq = -dot_product(urp,
v_right);
11429 dq = +dot_product(urp,
v_right);
11436 if (dq < 0.0)
return NO;
11439 if (dq > aim*aim)
return YES;
11444 astq = sqrt(1.0 - radius * radius / (d2 * 9));
11446 return (fabs(dq) >= astq);
11476 NSUInteger multiplier = 1;
11485 if (![weapon_type isTurretLaser])
11490 if (![
self onTarget:direction withWeapon:weapon_type])
return NO;
11495 if ([weapon_type isTurretLaser])
11536 NSEnumerator *subEnum =
nil;
11540 if ([se fireSubentityLaserShot:range])
11556- (BOOL) fireMainWeapon:(
double)range
11574 BOOL hasTurrets = NO;
11575 while (
isWeaponNone(weapon_type) && (se = [subEnum nextObject]))
11579 if (se->
behaviour == BEHAVIOUR_TRACK_AS_TURRET)
11556- (BOOL) fireMainWeapon:(
double)range {
…}
11602- (BOOL) fireAftWeapon:(
double)range
11602- (BOOL) fireAftWeapon:(
double)range {
…}
11612- (BOOL) firePortWeapon:(
double)range
11612- (BOOL) firePortWeapon:(
double)range {
…}
11622- (BOOL) fireStarboardWeapon:(
double)range
11622- (BOOL) fireStarboardWeapon:(
double)range {
…}
11644- (BOOL) fireTurretCannon:(
double) range
11669 while ((father)&&(father != last) && (father !=
NO_TARGET))
11684 energy:weapon_damage
11685 duration:weaponRange/TURRET_SHOT_SPEED
11686 color:laser_color];
11688 [
shot autorelease];
11689 [UNIVERSE addEntity:shot];
11644- (BOOL) fireTurretCannon:(
double) range {
…}
11729- (BOOL) fireSubentityLaserShot:(
double)range
11737 NSAssert([parent isShipWithSubEntityShip:
self],
@"-fireSubentityLaserShot: called on ship which is not a subentity.");
11750 ShipEntity *victim = [UNIVERSE firstShipHitByLaserFromShip:
self inDirection:direction offset:kZeroVector gettingRangeFound:&hitAtRange];
11763 [PLAYER addRoleForAggression:victim];
11778 [
shot setRange:hitAtRange];
11780 HPVector flash_pos = HPvector_add([shot
position], vectorToHPVector(vector_multiply_scalar(vd, hitAtRange)));
11781 [UNIVERSE addLaserHitEffectsAt:flash_pos against:victim damage:weapon_damage color:laser_color];
11794 Vector victimDirection = vector_normal(HPVectorToVector(HPvector_subtract([victim
position], [parent
position])));
11795 if (dot_product(shotDirection, victimDirection) > 0.995)
11799 [PLAYER addRoleForAggression:victim];
11810 [UNIVERSE addEntity:shot];
11729- (BOOL) fireSubentityLaserShot:(
double)range {
…}
11817- (BOOL) fireDirectLaserShot:(
double)range
11817- (BOOL) fireDirectLaserShot:(
double)range {
…}
11831 while ((target = [[targetEnum nextObject] weakRefUnderlyingObject]))
11855- (BOOL) fireDirectLaserShotAt:(
Entity *)my_target
11857 GLfloat hit_at_range;
11861 r_pos = vector_normal_or_zbasis([
self vectorTo:my_target]);
11865 GLfloat acc_factor = (10.0 -
accuracy) * 0.001;
11867 q_laser.x += acc_factor * (
randf() - 0.5);
11868 q_laser.y += acc_factor * (
randf() - 0.5);
11869 q_laser.z += acc_factor * (
randf() - 0.5);
11870 quaternion_normalize(&q_laser);
11875 ShipEntity *victim = [UNIVERSE firstShipHitByLaserFromShip:
self inDirection:WEAPON_FACING_FORWARD offset:kZeroVector gettingRangeFound:&hit_at_range];
11899 if (hit_at_range * hit_at_range < range_limit2)
11903 [
shot setRange:hit_at_range];
11905 HPVector flash_pos = HPvector_add([shot
position], vectorToHPVector(vector_multiply_scalar(vd, hit_at_range)));
11906 [UNIVERSE addLaserHitEffectsAt:flash_pos against:victim damage:weapon_damage color:laser_color];
11910 [UNIVERSE addEntity:shot];
11920 NSArray *laserPortOffset =
nil;
11940 return laserPortOffset;
11944- (BOOL) fireLaserShotInDirection:(
OOWeaponFacing)direction weaponIdentifier:(NSString *)weaponIdentifier
11947 GLfloat hit_at_range;
11948 NSUInteger i, barrels;
11954 NSMutableArray *shotEntities = [
NSMutableArray arrayWithCapacity:barrels];
11961 effective_damage /= (GLfloat)barrels;
11964 for (i=0;i<barrels;i++)
11970 ShipEntity *victim = [UNIVERSE firstShipHitByLaserFromShip:
self inDirection:direction offset:laserPortOffset gettingRangeFound:&hit_at_range];
11988 [PLAYER addRoleForAggression:victim];
12007 if (hit_at_range * hit_at_range < range_limit2)
12011 [
shot setRange:hit_at_range];
12013 HPVector flash_pos = HPvector_add([shot
position], vectorToHPVector(vector_multiply_scalar(vd, hit_at_range)));
12014 [UNIVERSE addLaserHitEffectsAt:flash_pos against:victim damage:effective_damage color:laser_color];
12042 [PLAYER addRoleForAggression:victim];
12044 [
victim setPrimaryAggressor:
self];
12045 [
victim setFoundTarget:
self];
12046 [
victim reactToAIMessage:@"ATTACKER_MISSED" context:@"attacker narrowly misses"];
12047 [
victim doScriptEvent:OOJSID("shipBeingAttackedUnsuccessfully") withArgument:
self];
12053 [UNIVERSE addEntity:shot];
11944- (BOOL) fireLaserShotInDirection:(
OOWeaponFacing)direction weaponIdentifier:(NSString *)weaponIdentifier {
…}
12068- (void) adjustMissedShots:(
int) delta
12068- (void) adjustMissedShots:(
int) delta {
…}
12110 float m = (w < h) ? 0.25 * w: 0.25 * h;
12114 Vector vel = vector_multiply_scalar(HPVectorToVector(HPvector_subtract(
origin,
position)), 2.0);
12120 duration:2.0 + 3.0 * randf()
12125 [UNIVERSE addEntity:spark];
12132- (void) considerFiringMissile:(
double)delta_t
12134 int missile_chance = 0;
12135 int rhs = 3.2 / delta_t;
12136 if (rhs) missile_chance = 1 + (
ranrot_rand() % rhs);
12139 if (
missiles > missile_chance * hurt_factor)
12132- (void) considerFiringMissile:(
double)delta_t {
…}
12155 start = [shipinfoDictionary oo_vectorForKey:@"missile_launch_position" defaultValue:start];
12161 if (start.x == 0.0f && start.y == 0.0f && start.z <= 0.0f)
12163 OOLog(
@"ship.missileLaunch.invalidPosition",
@"***** ERROR: The missile_launch_position defines a position %@ behind the %@. In future versions such missiles may explode on launch because they have to travel through the ship.", VectorDescription(start),
self);
12186 Vector start, v_eject;
12192 double throw_speed = 250.0f;
12216 if (identifier ==
nil)
12221 missile = [UNIVERSE newShipWithRole:identifier];
12230 missile = [UNIVERSE newShipWithRole:identifier];
12243 v_eject = vector_normal(start);
12251 start = vector_add(start, vector_multiply_scalar(v_eject, mcr));
12264 if ([missile
scanClass] == CLASS_THARGOID)
12292 [UNIVERSE addEntity:missile];
12323- (void) setIsMissileFlag:(BOOL)newValue
12323- (void) setIsMissileFlag:(BOOL)newValue {
…}
12356 if (![
self hasECM])
return NO;
12359 [UNIVERSE addEntity:ecmDevice];
12388 [
self setSpeed: maxFlightSpeed + 300];
12389 ShipEntity* bomb = [UNIVERSE newShipWithRole:@"energy-bomb"];
12390 if (bomb ==
nil)
return NO;
12395 Quaternion random_direction;
12398 double random_roll =
randf() - 0.5;
12399 double random_pitch =
randf() - 0.5;
12402 rpos = HPvector_subtract([
self position], vectorToHPVector(vector_multiply_scalar(
v_forward, start)));
12404 double eject_speed = -800.0;
12406 eject_speed *= 0.5 * (
randf() - 0.5);
12407 vel = vector_add(vel, vector_multiply_scalar(
v_up, eject_speed));
12408 eject_speed *= 0.5 * (
randf() - 0.5);
12409 vel = vector_add(vel, vector_multiply_scalar(
v_right, eject_speed));
12420 [UNIVERSE addEntity:bomb];
12442 unsigned n_pods, i;
12443 NSMutableArray *passengers =
nil;
12451 n_pods = [shipinfoDictionary oo_unsignedIntForKey:@"has_escape_pod"];
12452 if (n_pods > 65) n_pods = 65;
12453 if (n_pods > 1) passengers = [
NSMutableArray arrayWithCapacity:n_pods-1];
12458 for (i = 0; i < [crew count]; i++)
12473 for (i = 1; i < n_pods; i++)
12508 if (preferred ==
nil)
12510 jetto = [[[cargo objectAtIndex:0] retain] autorelease];
12515 for (i=0;i<[cargo count];i++)
12519 jetto = [[[cargo objectAtIndex:i] retain] autorelease];
12527 jetto = [[[cargo objectAtIndex:0] retain] autorelease];
12534 [cargo removeObjectAtIndex:i];
12557 ShipEntity* jetto = [UNIVERSE reifyCargoPod:cargoObj];
12566 double eject_reaction = -eject_speed * [
jetto mass] / [
self mass];
12570 Vector vel, v_eject, v_eject_normal;
12572 double jetto_roll = 0;
12573 double jetto_pitch = 0;
12581 start = [shipinfoDictionary oo_vectorForKey:@"aft_eject_position" defaultValue:start];
12583 v_eject = vector_normal(start);
12590 start = vector_add(start, vector_multiply_scalar(v_eject, jcr));
12594 rpos = HPvector_add(rpos, vectorToHPVector(v_eject));
12595 v_eject = vector_normal(v_eject);
12596 v_eject_normal = v_eject;
12598 v_eject.x += (
randf() -
randf())/eject_speed;
12599 v_eject.y += (
randf() -
randf())/eject_speed;
12600 v_eject.z += (
randf() -
randf())/eject_speed;
12602 vel = vector_add(vector_multiply_scalar(
v_forward,
flightSpeed), vector_multiply_scalar(v_eject, eject_speed));
12603 velocity = vector_add(
velocity, vector_multiply_scalar(v_eject, eject_reaction));
12614 jetto_roll = ((
ranrot_rand() % 1024) - 512.0)/1024.0;
12615 jetto_pitch = ((
ranrot_rand() % 1024) - 512.0)/1024.0;
12625 [UNIVERSE addEntity:jetto];
12628 if ([jettoAI hasSuspendedStateMachines])
12652 ent = [[[collidingEntities objectAtIndex:0] retain] autorelease];
12653 [collidingEntities removeObjectAtIndex:0];
12663 [
self getDestroyedBy:ent damageType:[
ent isSun] ? kOODamageTypeHitASun : kOODamageTypeHitAPlanet];
12664 if (
self ==
PLAYER) [
self retain];
12686 BOOL otherIsStation = other == [UNIVERSE station];
12689 loc = HPVectorToVector(hploc);
12692 if ([
self canScoop:other])
12697 if ([other canScoop:
self])
12699 [
other scoopIn:
self];
12716 Vector v, vel1b = [
self velocity];
12718 if (otherParent !=
nil)
12732 v = vector_subtract(vel1b, v);
12734 GLfloat v2b = dot_product(v, loc);
12736 GLfloat v1a = sqrt(v2b * v2b * m2 / m1);
12737 if (v2b < 0.0f) v1a = -v1a;
12742 if (v2b < -1.0f)
return NO;
12751 dam1 = m2 * v2b * v2b / 50000000;
12752 dam2 = m1 * v2b * v2b / 50000000;
12755 Vector vel1a = vector_multiply_scalar(loc, -v1a);
12756 Vector vel2a = vector_multiply_scalar(loc, v2b);
12758 if (magnitude2(v) <= 0.1)
12760 vel1a = vector_multiply_scalar(loc, -1);
12765 if (otherParent !=
nil)
12771 [
other adjustVelocity:vel2a];
12776 BOOL selfDestroyed = (dam1 >
energy);
12777 BOOL otherDestroyed = (dam2 > [
other energy]) && !otherIsStation;
12784 vel2a = vector_multiply_scalar(vel2a, -1);
12785 [
other adjustVelocity:vel2a];
12797 [
other takeScrapeDamage: dam2 from:
self];
12800 if (otherDestroyed)
12802 vel1a = vector_multiply_scalar(vel1a, -1);
12807 if (!selfDestroyed && !otherDestroyed)
12809 float t = 10.0 * [UNIVERSE getTimeDelta];
12811 HPVector pos1a = HPvector_add([
self position], vectorToHPVector(vector_multiply_scalar(loc, t * v1a)));
12814 if (!otherIsStation)
12816 HPVector pos2a = HPvector_add([other
position], vectorToHPVector(vector_multiply_scalar(loc, t * v2b)));
12825 [
other doScriptEvent:OOJSID("shipCollided") withArgument:
self andReactToAIMessage:@"COLLISION"];
12843- (void) setTotalVelocity:(Vector)vel
12843- (void) setTotalVelocity:(Vector)vel {
…}
12849- (void) adjustVelocity:(Vector) xVel
12849- (void) adjustVelocity:(Vector) xVel {
…}
12855- (void) addImpactMoment:(Vector) moment fraction:(GLfloat) howmuch
12855- (void) addImpactMoment:(Vector) moment fraction:(GLfloat) howmuch {
…}
12863 if (other ==
nil)
return NO;
12866 if (
scanClass == CLASS_CARGO)
return NO;
12867 if ([other
scanClass] != CLASS_CARGO)
return NO;
12874 if (dot_product(
v_forward, HPVectorToVector(loc)) < 0.0f)
return NO;
12875 if ([
self isPlayer] && dot_product(
v_up, HPVectorToVector(loc)) > 0.0f)
return NO;
12883 if([
self status] == STATUS_BEING_SCOOPED)
return;
12885 [
self setAITo:@"nullAI.plist"];
12899 if (other != scooper && (
id)
self == [scooper
primaryTarget])
12909 [
other getTractoredBy:
self];
12925- (void) scoopUpProcess:(
ShipEntity *)other processEvents:(BOOL) procEvents processMessages:(BOOL) procMessages
12927 if (other ==
nil)
return;
12942 co_type = [
other commodityType];
12943 co_amount = [
other commodityAmount];
12953 [
other doScriptEvent:OOJSID("shipWasScooped") withArgument:
self];
12958 co_type = [
other commodityType];
12959 co_amount = [
other commodityAmount];
12966 [UNIVERSE clearPreviousMessage];
12967 NSString *shipName = [
other displayName];
12968 [UNIVERSE addMessage:OOExpandKey(@"scripted-item-scooped", shipName) forCount:4];
12970 [
other setCommodityForPod:nil andAmount:0];
12991 if (co_type ==
nil && co_amount > 0)
12993 co_type = [UNIVERSE getRandomCommodity];
12994 co_amount = [UNIVERSE getRandomAmountOfCommodity:co_type];
12999 [
other setCommodity:co_type andAmount:co_amount];
13008 [UNIVERSE clearPreviousMessage];
13010 for (i = 0; i < [[
other crew] count]; i++)
13016 [UNIVERSE addMessage:OOExpandKey(@"scoop-captured-character", characterName) forCount: 4.5];
13018 else if ([rescuee insuranceCredits])
13020 [UNIVERSE addMessage:OOExpandKey(@"scoop-rescued-character", characterName) forCount: 4.5];
13024 [UNIVERSE addMessage: DESC(@"scoop-got-slave") forCount: 4.5];
13037 [UNIVERSE clearPreviousMessage];
13038 [UNIVERSE addMessage:[UNIVERSE describeCommodity:co_type amount:co_amount] forCount:4.5];
13042 [cargo insertObject:other atIndex:0];
13044 [
other performTumble];
13055 if ([other
status] != STATUS_IN_HOLD)
13057 if ([
cargo containsObject:other])
13059 [cargo removeObject:other];
13081 [UNIVERSE removeEntity:other];
12925- (void) scoopUpProcess:(
ShipEntity *)other processEvents:(BOOL) procEvents processMessages:(BOOL) procMessages {
…}
13085- (BOOL) cascadeIfAppropriateWithDamageAmount:(
double)amount cascadeOwner:(
Entity *)owner
13090 case CLASS_WORMHOLE:
13093 case CLASS_VISUAL_EFFECT:
13102 case CLASS_STATION:
13106 case CLASS_MILITARY:
13107 case CLASS_THARGOID:
13108 case CLASS_MISSILE:
13109 case CLASS_NOT_SET:
13110 case CLASS_NO_DRAW:
13111 case CLASS_NEUTRAL:
13114 if (energy < amount && energy > 10 && [
self countsAsKill])
13085- (BOOL) cascadeIfAppropriateWithDamageAmount:(
double)amount cascadeOwner:(
Entity *)owner {
…}
13126- (void) takeEnergyDamage:(
double)amount from:(
Entity *)ent becauseOf:(
Entity *)other weaponIdentifier:(NSString *)weaponIdentifier
13128 if ([
self status] == STATUS_DEAD)
return;
13129 if (amount <= 0.0)
return;
13159 if ((other)&&([other
isShip]))
13164 if (hunter !=
nil && [
self owner] != hunter)
13210 if (groupLeader !=
self)
13220 NSEnumerator *groupEnum =
nil;
13223 for (groupEnum = [
group mutationSafeEnumerator]; (otherPirate = [
groupEnum nextObject]); )
13225 if (otherPirate !=
self &&
randf() < 0.5)
13233 else if (iAmTheLaw)
13235 NSEnumerator *groupEnum =
nil;
13238 for (groupEnum = [
group mutationSafeEnumerator]; (otherPolice = [
groupEnum nextObject]); )
13240 if (otherPolice !=
self)
13252 if (iAmTheLaw && !uAreTheLaw)
13264 if ([hunter
behaviour] == BEHAVIOUR_ATTACK_FLY_TO_TARGET)
13275 else if (energyMine) damageType = kOODamageTypeCascadeWeapon;
13280 if (cascade)
energy = 0.0;
13126- (void) takeEnergyDamage:(
double)amount from:(
Entity *)ent becauseOf:(
Entity *)other weaponIdentifier:(NSString *)weaponIdentifier {
…}
13313 OOLog(
@"ShipEntity.abandonShip.failed",
@"%@",
@"Player cannot abandon ship while docked.");
13319 OOLog(
@"ShipEntity.abandonShip.failed",
@"Ship abandonment was requested for %@, but this ship does not carry escape pod(s).",
self);
13329 while ([
self hasEquipmentItemProviding:
@"EQ_ESCAPE_POD"])
13333 [
self setAITo:@"nullAI.plist"];
13345 NSEnumerator *escortEnum =
nil;
13365 while ([
self hasEquipmentItemProviding:
@"EQ_ESCAPE_POD"])
13374 OOLog(
@"ShipEntity.abandonShip.notPossible",
@"Ship %@ cannot be abandoned at this time.",
self);
13380- (void) takeScrapeDamage:(
double) amount from:(
Entity *)ent
13382 if ([
self status] == STATUS_DEAD)
return;
13384 if ([
self status] == STATUS_LAUNCHING|| [ent
status] == STATUS_LAUNCHING)
13403 if (
randf() < frag_chance)
13380- (void) takeScrapeDamage:(
double) amount from:(
Entity *)ent {
…}
13424- (void) takeHeatDamage:(
double)amount
13426 if ([
self status] == STATUS_DEAD)
return;
13424- (void) takeHeatDamage:(
double)amount {
…}
13463 [dockingInstructions autorelease];
13471 [UNIVERSE removeEntity:
self];
13478 if (station ==
nil)
return;
13493 if (w_hole ==
nil)
return;
13494 if ([
self status] == STATUS_ENTERING_WITCHSPACE)
13526 [UNIVERSE addWitchspaceJumpEffectForShip:
self];
13532 [UNIVERSE witchspaceShipWithPrimaryRole:[
self primaryRole]];
13535 [UNIVERSE removeEntity:
self];
13546 GLfloat min_d1 = [UNIVERSE safeWitchspaceExitDistance];
13548 while (fabs(d1) < min_d1)
13554 HPVector exitposition = [UNIVERSE getWitchspaceExitPosition];
13555 exitposition.x += v1.x * d1;
13556 exitposition.y += v1.y * d1;
13557 exitposition.z += v1.z * d1;
13566 orientation = [UNIVERSE getWitchspaceExitRotation];
13582 [
self setStatus:STATUS_EXITING_WITCHSPACE];
13585 [UNIVERSE addWitchspaceJumpEffectForShip:
self];
13591- (void) markAsOffender:(
int)offence_value
13591- (void) markAsOffender:(
int)offence_value {
…}
13607 if ((
scanClass == CLASS_THARGOID ||
scanClass == CLASS_STATION) && reason != kOOLegalStatusReasonSetup && reason != kOOLegalStatusReasonByScript)
13614 jsval amountVal = JSVAL_VOID;
13615 JS_NewNumberValue(context, (
bounty | offence_value)-
bounty, &amountVal);
13617 bounty |= offence_value;
13621 ShipScriptEvent(context,
self,
"shipBountyChanged", amountVal, reasonVal);
13633 NSEnumerator *subEnum =
nil;
13641 [
se setActive:YES];
13652 NSEnumerator *subEnum =
nil;
13675- (void) setDestination:(HPVector) dest
13675- (void) setDestination:(HPVector) dest {
…}
13682- (void) setEscortDestination:(HPVector) dest
13682- (void) setEscortDestination:(HPVector) dest {
…}
13698 if ([
self bounty] == 0 && [potentialEscort
bounty] != 0)
13713 if (
self == other_ship)
return NO;
13716 if ([
self status] != STATUS_IN_FLIGHT)
return NO;
13720 if ([
shipAI stackDepth] > 3)
13722 OOLog(
@"ship.escort.reject",
@"%@ rejecting escort %@ because AI stack depth is %lu.",
self, other_ship, [
shipAI stackDepth]);
13726 if ([
self canAcceptEscort:other_ship])
13730 if ([
escortGroup containsShip:other_ship])
return YES;
13734 if (
_maxEscortCount == 0 && ([
self hasPrimaryRole:
@"police"] || [
self hasPrimaryRole:
@"hunter"] || [
self hasRole:
@"thargoid-mothership"]))
13756 OOLog(
@"ship.escort.accept",
@"%@ accepting escort %@.",
self, other_ship);
13759 [
other_ship doScriptEvent:OOJSID("escortAccepted") withArgument:
self];
13765 OOLog(
@"ship.escort.reject",
@"%@ already got max escorts(%ld). Escort rejected: %@.",
self,
escortCount, other_ship);
13770 OOLog(
@"ship.escort.reject",
@"%@ failed canAcceptEscort for escort %@.",
self, other_ship);
13792 if (!_escortPositionsValid)
13796 jsval args[] = { INT_TO_JSVAL(0), INT_TO_JSVAL(_maxEscortCount) };
13800 _escortPositionsValid = YES;
13803 for (i = 0; i < _maxEscortCount; i++)
13805 args[0] = INT_TO_JSVAL(i);
13806 OK = [
script callMethod:OOJSID("coordinatesForEscortPosition")
13808 withArguments:args count:sizeof args / sizeof *args
13821- (HPVector) coordinatesForEscortPosition:(
unsigned)idx
13821- (HPVector) coordinatesForEscortPosition:(
unsigned)idx {
…}
13842 NSEnumerator *escortEnum =
nil;
13845 NSMutableSet *idleEscorts =
nil;
13846 unsigned deployCount;
13868 if (![[[escort
getAI]
name] isEqualToString:
@"interceptAI.plist"] && ![escort
hasNewAI])
13886 for (escortEnum = [idleEscorts objectEnumerator]; (escort = [
escortEnum nextObject]); )
13892 if (--deployCount == 0)
break;
13905 NSEnumerator *escortEnum =
nil;
13912 float delay = i++ * 3.0 + 1.5;
13934- (void) setTargetToNearestStationIncludingHostiles:(BOOL) includeHostiles
13948 int ent_count =
UNIVERSE->n_entities;
13952 int station_count = 0;
13953 for (i = 0; i < ent_count; i++)
13959 for (i = 0; i < station_count; i++)
13963 if (range2 < nearest2 && (includeHostiles || ![thing isHostileTo:
self]))
13969 for (i = 0; i < station_count; i++)
13970 [my_entities[i] release];
13934- (void) setTargetToNearestStationIncludingHostiles:(BOOL) includeHostiles {
…}
14003 if (!system_station)
14031 [
planet welcomeShuttle:
self];
14038 OOLog(
@"planet.collide.shuttleLanded",
@"DEBUG: %@ landed on planet %@",
self, planet);
14042 [UNIVERSE removeEntity:
self];
14049 [[UNIVERSE findEntitiesMatchingPredicate:IsStationPredicate
14053 makeObjectsPerformSelector:@selector(abortDockingForShip:) withObject:
self];
14065 [[UNIVERSE findShipsMatchingPredicate:HasRolePredicate
14066 parameter:@"tharglet"
14067 inRange:SCANNER_MAX_RANGE
14069 makeObjectsPerformSelector:@selector(sendAIMessage:) withObject:@"THARGOID_DESTROYED"];
14084 if ([entity
scanClass] == CLASS_POLICE &&
14099 if ([
self bounty])
return;
14100 if (!aggressor_ship)
return;
14109 NSArray *authorities =
nil;
14110 NSEnumerator *authEnum =
nil;
14113 authorities = [UNIVERSE findShipsMatchingPredicate:AuthorityPredicate
14118 while ((auth = [authEnum nextObject]))
14128- (void) sendMessage:(NSString *) message_text toShip:(
ShipEntity*) other_ship withUnpilotedOverride:(BOOL)unpilotedOverride
14130 if (!other_ship || !message_text)
return;
14131 if (!
crew && !unpilotedOverride)
return;
14137 NSString *expandedMessage =
OOExpand(message_text);
14144 [UNIVERSE resetCommsLogColor];
14128- (void) sendMessage:(NSString *) message_text toShip:(
ShipEntity*) other_ship withUnpilotedOverride:(BOOL)unpilotedOverride {
…}
14151- (void) sendExpandedMessage:(NSString *)message_text toShip:(
ShipEntity *)other_ship
14153 if (!other_ship || !
crew)
14157 [lastRadioMessage autorelease];
14168 very_random_seed.
a = rand() & 255;
14169 very_random_seed.
b = rand() & 255;
14170 very_random_seed.
c = rand() & 255;
14171 very_random_seed.
d = rand() & 255;
14172 very_random_seed.
e = rand() & 255;
14173 very_random_seed.
f = rand() & 255;
14176 NSDictionary *specials = [
NSDictionary dictionaryWithObjectsAndKeys:
14151- (void) sendExpandedMessage:(NSString *)message_text toShip:(
ShipEntity *)other_ship {
…}
14186- (void) broadcastAIMessage:(NSString *) ai_message
14188 NSString *expandedMessage =
OOExpand(ai_message);
14186- (void) broadcastAIMessage:(NSString *) ai_message {
…}
14200- (void) broadcastMessage:(NSString *) message_text withUnpilotedOverride:(BOOL) unpilotedOverride
14202 NSString *expandedMessage =
OOExpand(message_text);
14205 if (!
crew && !unpilotedOverride)
14224 [UNIVERSE resetCommsLogColor];
14200- (void) broadcastMessage:(NSString *) message_text withUnpilotedOverride:(BOOL) unpilotedOverride {
…}
14240- (void) receiveCommsMessage:(NSString *) message_text from:(
ShipEntity *) other
14240- (void) receiveCommsMessage:(NSString *) message_text from:(
ShipEntity *) other {
…}
14247- (void) commsMessage:(NSString *)valueString withUnpilotedOverride:(BOOL)unpilotedOverride
14250 very_random_seed.
a = rand() & 255;
14251 very_random_seed.
b = rand() & 255;
14252 very_random_seed.
c = rand() & 255;
14253 very_random_seed.
d = rand() & 255;
14254 very_random_seed.
e = rand() & 255;
14255 very_random_seed.
f = rand() & 255;
14247- (void) commsMessage:(NSString *)valueString withUnpilotedOverride:(BOOL)unpilotedOverride {
…}
14283- (void) interpretAIMessage:(NSString *)ms
14290 int switcher_id = [(
NSString*)[
tokens objectAtIndex:1] intValue];
14291 Entity* switcher = [UNIVERSE entityForUniversalID:switcher_id];
14292 int rescuer_id = [(
NSString*)[
tokens objectAtIndex:2] intValue];
14293 Entity* rescuer = [UNIVERSE entityForUniversalID:rescuer_id];
14283- (void) interpretAIMessage:(NSString *)ms {
…}
14313- (BoundingBox) findBoundingBoxRelativeTo:(
Entity *)other InVectors:(Vector) _i :(Vector) _j :(Vector) _k
14313- (BoundingBox) findBoundingBoxRelativeTo:(
Entity *)other InVectors:(Vector) _i :(Vector) _j :(Vector) _k {
…}
14321- (void) spawn:(NSString *)roles_number
14324 NSString *roleString =
nil;
14325 NSString *numberString =
nil;
14328 if ([tokens
count] != 2)
14334 roleString = [
tokens oo_stringAtIndex:0];
14335 numberString = [
tokens oo_stringAtIndex:1];
14321- (void) spawn:(NSString *)roles_number {
…}
14358 int ent_count =
UNIVERSE->n_entities;
14363 int ship_count = 0;
14364 for (i = 0; i < ent_count; i++)
14365 if ((uni_entities[i]->
isShip)&&(uni_entities[i] !=
self))
14368 for (i = 0; (i < ship_count)&&(result ==
NO_TARGET) ; i++)
14372 GLfloat d2 = HPmagnitude2(delta);
14379 for (i = 0; i < ship_count; i++)
14380 [my_entities[i] release];
14392- (void) setTrackCloseContacts:(BOOL) value
14397 [closeContactsInfo release];
14392- (void) setTrackCloseContacts:(BOOL) value {
…}
14410#if OO_SALVAGE_SUPPORT
14412- (void) claimAsSalvage
14416 OOLog(
@"claimAsSalvage.called",
@"claimAsSalvage called on %@ %@", [
self name], [
self roleSet]);
14419 if (![
self isHulk])
14421 OOLog(
@"claimAsSalvage.failed.notHulk",
@"claimAsSalvage failed because not a hulk");
14426 [
self setTargetToSystemStation];
14427 if ([
self primaryTarget] ==
nil)
14429 OOLog(
@"claimAsSalvage.failed.noStation",
@"claimAsSalvage failed because did not find a station");
14434 StationEntity *station = (StationEntity *)[
self primaryTarget];
14435 OOLog(
@"claimAsSalvage.requestingPilot",
@"claimAsSalvage asking station to launch a pilot boat");
14437 [
self setReportAIMessages:YES];
14438 OOLog(
@"claimAsSalvage.success",
@"claimAsSalvage setting own state machine to capturedShipAI.plist");
14439 [
self setAITo:@"capturedShipAI.plist"];
14443- (void) sendCoordinatesToPilot
14446 ShipEntity *scanShip, *pilot;
14448 n_scanned_ships = 0;
14450 OOLog(
@"ship.pilotage",
@"searching for pilot boat");
14451 while (scan &&(scan->
isShip == NO))
14461 scanShip = (ShipEntity *)scan;
14463 if ([
self hasRole:
@"pilot"] == YES)
14465 if ([scanShip primaryTarget] ==
nil)
14467 OOLog(
@"ship.pilotage",
@"found pilot boat with no target, will use this one");
14475 while (scan && (scan->
isShip == NO))
14483 OOLog(
@"ship.pilotage",
@"becoming pilot target and setting AI");
14486 [pilot
setAITo:@"pilotAI.plist"];
14487 [
self reactToAIMessage:@"FOUND_PILOT" context:@"flight update"];
14492- (void) pilotArrived
14495 [
self reactToAIMessage:@"PILOT_ARRIVED" context:@"flight update"];
14503 NSMutableArray *flags =
nil;
14504 NSString *flagsString =
nil;
14509 OOLog(
@"dumpState.shipEntity",
@"Name: %@",
name);
14511 OOLog(
@"dumpState.shipEntity",
@"Roles: %@", [
self roleSet]);
14513 OOLog(
@"dumpState.shipEntity",
@"Script: %@",
script);
14517 if (target ==
nil) target =
@"<none>";
14518 OOLog(
@"dumpState.shipEntity",
@"Target: %@", target);
14519 OOLog(
@"dumpState.shipEntity",
@"Destination: %@", HPVectorDescription(
_destination));
14520 OOLog(
@"dumpState.shipEntity",
@"Other destination: %@", HPVectorDescription(
coordinates));
14523 OOLog(
@"dumpState.shipEntity",
@"Thrust: %g",
thrust);
14525 OOLog(
@"dumpState.shipEntity",
@"Fuel: %i",
fuel);
14527 OOLog(
@"dumpState.shipEntity",
@"Missile count: %u",
missiles);
14531 OOLog(
@"dumpState.shipEntity.ai",
@"%@",
@"AI:");
14538 @catch (
id exception) {}
14542 OOLog(
@"dumpState.shipEntity",
@"Jink position: %@", VectorDescription(
jink));
14546 OOLog(
@"dumpState.shipEntity",
@"Time since shot: %g", [
self shotTime]);
14550 OOLog(
@"dumpState.shipEntity",
@"Beacon code: %@", [
self beaconCode]);
14556 #define ADD_FLAG_IF_SET(x) if (x) { [flags addObject:@#x]; }
14570 flagsString = [
flags count] ? [
flags componentsJoinedByString:@", "] : (NSString *)
@"none";
14571 OOLog(
@"dumpState.shipEntity",
@"Flags: %@", flagsString);
14588- (void) overrideScriptInfo:(NSDictionary *)override
14591 else if (
override !=
nil)
14593 NSMutableDictionary *newInfo = [
NSMutableDictionary dictionaryWithDictionary:scriptInfo];
14594 [
newInfo addEntriesFromDictionary:override];
14595 [scriptInfo release];
14588- (void) overrideScriptInfo:(NSDictionary *)override {
…}
14631- (void) doScriptEvent:(jsid)message
14631- (void) doScriptEvent:(jsid)message {
…}
14639- (void) doScriptEvent:(jsid)message withArgument:(
id)argument
14639- (void) doScriptEvent:(jsid)message withArgument:(
id)argument {
…}
14650- (void) doScriptEvent:(jsid)message
14651 withArgument:(
id)argument1
14652 andArgument:(
id)argument2
14650- (void) doScriptEvent:(jsid)message {
…}
14663- (void) doScriptEvent:(jsid)message withArguments:(NSArray *)arguments
14667 jsval *argv = NULL;
14670 argc = (uintN)[arguments
count];
14673 argv = malloc(
sizeof *argv * argc);
14676 for (i = 0; i != argc; ++i)
14678 argv[
i] = [[
arguments objectAtIndex:i] oo_jsValueInContext:context];
14690 for (i = 0; i != argc; ++i)
14692 JS_RemoveValueRoot(context, &argv[i]);
14663- (void) doScriptEvent:(jsid)message withArguments:(NSArray *)arguments {
…}
14701- (void) doScriptEvent:(jsid)message withArguments:(jsval *)argv count:(uintN)argc
14701- (void) doScriptEvent:(jsid)message withArguments:(jsval *)argv count:(uintN)argc {
…}
14709- (void) doScriptEvent:(jsid)message inContext:(JSContext *)context withArguments:(jsval *)argv count:(uintN)argc
14709- (void) doScriptEvent:(jsid)message inContext:(JSContext *)context withArguments:(jsval *)argv count:(uintN)argc {
…}
14717- (void) reactToAIMessage:(NSString *)message context:(NSString *)debugContext
14717- (void) reactToAIMessage:(NSString *)message context:(NSString *)debugContext {
…}
14723- (void) sendAIMessage:(NSString *)message
14723- (void) sendAIMessage:(NSString *)message {
…}
14729- (void) doScriptEvent:(jsid)scriptEvent andReactToAIMessage:(NSString *)aiMessage
14729- (void) doScriptEvent:(jsid)scriptEvent andReactToAIMessage:(NSString *)aiMessage {
…}
14736- (void) doScriptEvent:(jsid)scriptEvent withArgument:(
id)argument andReactToAIMessage:(NSString *)aiMessage
14736- (void) doScriptEvent:(jsid)scriptEvent withArgument:(
id)argument andReactToAIMessage:(NSString *)aiMessage {
…}
14747 if ([
self status] == STATUS_DOCKED)
14761 if ([
self status] == STATUS_DOCKED)
14774 while ((ship = [sEnum nextObject]))
14788 if (ptarget !=
nil && [ptarget
isShip])
14803 while ((ship = [sEnum nextObject]))
14817 while ((ship = [sEnum nextObject]))
14844 desc = [
NSString stringWithFormat:@"%@ mass %g", desc, [
self mass]];
14856@implementation Entity (SubEntityRelationship)
14864- (void) drawSubEntityImmediate:(
bool)immediate translucent:(
bool)translucent
14864- (void) drawSubEntityImmediate:(
bool)immediate translucent:(
bool)translucent {
…}
14872@implementation ShipEntity (SubEntityRelationship)
14876 assert ([
self isShip]);
14878 if (![other isShip])
return NO;
14879 if (![other isSubEntity])
return NO;
14880 if ([other owner] !=
self)
return NO;
14884 if (![
self hasSubEntity:(
ShipEntity *)other])
14886 OOLogERR(
@"ship.subentity.sanityCheck.failed",
@"%@ thinks it's a subentity of %@, but the supposed parent does not agree. %@", [other shortDescription], [
self shortDescription],
@"This is an internal error, please report it.");
14900 static NSDictionary *macros =
nil;
14913 static NSSet *entityWhitelist =
nil;
14914 static NSSet *shipWhitelist =
nil;
14915 static NSSet *playerShipWhitelist =
nil;
14916 static NSSet *visualEffectWhitelist =
nil;
14918 if (entityWhitelist ==
nil)
14921 entityWhitelist = [[NSSet alloc] initWithArray:[wlDict oo_arrayForKey:@"shader_entity_binding_methods"]];
14922 shipWhitelist = [[NSSet alloc] initWithArray:[wlDict oo_arrayForKey:@"shader_ship_binding_methods"]];
14923 playerShipWhitelist = [[NSSet alloc] initWithArray:[wlDict oo_arrayForKey:@"shader_player_ship_binding_methods"]];
14924 visualEffectWhitelist = [[NSSet alloc] initWithArray:[wlDict oo_arrayForKey:@"shader_visual_effect_binding_methods"]];
14927 if ([bindingTarget isKindOfClass:[
Entity class]])
14929 if ([entityWhitelist containsObject:propertyName])
return YES;
14930 if ([bindingTarget isShip])
14932 if ([shipWhitelist containsObject:propertyName])
return YES;
14934 if ([bindingTarget isPlayerLikeShip])
14936 if ([playerShipWhitelist containsObject:propertyName])
return YES;
14938 if ([bindingTarget isVisualEffect])
14940 if ([visualEffectWhitelist containsObject:propertyName])
return YES;
14956 return weapon ==
nil || [[weapon
identifier] isEqualToString:@"EQ_WEAPON_NONE"];
240- (BOOL) setUpFromDictionary:(NSDictionary *) shipDict {
…}
#define NO_DRAW_DISTANCE_FACTOR
OOScanClass OOScanClassFromString(NSString *string) PURE_FUNC
#define SCANNER_MAX_RANGE
#define SCANNER_MAX_RANGE2
#define ADD_FLAG_IF_SET(x)
#define foreachkey(VAR, DICT)
OOINLINE jsval OOJSValueFromLegalStatusReason(JSContext *context, OOLegalStatusReason value)
OOINLINE jsval OOJSValueFromShipDamageType(JSContext *context, OOShipDamageType value)
OOCargoType StringToCargoType(NSString *string) PURE_FUNC
NSString * OOStringFromLegalStatusReason(OOLegalStatusReason reason)
OOINLINE void OODebugDrawColoredBoundingBox(BoundingBox box, OOColor *color)
OOINLINE void OODebugDrawBoundingBox(BoundingBox box)
void OODebugDrawColoredLine(Vector start, Vector end, OOColor *color)
void OODebugDrawPoint(Vector position, OOColor *color)
void OOStandardsDeprecated(NSString *message)
BOOL OOEnforceStandards(void)
const HPVector kZeroHPVector
HPVector OOHPVectorRandomSpatial(OOHPScalar maxLength)
#define OOJS_PROFILE_EXIT
#define OOJS_PROFILE_ENTER
BOOL JSValueToVector(JSContext *context, jsval value, Vector *outVector) NONNULL_FUNC
OOINLINE jsval OOJSValueFromNativeObject(JSContext *context, id object)
id OOJSNativeObjectFromJSObject(JSContext *context, JSObject *object)
OOINLINE JSContext * OOJSAcquireContext(void)
OOINLINE void OOJSRelinquishContext(JSContext *context)
#define OOJSAddGCValueRoot(context, root, name)
void OOLogPushIndent(void)
#define OOLogWARN(class, format,...)
#define OOLogERR(class, format,...)
void OOLogPopIndent(void)
BOOL OOLogWillDisplayMessagesInClass(NSString *inMessageClass)
#define OOLog(class, format,...)
HPVector OOHPVectorMultiplyMatrix(HPVector v, OOMatrix m)
const OOMatrix kIdentityMatrix
Vector OOVectorMultiplyMatrix(Vector v, OOMatrix m)
void OOGLPushModelView(void)
void OOGLTranslateModelView(Vector vector)
void OOGLMultModelView(OOMatrix matrix)
OOMatrix OOGLPopModelView(void)
#define OOVerifyOpenGLState()
Vector vector_up_from_quaternion(Quaternion quat)
void quaternion_rotate_about_x(Quaternion *quat, OOScalar angle)
Vector vector_right_from_quaternion(Quaternion quat)
Vector vector_forward_from_quaternion(Quaternion quat)
void quaternion_rotate_about_z(Quaternion *quat, OOScalar angle)
void quaternion_set_random(Quaternion *quat)
Vector quaternion_rotate_vector(Quaternion q, Vector v)
const Quaternion kIdentityQuaternion
Quaternion quaternion_rotation_between(Vector v0, Vector v1)
void quaternion_rotate_about_y(Quaternion *quat, OOScalar angle)
const Quaternion kZeroQuaternion
void quaternion_rotate_about_axis(Quaternion *quat, Vector axis, OOScalar angle)
Quaternion quaternion_multiply(Quaternion q1, Quaternion q2)
@ STELLAR_TYPE_NORMAL_PLANET
Random_Seed OOStringExpanderDefaultRandomSeed(void)
NSString * OOExpandDescriptionString(Random_Seed seed, NSString *string, NSDictionary *overrides, NSDictionary *legacyLocals, NSString *systemName, OOExpandOptions options)
#define OOExpand(string,...)
NSMutableArray * ScanTokensFromString(NSString *values)
BOOL ScanVectorFromString(NSString *xyzString, Vector *outVector)
uint8_t OOWeaponFacingSet
NSString * OOCommodityType
@ AEGIS_CLOSE_TO_MAIN_PLANET
@ AEGIS_CLOSE_TO_ANY_PLANET
uint64_t OOCreditsQuantity
#define VALID_WEAPON_FACINGS
@ CARGO_FLAG_FULL_CONTRABAND
@ CARGO_FLAG_FULL_PLENTIFUL
@ CARGO_FLAG_FULL_UNIFORM
@ CARGO_FLAG_FULL_MEDICAL
@ CARGO_FLAG_FULL_PASSENGERS
@ WEAPON_FACING_STARBOARD
const Vector kBasisYVector
const Vector kBasisZVector
Vector OORandomPositionInBoundingBox(BoundingBox bb)
const Vector kBasisXVector
static GLfloat scripted_color[4]
static BOOL isHitByOctree(Octree_details axialDetails, Octree_details otherDetails, Vector delta, Triangle other_ijk)
static NSString *const kOOLogSyntaxAddShips
#define HYPERSPEED_FACTOR
@ SCOOP_STATUS_NOT_INSTALLED
#define MIN_HYPERSPEED_FACTOR
#define INITIAL_SHOT_TIME
#define COMBAT_BROADSIDE_IN_RANGE_FACTOR
OOEquipmentType * OOWeaponType
BOOL isWeaponNone(OOWeaponType weapon)
#define COMBAT_AI_TRACKS_CLOSER
#define SHIP_COOLING_FACTOR
#define CLOAKING_DEVICE_MIN_ENERGY
#define COMBAT_AI_WEAPON_TEMP_READY
OOWeaponType OOWeaponTypeFromEquipmentIdentifierStrict(NSString *string) PURE_FUNC
#define COMBAT_BROADSIDE_RANGE_FACTOR
#define COMBAT_AI_WEAPON_TEMP_USABLE
#define ShipScriptEventNoCx(ship, event,...)
#define TURRET_SHOT_RANGE
#define COMBAT_AI_ISNT_AWFUL
#define TURRET_MINIMUM_COS
NSDictionary * OODefaultShipShaderMacros(void)
#define SHIP_MIN_CABIN_TEMP
#define CLOAKING_DEVICE_START_ENERGY
#define NPC_MAX_WEAPON_TEMP
#define COMBAT_AI_FLEES_BETTER_2
#define MILITARY_JAMMER_ENERGY_RATE
#define CLOAKING_DEVICE_ENERGY_RATE
#define AIMS_AGGRESSOR_SWITCHED_TARGET
#define COMBAT_AI_DOGFIGHTER
#define WEAPON_COOLING_FACTOR
#define ENTITY_PERSONALITY_MAX
GLfloat getWeaponRangeFromType(OOWeaponType weapon_type)
#define SHIP_MAX_CABIN_TEMP
#define MILITARY_JAMMER_MIN_ENERGY
#define COMBAT_AI_FLEES_BETTER
#define TURRET_SHOT_SPEED
#define COMBAT_IN_RANGE_FACTOR
#define COMBAT_OUT_RANGE_FACTOR
#define COMBAT_WEAPON_RANGE_FACTOR
#define COMBAT_AI_CONFIDENCE_FACTOR
#define COMBAT_AI_IS_SMART
NSString * OOStringFromBehaviour(OOBehaviour behaviour) CONST_FUNC
OOWeaponType OOWeaponTypeFromEquipmentIdentifierSloppy(NSString *string) PURE_FUNC
#define BASELINE_SHIELD_LEVEL
#define SHIPENTITY_MAX_MISSILES
#define MAX_LANDING_SPEED2
#define SHIP_THRUST_FACTOR
OOWeaponType OOWeaponTypeFromString(NSString *string) PURE_FUNC
#define ShipScriptEvent(context, ship, event,...)
#define WEAPON_COOLING_CUTOUT
#define SHIP_INSULATION_FACTOR
#define SHIP_ENERGY_DAMAGE_TO_HEAT_FACTOR
static ShipEntity * doOctreesCollide(ShipEntity *prime, ShipEntity *other)
static GLfloat mascem_color1[4]
static GLfloat neutral_color[4]
static GLfloat cargo_color[4]
static GLfloat hostile_color[4]
static NSString *const kOOLogEntityBehaviourChanged
static GLfloat missile_color[4]
static GLfloat police_color1[4]
BOOL OOUniformBindingPermitted(NSString *propertyName, id bindingTarget)
static GLfloat mascem_color2[4]
static GLfloat jammed_color[4]
static GLfloat friendly_color[4]
static GLfloat police_color2[4]
#define PROXIMITY_AVOID_DISTANCE_FACTOR
OOShipGroup * rawEscortGroup()
Entity< OOStellarBody > * lastAegisLock()
void refreshEscortPositions()
void setOwner:(ShipEntity *ship)
void exitStateMachineWithMessage:(NSString *message)
void message:(NSString *ms)
void setState:afterDelay:(NSString *stateName,[afterDelay] NSTimeInterval delay)
NSString * shortDescriptionComponents()
void setState:(NSString *stateName)
void reactToMessage:context:(NSString *message,[context] NSString *debugContext)
BOOL validForAddToUniverse()
void wasAddedToUniverse()
GLfloat timeElapsedSinceSpawn()
OOUniversalID universalID
HPVector absolutePositionForSubentity()
NSMutableArray * collisionArray()
NSMutableArray * collidingEntities
void setVelocity:(Vector vel)
void moveForward:(double amount)
void setOrientation:(Quaternion quat)
void update:(OOTimeDelta delta_t)
GLfloat collisionRadius()
void setOwner:(Entity *ent)
void orientationChanged()
void setScanClass:(OOScanClass sClass)
void drawSubEntityImmediate:translucent:(bool immediate, [translucent] bool translucent)
void setDistanceTravelled:(GLfloat value)
GLfloat cam_zero_distance
GLfloat distanceTravelled
NSString * descriptionComponents()
ShipEntity * rootShipEntity()
void setEnergy:(GLfloat amount)
NSString * descriptionForObjDump()
Quaternion normalOrientation()
ShipEntity * parentEntity()
void takeEnergyDamage:from:becauseOf:weaponIdentifier:(double amount,[from] Entity *ent,[becauseOf] Entity *other,[weaponIdentifier] NSString *weaponIdentifier)
Vector vectorTo:(Entity *entity)
Vector relativePosition()
void setStatus:(OOEntityStatus stat)
void setPosition:(HPVector posn)
OOMatrix drawRotationMatrix()
id fragmentBurstFromEntity:(Entity *entity)
OOCharacter * characterWithDictionary:(NSDictionary *c_dict)
void setLegalStatus:(int value)
NSDictionary * infoForScripting()
OOCharacter * randomCharacterWithRole:andOriginalSystem:(NSString *c_role,[andOriginalSystem] OOSystemID s)
OOColor * colorWithRGBAComponents:(OORGBAComponents components)
OOColor * brightColorWithDescription:(id description)
OOColor * colorWithDescription:(id description)
void getRed:green:blue:alpha:(float *red,[green] float *green,[blue] float *blue,[alpha] float *alpha)
OOColor * colorWithHue:saturation:brightness:alpha:(float hue,[saturation] float saturation,[brightness] float brightness,[alpha] float alpha)
void setBindingTarget:(id< OOWeakReferenceSupport > target)
double findCollisionRadius()
void setDrawable:(OODrawable *drawable)
void drawImmediate:translucent:(bool immediate, [translucent] bool translucent)
NSString * conditionScript()
GLfloat weaponEnergyUse()
GLfloat weaponShotTemperature()
void addEquipmentWithInfo:(NSArray *itemInfo)
void setMissileRegistryRole:forShip:(NSString *roles,[forShip] NSString *shipKey)
OOCargoQuantity requiredCargoSpace()
NSString * getMissileRegistryRoleForShip:(NSString *shipKey)
OOEquipmentType * equipmentTypeWithIdentifier:(NSString *identifier)
NSArray * allEquipmentTypes()
GLfloat weaponRechargeRate()
double findCollisionRadius()
id exhaustForShip:withDefinition:andScale:(ShipEntity *ship,[withDefinition] NSArray *definition,[andScale] float scale)
instancetype explosionCloudFromEntity:withSettings:(Entity *entity,[withSettings] NSDictionary *settings)
instancetype explosionCloudFromEntity:withSize:andSettings:(Entity *entity,[withSize] float size,[andSettings] NSDictionary *settings)
instancetype explosionFlashFromEntity:(Entity *entity)
instancetype flasherWithDictionary:(NSDictionary *dictionary)
void rescaleBy:(GLfloat factor)
BOOL callMethod:inContext:withArguments:count:result:(jsid methodID,[inContext] JSContext *context,[withArguments] jsval *argv,[count] intN argc,[result] jsval *outResult)
instancetype laserFromShip:direction:offset:(ShipEntity *ship,[direction] OOWeaponFacing direction,[offset] Vector offset)
void setColor:(OOColor *color)
BoundingBox findSubentityBoundingBoxWithPosition:rotMatrix:(Vector position,[rotMatrix] OOMatrix rotMatrix)
instancetype meshWithName:cacheKey:materialDictionary:shadersDictionary:smooth:shaderMacros:shaderBindingTarget:scaleFactor:cacheWriteable:(NSString *name,[cacheKey] NSString *cacheKey,[materialDictionary] NSDictionary *materialDict,[shadersDictionary] NSDictionary *shadersDict,[smooth] BOOL smooth,[shaderMacros] NSDictionary *macros,[shaderBindingTarget] id< OOWeakReferenceSupport > object,[scaleFactor] float factor,[cacheWriteable] BOOL cacheWriteable)
instancetype quiriumCascadeFromShip:(ShipEntity *ship)
instancetype ringFromEntity:(Entity *sourceEntity)
id roleSetWithAddedRoleIfNotSet:probability:(NSString *role,[probability] float probability)
instancetype roleSetWithString:(NSString *roleString)
BOOL hasRole:(NSString *role)
id roleSetWithAddedRole:probability:(NSString *role,[probability] float probability)
instancetype roleSetWithRole:probability:(NSString *role,[probability] float probability)
id roleSetWithRemovedRole:(NSString *role)
id jsScriptFromFileNamed:properties:(NSString *fileName,[properties] NSDictionary *properties)
BOOL addShip:(ShipEntity *ship)
void setLeader:(ShipEntity *leader)
NSEnumerator * mutationSafeEnumerator()
instancetype groupWithName:(NSString *name)
NSEnumerator * objectEnumerator()
BOOL removeShip:(ShipEntity *ship)
NSDictionary * shipyardInfoForKey:(NSString *key)
OOShipRegistry * sharedRegistry()
id fragmentBurstFromEntity:(Entity *entity)
OOWeakReference * weakSelf
id weakRefUnderlyingObject()
void addObject:(id< OOWeakReferenceSupport > object)
NSEnumerator * objectEnumerator()
BOOL containsObject:(id< OOWeakReferenceSupport > object)
void removeObject:(id< OOWeakReferenceSupport > object)
void setScriptTarget:(ShipEntity *ship)
void receiveCommsMessage:from:(NSString *message_text, [from] ShipEntity *other)
void adjustTradeInFactorBy:(int value)
NSDictionary * materialDefaults()
NSDictionary * whitelistDictionary()
NSDictionary * dictionaryFromFilesNamed:inFolder:andMerge:(NSString *fileName,[inFolder] NSString *folderName,[andMerge] BOOL mergeFiles)
void behaviour_fly_to_destination:(double delta_t)
BOOL firePortWeapon:(double range)
void setWeaponEnergy:(float value)
OOWeaponFacingSet weapon_facings
BOOL isExplicitlyUnpiloted()
BOOL suppressFlightNotifications()
OOTimeAbsolute last_shot_time
void suppressTargetLost()
void behaviour_stop_still:(double delta_t)
void behaviour_evasive_action:(double delta_t)
GLfloat laserHeatLevelAft()
BOOL hasAllEquipment:includeWeapons:whileLoading:(id equipmentKeys,[includeWeapons] BOOL includeWeapons,[whileLoading] BOOL loading)
OOCargoQuantity commodity_amount
Vector positionOffsetForShipInRotationToAlignment(ShipEntity *ship, Quaternion q, NSString *align)
void setCommsMessageColor()
unsigned suppressExplosion
Entity * rememberedShip()
void removeRole:(NSString *role)
NSUInteger passengerCount()
void setSuppressExplosion:(BOOL suppress)
OOWeakReference * _targetStation
void setBounty:withReasonAsString:(OOCreditsQuantity amount,[withReasonAsString] NSString *reason)
BoundingBox findBoundingBoxRelativeToPosition:InVectors:_i:_j:(HPVector opv, [InVectors] Vector, [_i] Vector, [_j] Vector _k)
void getDestroyedBy:damageType:(Entity *whom,[damageType] OOShipDamageType type)
void setCargo:(NSArray *some_cargo)
unsigned trackCloseContacts
double missileTrackPrimaryTarget:(double delta_t)
BOOL canStillTrackPrimaryTarget()
void setMesh:(OOMesh *mesh)
void setScannerDisplayColor1:(OOColor *color1)
BOOL validForAddToUniverse()
NSComparisonResult ComparePlanetsBySurfaceDistance(id i1, id i2, void *context)
BOOL addEquipmentItem:inContext:(NSString *equipmentKey,[inContext] NSString *context)
void setShipHitByLaser:(ShipEntity *ship)
OOCommodityType commodity_type
void landOnPlanet:(OOPlanetEntity *planet)
HPVector absoluteTractorPosition()
void setTargetStation:(Entity *targetEntity)
void setLastAegisLock:(Entity< OOStellarBody > *lastAegisLock)
BOOL setUpOneStandardSubentity:asTurret:(NSDictionary *subentDict,[asTurret] BOOL asTurret)
void resumePostProximityAlert()
OOEquipmentType * selectMissile()
void decrease_flight_speed:(double delta)
NSArray * spawnShipsWithRole:count:(NSString *role,[count] NSUInteger count)
GLfloat currentAimTolerance()
void behaviour_tractored:(double delta_t)
void doScriptEvent:withArgument:andReactToAIMessage:(jsid scriptEvent,[withArgument] id argument,[andReactToAIMessage] NSString *aiMessage)
void transitionToAegisNone()
OOTimeAbsolute aiScriptWakeTime
void setBounty:withReason:(OOCreditsQuantity amount,[withReason] OOLegalStatusReason reason)
void refreshEscortPositions()
float randomEjectaTemperatureWithMaxFactor:(float factor)
void evasiveAction:(double delta_t)
void addTarget:(Entity *targetEntity)
void setPrimaryAggressor:(Entity *targetEntity)
float shieldBoostFactor()
void noteKilledBy:damageType:(Entity *whom,[damageType] OOShipDamageType type)
NSArray * allDefenseTargets()
float weaponRechargeRate()
void broadcastHitByLaserFrom:(ShipEntity *aggressor_ship)
id primaryTargetWithoutValidityCheck()
void setDesiredSpeed:(double amount)
NSUInteger defenseTargetCount()
ShipEntity ** scannedShips()
void collectBountyFor:(ShipEntity *other)
void behaviour_close_to_broadside_range:(double delta_t)
NSDictionary * shipInfoDictionary()
void removeEquipmentItem:(NSString *equipmentKey)
void setTargetToSystemStation()
float hyperspaceSpinTime()
void setUpCargoType:(NSString *cargoString)
NSUInteger passengerCapacity()
void setLaserColor:(OOColor *color)
void behaviour_fly_thru_navpoints:(double delta_t)
NSDictionary * scriptInfo
OOColor * scanner_display_color_hostile2
void setFuel:(OOFuelQuantity amount)
void rescaleBy:writeToCache:(GLfloat factor, [writeToCache] BOOL writeToCache)
void setThankedShip:(Entity *targetEntity)
GLfloat rollToMatchUp:rotating:(Vector up_vec,[rotating] GLfloat match_roll)
void removeTarget:(Entity *targetEntity)
GLfloat scriptedMisjumpRange()
OOTimeAbsolute cargo_dump_time
void takeEnergyDamage:from:becauseOf:weaponIdentifier:(double amount, [from] Entity *ent, [becauseOf] Entity *other, [weaponIdentifier] NSString *weaponIdentifier)
void calculateTrackingCurve()
BOOL _escortPositionsValid
NSArray * contractListForScripting()
void considerFiringMissile:(double delta_t)
OOWeakReference * _thankedShip
OOSystemID destination_system
OOWeakReference * _rememberedShip
unsigned reportAIMessages
OOWeaponFacing currentWeaponFacing
unsigned isNearPlanetSurface
GLfloat rangeToDestination()
void setStatus:(OOEntityStatus stat)
OOTimeAbsolute trackingCurveTimes[4]
NSDictionary * dockingInstructions
id initWithKey:definition:(NSString *key,[definition] NSDictionary *dict)
OOTimeAbsolute shipAIScriptWakeTime()
void behaviour_attack_broadside_target:leftside:(double delta_t,[leftside] BOOL leftside)
void behaviour_fly_from_destination:(double delta_t)
GLfloat weapon_damage_override
NSUInteger equipmentCount()
void broadcastEnergyBlastImminent()
ShipEntity * doOctreesCollide(ShipEntity *prime, ShipEntity *other)
int numberOfScannedShips()
HPVector coordinatesForEscortPosition:(unsigned idx)
void behaviour_attack_broadside_right:(double delta_t)
void behaviour_formation_form_up:(double delta_t)
void behaviour_scripted_ai:(double delta_t)
GLfloat weapon_energy_use
BOOL witchspaceLeavingEffects()
GLfloat afterburner_speed_factor
BOOL addEquipmentItem:withValidation:inContext:(NSString *equipmentKey,[withValidation] BOOL validateAddition,[inContext] NSString *context)
void applySticks:(double delta_t)
void behaviour_land_on_planet:(double delta_t)
GLfloat lookingAtSunWithThresholdAngleCos:(GLfloat thresholdAngleCos)
void noteFrustration:(NSString *context)
ShipEntity * scanned_ships[MAX_SCAN_NUMBER+1]
void setEvasiveJink:(GLfloat z)
void setRoll:(double amount)
void setThrust:(double amount)
OOAlertCondition alertCondition()
GLfloat _scriptedMisjumpRange
NSDictionary * shipinfoDictionary
BOOL collideWithShip:(ShipEntity *other)
ShipEntity * subEntityTakingDamage()
void broadcastThargoidDestroyed()
OOShipGroup * escortGroup()
BOOL hasOneEquipmentItem:includeWeapons:whileLoading:(NSString *itemKey,[includeWeapons] BOOL includeMissiles,[whileLoading] BOOL loading)
void setSpeed:(double amount)
void takeScrapeDamage:from:(double amount,[from] Entity *ent)
void behaviour_intercept_target:(double delta_t)
BOOL hasMilitaryShieldEnhancer()
OOTimeAbsolute getDemoStartTime()
void setSingleCrewWithRole:(NSString *crewRole)
void setScannerDisplayColorHostile1:(OOColor *color1)
NSEnumerator * escortEnumerator()
OOEquipmentType * verifiedMissileTypeFromRole:(NSString *role)
unsigned suppressAegisMessages
NSMutableArray * _equipment
void setTargetToNearestStationIncludingHostiles:(BOOL includeHostiles)
int checkShipsInVicinityForWitchJumpExit()
NSUInteger missileCount()
void setGroup:(OOShipGroup *group)
void scoopIn:(ShipEntity *other)
void applyAttitudeChanges:(double delta_t)
GLfloat laserHeatLevelStarboard()
BOOL fireLaserShotInDirection:weaponIdentifier:(OOWeaponFacing direction,[weaponIdentifier] NSString *weaponIdentifier)
void setSubEntityTakingDamage:(ShipEntity *sub)
BOOL fireDirectLaserShotAt:(Entity *my_target)
OOEquipmentType * generateMissileEquipmentTypeFrom:(NSString *role)
void setEscortDestination:(HPVector dest)
OOColor * scanner_display_color2
OOCargoQuantity availableCargoSpace()
void behaviour_attack_fly_to_target:(double delta_t)
OOWeakReference * _subEntityTakingDamage
void doScriptEvent:(jsid message)
void doScriptEvent:andReactToAIMessage:(jsid scriptEvent,[andReactToAIMessage] NSString *aiMessage)
void addImpactMoment:fraction:(Vector moment,[fraction] GLfloat howmuch)
OOWeakReference * _primaryAggressor
void behaviour_attack_broadside_left:(double delta_t)
static float SurfaceDistanceSqared(Entity *reference, Entity< OOStellarBody > *stellar)
void receiveCommsMessage:from:(NSString *message_text,[from] ShipEntity *other)
void setDisplayName:(NSString *inName)
unsigned number_of_navpoints
double rangeToSecondaryTarget:(Entity *target)
OOColor * scannerDisplayColor2()
void setAccuracy:(GLfloat new_accuracy)
float maxForwardShieldLevel()
void wasAddedToUniverse()
NSArray * portWeaponOffset
Quaternion subentityRotationalVelocity
float hyperspaceMotorSpinTime
OOCargoType dumpItem:(ShipEntity *jetto)
NSString * repeatString:times:(NSString *str, [times] NSUInteger times)
BOOL fireDirectLaserDefensiveShot()
GLint entityPersonalityInt()
OOShipGroup * stationGroup()
Entity * primaryAggressor()
OOTimeDelta missile_load_time
void setPrimaryRole:(NSString *role)
void releaseCargoPodsDebris()
OOWeaponType weaponTypeIDForFacing:strict:(OOWeaponFacing facing,[strict] BOOL strict)
void validateDefenseTargets()
void subEntityDied:(ShipEntity *sub)
BOOL fireStarboardWeapon:(double range)
NSArray * equipmentListForScripting()
OOWeakSet * _collisionExceptions
void behaviour_close_with_target:(double delta_t)
OOWeaponType aft_weapon_type
void deactivateCloakingDevice()
void setUpOneEscort:inGroup:withRole:atPosition:andCount:(ShipEntity *escorter, [inGroup] OOShipGroup *escortGroup, [withRole] NSString *escortRole, [atPosition] HPVector ex_pos, [andCount] uint8_t currentEscortCount)
void increase_flight_speed:(double delta)
BoundingBox totalBoundingBox
Entity * entityForShaderProperties()
OOCreditsQuantity removeMissiles()
OOWeakReference * _lastAegisLock
void wasRemovedFromUniverse()
void setShipScript:(NSString *script_name)
NSString * scanDescription()
void behaviour_idle:(double delta_t)
BOOL hasEquipmentItem:(id equipmentKeys)
OOWeakReference * _lastEscortTarget
NSEnumerator * defenseTargetEnumerator()
NSMutableDictionary * previousCondition
NSString * descriptionComponents()
BOOL removeExternalStore:(OOEquipmentType *eqType)
void updateTrackingCurve()
OOWeakReference * _primaryTarget
void broadcastMessage:withUnpilotedOverride:(NSString *message_text,[withUnpilotedOverride] BOOL unpilotedOverride)
NSArray * starboardWeaponOffset
void setTargetToNearestFriendlyStation()
BOOL activateCloakingDevice()
NSEnumerator * equipmentEnumerator()
void drawImmediate:translucent:(bool immediate, [translucent] bool translucent)
void setHeatInsulation:(GLfloat value)
void resetExhaustPlumes()
void setScannerDisplayColor2:(OOColor *color2)
void behaviour_attack_break_off_target:(double delta_t)
OOFuelQuantity fuelCapacity()
float shieldRechargeRate()
OOEquipmentType * missile_list[SHIPENTITY_MAX_MISSILES]
ShipEntity * dumpCargoItem:(OOCommodityType preferred)
id< OOHUDBeaconIcon > _beaconDrawable
NSArray * parcelListForScripting()
HPVector calculateTargetPosition()
OOAegisStatus aegis_status
void checkScannerIgnoringUnpowered()
BOOL hasMilitaryScannerFilter()
void setLastEscortTarget:(Entity *targetEntity)
void behaviour_fly_to_target_six:(double delta_t)
NSArray * cargoListForScripting()
void respondToAttackFrom:becauseOf:(Entity *from,[becauseOf] Entity *other)
NSEnumerator * flasherEnumerator()
Entity * proximityAlert()
NSMutableDictionary * closeContactsInfo
void scoopUpProcess:processEvents:processMessages:(ShipEntity *other,[processEvents] BOOL proc_events,[processMessages] BOOL proc_messages)
BOOL hasEquipmentItemProviding:(NSString *equipmentType)
NSString * scan_description
StationEntity * targetStation()
GLfloat distance2_scanned_ships[MAX_SCAN_NUMBER+1]
uint16_t entity_personality
NSString * serializeShipSubEntities()
void setPitch:(double amount)
void behaviour_running_defense:(double delta_t)
void behaviour_tumble:(double delta_t)
NSString * identFromShip:(ShipEntity *otherShip)
NSString * descriptionForObjDump()
BOOL fireTurretCannon:(double range)
OOWeakReference * _proximityAlert
OOAlertCondition realAlertCondition()
OOTimeAbsolute missile_launch_time
GLfloat forward_weapon_temp
BOOL cascadeIfAppropriateWithDamageAmount:cascadeOwner:(double amount,[cascadeOwner] Entity *owner)
uint32_t randomSeedForShaders()
static BOOL AuthorityPredicate(Entity *entity, void *parameter)
void removeAllEquipment()
void broadcastAIMessage:(NSString *ai_message)
ShipEntity * fireMissile()
NSString * shipUniqueName
void removeDefenseTarget:(Entity *target)
OOCargoQuantity likely_cargo
OOTimeDelta missileLoadTime()
NSString * scanDescriptionForScripting()
void setBeaconCode:(NSString *bcode)
NSUInteger missileCapacity()
OOColor * exhaust_emissive_color
void dealEnergyDamageWithinDesiredRange()
void enterWormhole:(WormholeEntity *w_hole)
double approachAspectToPrimaryTarget()
double ballTrackLeadingTarget:atTarget:(double delta_t,[atTarget] Entity *target)
BOOL isValidTarget:(Entity *target)
static BOOL IsBehaviourHostile(OOBehaviour behaviour)
BOOL equipmentValidToAdd:whileLoading:inContext:(NSString *equipmentKey,[whileLoading] BOOL loading,[inContext] NSString *context)
OOPlanetEntity * findNearestPlanet()
OOCommodityType dumpCargo()
GLfloat starboard_weapon_temp
void setAITo:(NSString *aiString)
void sendMessage:toShip:withUnpilotedOverride:(NSString *message_text,[toShip] ShipEntity *other_ship,[withUnpilotedOverride] BOOL unpilotedOverride)
void applyThrust:(double delta_t)
OOColor * scannerDisplayColorHostile2()
float energyRechargeRate()
void setWeaponDataFromType:(OOWeaponType weapon_type)
BOOL isTemplateCargoPod()
ShipEntity * launchEscapeCapsule()
void behaviour_attack_mining_target:(double delta_t)
NSEnumerator * shipSubEntityEnumerator()
BOOL hasDockingComputer()
void noteTargetDestroyed:(ShipEntity *target)
void addRole:(NSString *role)
Vector missileLaunchPosition()
NSEnumerator * exhaustEnumerator()
void behaviour_attack_broadside:(double delta_t)
NSArray * aftWeaponOffset
NSArray * laserPortOffset:(OOWeaponFacing direction)
void setWeaponRange:(GLfloat value)
ShipEntity * launchPodWithCrew:(NSArray *podCrew)
void behaviour_attack_sniper:(double delta_t)
void adjustVelocity:(Vector xVel)
NSArray * forwardWeaponOffset
Entity< OOStellarBody > * findNearestStellarBody()
float maxAftShieldLevel()
OOColor * scanner_display_color1
void setWeaponRechargeRate:(float value)
NSString * equipmentItemProviding:(NSString *equipmentType)
NSArray * passengerListForScripting()
void setEscortGroup:(OOShipGroup *group)
NSArray * collisionExceptions()
OOWeaponFacingSet weaponFacings()
NSString * shortDescriptionComponents()
void behaviour_face_destination:(double delta_t)
NSEnumerator * subEntityEnumerator()
void sendExpandedMessage:toShip:(NSString *message_text,[toShip] ShipEntity *other_ship)
float randomEjectaTemperature()
double trackSideTarget:delta_t:(double,[delta_t] BOOL leftside)
OOWeaponType starboard_weapon_type
void addSubentityToCollisionRadius:(Entity< OOSubEntity > *subent)
void setScriptedMisjumpRange:(GLfloat newValue)
void behaviour_track_target:(double delta_t)
unsigned scripted_misjump
void behaviour_attack_target:(double delta_t)
OOColor * scannerDisplayColorHostile1()
void setEntityPersonalityInt:(uint16_t value)
void setReportAIMessages:(BOOL yn)
void removeAllDefenseTargets()
BOOL hasGalacticHyperdrive()
BOOL fireDirectLaserShot:(double range)
OOColor * exhaustEmissiveColor()
void setTrackCloseContacts:(BOOL value)
void behaviour_avoid_collision:(double delta_t)
OOTimeAbsolute demoStartTime
void updateEscortFormation()
unsigned military_jammer_active
void setSubIdx:(NSUInteger value)
OOCargoQuantity commodityAmount()
GLfloat weapon_shot_temperature
void noteLostTargetAndGoIdle()
void doScriptEvent:inContext:withArguments:count:(jsid message,[inContext] JSContext *context,[withArguments] jsval *argv,[count] uintN argc)
GLfloat energy_recharge_rate
void overrideScriptInfo:(NSDictionary *override)
OOCargoQuantity maxAvailableCargoSpace()
OOColor * default_laser_color
void orientationChanged()
float weapon_recharge_rate
void update:(OOTimeDelta delta_t)
uint8_t pendingEscortCount()
void setTemperature:(GLfloat value)
void dealMomentumWithinDesiredRange:(double amount)
void noteTakingDamage:from:type:(double amount,[from] Entity *entity,[type] OOShipDamageType type)
OOSystemID destinationSystem()
void adjustMissedShots:(int delta)
void setScriptedMisjump:(BOOL newValue)
ShipEntity * shipHitByLaser()
Quaternion subEntityRotationalVelocity()
OOShipGroup * _escortGroup
HPVector trackingCurveCoeffs[3]
GLfloat laserHeatLevelPort()
BOOL fireAftWeapon:(double range)
void takeHeatDamage:(double amount)
ShipEntity * fireMissileWithIdentifier:andTarget:(NSString *identifier,[andTarget] Entity *target)
float afterburnerFactor()
void processBehaviour:(OOTimeDelta delta_t)
void setCloaked:(BOOL cloak)
void setIsBoulder:(BOOL flag)
OOEquipmentType * weaponTypeForFacing:strict:(OOWeaponFacing facing,[strict] BOOL strict)
NSArray * crewForScripting()
void setCrew:(NSArray *crewArray)
void setCommodityForPod:andAmount:(OOCommodityType co_type,[andAmount] OOCargoQuantity co_amount)
OOWeaponType port_weapon_type
void markAsOffender:withReason:(int offence_value,[withReason] OOLegalStatusReason reason)
BOOL fireMainWeapon:(double range)
Entity< OOBeaconEntity > * nextBeacon()
double maxHyperspaceDistance()
void subEntityReallyDied:(ShipEntity *sub)
OOCargoQuantity max_cargo
void setBehaviour:(OOBehaviour cond)
NSUInteger maxShipSubEntities()
void doScriptEvent:withArgument:(jsid message,[withArgument] id argument)
NSUInteger subEntityCount()
void setIsMissileFlag:(BOOL newValue)
void scoopUp:(ShipEntity *other)
void switchAITo:(NSString *aiString)
BOOL setUpOneSubentity:(NSDictionary *subentDict)
NSString * shipDataKeyAutoRole()
BOOL hasHyperspaceMotor()
uint8_t _pendingEscortCount
OOAegisStatus checkForAegis()
GLfloat laserHeatLevelForward()
void setHulk:(BOOL isNowHulk)
id< OOHUDBeaconIcon > beaconDrawable()
void setTargetToNearestStation()
Quaternion demoStartOrientation
void setBeaconLabel:(NSString *blabel)
double rangeToPrimaryTarget()
Triangle absoluteIJKForSubentity()
void behaviour_flee_target:(double delta_t)
OOCargoQuantity cargoQuantityOnBoard()
unsigned next_navpoint_index
void reactToAIMessage:context:(NSString *message,[context] NSString *debugContext)
void setFoundTarget:(Entity *targetEntity)
BOOL withinStationAegis()
void setScannerDisplayColorHostile2:(OOColor *color2)
OOWeakReference * _nextBeacon
BOOL setUpOneFlasher:(NSDictionary *subentDict)
GLfloat entityPersonality()
OOPlanetEntity * findNearestPlanetExcludingMoons()
OOWeakSet * _defenseTargets
void applyRoll:climb:andYaw:(GLfloat roll1, [climb] GLfloat climb1, [andYaw] GLfloat yaw1)
OOColor * scanner_display_color_hostile1
void setCommodity:andAmount:(OOCommodityType co_type,[andAmount] OOCargoQuantity co_amount)
unsigned docking_match_rotation
void behaviour_fly_range_from_destination:(double delta_t)
void behaviour_attack_fly_from_target:(double delta_t)
OOWeaponType forward_weapon_type
unsigned cloaking_device_active
BOOL hasEquipmentItem:includeWeapons:whileLoading:(id equipmentKeys,[includeWeapons] BOOL includeWeapons,[whileLoading] BOOL loading)
OOCargoQuantity extra_cargo
void startTrackingCurve()
NSMutableArray * subEntities
void addRole:withProbability:(NSString *role,[withProbability] float probability)
OOCargoQuantity equipment_weight
void enterWormhole:replacing:(WormholeEntity *w_hole,[replacing] BOOL replacing)
unsigned _explicitlyUnpiloted
HPVector trackingCurvePositions[4]
GLfloat weaponRecoveryTime()
OOWeakReference * _prevBeacon
OOCommodityType commodityType()
void setOwner:(Entity *who_owns_entity)
BoundingBox findSubentityBoundingBox()
void behaviour_track_as_turret:(double delta_t)
BOOL hasExpandedCargoBay()
NSUInteger countEquipmentItem:(NSString *eqkey)
OOWeakReference * _foundTarget
Entity< OOBeaconEntity > * prevBeacon()
Entity< OOStellarBody > * lastAegisLock()
void behaviour_attack_slow_dogfight:(double delta_t)
NSString * lastRadioMessage
Entity * lastEscortTarget()
OOColor * scannerDisplayColor1()
NSUInteger _maxShipSubIdx
BoundingBox findBoundingBoxRelativeToPosition:InVectors:i:j:(HPVector opv,[InVectors] Vector,[i] Vector,[j] Vector k)
double trackPrimaryTarget:delta_t:(double,[delta_t] BOOL retreat)
void addSubEntity:(Entity< OOSubEntity > *sub)
OOScript * shipAIScript()
OOBehaviour debugLastBehaviour
unsigned haveExecutedSpawnAction
void setReference:(Vector v)
static float SurfaceDistanceSqaredV(HPVector reference, Entity< OOStellarBody > *stellar)
void disengageAutopilot()
BOOL fireWeapon:direction:range:(OOWeaponType weapon_type, [direction] OOWeaponFacing direction, [range] double range)
void doScriptEvent:withArgument:andArgument:(jsid message,[withArgument] id argument1,[andArgument] id argument2)
double trackDestination:delta_t:(double,[delta_t] BOOL retreat)
void launchShip:(ShipEntity *ship)
Vector portUpVectorForShip:(ShipEntity *ship)
void launchShipWithRole:(NSString *role)
void noteDockedShip:(ShipEntity *ship)
BOOL suckInShip:(ShipEntity *ship)
void setMisjumpWithRange:(GLfloat range)
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
void seed_RNG_only_for_planet_description(Random_Seed s_seed)