This is NewGameController.m in view mode; [Download] [Up]
// // This file is a part of Risk by Mike Ferris. // #import "Risk.h" RCSID ("$Id: NewGameController.m,v 1.2 1997/12/15 07:43:57 nygard Exp $"); #import "NewGameController.h" #import "Brain.h" #import "RiskGameManager.h" #import "Human.h" #import "GameConfiguration.h" #import "BoardSetup.h" //====================================================================== // The NewGameController loads the panel, adds loaded computer players // to the appropriate popup buttons, updates the controls to reflect // the default values, and creates a new game based on the current // values. // // This also doubles as a preference panel for all of the options. //====================================================================== #define NewGameController_VERSION 1 @implementation NewGameController + (void) initialize { if (self == [NewGameController class]) { [self setVersion:NewGameController_VERSION]; } } //---------------------------------------------------------------------- - (void) awakeFromNib { NSArray *riskPlayerBundles; NSEnumerator *bundleEnumerator; NSBundle *bundle; NSMutableArray *playerTypeNames; NSString *name; playerTypeNames = [NSMutableArray array]; riskPlayerBundles = [brain riskPlayerBundles]; bundleEnumerator = [riskPlayerBundles objectEnumerator]; while (bundle = [bundleEnumerator nextObject]) { name = [[bundle infoDictionary] objectForKey:@"PlayerTypeName"]; [playerTypeNames addObject:name]; } [player1TypePopup addItemsWithTitles:playerTypeNames]; [player2TypePopup addItemsWithTitles:playerTypeNames]; [player3TypePopup addItemsWithTitles:playerTypeNames]; [player4TypePopup addItemsWithTitles:playerTypeNames]; [player5TypePopup addItemsWithTitles:playerTypeNames]; [player6TypePopup addItemsWithTitles:playerTypeNames]; [self revertToDefaults]; } //---------------------------------------------------------------------- - initWithBrain:(Brain *)theBrain { NSString *nibFile; BOOL loaded; if ([super init] == nil) return nil; gameConfiguration = [[GameConfiguration alloc] init]; boardSetup = [BoardSetup instance]; brain = theBrain; // -awakeFromNib gets called immediately, so the above stuff must // already be set up. nibFile = @"NewGamePanel.nib"; loaded = [NSBundle loadNibNamed:nibFile owner:self]; if (loaded == NO) { NSLog (@"Could not load %@.", nibFile); SNRelease (gameConfiguration); [super dealloc]; return nil; } runningAsPreferences = NO; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (boardSetupChanged:) name:RiskBoardSetupPlayerColorsChangedNotification object:nil]; return self; } //---------------------------------------------------------------------- - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; SNRelease (gameConfiguration); //SNRelease (boardSetup); [super dealloc]; } //---------------------------------------------------------------------- - (void) showNewGamePanel { runningAsPreferences = NO; [newGamePanel setTitle:@"New Game"]; [acceptButton setTitle:@"Accept"]; [cancelButton setTitle:@"Cancel"]; [newGamePanel makeKeyAndOrderFront:self]; } //---------------------------------------------------------------------- - (void) showGameSetupPanel { runningAsPreferences = YES; [newGamePanel setTitle:@"New Game Setup"]; [acceptButton setTitle:@"Set"]; [cancelButton setTitle:@"Revert"]; [self takePreferencesFromCurrent]; [newGamePanel makeKeyAndOrderFront:self]; } //---------------------------------------------------------------------- - (void) aboutAction:sender { NSPopUpButton *thePopup; int tag, itemIndex; NSString *rtfPath, *imagePath; NSBundle *thisBundle, *playerBundle; NSArray *riskPlayerBundles; NSDictionary *playerBundleInfo; NSImage *image; NSString *playerTypeName; thisBundle = [NSBundle bundleForClass:[self class]]; NSAssert (thisBundle != nil, @"Could not get this bundle."); riskPlayerBundles = [brain riskPlayerBundles]; tag = [[sender selectedCell] tag]; thePopup = nil; switch (tag) { case 0: thePopup = player1TypePopup; break; case 1: thePopup = player2TypePopup; break; case 2: thePopup = player3TypePopup; break; case 3: thePopup = player4TypePopup; break; case 4: thePopup = player5TypePopup; break; case 5: thePopup = player6TypePopup; break; default: thePopup = nil; } NSAssert (thePopup != nil, @"Bad tag."); itemIndex = [thePopup indexOfSelectedItem]; switch (itemIndex) { case 0: // None [aboutPlayerImageView setImage:nil]; [aboutPlayerNameTextfield setStringValue:[NSString stringWithFormat:@"%d. Not Playing", tag + 1]]; rtfPath = [thisBundle pathForResource:@"NotPlaying" ofType:@"rtf"]; if (rtfPath != nil) { [aboutPlayerText readRTFDFromFile:rtfPath]; } else { [aboutPlayerText setString:@""]; } break; case 1: // Human imagePath = [thisBundle pathForResource:@"Human" ofType:@"tiff"]; image = [[[NSImage alloc] initByReferencingFile:imagePath] autorelease]; [aboutPlayerImageView setImage:image]; [aboutPlayerNameTextfield setStringValue:[NSString stringWithFormat:@"%d. Human Player", tag + 1]]; rtfPath = [thisBundle pathForResource:@"Human" ofType:@"rtf"]; if (rtfPath != nil) { [aboutPlayerText readRTFDFromFile:rtfPath]; } else { [aboutPlayerText setString:@""]; } break; default: // Computer player playerBundle = [riskPlayerBundles objectAtIndex:itemIndex - 2]; playerBundleInfo = [playerBundle infoDictionary]; imagePath = [playerBundle pathForResource:[playerBundleInfo objectForKey:@"PlayerIcon"] ofType:nil]; image = [[[NSImage alloc] initByReferencingFile:imagePath] autorelease]; [aboutPlayerImageView setImage:image]; playerTypeName = [playerBundleInfo objectForKey:@"PlayerTypeName"]; [aboutPlayerNameTextfield setStringValue:[NSString stringWithFormat:@"%d. %@", tag + 1, playerTypeName]]; rtfPath = [playerBundle pathForResource:[playerBundleInfo objectForKey:@"AboutPlayerFile"] ofType:nil]; if (rtfPath != nil) { [aboutPlayerText readRTFDFromFile:rtfPath]; } else { [aboutPlayerText setString:@""]; } break; } [aboutPlayerWindow makeKeyAndOrderFront:self]; [NSApp runModalForWindow:aboutPlayerWindow]; [aboutPlayerWindow orderOut:self]; } //---------------------------------------------------------------------- - (void) aboutStopAction:sender { [NSApp stopModal]; } //---------------------------------------------------------------------- - (void) recalculateInitialArmies:sender { int playerCount; int ps[7]; int l; ps[1] = [player1TypePopup indexOfSelectedItem]; ps[2] = [player2TypePopup indexOfSelectedItem]; ps[3] = [player3TypePopup indexOfSelectedItem]; ps[4] = [player4TypePopup indexOfSelectedItem]; ps[5] = [player5TypePopup indexOfSelectedItem]; ps[6] = [player6TypePopup indexOfSelectedItem]; playerCount = 0; for (l = 1; l < 7; l++) { if (ps[l] != 0) playerCount++; } if (playerCount > 1) { [initialArmyCountTextfield setIntValue:RiskInitialArmyCountForPlayers (playerCount)]; } else { [initialArmyCountTextfield setStringValue:@"--"]; } } //---------------------------------------------------------------------- - (void) acceptAction:sender { if (runningAsPreferences == YES) { //[boardSetup writePlayerColorDefaults]; [self writeDefaults]; } else { [self createNewGame]; } } //---------------------------------------------------------------------- - (void) cancelAction:sender { if (runningAsPreferences == YES) { //[boardSetup revertPlayerColorsToDefaults]; [self revertToDefaults]; } else { [newGamePanel orderOut:self]; } } //---------------------------------------------------------------------- // Odd - the "Control" title of the control panel shifts to the right once this method is finished... // Or, rather, as soon as the window becomes key. It looks like this is happening because there is // not a miniaturize button. // On a related note. Window w/ mini changed to Panel, attr insp shows no mini, but mini still set. - (void) createNewGame { NSUserDefaults *defaults; RiskGameManager *gameManager; int ps[7]; int l, playerCount; NSArray *riskPlayerBundles; NSBundle *playerBundle; RiskPlayer *player; Class playerClass; NSString *name; GameConfiguration *thisConfiguration; BOOL showPlayerConsole; gameManager = [brain gameManager]; if ([gameManager gameInProgress] == YES) { if (NSRunAlertPanel (@"New Game", @"There is already a game starting or in progess.", @"Cancel", @"Start new game", nil) == NSAlertDefaultReturn) { return; } [gameManager stopGame]; } ps[1] = [player1TypePopup indexOfSelectedItem]; ps[2] = [player2TypePopup indexOfSelectedItem]; ps[3] = [player3TypePopup indexOfSelectedItem]; ps[4] = [player4TypePopup indexOfSelectedItem]; ps[5] = [player5TypePopup indexOfSelectedItem]; ps[6] = [player6TypePopup indexOfSelectedItem]; playerCount = 0; for (l = 1; l < 7; l++) { if (ps[l] != 0) playerCount++; } if (playerCount < 2) { NSRunAlertPanel (@"New Game", @"At least two players have to play.", @"OK", nil, nil); return; } [newGamePanel orderOut:self]; //[self writeDefaults]; thisConfiguration = [self thisConfiguration]; //[thisConfiguration writeDefaults]; [gameManager setGameConfiguration:thisConfiguration]; [gameManager startNewGame]; riskPlayerBundles = [brain riskPlayerBundles]; defaults = [NSUserDefaults standardUserDefaults]; for (l = 1; l < 7; l++) { name = [[playerNameForm cellAtIndex:l - 1] stringValue]; player = nil; switch (ps[l]) { case 0: // None break; case 1: // Human player = [[[Human alloc] initWithPlayerName:name number:l gameManager:gameManager] autorelease]; //[gameManager addPlayer:player number:l]; break; default: // Computer playerBundle = [riskPlayerBundles objectAtIndex:ps[l] - 2]; playerClass = [playerBundle principalClass]; //NSAssert ([playerClass isKindOfClass:[RiskPlayer class]] == YES, @"Player class must be a subclass of RiskPlayer."); player = [[[playerClass alloc] initWithPlayerName:name number:l gameManager:gameManager] autorelease]; //[gameManager addPlayer:player number:l]; break; } if (player != nil) { [gameManager addPlayer:player number:l]; showPlayerConsole = [defaults boolForKey:[NSString stringWithFormat:@"ShowPlayer%dConsole", l]]; if (showPlayerConsole == YES) [player showConsolePanel:self]; } } [gameManager beginGame]; } //---------------------------------------------------------------------- - (void) writeDefaults { NSUserDefaults *defaults; defaults = [NSUserDefaults standardUserDefaults]; [boardSetup writePlayerColorDefaults]; [[self thisConfiguration] writeDefaults]; // And then save the player names and types. [defaults setObject:[[playerNameForm cellAtIndex:0] stringValue] forKey:DK_DefaultPlayer1Name]; [defaults setObject:[[playerNameForm cellAtIndex:1] stringValue] forKey:DK_DefaultPlayer2Name]; [defaults setObject:[[playerNameForm cellAtIndex:2] stringValue] forKey:DK_DefaultPlayer3Name]; [defaults setObject:[[playerNameForm cellAtIndex:3] stringValue] forKey:DK_DefaultPlayer4Name]; [defaults setObject:[[playerNameForm cellAtIndex:4] stringValue] forKey:DK_DefaultPlayer5Name]; [defaults setObject:[[playerNameForm cellAtIndex:5] stringValue] forKey:DK_DefaultPlayer6Name]; [defaults setObject:[player1TypePopup title] forKey:DK_DefaultPlayer1Type]; [defaults setObject:[player2TypePopup title] forKey:DK_DefaultPlayer2Type]; [defaults setObject:[player3TypePopup title] forKey:DK_DefaultPlayer3Type]; [defaults setObject:[player4TypePopup title] forKey:DK_DefaultPlayer4Type]; [defaults setObject:[player5TypePopup title] forKey:DK_DefaultPlayer5Type]; [defaults setObject:[player6TypePopup title] forKey:DK_DefaultPlayer6Type]; [defaults synchronize]; } //---------------------------------------------------------------------- - (void) revertToDefaults { NSUserDefaults *defaults; GameConfiguration *oldConfiguration; NSString *tmp; int index; defaults = [NSUserDefaults standardUserDefaults]; tmp = [defaults stringForKey:DK_DefaultPlayer1Name]; [[playerNameForm cellAtIndex:0] setStringValue:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer2Name]; [[playerNameForm cellAtIndex:1] setStringValue:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer3Name]; [[playerNameForm cellAtIndex:2] setStringValue:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer4Name]; [[playerNameForm cellAtIndex:3] setStringValue:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer5Name]; [[playerNameForm cellAtIndex:4] setStringValue:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer6Name]; [[playerNameForm cellAtIndex:5] setStringValue:tmp]; //---------------------------------------- tmp = [defaults stringForKey:DK_DefaultPlayer1Type]; [player1TypePopup selectItemWithTitle:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer2Type]; [player2TypePopup selectItemWithTitle:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer3Type]; [player3TypePopup selectItemWithTitle:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer4Type]; [player4TypePopup selectItemWithTitle:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer5Type]; [player5TypePopup selectItemWithTitle:tmp]; tmp = [defaults stringForKey:DK_DefaultPlayer6Type]; [player6TypePopup selectItemWithTitle:tmp]; [boardSetup revertPlayerColorsToDefaults]; [player1ColorWell setColor:[boardSetup colorForPlayer:1]]; [player2ColorWell setColor:[boardSetup colorForPlayer:2]]; [player3ColorWell setColor:[boardSetup colorForPlayer:3]]; [player4ColorWell setColor:[boardSetup colorForPlayer:4]]; [player5ColorWell setColor:[boardSetup colorForPlayer:5]]; [player6ColorWell setColor:[boardSetup colorForPlayer:6]]; //---------------------------------------- // Now the game configuration rules. oldConfiguration = [GameConfiguration defaultConfiguration]; switch ([oldConfiguration initialCountryDistribution]) { case RandomlyChosen: index = 1; break; case PlayerChosen: default: index = 0; break; } [initialCountryDistributionMatrix selectCellWithTag:index]; switch ([oldConfiguration initialArmyPlacement]) { case PlaceByThrees: index = 1; break; case PlaceByFives: index = 2; break; case PlaceByOnes: default: index = 0; break; } [initialArmyPlacementMatrix selectCellWithTag:index]; switch ([oldConfiguration cardSetRedemption]) { case IncreaseByOne: index = 1; break; case IncreaseByFive: index = 2; break; case RemainConstant: default: index = 0; break; } [cardRedemptionMatrix selectCellWithTag:index]; switch ([oldConfiguration fortifyRule]) { case OneToManyNeighbors: index = 1; break; case ManyToManyNeighbors: index = 2; break; case ManyToManyConnected: index = 3; break; case OneToOneNeighbor: default: index = 0; break; } [fortifyRuleMatrix selectCellWithTag:index]; // And finally update the intial armies textfield [self recalculateInitialArmies:self]; } //---------------------------------------------------------------------- - (GameConfiguration *) thisConfiguration { GameConfiguration *thisConfiguration; int index; InitialCountryDistribution distribution[2] = { PlayerChosen, RandomlyChosen }; InitialArmyPlacement placement[3] = { PlaceByOnes, PlaceByThrees, PlaceByFives }; CardSetRedemption redemption[3] = { RemainConstant, IncreaseByOne, IncreaseByFive }; FortifyRule rule[4] = { OneToOneNeighbor, OneToManyNeighbors, ManyToManyNeighbors, ManyToManyConnected }; thisConfiguration = [GameConfiguration defaultConfiguration]; index = [initialCountryDistributionMatrix selectedRow]; if (index < 0 || index > 1) index = 0; [thisConfiguration setInitialCountryDistribution:distribution[index]]; index = [initialArmyPlacementMatrix selectedRow]; if (index < 0 || index > 2) index = 0; [thisConfiguration setInitialArmyPlacement:placement[index]]; index = [cardRedemptionMatrix selectedRow]; if (index < 0 || index > 2) index = 0; [thisConfiguration setCardSetRedemption:redemption[index]]; index = [fortifyRuleMatrix selectedRow]; if (index < 0 || index > 3) index = 0; [thisConfiguration setFortifyRule:rule[index]]; return thisConfiguration; } //---------------------------------------------------------------------- - (void) takePreferencesFromCurrent { [player1ColorWell setColor:[boardSetup colorForPlayer:1]]; [player2ColorWell setColor:[boardSetup colorForPlayer:2]]; [player3ColorWell setColor:[boardSetup colorForPlayer:3]]; [player4ColorWell setColor:[boardSetup colorForPlayer:4]]; [player5ColorWell setColor:[boardSetup colorForPlayer:5]]; [player6ColorWell setColor:[boardSetup colorForPlayer:6]]; } //---------------------------------------------------------------------- - (void) boardSetupChanged:(NSNotification *)aNotification { [self takePreferencesFromCurrent]; } //---------------------------------------------------------------------- - (void) playerColorAction:sender { if (sender == player1ColorWell) [boardSetup setColor:[player1ColorWell color] forPlayer:1]; else if (sender == player2ColorWell) [boardSetup setColor:[player2ColorWell color] forPlayer:2]; else if (sender == player3ColorWell) [boardSetup setColor:[player3ColorWell color] forPlayer:3]; else if (sender == player4ColorWell) [boardSetup setColor:[player4ColorWell color] forPlayer:4]; else if (sender == player5ColorWell) [boardSetup setColor:[player5ColorWell color] forPlayer:5]; else if (sender == player6ColorWell) [boardSetup setColor:[player6ColorWell color] forPlayer:6]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.