Deal with permanent and temporary rejects from docking in correct order for multidock vessels

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@5079 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Chris Morris 2012-07-12 12:36:04 +00:00
parent 6a52ff134f
commit cbabc68986
2 changed files with 30 additions and 10 deletions

View File

@ -179,14 +179,23 @@ MA 02110-1301, USA.
- (NSString*) canAcceptShipForDocking:(ShipEntity *) ship
{
// First test permanent rejection reasons
if (!allow_docking && (![ship isPlayer] || !allow_player_docking))
{
return @"TRY_AGAIN_LATER";
return @"TOO_BIG_TO_DOCK"; // not strictly true, but is the permanent-reject code
}
if (!allow_player_docking && [ship isPlayer])
{
return @"TRY_AGAIN_LATER";
return @"TOO_BIG_TO_DOCK"; // not strictly true, but is the permanent-reject code
}
BoundingBox bb = [ship totalBoundingBox];
if ((port_dimensions.x < (bb.max.x - bb.min.x) || port_dimensions.y < (bb.max.y - bb.min.y)) &&
(port_dimensions.y < (bb.max.x - bb.min.x) || port_dimensions.x < (bb.max.y - bb.min.y)))
{
return @"TOO_BIG_TO_DOCK";
}
// Second test temporary rejection reasons
if (no_docking_while_launching)
{
return @"TRY_AGAIN_LATER";
@ -196,12 +205,6 @@ MA 02110-1301, USA.
{
return @"TRY_AGAIN_LATER";
}
BoundingBox bb = [ship totalBoundingBox];
if ((port_dimensions.x < (bb.max.x - bb.min.x) || port_dimensions.y < (bb.max.y - bb.min.y)) &&
(port_dimensions.y < (bb.max.x - bb.min.x) || port_dimensions.x < (bb.max.y - bb.min.y)))
{
return @"TOO_BIG_TO_DOCK";
}
return @"DOCKING_POSSIBLE";
}

View File

@ -381,8 +381,8 @@ NSDictionary *OOMakeDockingInstructions(StationEntity *station, Vector coords, f
}
// this routine does more than set coordinates - it provides a whole set of docking instructions and messages at each stage..
//
// this routine does initial traffic control, before passing the ship
// to an appropriate dock for docking coordinates and instructions
- (NSDictionary *) dockingInstructionsForShip:(ShipEntity *) ship
{
if (ship == nil) return nil;
@ -412,11 +412,13 @@ NSDictionary *OOMakeDockingInstructions(StationEntity *station, Vector coords, f
DockEntity *sub = nil;
unsigned queue = 100;
BOOL alldockstoosmall = YES;
for (subEnum = [self dockSubEntityEnumerator]; (sub = [subEnum nextObject]); )
{
if ([sub shipIsInDockingQueue:ship])
{ // if already claimed a docking queue, use that one
chosenDock = sub;
alldockstoosmall = NO;
break;
}
if (sub != player_reserved_dock)
@ -426,11 +428,26 @@ NSDictionary *OOMakeDockingInstructions(StationEntity *station, Vector coords, f
// try to select the dock with the fewest ships already enqueued
chosenDock = sub;
queue = [sub countOfShipsInDockingQueue];
alldockstoosmall = NO;
}
else if (![docking isEqualToString:@"TOO_BIG_TO_DOCK"])
{
alldockstoosmall = NO;
}
}
else
{
alldockstoosmall = NO;
}
}
if (chosenDock == nil)
{
if ([docking isEqualToString:@"TOO_BIG_TO_DOCK"] && !alldockstoosmall)
{
// last dock was too small, but there may be an acceptable one
// not tested yet or returning TRY_AGAIN_LATER
docking = @"TRY_AGAIN_LATER";
}
// no docks accept this ship (or the player is blocking them)
return OOMakeDockingInstructions(self, [ship position], 0, 100, docking, nil, NO);
}