- the player can now have misjumps when using someone else's wormhole - required some refactoring!

- when misjumping there's now a small chance of a decrease in reputation (should have kept the ship spaceworthy, etc...)
- added ship.hasHyperspaceMotor as a read-only js property.
- more cleanup.

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@3741 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Marc 2010-08-21 17:04:16 +00:00
parent 9b25043399
commit 9dedfda5b0
3 changed files with 46 additions and 46 deletions

View File

@ -132,6 +132,7 @@ static GLfloat sBaseMass = 0.0;
- (NSArray*) contractsListForScriptingFromArray:(NSArray *) contracts_array forCargo:(BOOL)forCargo;
- (void) witchStart;
- (void) witchJumpTo:(Random_Seed)sTo standard:(BOOL)standard;
- (void) witchEnd;
@end
@ -4654,25 +4655,10 @@ static GLfloat sBaseMass = 0.0;
}
//it is impossible to have a misjump here
- (void) enterWormhole:(WormholeEntity *) w_hole replacing:(BOOL)replacing
// now with added misjump goodness!
- (void) enterWormhole:(WormholeEntity *) w_hole
{
// don't do anything with the player's target
system_seed = [w_hole destination];
[self setStatus:STATUS_ENTERING_WITCHSPACE];
[self doScriptEvent:@"shipWillEnterWitchspace" withArgument:@"wormhole"];
[self witchStart];
// set clock after "playerWillEnterWitchspace" and before removeAllEntitiesExceptPlayer, to allow escorts time to follow their mother.
double distance = distanceBetweenPlanetPositions(system_seed.d,system_seed.b,galaxy_coordinates.x,galaxy_coordinates.y);
ship_clock_adjust = distance * distance * 3600.0; // LY * LY hrs
[UNIVERSE removeAllEntitiesExceptPlayer:NO];
legalStatus /= 2; // 'another day, another system'
[self witchEnd];
[self witchJumpTo:[w_hole destination] standard:NO];
}
@ -4683,13 +4669,17 @@ static GLfloat sBaseMass = 0.0;
[self setStatus:STATUS_IN_FLIGHT];
return; // naughty, you cant hyperspace to your own system.
}
[self witchJumpTo:target_system_seed standard:YES];
}
- (void) witchJumpTo:(Random_Seed)sTo standard:(BOOL)standard
{
// don't do anything with the player's target
[self setStatus:STATUS_ENTERING_WITCHSPACE];
[self doScriptEvent:@"shipWillEnterWitchspace" withArgument:@"standard jump"];
[self doScriptEvent:@"shipWillEnterWitchspace" withArgument:(standard ? @"standard jump" : @"wormhole")];
[self witchStart];
[UNIVERSE removeAllEntitiesExceptPlayer:NO];
// perform any check here for forced witchspace encounters
unsigned malfunc_chance = 253;
if (ship_trade_in_factor < 80)
@ -4699,14 +4689,16 @@ static GLfloat sBaseMass = 0.0;
// 75% of the time a malfunction means a misjump
BOOL misjump = [self scriptedMisjump] || ((flightPitch == max_flight_pitch) || (malfunc && (randf() > 0.75)));
//wear and tear on all jumps (inc misjumps and failures)
//wear and tear on all jumps (inc misjumps, failures, and wormholes)
if (2 * market_rnd < ship_trade_in_factor)
{
// every eight jumps or so drop the price down towards 75%
[self reduceTradeInFactorBy:1 + (market_rnd & 3)];
}
if (malfunc)
if (standard && malfunc)
{
// some malfunctions will start fuel leaks, some will result in no witchjump at all.
if (randf() > 0.5)
{
[self setFuelLeak:[NSString stringWithFormat:@"%f", (randf() + randf()) * 5.0]];
@ -4719,37 +4711,38 @@ static GLfloat sBaseMass = 0.0;
return;
}
}
double distance = distanceBetweenPlanetPositions(target_system_seed.d,target_system_seed.b,galaxy_coordinates.x,galaxy_coordinates.y);
//burn full fuel to create wormhole, but only take time for distance traveled
fuel -= 10.0 * distance; // fuel cost to target system
// set clock after "playerWillEnterWitchspace" and before removeAllEntitiesExceptPlayer, to allow escorts time to follow their mother.
double distance = distanceBetweenPlanetPositions(sTo.d,sTo.b,galaxy_coordinates.x,galaxy_coordinates.y);
ship_clock_adjust = distance * distance * (misjump ? 2700.0 : 3600.0); // LY * LY hrs - misjumps take 3/4 time of the full jump, they're not the same as a jump of half the length!
[UNIVERSE removeAllEntitiesExceptPlayer:NO];
if (standard)
{
// burn the full fuel amount to create the wormhole
fuel -= 10.0 * distance; // fuel cost to target system
}
if (!misjump)
{
system_seed = target_system_seed;
system_seed = sTo;
legalStatus /= 2; // 'another day, another system'
[self witchEnd];
if (market_rnd < 8)
[self erodeReputation]; // every 32 systems or so, drop back towards 'unknown'
ship_clock_adjust = distance * distance * 3600.0; // LY * LY hrs.
if (market_rnd < 8) [self erodeReputation]; // every 32 systems or so, drop back towards 'unknown'
}
else
{
//misjumps do not erode your reputation (perhaps for passenger contracts they should...)
//nor do they change legal status
// move sort of halfway there...
galaxy_coordinates.x += target_system_seed.d;
galaxy_coordinates.y += target_system_seed.b;
// Misjump: move halfway there!
// misjumps do not change legal status.
if (randf() < 0.1) [self erodeReputation]; // once every 10 misjumps - should be much rarer than successful jumps!
galaxy_coordinates.x += sTo.d;
galaxy_coordinates.y += sTo.b;
galaxy_coordinates.x /= 2;
galaxy_coordinates.y /= 2;
ship_clock_adjust = (distance * distance * 3600.0) * 3/4; // misjumps take 3/4 time of the full jump, this is not the same as a jump of half the length
[self playWitchjumpMisjump];
[UNIVERSE set_up_universe_from_misjump];
}
}
}

View File

@ -2430,7 +2430,7 @@ static WormholeEntity *whole = nil;
// tell the ship we're about to jump (so it can inform escorts etc).
primaryTarget = [whole universalID];
found_target = primaryTarget;
[shipAI reactToMessage:@"WITCHSPACE OKAY" context:@"performHyperSpaceExit[WithoutReplacing]"]; // must be a reaction, the ship is about to disappear
[shipAI reactToMessage:@"WITCHSPACE OKAY" context:@"performHyperSpaceExit"]; // must be a reaction, the ship is about to disappear
[self enterWormhole:whole replacing:replace]; // TODO

View File

@ -137,6 +137,7 @@ enum
kShip_fuelChargeRate, // fuel scoop rate & charge multiplier, float, read-only
kShip_group, // group, ShipGroup, read/write
kShip_hasHostileTarget, // has hostile target, boolean, read-only
kShip_hasHyperspaceMotor, // has hyperspace motor, boolean, read-only
kShip_hasSuspendedAI, // AI has suspended states, boolean, read-only
kShip_heatInsulation, // hull heat insulation, double, read/write
kShip_isBeacon, // is beacon, boolean, read-only
@ -216,6 +217,7 @@ static JSPropertySpec sShipProperties[] =
{ "fuelChargeRate", kShip_fuelChargeRate, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "group", kShip_group, JSPROP_PERMANENT | JSPROP_ENUMERATE },
{ "hasHostileTarget", kShip_hasHostileTarget, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "hasHyperspaceMotor", kShip_hasHyperspaceMotor, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "hasSuspendedAI", kShip_hasSuspendedAI, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
{ "heatInsulation", kShip_heatInsulation, JSPROP_PERMANENT | JSPROP_ENUMERATE },
{ "isBeacon", kShip_isBeacon, JSPROP_PERMANENT | JSPROP_ENUMERATE | JSPROP_READONLY },
@ -474,11 +476,16 @@ static JSBool ShipGetProperty(JSContext *context, JSObject *this, jsval name, js
*outValue = BOOLToJSVal([entity hasHostileTarget]);
OK = YES;
break;
case kShip_hasHyperspaceMotor:
*outValue = BOOLToJSVal([entity hasHyperspaceMotor]);
OK = YES;
break;
case kShip_weaponRange:
OK = JS_NewDoubleValue(context, [entity weaponRange], outValue);
break;
case kShip_scannerRange:
OK = JS_NewDoubleValue(context, [entity scannerRange], outValue);
break;