188 :(NSArray *)info
189{
190 BOOL OK = YES;
191 NSDictionary *extra =
nil;
193 NSString *condition_script =
nil;
194 NSArray *keydef =
nil;
195
196 self = [super init];
197 if (
self ==
nil) OK = NO;
198
200
201 if (OK)
202 {
203
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];
209
211 {
212 OOLog(
@"equipment.load",
@"***** ERROR: Invalid equipment.plist entry - missing name, identifier or description (\"%@\
", %@, \"%@\")",
_name,
_identifier,
_description);
213 OK = NO;
214 }
215 }
216
217 if (OK)
218 {
219
221 {
224 }
225 else if ([
_identifier isEqualToString:
@"EQ_PASSENGER_BERTH_REMOVAL"])
226 {
228 }
230 {
232 }
238 }
239
241 {
242
243 extra = [info oo_dictionaryAtIndex:EQUIPMENT_EXTRA_INFO_INDEX];
245 {
246
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];
250
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];
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];
262 _hideValues = [extra oo_boolForKey:@"hide_values" defaultValue:NO];
263
264 _requiredCargoSpace = [extra oo_unsignedIntForKey:@"requires_cargo_space" defaultValue:_requiredCargoSpace];
265
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];
269
270 id dispColor = [extra oo_objectForKey:@"display_color" defaultValue:nil];
272
273 _weaponInfo = [[extra oo_dictionaryForKey:@"weapon_info" defaultValue:[NSDictionary dictionary]] retain];
274
275 _damageProbability = [extra oo_floatForKey:@"damage_probability" defaultValue:(_isMissileOrMine?0.0:1.0)];
276
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)
281 {
282 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"requires_equipment",
_identifier);
283 }
284
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)
289 {
290 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"requires_any_equipment",
_identifier);
291 }
292
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)
297 {
298 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"incompatible_with_equipment",
_identifier);
299 }
300
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)
305 {
306 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string or an array.",
@"conditions",
_identifier);
307 }
309 {
312 {
314 [_conditions retain];
315 }
316 }
317
318 object = [extra objectForKey:@"condition_script"];
319 if ([object isKindOfClass:[NSString class]])
320 {
321 condition_script = object;
322 }
323 else if (
object !=
nil)
324 {
325 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not a string.",
@"condition_script",
_identifier);
326 }
327 if (condition_script !=
nil)
328 {
330 }
331
332
333
334
335
336 _scriptInfo = [extra oo_dictionaryForKey:@"script_info"];
337 [_scriptInfo retain];
338
339 _script = [extra oo_stringForKey:@"script"];
341 [_script retain];
343 {
344 _fastAffinityA = !![extra oo_boolForKey:@"fast_affinity_defensive"];
345 _fastAffinityB = !![extra oo_boolForKey:@"fast_affinity_offensive"];
346
347
348
349
350 NSString *checking;
351
352 object = [extra objectForKey:@"default_activate_key"];
353 if ([object isKindOfClass:[NSArray class]]) keydef = object;
354 else if (
object !=
nil)
355 {
356 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not an array.",
@"default_activate_key",
_identifier);
358 }
359
361 {
362
364 checking = [PLAYER validateKey:[NSString stringWithFormat:@"activate_%@", _identifier] checkKeys:_defaultActivateKey];
365
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);
369 }
370 }
371
372 object = [extra objectForKey:@"default_mode_key"];
373 if ([object isKindOfClass:[NSArray class]]) keydef = object;
374 else if (
object !=
nil)
375 {
376 OOLog(
@"equipment.load",
@"***** ERROR: %@ for equipment item %@ is not an array.",
@"default_mode_key",
_identifier);
378 }
379
381 {
382
384 checking = [PLAYER validateKey:[NSString stringWithFormat:@"mode_%@", _identifier] checkKeys:_defaultModeKey];
385
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);
389 }
390 }
391 }
392 }
393 }
394
395 if (!OK)
396 {
397 [self release];
399 }
400 return self;
401}
NSArray * OOSanitizeLegacyScriptConditions(NSArray *conditions, NSString *context)
#define OOLog(class, format,...)
@ EQUIPMENT_LONG_DESC_INDEX
@ EQUIPMENT_EXTRA_INFO_INDEX
OOColor * colorWithDescription:(id description)
OOCargoQuantity _requiredCargoSpace
unsigned _isMissileOrMine
unsigned _requiresFullFuel
unsigned _portableBetweenShips
unsigned _requiresMountedPylon
unsigned _isAvailableToAll
unsigned _isAvailableToNPCs
unsigned _requiresNotClean
unsigned _requiresFreePassengerBerth
unsigned _requiresNonFullFuel
unsigned _isAvailableToPlayer
unsigned _requiresEmptyPylon