This is Brain.m in view mode; [Download] [Up]
// // This file is a part of Risk by Mike Ferris. // #import "Risk.h" RCSID ("$Id: Brain.m,v 1.1.1.1 1997/12/09 07:18:53 nygard Exp $"); #import "Brain.h" #import "RiskMapView.h" #import "Country.h" #import "CountryShape.h" #import "NewGameController.h" #import "PreferenceController.h" #import "RiskWorld.h" #import "RiskGameManager.h" #import "Version.h" @implementation Brain + (void) initialize { NSUserDefaults *defaults; NSMutableDictionary *riskDefaults; if (self == [Brain class]) { defaults = [NSUserDefaults standardUserDefaults]; riskDefaults = [NSMutableDictionary dictionary]; [riskDefaults setObject:@"NO" forKey:DK_DMakeActive]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer1Type]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer2Type]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer3Type]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer4Type]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer5Type]; [riskDefaults setObject:@"None" forKey:DK_DefaultPlayer6Type]; [riskDefaults setObject:@"Dopey" forKey:DK_DefaultPlayer1Name]; [riskDefaults setObject:@"Sneezy" forKey:DK_DefaultPlayer2Name]; [riskDefaults setObject:@"Grumpy" forKey:DK_DefaultPlayer3Name]; [riskDefaults setObject:@"Doc" forKey:DK_DefaultPlayer4Name]; [riskDefaults setObject:@"Bashful" forKey:DK_DefaultPlayer5Name]; [riskDefaults setObject:@"Sleepy" forKey:DK_DefaultPlayer6Name]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer1Console]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer2Console]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer3Console]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer4Console]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer5Console]; [riskDefaults setObject:@"NO" forKey:DK_ShowPlayer6Console]; [defaults registerDefaults:riskDefaults]; } } //---------------------------------------------------------------------- - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { NSUserDefaults *defaults; RiskWorld *riskWorld; BOOL flag; defaults = [NSUserDefaults standardUserDefaults]; riskWorld = [RiskWorld defaultRiskWorld]; [gameManager setWorld:riskWorld]; [self loadRiskPlayerBundles]; flag = [defaults boolForKey:DK_DMakeActive]; if (flag == YES) { [NSApp activateIgnoringOtherApps:YES]; } } //---------------------------------------------------------------------- - init { if ([super init] == nil) return nil; riskPlayerBundles = [[NSMutableArray array] retain]; gameManager = [[RiskGameManager alloc] init]; preferenceController = nil; return self; } //---------------------------------------------------------------------- - (void) dealloc { SNRelease (gameManager); SNRelease (newGameController); SNRelease (riskPlayerBundles); SNRelease (preferenceController); [super dealloc]; } //---------------------------------------------------------------------- - (void) showNewGamePanel:sender { if (newGameController == nil) newGameController = [[NewGameController alloc] initWithBrain:self]; [newGameController showNewGamePanel]; } //---------------------------------------------------------------------- - (void) showGameSetupPanel:sender { if (newGameController == nil) newGameController = [[NewGameController alloc] initWithBrain:self]; [newGameController showGameSetupPanel]; } //---------------------------------------------------------------------- - (void) info:sender { NSString *nibFile; BOOL loaded; if (infoPanel == nil) { nibFile = @"InfoPanel.nib"; loaded = [NSBundle loadNibNamed:nibFile owner:self]; NSAssert1 (loaded == YES, @"Could not load %@.", nibFile); [versionTextField setStringValue:RISK_VERSION]; } [infoPanel makeKeyAndOrderFront:self]; } //---------------------------------------------------------------------- - (void) showPreferencePanel:sender { if (preferenceController == nil) { preferenceController = [[PreferenceController alloc] init]; } [preferenceController showPanel]; } //---------------------------------------------------------------------- - (void) loadRiskPlayerBundles { NSBundle *mainBundle; NSMutableSet *loadedRiskPlayerNames; NSMutableSet *delayedRiskPlayerPaths; NSMutableSet *tempPlayerNames; NSArray *resourcePaths; NSEnumerator *pathEnumerator; NSBundle *playerBundle; BOOL keepTrying; NSMutableDictionary *loadedBundles; NSString *path; mainBundle = [NSBundle mainBundle]; loadedRiskPlayerNames = [NSMutableSet set]; delayedRiskPlayerPaths = [NSMutableSet set]; tempPlayerNames = [NSMutableSet set]; loadedBundles = [NSMutableDictionary dictionary]; resourcePaths = [mainBundle pathsForResourcesOfType:@"riskplayer" inDirectory:nil]; //NSLog (@"resource paths: %@", resourcePaths); pathEnumerator = [resourcePaths objectEnumerator]; while (path = [pathEnumerator nextObject]) { NSString *str = [[path lastPathComponent] stringByDeletingPathExtension]; // refuse to load if the name matches a module already loaded if ([loadedRiskPlayerNames containsObject:str] == NO) { // OK, all is well -- go load the little bugger //NSLog (@"Load risk player bundle %@", path); playerBundle = [NSBundle bundleWithPath:path]; if ([playerBundle principalClass] == nil) { // Ugh, failed. Put the class name in tempStorage in case // it can't be loaded because it's a subclass of another // CP who hasn't been loaded yet. [delayedRiskPlayerPaths addObject:path]; } else { // it loaded so add it to the list. [loadedBundles setObject:playerBundle forKey:str]; //NSLog (@"str: %@, playerBundle: %@", str, playerBundle); //NSLog (@"priciple class is %@", [playerBundle principalClass]); [loadedRiskPlayerNames addObject:str]; } } } // now loop and keep trying to load the ones in tempStorage. Keep trying // as long as at least one of the failed ones succeeds each time through // the loop do { keepTrying = NO; pathEnumerator = [delayedRiskPlayerPaths objectEnumerator]; while (path = [pathEnumerator nextObject]) { playerBundle = [NSBundle bundleWithPath:path]; if ([playerBundle principalClass] != nil) { NSString *str = [[path lastPathComponent] stringByDeletingPathExtension]; [loadedBundles setObject:playerBundle forKey:str]; //NSLog (@"str: %@, playerBundle: %@", str, playerBundle); //NSLog (@"(delayed) priciple class is %@", [playerBundle principalClass]); keepTrying = YES; [tempPlayerNames addObject:path]; [loadedRiskPlayerNames addObject:str]; } } [delayedRiskPlayerPaths minusSet:tempPlayerNames]; [tempPlayerNames removeAllObjects]; } while (keepTrying == YES); // now cpNameStorage contains a list of all the menu strings. // we must add them to the menus in the panel. //NSLog (@"info: %@", [testBundle infoDictionary]); [riskPlayerBundles addObjectsFromArray:[loadedBundles allValues]]; } //---------------------------------------------------------------------- - (NSArray *) riskPlayerBundles { return riskPlayerBundles; } //---------------------------------------------------------------------- - (RiskGameManager *) gameManager { return gameManager; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.