fixes and code clean up

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@636 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Giles Williams 2006-07-05 13:23:38 +00:00
parent df228eed52
commit 1d3f29ff2e
2 changed files with 140 additions and 58 deletions

View File

@ -583,6 +583,9 @@ ShipEntity* doOctreesCollide(ShipEntity* prime, ShipEntity* other);
-----------------------------------------*/
BOOL class_masslocks(int some_class);
- (BOOL) checkTorusJumpClear;
- (void) checkScanner;
- (void) setFound_target:(Entity *) targetEntity;
@ -600,6 +603,8 @@ ShipEntity* doOctreesCollide(ShipEntity* prime, ShipEntity* other);
- (double) ballTrackTarget:(double) delta_t;
- (double) ballTrackLeadingTarget:(double) delta_t;
- (GLfloat) rollToMatchUp:(Vector) up_vec rotating:(GLfloat) match_roll;
- (GLfloat) rangeToDestination;
- (double) trackDestination:(double) delta_t :(BOOL) retreat;
@ -677,6 +682,7 @@ inline BOOL pairOK(NSString* my_role, NSString* their_role);
- (NSArray *) shipsInGroup:(int) ship_group_id;
- (void) sendExpandedMessage:(NSString *) message_text toShip:(ShipEntity*) other_ship;
- (void) broadcastAIMessage:(NSString *) ai_message;
- (void) broadcastMessage:(NSString *) message_text;
- (void) setCommsMessageColor;
- (void) receiveCommsMessage:(NSString *) message_text;

View File

@ -2995,6 +2995,7 @@ ShipEntity* doOctreesCollide(ShipEntity* prime, ShipEntity* other)
}
}
}
[self applyRoll:delta_t*flight_roll andClimb:delta_t*flight_pitch];
GLfloat temp = desired_speed;
desired_speed *= v0 * v0;
@ -4725,6 +4726,51 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q
-----------------------------------------*/
BOOL class_masslocks(int some_class)
{
switch (some_class)
{
case CLASS_BUOY :
case CLASS_ROCK :
case CLASS_CARGO :
case CLASS_MINE :
case CLASS_NO_DRAW :
return NO;
break;
case CLASS_THARGOID :
case CLASS_MISSILE :
case CLASS_STATION :
case CLASS_POLICE :
case CLASS_MILITARY :
case CLASS_WORMHOLE :
default :
return YES;
break;
}
return YES;
}
- (BOOL) checkTorusJumpClear
{
Entity* scan;
//
scan = z_previous; while ((scan)&&(!class_masslocks( scan->scan_class))) scan = scan->z_previous; // skip non-mass-locking
while ((scan)&&(scan->position.z > position.z - scanner_range))
{
if (class_masslocks( scan->scan_class) && (distance2( position, scan->position) < SCANNER_MAX_RANGE2))
return NO;
scan = scan->z_previous; while ((scan)&&(!class_masslocks( scan->scan_class))) scan = scan->z_previous;
}
scan = z_next; while ((scan)&&(!class_masslocks( scan->scan_class))) scan = scan->z_next; // skip non-mass-locking
while ((scan)&&(scan->position.z < position.z + scanner_range))
{
if (class_masslocks( scan->scan_class) && (distance2( position, scan->position) < SCANNER_MAX_RANGE2))
return NO;
scan = scan->z_previous; while ((scan)&&(!class_masslocks( scan->scan_class))) scan = scan->z_previous;
}
return YES;
}
- (void) checkScanner
{
Entity* scan;
@ -5404,38 +5450,35 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q
if ((station_for_docking)&&(station_for_docking->isStation))
{
// Vector up_vec = [station_for_docking portUpVector];
Vector up_vec = [station_for_docking portUpVectorForShipsBoundingBox: boundingBox];
double cosTheta = dot_product(up_vec, v_up); // == cos of angle between up vectors
double sinTheta = dot_product(up_vec, v_right);
double station_roll = [station_for_docking flight_roll];
if (!isPlayer)
{
station_roll = -station_roll; // make necessary corrections for a different viewpoint
sinTheta = -sinTheta;
}
if (cosTheta < 0)
{
cosTheta = -cosTheta;
sinTheta = -sinTheta;
}
if (sinTheta > 0.0)
{
// increase roll rate
stick_roll = cosTheta * cosTheta * station_roll + sinTheta * sinTheta * max_flight_roll;
}
else
{
// decrease roll rate
stick_roll = cosTheta * cosTheta * station_roll - sinTheta * sinTheta * max_flight_roll;
}
// NSLog(@"DEBUG %@ docking with %@ -- matching rotation .. docking cosTheta %.3f sinTheta %.3f station_roll %.3f stick_roll %.3f",
// self, [self getPrimaryTarget], cosTheta, sinTheta, station_roll, stick_roll);
stick_roll = [self rollToMatchUp:[station_for_docking portUpVectorForShipsBoundingBox: boundingBox] rotating:[station_for_docking flight_roll]];
// Vector up_vec = [station_for_docking portUpVectorForShipsBoundingBox: boundingBox];
// double cosTheta = dot_product(up_vec, v_up); // == cos of angle between up vectors
// double sinTheta = dot_product(up_vec, v_right);
//
// double station_roll = [station_for_docking flight_roll];
//
// if (!isPlayer)
// {
// station_roll = -station_roll; // make necessary corrections for a different viewpoint
// sinTheta = -sinTheta;
// }
//
// if (cosTheta < 0)
// {
// cosTheta = -cosTheta;
// sinTheta = -sinTheta;
// }
//
// if (sinTheta > 0.0)
// {
// // increase roll rate
// stick_roll = cosTheta * cosTheta * station_roll + sinTheta * sinTheta * max_flight_roll;
// }
// else
// {
// // decrease roll rate
// stick_roll = cosTheta * cosTheta * station_roll - sinTheta * sinTheta * max_flight_roll;
// }
}
}
@ -5473,6 +5516,35 @@ Vector positionOffsetForShipInRotationToAlignment(ShipEntity* ship, Quaternion q
return d_forward;
}
- (GLfloat) rollToMatchUp:(Vector) up_vec rotating:(GLfloat) match_roll;
{
GLfloat cosTheta = dot_product(up_vec, v_up); // == cos of angle between up vectors
GLfloat sinTheta = dot_product(up_vec, v_right);
if (!isPlayer)
{
match_roll = -match_roll; // make necessary corrections for a different viewpoint
sinTheta = -sinTheta;
}
if (cosTheta < 0.0f)
{
cosTheta = -cosTheta;
sinTheta = -sinTheta;
}
if (sinTheta > 0.0f)
{
// increase roll rate
return cosTheta * cosTheta * match_roll + sinTheta * sinTheta * max_flight_roll;
}
else
{
// decrease roll rate
return cosTheta * cosTheta * match_roll - sinTheta * sinTheta * max_flight_roll;
}
}
- (GLfloat) rangeToDestination
{
return sqrtf(distance2( position, destination));
@ -7386,39 +7458,43 @@ inline BOOL pairOK(NSString* my_role, NSString* their_role)
[universe resetCommsLogColor];
}
- (void) broadcastMessage:(NSString *) message_text
- (void) broadcastAIMessage:(NSString *) ai_message
{
/*-- Locates all the stations, bounty hunters and police ships in range and tells them your message --*/
NSString* expandedMessage = [NSString stringWithFormat:@"%@:\n %@", name, [universe expandDescription:message_text forSystem:[universe systemSeed]]];
if (!universe)
return;
int ent_count = universe->n_entities;
Entity** uni_entities = universe->sortedEntities; // grab the public sorted list
Entity* my_entities[ent_count];
NSString* expandedMessage = [universe expandDescription:ai_message forSystem:[universe systemSeed]];
[self checkScanner];
int i;
int ship_count = 0;
for (i = 0; i < ent_count; i++)
if (uni_entities[i]->isShip)
my_entities[ship_count++] = [uni_entities[i] retain]; // retained
//
double d2;
double found_d2 = scanner_range * scanner_range;
found_target = NO_TARGET;
[self setCommsMessageColor];
for (i = 0; i < ship_count ; i++)
for (i = 0; i < n_scanned_ships ; i++)
{
ShipEntity* ship = (ShipEntity *)my_entities[i];
d2 = distance2( position, ship->position);
if (d2 < found_d2)
{
[ship receiveCommsMessage: expandedMessage];
if (ship->isPlayer)
message_time = 6.0;
}
ShipEntity* ship = scanned_ships[i];
[[ship getAI] message: expandedMessage];
}
}
- (void) broadcastMessage:(NSString *) message_text
{
if (!universe)
return;
NSString* expandedMessage = [NSString stringWithFormat:@"%@:\n %@", name, [universe expandDescription:message_text forSystem:[universe systemSeed]]];
if (!crew)
return; // nobody to send the signal
[self setCommsMessageColor];
[self checkScanner];
int i;
for (i = 0; i < n_scanned_ships ; i++)
{
ShipEntity* ship = scanned_ships[i];
[ship receiveCommsMessage: expandedMessage];
if (ship->isPlayer)
message_time = 6.0;
}
for (i = 0; i < ship_count; i++)
[my_entities[i] release]; // released
[universe resetCommsLogColor];
}