43#define OO_WORMHOLE_COLOR_BOOST 25.0
44#define OO_WORMHOLE_COLOR_FVEC4 { 0.067, 0.067, 1.0, 0.25 }
47@interface WormholeEntity (Private)
54static void DrawWormholeCorona(GLfloat inner_radius, GLfloat outer_radius,
int step, GLfloat z_distance, GLfloat *col4v1);
57@implementation WormholeEntity (Private)
61 if ((
self = [super
init]))
65 collision_radius = 0.0;
67 scanClass = CLASS_WORMHOLE;
91 if ((
self = [
self init]))
97 origin = [
dict oo_intForKey:@"origin_id" defaultValue:0];
100 originCoords = [[UNIVERSE systemManager] getCoordinatesForSystem:origin inGalaxy:[PLAYER galaxyNumber]];
101 destinationCoords = [[UNIVERSE systemManager] getCoordinatesForSystem:destination inGalaxy:[PLAYER galaxyNumber]];
120 _misjump = [
dict oo_boolForKey:@"misjump" defaultValue:NO];
124 NSArray * shipDictsArray = [
dict oo_arrayForKey:@"ships"];
126 NSDictionary *currShipDict =
nil;
127 [shipsInTransit removeAllObjects];
130 while ((currShipDict = [shipDicts nextObject]) !=
nil)
132 NSDictionary *shipInfo = [
currShipDict oo_dictionaryForKey:@"ship_info"];
140 [shipsInTransit addObject:[
NSDictionary dictionaryWithObjectsAndKeys:
147 OOLog(
@"wormhole.load.warning",
@"Wormhole ship \"%@\
" failed to initialize - missing OXP or old-style saved wormhole data.", [shipInfo oo_stringForKey:
@"ship_key"]);
160 if ((
self = [
self init]))
162 double now = [PLAYER clockTimeAdjusted];
167 origin = [UNIVERSE currentSystemID];
170 destinationCoords = [[UNIVERSE systemManager] getCoordinatesForSystem:destination inGalaxy:[PLAYER galaxyNumber]];
172 distance = fmax(distance, 0.1);
177 if (sun && ([sun willGoNova] || [sun goneNova]) && [ship
mass] > 240000)
211 double time_adjust = distance * distance * (3600 - 2700);
221- (void) setMisjumpWithRange:(GLfloat)range
223 if (range <= 0.0 || range >= 1.0)
221- (void) setMisjumpWithRange:(GLfloat)range {
…}
260 if (!ship || [ship
status] == STATUS_ENTERING_WITCHSPACE)
274 double now = [PLAYER clockTimeAdjusted];
293 if (leader && (leader != ship))
297 if (leaderShipSpeed < shipSpeed ) shipSpeed = leaderShipSpeed;
299 if (shipSpeed <= 0.0f ) shipSpeed = 0.1f;
300 now += d / shipSpeed;
307 [shipsInTransit addObject:[
NSDictionary dictionaryWithObjectsAndKeys:
309 [
NSNumber numberWithDouble: now + travel_time - arrival_time], @"time",
322 [UNIVERSE addWitchspaceJumpEffectForShip:ship];
329 [UNIVERSE removeEntity:ship];
338 [UNIVERSE carryPlayerOn:(StationEntity*)ship inWormhole:
self];
349 double now = [PLAYER clockTimeAdjusted];
350 NSMutableArray* shipsStillInTransit = [[
NSMutableArray alloc] initWithCapacity:[shipsInTransit count]];
351 BOOL hasShiftedExitPosition = NO;
352 BOOL useExitXYScatter = NO;
354 NSDictionary *shipInfo =
nil;
358 NSString *shipBeacon = [
shipInfo objectForKey:@"shipBeacon"];
360 double time_passed = now - ship_arrival_time;
362 if ([ship
status] == STATUS_DEAD)
continue;
364 if (ship_arrival_time > now)
373 position = [UNIVERSE getWitchspaceExitPosition];
374 GLfloat min_d1 = [UNIVERSE safeWitchspaceExitDistance];
385 if (fabs(d1) < min_d1)
387 d1 += ((d1 > 0.0)? min_d1: -min_d1);
402 double offset_x =
randf()*150.0-75.0;
403 double offset_y =
randf()*150.0-75.0;
404 shippos.x =
position.x + (offset_x*exit_vector_x.x)+(offset_y*exit_vector_y.x);
405 shippos.y =
position.y + (offset_x*exit_vector_x.y)+(offset_y*exit_vector_y.y);
406 shippos.z =
position.z + (offset_x*exit_vector_x.z)+(offset_y*exit_vector_y.z);
415 [PLAYER setSpeed:exit_speed];
417 useExitXYScatter = YES;
421 if (shipBeacon !=
nil)
436 if (time_passed < 2.0)
447 [UNIVERSE addEntity:ship];
462 hasShiftedExitPosition = YES;
466 else if (time_passed > 1)
468 if (hasShiftedExitPosition)
471 [
ship update: (ship_arrival_time - arrival_time)];
482 [shipsInTransit release];
497- (void) setContainsPlayer:(BOOL)val
497- (void) setContainsPlayer:(BOOL)val {
…}
503- (void) setExitPosition:(HPVector)pos
503- (void) setExitPosition:(HPVector)pos {
…}
535- (void) setExitSpeed:(
double) speed
535- (void) setExitSpeed:(
double) speed {
…}
571- (void) setScannedAt:(
double)p_scanTime
571- (void) setScannedAt:(
double)p_scanTime {
…}
598 [shipsInTransit release];
606 double now = [PLAYER clockTime];
607 return [
NSString stringWithFormat:@"destination: %@ ttl: %.2fs arrival: %@",
608 _misjump ? (NSString *)@"Interstellar Space" : [UNIVERSE getSystemName:destination],
610 ClockToString(arrival_time, false)];
616 if ([ship hasEquipmentItem:
@"EQ_WORMHOLE_SCANNER"])
620 return [
NSString stringWithFormat:DESC(@"wormhole-to-@"), [UNIVERSE getSystemName:destination]];
624 return DESC(
@"wormhole-desc");
659- (BOOL) checkCloseCollisionWith:(
Entity *)other
659- (BOOL) checkCloseCollisionWith:(
Entity *)other {
…}
670 assert(player !=
nil);
691 [UNIVERSE removeEntity:
self];
696- (void) drawImmediate:(
bool)immediate translucent:(
bool)translucent
721 OOGL(glDisable(GL_CULL_FACE));
722 OOGL(glEnable(GL_BLEND));
724 OOGL(glColor4fv(color_fv));
729 color_fv[3] = fmin(color_fv[3] * 2.0, 1.0);
732 OOGL(glEnable(GL_CULL_FACE));
733 OOGL(glDisable(GL_BLEND));
696- (void) drawImmediate:(
bool)immediate translucent:(
bool)translucent {
…}
741static void DrawWormholeCorona(GLfloat inner_radius, GLfloat outer_radius,
int step, GLfloat z_distance, GLfloat *col4v1)
743 if (outer_radius >= z_distance)
747 NSRange activity = { 0.34, 1.0 };
749 GLfloat s0, c0, s1, c1;
754 GLfloat theta, delta, halfStep;
756 r0 = outer_radius * z_distance / sqrt(z_distance * z_distance - outer_radius * outer_radius);
757 r1 = inner_radius * z_distance / sqrt(z_distance * z_distance - inner_radius * inner_radius);
759 delta = step *
M_PI / 180.0f;
760 halfStep = 0.5f * delta;
764 for (i = 0; i < 360; i += step )
769 q = activity.location + rv0 * activity.length;
771 s0 = r0 * sin(theta);
772 c0 = r0 * cos(theta);
773 glColor4f(col4v1[0] * q, col4v1[1] * q, col4v1[2] * q, col4v1[3] * rv0);
774 glVertex3f(s0, c0, 0.0);
776 s1 = r1 * sin(theta - halfStep) * 0.5 * (1.0 + rv1);
777 c1 = r1 * cos(theta - halfStep) * 0.5 * (1.0 + rv1);
779 glVertex3f(s1, c1, 0.0);
787 q = activity.location + rv0 * activity.length;
791 glColor4f(col4v1[0] * q, col4v1[1] * q, col4v1[2] * q, col4v1[3] * rv0);
792 glVertex3f(s0, c0, 0.0);
794 s1 = r1 * sin(halfStep) * 0.5 * (1.0 + rv1);
795 c1 = r1 * cos(halfStep) * 0.5 * (1.0 + rv1);
797 glVertex3f(s1, c1, 0.0);
741static void DrawWormholeCorona(GLfloat inner_radius, GLfloat outer_radius,
int step, GLfloat z_distance, GLfloat *col4v1) {
…}
805 [
myDict oo_setInteger:origin forKey:@"origin_id"];
806 [
myDict oo_setInteger:destination forKey:@"dest_id"];
807 [
myDict setObject:StringFromPoint(originCoords) forKey:@"origin_coords"];
808 [
myDict setObject:StringFromPoint(destinationCoords) forKey:@"dest_coords"];
811 [
myDict oo_setFloat:(expiry_time) forKey:@"expiry_time"];
812 [
myDict oo_setFloat:(arrival_time) forKey:@"arrival_time"];
813 [
myDict oo_setFloat:(estimated_arrival_time) forKey:@"estimated_arrival_time"];
814 [
myDict oo_setHPVector:position forKey:@"position"];
815 [
myDict oo_setBool:_misjump forKey:@"misjump"];
817 NSMutableArray * shipArray = [
NSMutableArray arrayWithCapacity:[shipsInTransit count]];
818 NSEnumerator * ships = [shipsInTransit objectEnumerator];
819 NSDictionary * currShipDict =
nil;
821 while ((currShipDict = [ships nextObject]) !=
nil)
826 [
ship savedShipDictionaryWithContext:context], @"ship_info",
829 [
myDict setObject:shipArray forKey:@"ships"];
845 return @"WH_SCANINFO_UNDEFINED";
862 for (i = 0; i < [shipsInTransit count]; ++i)
864 NSDictionary *shipDict = [shipsInTransit oo_dictionaryAtIndex:i];
867 OOLog(
@"dumpState.wormholeEntity.ships",
@"Ship %d: %@ mass %.2f arrival time %@", i+1, ship, [ship
mass],
ClockToString(ship_arrival_time,
false));
#define NO_DRAW_DISTANCE_FACTOR
#define SCANNER_MAX_RANGE
#define OOLogERR(class, format,...)
NSString *const kOOLogInconsistentState
#define OOLog(class, format,...)
OOMatrix OOMatrixForBillboard(HPVector bbPos, HPVector eyePos)
@ OPENGL_STATE_TRANSLUCENT_PASS
#define OOVerifyOpenGLState()
BOOL OOCheckOpenGLErrors(NSString *format,...)
void GLDrawBallBillboard(GLfloat radius, GLfloat step, GLfloat z_distance)
#define OOSetOpenGLState(STATE)
Vector vector_up_from_quaternion(Quaternion quat)
Vector vector_right_from_quaternion(Quaternion quat)
Vector vector_forward_from_quaternion(Quaternion quat)
void quaternion_set_random(Quaternion *quat)
NSString * ClockToString(double clock, BOOL adjusting)
const Vector kBasisZVector
#define WORMHOLE_SHRINK_RATE
@ WH_SCANINFO_ARRIVAL_TIME
@ WH_SCANINFO_DESTINATION
@ WH_SCANINFO_COLLAPSE_TIME
#define OO_WORMHOLE_COLOR_FVEC4
#define OO_WORMHOLE_COLOR_BOOST
static void DrawWormholeCorona(GLfloat inner_radius, GLfloat outer_radius, int step, GLfloat z_distance, GLfloat *col4v1)
void message:(NSString *ms)
void setVelocity:(Vector vel)
void setOrientation:(Quaternion quat)
void update:(OOTimeDelta delta_t)
GLfloat collisionRadius()
GLfloat cam_zero_distance
void setStatus:(OOEntityStatus stat)
void setPosition:(HPVector posn)
double clockTimeAdjusted()
void setBounty:withReason:(OOCreditsQuantity amount,[withReason] OOLegalStatusReason reason)
void setStatus:(OOEntityStatus stat)
BOOL witchspaceLeavingEffects()
void setRoll:(double amount)
void setSpeed:(double amount)
void doScriptEvent:(jsid message)
void doScriptEvent:andReactToAIMessage:(jsid scriptEvent,[andReactToAIMessage] NSString *aiMessage)
void setPitch:(double amount)
void setBeaconCode:(NSString *bcode)
void update:(OOTimeDelta delta_t)
float afterburnerFactor()
id shipRestoredFromDictionary:useFallback:context:(NSDictionary *dictionary,[useFallback] BOOL fallback,[context] NSMutableDictionary *context)
WORMHOLE_SCANINFO scanInfo()
double estimatedArrivalTime()
NSPoint originCoordinates()
NSPoint destinationCoords
WORMHOLE_SCANINFO scan_info
double estimated_arrival_time
NSMutableArray * shipsInTransit
NSPoint destinationCoordinates()
NSString * scanInfoString()
NSString * descriptionComponents()
void setExitSpeed:(double speed)
static void DrawWormholeCorona(GLfloat inner_radius, GLfloat outer_radius, int step, GLfloat z_distance, GLfloat *col4v1)
OOINLINE double distanceBetweenPlanetPositions(int x1, int y1, int x2, int y2) INLINE_CONST_FUNC