43@interface OOEquipmentType (Private)
45- (id) initWithInfo:(NSArray *)info;
54 NSArray *equipmentData =
nil;
55 NSMutableArray *equipmentTypes =
nil;
56 NSMutableDictionary *equipmentTypesByIdentifier =
nil;
57 NSArray *itemInfo =
nil;
59 NSMutableArray *conditionScripts =
nil;
61 equipmentData = [UNIVERSE equipmentData];
63 [sEquipmentTypes release];
65 equipmentTypes = [NSMutableArray arrayWithCapacity:[equipmentData count]];
66 conditionScripts = [NSMutableArray arrayWithCapacity:[equipmentData count]];
68 equipmentTypesByIdentifier = [NSMutableDictionary dictionaryWithCapacity:[equipmentData count]];
70 foreach (itemInfo, equipmentData)
75 [equipmentTypes addObject:item];
76 [equipmentTypesByIdentifier setObject:item forKey:[item
identifier]];
79 if (condition_script !=
nil)
81 if (![conditionScripts containsObject:condition_script])
83 [conditionScripts addObject:condition_script];
94 equipmentData = [UNIVERSE equipmentDataOutfitting];
96 [sEquipmentTypesOutfitting release];
99 equipmentTypes = [NSMutableArray arrayWithCapacity:[equipmentData count]];
100 foreach (itemInfo, equipmentData)
105 [equipmentTypes addObject:item];
106 [equipmentTypesByIdentifier setObject:item forKey:[item
identifier]];
114+ (void) addEquipmentWithInfo:(NSArray *)itemInfo
116 NSMutableArray *equipmentTypes = [NSMutableArray arrayWithArray:sEquipmentTypes];
117 NSMutableArray *equipmentTypesOutfitting = [NSMutableArray arrayWithArray:sEquipmentTypesOutfitting];
118 NSMutableDictionary *equipmentTypesByIdentifier = [[NSMutableDictionary alloc] initWithDictionary:sEquipmentTypesByIdentifier];
122 [equipmentTypes addObject:item];
123 [equipmentTypesOutfitting addObject:item];
124 [equipmentTypesByIdentifier setObject:item forKey:[item
identifier]];
126 [sEquipmentTypes release];
128 [sEquipmentTypesOutfitting release];
135 DESTROY(equipmentTypesByIdentifier);
139+ (NSString *) getMissileRegistryRoleForShip:(NSString *)shipKey
141 return [sMissilesRegistry oo_stringForKey:shipKey];
145+ (void) setMissileRegistryRole:(NSString *)role forShip:(NSString *)shipKey
147 NSMutableDictionary *missilesRegistry = [[NSMutableDictionary alloc] initWithDictionary:sMissilesRegistry];
148 if (role !=
nil && shipKey !=
nil && ![shipKey isEqualToString:
@""])
150 [missilesRegistry setValue:role forKey:shipKey];
158+ (NSArray *) allEquipmentTypes
164+ (NSEnumerator *) equipmentEnumerator
166 return [sEquipmentTypes objectEnumerator];
170+ (NSEnumerator *) reverseEquipmentEnumerator
172 return [sEquipmentTypes reverseObjectEnumerator];
176+ (NSEnumerator *) equipmentEnumeratorOutfitting
178 return [sEquipmentTypesOutfitting objectEnumerator];
182+ (
OOEquipmentType *) equipmentTypeWithIdentifier:(NSString *)identifier
184 return [sEquipmentTypesByIdentifier objectForKey:identifier];
188- (id) initWithInfo:(NSArray *)info
191 NSDictionary *extra =
nil;
192 NSArray *conditions =
nil;
193 NSString *condition_script =
nil;
194 NSArray *keydef =
nil;
197 if (
self ==
nil) OK = NO;
204 _techLevel = [info oo_unsignedIntAtIndex:EQUIPMENT_TECH_LEVEL_INDEX];
205 _price = [info oo_unsignedIntAtIndex:EQUIPMENT_PRICE_INDEX];
206 _name = [[info oo_stringAtIndex:EQUIPMENT_SHORT_DESC_INDEX] retain];
207 _identifier = [[info oo_stringAtIndex:EQUIPMENT_KEY_INDEX] retain];
208 _description = [[info oo_stringAtIndex:EQUIPMENT_LONG_DESC_INDEX] retain];
210 if (_name ==
nil || _identifier ==
nil || _description ==
nil)
212 OOLog(
@"equipment.load",
@"***** ERROR: Invalid equipment.plist entry - missing name, identifier or description (\"%@\
", %@, \"%@\")", _name, _identifier, _description);
220 if ([_identifier hasSuffix:
@"_MISSILE"] || [_identifier hasSuffix:
@"_MINE"])
222 _isMissileOrMine = YES;
223 _requiresEmptyPylon = YES;
225 else if ([_identifier isEqualToString:
@"EQ_PASSENGER_BERTH_REMOVAL"])
227 _requiresFreePassengerBerth = YES;
229 else if ([_identifier isEqualToString:
@"EQ_FUEL"])
231 _requiresNonFullFuel = YES;
234 _isAvailableToPlayer = YES;
235 _isAvailableToNPCs = YES;
236 _damageProbability = 1.0;
243 extra = [info oo_dictionaryAtIndex:EQUIPMENT_EXTRA_INFO_INDEX];
247 _isAvailableToAll = [extra oo_boolForKey:@"available_to_all" defaultValue:_isAvailableToAll];
248 _isAvailableToPlayer = [extra oo_boolForKey:@"available_to_player" defaultValue:_isAvailableToPlayer];
249 _isAvailableToNPCs = [extra oo_boolForKey:@"available_to_NPCs" defaultValue:_isAvailableToNPCs];
251 _isMissileOrMine = [extra oo_boolForKey:@"is_external_store" defaultValue:_isMissileOrMine];
252 _requiresEmptyPylon = [extra oo_boolForKey:@"requires_empty_pylon" defaultValue:_requiresEmptyPylon];
253 _requiresMountedPylon = [extra oo_boolForKey:@"requires_mounted_pylon" defaultValue:_requiresMountedPylon];
254 _requiresClean = [extra oo_boolForKey:@"requires_clean" defaultValue:_requiresClean];
255 _requiresNotClean = [extra oo_boolForKey:@"requires_not_clean" defaultValue:_requiresNotClean];
256 _portableBetweenShips = [extra oo_boolForKey:@"portable_between_ships" defaultValue:_portableBetweenShips];
257 _requiresFreePassengerBerth = [extra oo_boolForKey:@"requires_free_passenger_berth" defaultValue:_requiresFreePassengerBerth];
258 _requiresFullFuel = [extra oo_boolForKey:@"requires_full_fuel" defaultValue:_requiresFullFuel];
259 _requiresNonFullFuel = [extra oo_boolForKey:@"requires_non_full_fuel" defaultValue:_requiresNonFullFuel];
260 _isVisible = [extra oo_boolForKey:@"visible" defaultValue:_isVisible];
261 _canCarryMultiple = [extra oo_boolForKey:@"can_carry_multiple" defaultValue:NO];
262 _hideValues = [extra oo_boolForKey:@"hide_values" defaultValue:NO];
264 _requiredCargoSpace = [extra oo_unsignedIntForKey:@"requires_cargo_space" defaultValue:_requiredCargoSpace];
266 _installTime = [extra oo_unsignedIntForKey:@"installation_time" defaultValue:0];
267 _repairTime = [extra oo_unsignedIntForKey:@"repair_time" defaultValue:0];
268 _provides = [[extra oo_arrayForKey:@"provides" defaultValue:[NSArray array]] retain];
270 id dispColor = [extra oo_objectForKey:@"display_color" defaultValue:nil];
273 _weaponInfo = [[extra oo_dictionaryForKey:@"weapon_info" defaultValue:[NSDictionary dictionary]] retain];
275 _damageProbability = [extra oo_floatForKey:@"damage_probability" defaultValue:(_isMissileOrMine?0.0:1.0)];
277 id object = [extra objectForKey:@"requires_equipment"];
278 if ([
object isKindOfClass:[NSString class]]) _requiresEquipment = [[NSSet setWithObject:object] retain];
279 else if ([
object isKindOfClass:[NSArray class]]) _requiresEquipment = [[NSSet setWithArray:object] retain];
280 else if (
object !=
nil)
282 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"requires_equipment", _identifier);
285 object = [extra objectForKey:@"requires_any_equipment"];
286 if ([
object isKindOfClass:[NSString class]]) _requiresAnyEquipment = [[NSSet setWithObject:object] retain];
287 else if ([
object isKindOfClass:[NSArray class]]) _requiresAnyEquipment = [[NSSet setWithArray:object] retain];
288 else if (
object !=
nil)
290 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"requires_any_equipment", _identifier);
293 object = [extra objectForKey:@"incompatible_with_equipment"];
294 if ([
object isKindOfClass:[NSString class]]) _incompatibleEquipment = [[NSSet setWithObject:object] retain];
295 else if ([
object isKindOfClass:[NSArray class]]) _incompatibleEquipment = [[NSSet setWithArray:object] retain];
296 else if (
object !=
nil)
298 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"incompatible_with_equipment", _identifier);
301 object = [extra objectForKey:@"conditions"];
302 if ([
object isKindOfClass:[NSString class]]) conditions = [NSArray arrayWithObject:object];
303 else if ([
object isKindOfClass:[NSArray class]]) conditions = object;
304 else if (
object !=
nil)
306 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"conditions", _identifier);
308 if (conditions !=
nil)
310 OOStandardsDeprecated([NSString stringWithFormat:
@"The conditions key is deprecated for equipment %@",_name]);
314 [_conditions retain];
318 object = [extra objectForKey:@"condition_script"];
319 if ([
object isKindOfClass:[NSString class]])
321 condition_script = object;
323 else if (
object !=
nil)
325 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string.",
@"condition_script", _identifier);
327 if (condition_script !=
nil)
329 _condition_script = [condition_script retain];
336 _scriptInfo = [extra oo_dictionaryForKey:@"script_info"];
337 [_scriptInfo retain];
339 _script = [extra oo_stringForKey:@"script"];
340 if (_script !=
nil && ![
OOScript jsScriptFromFileNamed:_script properties:
nil]) _script =
nil;
344 _fastAffinityA = !![extra oo_boolForKey:@"fast_affinity_defensive"];
345 _fastAffinityB = !![extra oo_boolForKey:@"fast_affinity_offensive"];
352 object = [extra objectForKey:@"default_activate_key"];
353 if ([
object isKindOfClass:[NSArray class]]) keydef = object;
354 else if (
object !=
nil)
356 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not an array.",
@"default_activate_key", _identifier);
363 _defaultActivateKey = [PLAYER processKeyCode:keydef];
364 checking = [PLAYER validateKey:[NSString stringWithFormat:@"activate_%@", _identifier] checkKeys:_defaultActivateKey];
366 if (checking !=
nil) {
367 OOLog(
@"equipment.load",
@"***** Error: %@ for equipment item %@ is already in use for %@. Default not applied",
@"default_activate_key", _identifier, checking);
368 _defaultActivateKey =
nil;
372 object = [extra objectForKey:@"default_mode_key"];
373 if ([
object isKindOfClass:[NSArray class]]) keydef = object;
374 else if (
object !=
nil)
376 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not an array.",
@"default_mode_key", _identifier);
383 _defaultModeKey = [PLAYER processKeyCode:keydef];
384 checking = [PLAYER validateKey:[NSString stringWithFormat:@"mode_%@", _identifier] checkKeys:_defaultModeKey];
386 if (checking !=
nil) {
387 OOLog(
@"equipment.load",
@"***** Error: %@ for equipment item %@ is already in use for %@. Default not applied.",
@"default_mode_key", _identifier, checking);
388 _defaultModeKey =
nil;
411 DESTROY(_requiresAnyEquipment);
412 DESTROY(_incompatibleEquipment);
426- (id) copyWithZone:(NSZone *)zone
429 return [
self retain];
433- (NSString *) descriptionComponents
435 return [NSString stringWithFormat:@"%@ \"%@\"", _identifier, _name];
439- (NSString *) identifier
445- (NSString *) damagedIdentifier
447 return [_identifier stringByAppendingString:@"_DAMAGED"];
457- (NSString *) descriptiveText
475- (BOOL) isAvailableToAll
477 return _isAvailableToAll;
481- (BOOL) requiresEmptyPylon
483 return _requiresEmptyPylon;
487- (BOOL) requiresMountedPylon
489 return _requiresMountedPylon;
493- (BOOL) requiresCleanLegalRecord
495 return _requiresClean;
499- (BOOL) requiresNonCleanLegalRecord
501 return _requiresNotClean;
505- (BOOL) requiresFreePassengerBerth
507 return _requiresFreePassengerBerth;
511- (BOOL) requiresFullFuel
513 return _requiresFullFuel;
517- (BOOL) requiresNonFullFuel
519 return _requiresNonFullFuel;
523- (BOOL) isPrimaryWeapon
525 return [[
self identifier] hasPrefix:@"EQ_WEAPON"];
529- (BOOL) isMissileOrMine
531 return _isMissileOrMine;
535- (BOOL) isPortableBetweenShips
537 return _portableBetweenShips;
541- (BOOL) canCarryMultiple
543 if ([
self isMissileOrMine])
return YES;
545 if ([
self isPrimaryWeapon])
return NO;
548 if ([_identifier isEqualToString:
@"EQ_PASSENGER_BERTH"] ||
549 [_identifier isEqualToString:
@"EQ_TRUMBLE"])
554 return _canCarryMultiple;
558- (GLfloat) damageProbability
560 if ([
self isMissileOrMine])
return 0.0;
562 return _damageProbability;
568 if ([
self isMissileOrMine])
return NO;
570 if ([
self damageProbability] > 0.0)
591- (BOOL) isAvailableToPlayer
593 return _isAvailableToPlayer;
597- (BOOL) isAvailableToNPCs
599 return _isAvailableToNPCs;
605 return _requiredCargoSpace;
609- (NSSet *) requiresEquipment
611 return _requiresEquipment;
615- (NSSet *) requiresAnyEquipment
617 return _requiresAnyEquipment;
621- (NSSet *) incompatibleEquipment
623 return _incompatibleEquipment;
629 return _displayColor;
633- (void) setDisplayColor:(
OOColor *)color
635 [_displayColor release];
636 _displayColor = [color retain];
640- (NSArray *) conditions
646- (NSString *) conditionScript
648 return _condition_script;
652- (NSDictionary *) scriptInfo
658- (NSString *) scriptName
664- (BOOL) fastAffinityDefensive
666 return _fastAffinityA;
670- (BOOL) fastAffinityOffensive
672 return _fastAffinityB;
676- (NSArray *) defaultActivateKey
678 return _defaultActivateKey;
682- (NSArray *) defaultModeKey
684 return _defaultModeKey;
688- (NSUInteger) installTime
694- (NSUInteger) repairTime
702 return _installTime / 2;
707- (NSArray *) providesForScripting
709 return [[_provides copy] autorelease];
713- (BOOL) provides:(NSString *)key
715 return [_provides containsObject:key];
720- (BOOL) isTurretLaser
722 return [_weaponInfo oo_boolForKey:@"is_turret_laser" defaultValue:NO];
726- (BOOL) isMiningLaser
728 return [_weaponInfo oo_boolForKey:@"is_mining_laser" defaultValue:NO];
732- (NSDictionary *) weaponInfo
738- (GLfloat) weaponRange
740 return [_weaponInfo oo_floatForKey:@"range" defaultValue:12500.0];
744- (GLfloat) weaponEnergyUse
746 return [_weaponInfo oo_floatForKey:@"energy" defaultValue:0.8];
750- (GLfloat) weaponDamage
752 return [_weaponInfo oo_floatForKey:@"damage" defaultValue:15.0];
756- (GLfloat) weaponRechargeRate
758 return [_weaponInfo oo_floatForKey:@"recharge_rate" defaultValue:0.5];
762- (GLfloat) weaponShotTemperature
764 return [_weaponInfo oo_floatForKey:@"shot_temperature" defaultValue:7.0];
768- (GLfloat) weaponThreatAssessment
770 return [_weaponInfo oo_floatForKey:@"threat_assessment" defaultValue:1.0];
780- (NSString *) fxShotMissName
782 return [_weaponInfo oo_stringForKey:@"fx_shot_miss_name" defaultValue:@"[player-laser-miss]"];
786- (NSString *) fxShotHitName
788 return [_weaponInfo oo_stringForKey:@"fx_shot_hit_name" defaultValue:@"[player-laser-hit]"];
792- (NSString *) fxShieldHitName
794 return [_weaponInfo oo_stringForKey:@"fx_hitplayer_shielded_name" defaultValue:@"[player-hit-by-weapon]"];
798- (NSString *) fxUnshieldedHitName
800 return [_weaponInfo oo_stringForKey:@"fx_hitplayer_unshielded_name" defaultValue:@"[player-direct-hit]"];
804- (NSString *) fxWeaponLaunchedName
806 return [_weaponInfo oo_stringForKey:@"fx_weapon_launch_name" defaultValue:([[
self identifier] hasSuffix:@"_MINE"] ? @"[mine-launched]" : @"[missile-launched]")];
815- (BOOL) suppressClangStuff
825@implementation OOEquipmentType (Conveniences)
832 tl = [
self techLevel];
838 missionVar = [PLAYER missionVariableForKey:[@"mission_TL_FOR_" stringByAppendingString:[
self identifier]]];
void OOStandardsDeprecated(NSString *message)
BOOL OOEnforceStandards(void)
static NSDictionary * sEquipmentTypesByIdentifier
static NSArray * sEquipmentTypes
static NSArray * sEquipmentTypesOutfitting
static NSDictionary * sMissilesRegistry
NSArray * OOSanitizeLegacyScriptConditions(NSArray *conditions, NSString *context)
#define OOLog(class, format,...)
uint64_t OOCreditsQuantity
@ EQUIPMENT_LONG_DESC_INDEX
@ EQUIPMENT_EXTRA_INFO_INDEX
void setObject:forKey:inCache:(id inElement,[forKey] NSString *inKey,[inCache] NSString *inCacheKey)
OOCacheManager * sharedCache()
OOColor * brightColorWithDescription:(id description)
OOColor * colorWithDescription:(id description)
NSString * conditionScript()