Cleaned up canAwardEquipment - now admits the existence of canAwardMultiple equipment, and has less redundancy. Added available_to_player and available_to_NPCs properties for equipment. Exposed five new equipment properties to JS.

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@3578 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Jens Ayton 2010-06-19 19:18:41 +00:00
parent 16b8d30f54
commit 6ded4261b2
6 changed files with 74 additions and 18 deletions

View File

@ -177,6 +177,7 @@
"Provides life support, entertainment and comfort for a single passenger.",
{
available_to_all = true;
available_to_NPCs = false;
requires_cargo_space = 5;
}
),
@ -186,6 +187,7 @@
"Removes a passenger berth.",
{
available_to_all = true;
available_to_NPCs = false;
requires_free_passenger_berth = true;
}
),

View File

@ -2122,7 +2122,9 @@ ShipEntity* doOctreesCollide(ShipEntity* prime, ShipEntity* other)
if (missiles >= max_missiles) return NO;
}
if ([self hasEquipmentItem:equipmentKey]) return NO;
OOEquipmentType *eqType = [OOEquipmentType equipmentTypeWithIdentifier:equipmentKey];
if (![eqType canAwardMultiple] && [self hasEquipmentItem:equipmentKey]) return NO;
if (![self equipmentValidToAdd:equipmentKey]) return NO;
return YES;
@ -2254,6 +2256,14 @@ ShipEntity* doOctreesCollide(ShipEntity* prime, ShipEntity* other)
if ([eqType requiresFreePassengerBerth] && [self passengerCount] >= [self passengerCapacity]) return NO;
if ([eqType requiresFullFuel] && [self fuel] < [self fuelCapacity]) return NO;
if ([eqType requiresNonFullFuel] && [self fuel] >= [self fuelCapacity]) return NO;
if ([self isPlayer])
{
if (![eqType isAvailableToPlayer]) return NO;
}
else
{
if (![eqType isAvailableToNPCs]) return NO;
}
return YES;
}

View File

@ -50,7 +50,9 @@ SOFTWARE.
_requiresFullFuel: 1,
_requiresNonFullFuel: 1,
_isMissileOrMine: 1,
_isVisible: 1;
_isVisible: 1,
_isAvailableToPlayer: 1,
_isAvailableToNPCs: 1;
OOCargoQuantity _requiredCargoSpace;
NSSet *_requiresEquipment;
NSSet *_requiresAnyEquipment;
@ -95,6 +97,9 @@ SOFTWARE.
- (BOOL) canBeDamaged;
- (BOOL) isVisible; // Visible in UI?
- (BOOL) isAvailableToPlayer;
- (BOOL) isAvailableToNPCs;
- (OOCargoQuantity) requiredCargoSpace;
- (NSSet *) requiresEquipment; // Set of equipment identifiers; all items required
- (NSSet *) requiresAnyEquipment; // Set of equipment identifiers; any item required

View File

@ -178,6 +178,8 @@ static NSDictionary *sMissilesRegistry = nil;
_requiresNonFullFuel = YES;
}
_isVisible = YES;
_isAvailableToPlayer = YES;
_isAvailableToNPCs = YES;
}
if (OK && [info count] > EQUIPMENT_EXTRA_INFO_INDEX)
@ -194,6 +196,9 @@ static NSDictionary *sMissilesRegistry = nil;
if ((strict && !strictModeCompatible) || (!strict && strictModeOnly)) OK = NO;
_isAvailableToAll = [extra oo_boolForKey:@"available_to_all" defaultValue:_isAvailableToAll];
_isAvailableToPlayer = [extra oo_boolForKey:@"available_to_player" defaultValue:_isAvailableToPlayer];
_isAvailableToNPCs = [extra oo_boolForKey:@"available_to_NPCs" defaultValue:_isAvailableToNPCs];
_isMissileOrMine = [extra oo_boolForKey:@"is_external_store" defaultValue:_isMissileOrMine];
_requiresEmptyPylon = [extra oo_boolForKey:@"requires_empty_pylon" defaultValue:_requiresEmptyPylon];
_requiresMountedPylon = [extra oo_boolForKey:@"requires_mounted_pylon" defaultValue:_requiresMountedPylon];
@ -426,6 +431,18 @@ static NSDictionary *sMissilesRegistry = nil;
}
- (BOOL) isAvailableToPlayer
{
return _isAvailableToPlayer;
}
- (BOOL) isAvailableToNPCs
{
return _isAvailableToNPCs;
}
- (OOCargoQuantity) requiredCargoSpace
{
return _requiredCargoSpace;

View File

@ -45,13 +45,18 @@ static JSBool EquipmentInfoStaticInfoForKey(JSContext *context, JSObject *this,
enum
{
// Property IDs
kEquipmentInfo_canAwardMultiple,
kEquipmentInfo_canBeDamaged,
kEquipmentInfo_description,
kEquipmentInfo_effectiveTechLevel,
kEquipmentInfo_equipmentKey,
kEquipmentInfo_incompatibleEquipment,
kEquipmentInfo_isAvailableToAll,
kEquipmentInfo_isAvailableToNPCs,
kEquipmentInfo_isAvailableToPlayer,
kEquipmentInfo_isExternalStore, // is missile or mine
kEquipmentInfo_isPortableBetweenShips,
kEquipmentInfo_isVisible,
kEquipmentInfo_name,
kEquipmentInfo_price,
kEquipmentInfo_requiredCargoSpace,
@ -72,13 +77,18 @@ enum
static JSPropertySpec sEquipmentInfoProperties[] =
{
// JS name ID flags
{ "canAwardMultiple", kEquipmentInfo_canAwardMultiple, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "canBeDamaged", kEquipmentInfo_canBeDamaged, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "description", kEquipmentInfo_description, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "effectiveTechLevel", kEquipmentInfo_effectiveTechLevel, JSPROP_PERMANENT | JSPROP_ENUMERATE },
{ "equipmentKey", kEquipmentInfo_equipmentKey, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "incompatibleEquipment", kEquipmentInfo_incompatibleEquipment, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isAvailableToAll", kEquipmentInfo_isAvailableToAll, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isAvailableToNPCs", kEquipmentInfo_isAvailableToNPCs, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isAvailableToPlayer", kEquipmentInfo_isAvailableToPlayer, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isExternalStore", kEquipmentInfo_isExternalStore, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isPortableBetweenShips", kEquipmentInfo_isPortableBetweenShips, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "isVisible", kEquipmentInfo_isVisible, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "name", kEquipmentInfo_name, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "price", kEquipmentInfo_price, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "requiredCargoSpace", kEquipmentInfo_requiredCargoSpace, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
@ -205,6 +215,14 @@ static JSBool EquipmentInfoGetProperty(JSContext *context, JSObject *this, jsval
result = [eqType name];
break;
case kEquipmentInfo_canAwardMultiple:
*outValue = BOOLToJSVal([eqType canAwardMultiple]);
break;
case kEquipmentInfo_canBeDamaged:
*outValue = BOOLToJSVal([eqType canBeDamaged]);
break;
case kEquipmentInfo_description:
result = [eqType descriptiveText];
break;
@ -225,6 +243,14 @@ static JSBool EquipmentInfoGetProperty(JSContext *context, JSObject *this, jsval
*outValue = BOOLToJSVal([eqType isAvailableToAll]);
break;
case kEquipmentInfo_isAvailableToNPCs:
*outValue = BOOLToJSVal([eqType isAvailableToNPCs]);
break;
case kEquipmentInfo_isAvailableToPlayer:
*outValue = BOOLToJSVal([eqType isAvailableToPlayer]);
break;
case kEquipmentInfo_requiresEmptyPylon:
*outValue = BOOLToJSVal([eqType requiresEmptyPylon]);
break;
@ -261,6 +287,10 @@ static JSBool EquipmentInfoGetProperty(JSContext *context, JSObject *this, jsval
*outValue = BOOLToJSVal([eqType isPortableBetweenShips]);
break;
case kEquipmentInfo_isVisible:
*outValue = BOOLToJSVal([eqType isVisible]);
break;
case kEquipmentInfo_requiredCargoSpace:
*outValue = BOOLToJSVal([eqType requiredCargoSpace]);
break;

View File

@ -1461,6 +1461,7 @@ static JSBool ShipCanAwardEquipment(JSContext *context, JSObject *this, uintN ar
{
ShipEntity *thisEnt = nil;
NSString *key = nil;
OOEquipmentType *eqType = nil;
BOOL result;
BOOL isBerth;
BOOL exists;
@ -1476,23 +1477,14 @@ static JSBool ShipCanAwardEquipment(JSContext *context, JSObject *this, uintN ar
if (exists)
{
eqType = [OOEquipmentType equipmentTypeWithIdentifier:key];
result = YES;
isBerth = [key isEqualToString:@"EQ_PASSENGER_BERTH"];
// can't add fuel as equipment, can add multiple berths if there's space.
result = ![key isEqualToString:@"EQ_FUEL"] && (![thisEnt hasEquipmentItem:key] ||
(isBerth && [thisEnt availableCargoSpace] >= 5));
if (result)
{
if ( ([key isEqualToString:@"EQ_ENERGY_BOMB"] && [OOEquipmentType equipmentTypeWithIdentifier:key] == nil)
|| (![thisEnt isPlayer] && (isBerth || [key isEqualToString:@"EQ_PASSENGER_BERTH_REMOVAL"]))
|| ([key isEqualToString:@"EQ_MISSILE_REMOVAL"] && [thisEnt missileCount] == 0) )
{
result = NO;
}
else
{
result = [thisEnt canAddEquipment:key];
}
}
if ([key isEqualToString:@"EQ_FUEL"]) result = NO;
if (result) result = [thisEnt canAddEquipment:key];
}
else
{