Oolite 1.91.0.7645-241119-222d325
Loading...
Searching...
No Matches
ShipEntity(AI) Category Reference

#include <ShipEntityAI.h>

Instance Methods

(void) - setAITo:
 
(void) - setAIScript:
 
(void) - switchAITo:
 
(void) - scanForHostiles
 
(BOOL) - performHyperSpaceToSpecificSystem:
 
(void) - scanForNearestIncomingMissile
 
(void) - enterTargetWormhole
 
(void) - enterPlayerWormhole
 
(void) - wormholeEscorts
 
(void) - wormholeEntireGroup
 
(BOOL) - suggestEscortTo:
 
(void) - groupAttackTarget
 
(void) - performAttack
 
(void) - performCollect
 
(void) - performEscort
 
(void) - performFaceDestination
 
(void) - performFlee
 
(void) - performFlyToRangeFromDestination
 
(void) - performHold
 
(void) - performIdle
 
(void) - performIntercept
 
(void) - performLandOnPlanet
 
(void) - performMining
 
(void) - performScriptedAI
 
(void) - performScriptedAttackAI
 
(void) - performStop
 
(void) - performTumble
 
(void) - broadcastDistressMessage
 
(void) - broadcastDistressMessageWithDumping:
 
(void) - requestDockingCoordinates
 
(void) - recallDockingInstructions
 
(void) - performBuoyTumble [implementation]
 

Detailed Description

Definition at line 32 of file ShipEntityAI.h.

Method Documentation

◆ broadcastDistressMessage

- (void) broadcastDistressMessage

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

764{
765 /*-- Locates all the stations, bounty hunters and police ships in range and tells them that you are under attack --*/
766 [self broadcastDistressMessageWithDumping:YES];
767}

◆ broadcastDistressMessageWithDumping:

- (void) broadcastDistressMessageWithDumping: (BOOL) dumpCargo

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

769 :(BOOL)dumpCargo
770{
771 [self checkScannerIgnoringUnpowered];
772 DESTROY(_foundTarget);
773
774 ShipEntity *aggressor_ship = (ShipEntity*)[self primaryAggressor];
775 if (aggressor_ship == nil) return;
776
777 // don't send too many distress messages at once, space them out semi-randomly
778 if (messageTime > 2.0 * randf()) return;
779
780 NSString *distress_message = nil;
781 BOOL is_buoy = (scanClass == CLASS_BUOY);
782 if (is_buoy) distress_message = @"[buoy-distress-call]";
783 else distress_message = @"[distress-call]";
784
785 unsigned i;
786 for (i = 0; i < n_scanned_ships; i++)
787 {
788 ShipEntity* ship = scanned_ships[i];
789
790 // dump cargo if energy is low
791 if (dumpCargo && !is_buoy && [self primaryAggressor] == ship && energy < 0.375 * maxEnergy)
792 {
793 [self ejectCargo];
794 [self performFlee];
795 }
796
797 // tell it! (only plist AIs send comms here; JS AIs are
798 // expected to handle their own)
799 if (ship->isPlayer && ![self hasNewAI])
800 {
801 [ship doScriptEvent:OOJSID("distressMessageReceived") withArgument:aggressor_ship andArgument:self];
802
803 if (!is_buoy && [self primaryAggressor] == ship && energy < 0.375 * maxEnergy)
804 {
805 [self sendExpandedMessage:@"[beg-for-mercy]" toShip:ship];
806 }
807 else if ([self bounty] == 0)
808 {
809 // only send distress message to player if plausibly sending
810 // one more generally
811 [self sendExpandedMessage:distress_message toShip:ship];
812 }
813
814 // reset the thanked_ship_id
815 DESTROY(_thankedShip);
816 }
817 else if ([self bounty] == 0 && [ship crew]) // Only clean ships can have their distress calls accepted
818 {
819 [ship doScriptEvent:OOJSID("distressMessageReceived") withArgument:aggressor_ship andArgument:self];
820
821 // we only can send distressMessages to ships that are known to have a "ACCEPT_DISTRESS_CALL" reaction
822 // in their AI, or they might react wrong on the added found_target.
823
824 // ship must have a plist AI for this next bit. JS AIs
825 // should already have done something sensible on
826 // distressMessageReceived
827 if (![self hasNewAI])
828 {
829 // FIXME: this test only works with core AIs
830 if (ship->isStation || [ship hasPrimaryRole:@"police"] || [ship hasPrimaryRole:@"hunter"])
831 {
832 [ship acceptDistressMessageFrom:self];
833 }
834 }
835 }
836 }
837}
#define DESTROY(x)
Definition OOCocoa.h:77
return nil
unsigned isStation
Definition Entity.h:92
unsigned isPlayer
Definition Entity.h:93
void acceptDistressMessageFrom:(ShipEntity *other)
void doScriptEvent:withArgument:andArgument:(jsid message,[withArgument] id argument1,[andArgument] id argument2)
float randf(void)

◆ enterPlayerWormhole

- (void) enterPlayerWormhole

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

635{
636 [self enterWormhole:[PLAYER wormhole] replacing:NO];
637}

◆ enterTargetWormhole

- (void) enterTargetWormhole

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

640{
641 WormholeEntity *whole = nil;
642 ShipEntity *targEnt = [self primaryTarget];
643 double found_d2 = scannerRange * scannerRange;
644
645 if (targEnt && (HPdistance2(position, [targEnt position]) < found_d2))
646 {
647 if ([targEnt isWormhole])
648 whole = (WormholeEntity *)targEnt;
649 else if ([targEnt isPlayer])
650 whole = [PLAYER wormhole];
651 }
652
653 if (!whole)
654 {
655 // locate nearest wormhole
656 int ent_count = UNIVERSE->n_entities;
657 Entity** uni_entities = UNIVERSE->sortedEntities; // grab the public sorted list
658 WormholeEntity* wormholes[ent_count];
659 int i;
660 int wh_count = 0;
661 for (i = 0; i < ent_count; i++)
662 if (uni_entities[i]->isWormhole)
663 wormholes[wh_count++] = [(WormholeEntity *)uni_entities[i] retain];
664 //
665 //double found_d2 = scannerRange * scannerRange;
666 for (i = 0; i < wh_count ; i++)
667 {
668 WormholeEntity *wh = wormholes[i];
669 double d2 = HPdistance2(position, wh->position);
670 if (d2 < found_d2)
671 {
672 whole = wh;
673 found_d2 = d2;
674 }
675 [wh release];
676 }
677 }
678
679 [self enterWormhole:whole replacing:NO];
680}
#define UNIVERSE
Definition Universe.h:833
HPVector position
Definition Entity.h:112

◆ groupAttackTarget

- (void) groupAttackTarget

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

340{
341 NSEnumerator *shipEnum = nil;
342 ShipEntity *target = nil, *ship = nil;
343
344 target = [self primaryTarget];
345
346 if (target == nil) return;
347
348 if ([self group] == nil) // ship is alone!
349 {
350 [self setFoundTarget:target];
351 [shipAI reactToMessage:@"GROUP_ATTACK_TARGET" context:@"groupAttackTarget"];
352 [self doScriptEvent:OOJSID("helpRequestReceived") withArgument:self andArgument:target];
353 return;
354 }
355
356 for (shipEnum = [[self group] mutationSafeEnumerator]; (ship = [shipEnum nextObject]); )
357 {
358 [ship setFoundTarget:target];
359 [ship reactToAIMessage:@"GROUP_ATTACK_TARGET" context:@"groupAttackTarget"];
360 [ship doScriptEvent:OOJSID("helpRequestReceived") withArgument:self andArgument:target];
361
362 if ([ship escortGroup] != [ship group] && [[ship escortGroup] count] > 1) // Ship has a seperate escort group.
363 {
364 ShipEntity *escort = nil;
365 NSEnumerator *shipEnum = nil;
366 NSArray *escortMembers = [[ship escortGroup] memberArrayExcludingLeader];
367 for (shipEnum = [escortMembers objectEnumerator]; (escort = [shipEnum nextObject]); )
368 {
369 [escort setFoundTarget:target];
370 [escort reactToAIMessage:@"GROUP_ATTACK_TARGET" context:@"groupAttackTarget"];
371 [escort doScriptEvent:OOJSID("helpRequestReceived") withArgument:self andArgument:target];
372 }
373 }
374 }
375}
unsigned count
void reactToAIMessage:context:(NSString *message,[context] NSString *debugContext)
void setFoundTarget:(Entity *targetEntity)

◆ performAttack

- (void) performAttack

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

379{
380 if (behaviour != BEHAVIOUR_EVASIVE_ACTION)
381 {
382 behaviour = BEHAVIOUR_ATTACK_TARGET;
383 desired_range = 1250 * randf() + 750; // 750 til 2000
384 frustration = 0.0;
385 }
386}

◆ performBuoyTumble

- (void) performBuoyTumble
implementation

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

511{
512 stick_roll = 0.10;
513 stick_pitch = 0.15;
514 behaviour = BEHAVIOUR_TUMBLE;
515 frustration = 0.0;
516}

◆ performCollect

- (void) performCollect

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

390{
391 behaviour = BEHAVIOUR_COLLECT_TARGET;
392 frustration = 0.0;
393}

◆ performEscort

- (void) performEscort

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

397{
398 if(behaviour != BEHAVIOUR_FORMATION_FORM_UP)
399 {
400 behaviour = BEHAVIOUR_FORMATION_FORM_UP;
401 frustration = 0.0; // behavior changed, reset frustration.
402 }
403}

◆ performFaceDestination

- (void) performFaceDestination

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

407{
408 behaviour = BEHAVIOUR_FACE_DESTINATION;
409 frustration = 0.0;
410}

◆ performFlee

- (void) performFlee

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

414{
415 if (behaviour != BEHAVIOUR_FLEE_EVASIVE_ACTION)
416 {
417 behaviour = BEHAVIOUR_FLEE_TARGET;
418 [self setEvasiveJink:400.0];
419 frustration = 0.0;
420 if (accuracy > COMBAT_AI_ISNT_AWFUL)
421 {
422 // alert! they've got us in their sights! react!!
423 if ([self approachAspectToPrimaryTarget] > 0.9995)
424 {
425 behaviour = randf() < 0.15 ? BEHAVIOUR_EVASIVE_ACTION : BEHAVIOUR_FLEE_EVASIVE_ACTION;
426 }
427 }
428 }
429}
#define COMBAT_AI_ISNT_AWFUL
Definition ShipEntity.h:123

◆ performFlyToRangeFromDestination

- (void) performFlyToRangeFromDestination

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

433{
434 behaviour = BEHAVIOUR_FLY_RANGE_FROM_DESTINATION;
435 frustration = 0.0;
436}

◆ performHold

- (void) performHold

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

440{
441 desired_speed = 0.0;
442 behaviour = BEHAVIOUR_TRACK_TARGET;
443 frustration = 0.0;
444}

◆ performHyperSpaceToSpecificSystem:

- (BOOL) performHyperSpaceToSpecificSystem: (OOSystemID) systemID

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

536 :(OOSystemID)systemID
537{
538 return [self performHyperSpaceExitReplace:NO toSystem:systemID];
539}
int16_t OOSystemID
Definition OOTypes.h:211

◆ performIdle

- (void) performIdle

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

448{
449 behaviour = BEHAVIOUR_IDLE;
450 frustration = 0.0;
451}

◆ performIntercept

- (void) performIntercept

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

455{
456 behaviour = BEHAVIOUR_INTERCEPT_TARGET;
457 frustration = 0.0;
458}

◆ performLandOnPlanet

- (void) performLandOnPlanet

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

462{
463 OOPlanetEntity *nearest = [self findNearestPlanet];
464 if (isNearPlanetSurface)
465 {
466 _destination = [nearest position];
467 behaviour = BEHAVIOUR_LAND_ON_PLANET;
468 planetForLanding = [nearest universalID];
469 }
470 else
471 {
472 behaviour = BEHAVIOUR_IDLE;
473 [shipAI message:@"NO_PLANET_NEARBY"];
474 }
475
476 frustration = 0.0;
477}

◆ performMining

- (void) performMining

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

481{
482 Entity *target = [self primaryTarget];
483 // mining is not seen as hostile behaviour, so ensure it is only used against rocks.
484 if (target && [target scanClass] == CLASS_ROCK)
485 {
486 behaviour = BEHAVIOUR_ATTACK_MINING_TARGET;
487 frustration = 0.0;
488 }
489 else
490 {
491 [self noteLostTargetAndGoIdle];
492 }
493}

◆ performScriptedAI

- (void) performScriptedAI

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

497{
498 behaviour = BEHAVIOUR_SCRIPTED_AI;
499 frustration = 0.0;
500}

◆ performScriptedAttackAI

- (void) performScriptedAttackAI

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

504{
505 behaviour = BEHAVIOUR_SCRIPTED_ATTACK_AI;
506 frustration = 0.0;
507}

◆ performStop

- (void) performStop

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

520{
521 behaviour = BEHAVIOUR_STOP_STILL;
522 desired_speed = 0.0;
523 frustration = 0.0;
524}

◆ performTumble

- (void) performTumble

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

528{
529 stick_roll = max_flight_roll*2.0*(randf() - 0.5);
530 stick_pitch = max_flight_pitch*2.0*(randf() - 0.5);
531 behaviour = BEHAVIOUR_TUMBLE;
532 frustration = 0.0;
533}

◆ recallDockingInstructions

- (void) recallDockingInstructions

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

600{
601 if (dockingInstructions != nil)
602 {
603 _destination = [dockingInstructions oo_hpvectorForKey:@"destination"];
604 desired_speed = fmin([dockingInstructions oo_floatForKey:@"speed"], maxFlightSpeed);
605 desired_range = [dockingInstructions oo_floatForKey:@"range"];
606 if ([dockingInstructions objectForKey:@"station"])
607 {
608 StationEntity *targetStation = [[dockingInstructions objectForKey:@"station"] weakRefUnderlyingObject];
609 if (targetStation != nil)
610 {
611 [self addTarget:targetStation];
612 [self setTargetStation:targetStation];
613 }
614 else
615 {
616 [self removeTarget:[self primaryTarget]];
617 }
618 }
619 docking_match_rotation = [dockingInstructions oo_boolForKey:@"match_rotation"];
620 }
621}

◆ requestDockingCoordinates

- (void) requestDockingCoordinates

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

543{
544 /*- requests coordinates from the target station
545 if the target station can't be found
546 then use the nearest it can find (which may be a rock hermit) -*/
547
548 StationEntity *station = nil;
549 Entity *targStation = nil;
550 NSString *message = nil;
551 double distanceToStation2 = 0.0;
552
553 targStation = [self targetStation];
554 if ([targStation isStation])
555 {
556 station = (StationEntity*)targStation;
557 }
558 else
559 {
560 station = [UNIVERSE nearestShipMatchingPredicate:IsStationPredicate
561 parameter:nil
562 relativeToEntity:self];
563 }
564
565 distanceToStation2 = HPdistance2([station position], [self position]);
566
567 // Player check for being inside the aegis already exists in PlayerEntityControls. We just
568 // check here that distance to station is less than 2.5 times scanner range to avoid problems with
569 // NPC ships getting stuck with a dockingAI while just outside the aegis - Nikos 20090630, as proposed by Eric
570 // On very busy systems (> 50 docking ships) docking ships can be sent to a hold position outside the range,
571 // so also test for presence of dockingInstructions. - Eric 20091130
572 if (station != nil && (distanceToStation2 < SCANNER_MAX_RANGE2 * 6.25 || dockingInstructions != nil))
573 {
574 // remember the instructions
575 [dockingInstructions release];
576 dockingInstructions = [[station dockingInstructionsForShip:self] retain];
577 if (dockingInstructions != nil)
578 {
579 [self recallDockingInstructions];
580
581 message = [dockingInstructions objectForKey:@"ai_message"];
582 if (message != nil) [shipAI message:message];
583 message = [dockingInstructions objectForKey:@"comms_message"];
584 if (message != nil) [station sendExpandedMessage:message toShip:self];
585 }
586 }
587 else
588 {
589 DESTROY(dockingInstructions);
590 }
591
592 if (dockingInstructions == nil)
593 {
594 [shipAI message:@"NO_STATION_FOUND"];
595 }
596}
#define SCANNER_MAX_RANGE2
Definition Entity.h:52

◆ scanForHostiles

- (void) scanForHostiles

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

315{
316 /*-- Locates all the ships in range targeting the receiver and chooses the nearest --*/
317 DESTROY(_foundTarget);
318
319 [self checkScanner];
320 unsigned i;
321 GLfloat found_d2 = scannerRange * scannerRange;
322 for (i = 0; i < n_scanned_ships ; i++)
323 {
324 ShipEntity *thing = scanned_ships[i];
325 GLfloat d2 = distance2_scanned_ships[i];
326 if ((d2 < found_d2)
327 && ([thing isThargoid] || (([thing primaryTarget] == self) && [thing hasHostileTarget]) || [thing isDefenseTarget:self])
328 && ![thing isCloaked])
329 {
330 [self setFoundTarget:thing];
331 found_d2 = d2;
332 }
333 }
334
335 [self checkFoundTarget];
336}

◆ scanForNearestIncomingMissile

- (void) scanForNearestIncomingMissile

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

625{
627 {
628 HasScanClassPredicate, [NSNumber numberWithInt:CLASS_MISSILE],
630 };
631 [self scanForNearestShipWithPredicate:ANDPredicate parameter:&param];
632}
BOOL HasScanClassPredicate(Entity *entity, void *parameter)
BOOL IsHostileAgainstTargetPredicate(Entity *ship, void *parameter)

◆ setAIScript:

- (void) setAIScript: (NSString *) aiString

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

284 :(NSString *)aiString
285{
286 NSMutableDictionary *properties = nil;
287
288 properties = [NSMutableDictionary dictionary];
289 [properties setObject:self forKey:@"ship"];
290
291 [aiScript autorelease];
292 aiScript = [OOScript jsAIScriptFromFileNamed:aiString properties:properties];
293 if (aiScript == nil)
294 {
295 OOLog(@"ai.load.failed.unknownAI",@"Unable to load JS AI %@ for ship %@ (%@ for role %@)",aiString,self,[self shipDataKey],[self primaryRole]);
296 aiScript = [OOScript jsAIScriptFromFileNamed:@"oolite-nullAI.js" properties:properties];
297 }
298 else
299 {
300 aiScriptWakeTime = 0;
301 haveStartedJSAI = NO;
302 }
303 [aiScript retain];
304}
#define OOLog(class, format,...)
Definition OOLogging.h:88
id jsAIScriptFromFileNamed:properties:(NSString *fileName,[properties] NSDictionary *properties)
Definition OOScript.m:221

◆ setAITo:

- (void) setAITo: (NSString *) aiString

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

252 :(NSString *)aiString
253{
254 // don't try to load real AIs if the game hasn't started yet
255 if (![PLAYER scriptsLoaded])
256 {
257 aiString = @"oolite-nullAI.js";
258 }
259 if ([aiString hasSuffix:@".plist"])
260 {
261 [[self getAI] setStateMachine:aiString withJSScript:@"oolite-nullAI.js"];
262 [self setAIScript:@"oolite-nullAI.js"];
263 }
264 else if ([aiString hasSuffix:@".js"])
265 {
266 [[self getAI] setStateMachine:@"nullAI.plist" withJSScript:aiString];
267 [self setAIScript:aiString];
268 }
269 else
270 {
271 NSString *path = [ResourceManager pathForFileNamed:[aiString stringByAppendingString:@".js"] inFolder:@"AIs"];
272 if (path == nil) // no js, use plist
273 {
274 [self setAITo:[aiString stringByAppendingString:@".plist"]];
275 }
276 else
277 {
278 [self setAITo:[aiString stringByAppendingString:@".js"]];
279 }
280 }
281}
#define PLAYER
NSString * pathForFileNamed:inFolder:(NSString *fileName,[inFolder] NSString *folderName)

◆ suggestEscortTo:

- (BOOL) suggestEscortTo: (ShipEntity *) mother

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

720 :(ShipEntity *)mother
721{
722 if (mother)
723 {
724#ifndef NDEBUG
725 if (reportAIMessages)
726 {
727 OOLog(@"ai.suggestEscort", @"DEBUG: %@ suggests escorting %@", self, mother);
728 }
729#endif
730
731 if ([mother acceptAsEscort:self])
732 {
733 // copy legal status across
734 if (([mother legalStatus] > 0)&&(bounty <= 0))
735 {
736 int extra = 1 | (ranrot_rand() & 15);
737// [mother setBounty: [mother legalStatus] + extra withReason:kOOLegalStatusReasonAssistingOffender];
738 [self markAsOffender:extra withReason:kOOLegalStatusReasonAssistingOffender];
739 // bounty += extra; // obviously we're dodgier than we thought!
740 }
741
742 [self setOwner:mother];
743 [self setGroup:[mother escortGroup]];
744 [shipAI message:@"ESCORTING"];
745 return YES;
746 }
747
748#ifndef NDEBUG
749 if (reportAIMessages)
750 {
751 OOLog(@"ai.suggestEscort.refused", @"DEBUG: %@ refused by %@", self, mother);
752 }
753#endif
754
755 }
756 [self setOwner:self];
757 [shipAI message:@"NOT_ESCORTING"];
758 [self doScriptEvent:OOJSID("escortRejected") withArgument:mother];
759 return NO;
760}
OOShipGroup * escortGroup()
#define ranrot_rand()

◆ switchAITo:

- (void) switchAITo: (NSString *) aiString

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

307 :(NSString *)aiString
308{
309 [self setAITo:aiString];
310 [[self getAI] clearStack];
311}

◆ wormholeEntireGroup

- (void) wormholeEntireGroup

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

714{
715 [self wormholeGroup];
716 [self wormholeEscorts];
717}

◆ wormholeEscorts

- (void) wormholeEscorts

Extends class ShipEntity.

Definition at line 1 of file ShipEntityAI.m.

685{
686 NSEnumerator *shipEnum = nil;
687 ShipEntity *ship = nil;
688 NSString *context = nil;
689 WormholeEntity *whole = nil;
690
691 whole = [self primaryTarget];
692 if (![whole isWormhole]) return;
693
694#ifndef NDEBUG
695 context = [NSString stringWithFormat:@"%@ wormholeEscorts", [self shortDescription]];
696#endif
697
698 for (shipEnum = [self escortEnumerator]; (ship = [shipEnum nextObject]); )
699 {
700 [ship addTarget:whole];
701 [ship reactToAIMessage:@"ENTER WORMHOLE" context:context];
702 [ship doScriptEvent:OOJSID("wormholeSuggested") withArgument:whole];
703 }
704
705 // We now have no escorts..
706
707 [_escortGroup release];
708 _escortGroup = nil;
709
710}
void addTarget:(Entity *targetEntity)
void doScriptEvent:withArgument:(jsid message,[withArgument] id argument)

The documentation for this category was generated from the following files: