This is GameBrain.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "GameBrain.h" #import "PreferencesBrain.h" #import "InfoController.h" #import "WinDel.h" #import <stdio.h> #import <string.h> static int ghostScores[4] = { 200, 400, 800, 1600 }; @implementation GameBrain - init // designated initializer sets up game variables { // to sensible values. score = 0; level = 0; paused = NO; ranOnce = NO; return self; } /* methods to get at important variables */ - (int)startLevel { return [preferencesBrain startLevel]; } - (int)level { return level; } - (int)speed { return speed; } - (int)paused { return paused; } - showHigh { // update the "high score field [topScoreText setIntValue:[highScoreTable highScore:0]]; return self; } - addToScore:(int)increment // update the player's score { score += increment; if (score - lastBonus >= pointsToNextBonus) { //[pacsLeft incPacs]; lastBonus += pointsToNextBonus; // assures bonus at 10000, 35000, 55000, 75000, and every 25000 after if ((pointsToNextBonus < 20000) || ((pointsToNextBonus == 20000) && (lastBonus >= 75000))) pointsToNextBonus += 5000; } [scoreText setIntValue:score]; if ((score > [highScoreTable highScore:0]) && ![gameScreen demoMode]) { [topScoreText setIntValue:score]; } return self; } - zeroScore { score = 0; // clear score [self addToScore:0]; // force display return self; } - gameOver:sender // end the game, take high scores, etc. { // calls gameOver method (this is IB wrapper) [self gameOver]; return self; } - pauseGame:sender // toggle pause status of the game { const char *title = [pauseMenuCell title]; if (!strcmp(title,"Pause")) { // returns zero if equal [self pause]; } else { [self unpause]; } return self; } - (int)pause // pause game { if ([gameScreen gameState]==GAMEOVER) return NO; // no pausing if over [pauseMenuCell setTitle:"Unpause"]; [gameScreen pause:self]; [gameWindow setTitle:"UNDERminer - Paused"]; paused = YES; return YES; } - unpause // unpause game { if ([gameScreen gameState]==GAMEOVER) { [pauseMenuCell setEnabled:NO]; return self; // no pausing if over } [pauseMenuCell setTitle:"Pause"]; [gameScreen unpause:self]; [gameWindow setTitle:"Gold Mine"]; paused = NO; return self; } - startNewGame:sender // starts a new game { if (([preferencesBrain alert]) && ([gameScreen gameState]!=GAMEOVER)) { if ([highScoreTable highScore:9] < score) { if (NXRunAlertPanel("You've got a high score!", "Do you want to throw away the current game?", "You betcha!", "Um, no.", NULL) != NX_ALERTDEFAULT) { return self; // allow "graceful escape" } } else { if (NXRunAlertPanel(NULL, "Do you want to throw away the current game?", "You betcha!", "Um, no.", NULL) != NX_ALERTDEFAULT) { return self; // allow "graceful escape" } } } [topScoreText setIntValue:[highScoreTable highScore:0]]; score = 0; level = 0; lastBonus = 0; pointsToNextBonus = 10000; // first bonus at 10000 points ranOnce = YES; [pauseMenuCell setEnabled:YES]; [scoreText setIntValue:score]; [self nextLevel:self]; // by the nextLevel: method. if (paused) [self unpause]; [gameWindow makeKeyAndOrderFront:self]; //[pacsLeft setNumUp:3]; // start with 3 pacs [gameScreen restartGame]; return self; } - unpauseGame:sender // unpause the game { return [self pauseGame:sender]; // handles toggle of menuCell } - nextLevel:sender // move to next level-- called when all viruses // are gone or to start game { level++; [levelText setIntValue:level]; [gameScreen setUpScreen]; return self; } - gameOver // tidy up game, allow high score name entry { // remove demo mode title... if ([gameScreen demoMode]) [gameWindow setTitle:"Gold Mine"]; // if not demo, it's possible to get a high score entry... else [highScoreTable putInHighScores:score]; [pauseMenuCell setEnabled:NO]; return self; } - (int)ateGhost { int temp = ghostScores[ghostCount]; [self addToScore:temp]; ghostCount++; ghostCount &= 0x3; return temp; } - resetGhostScore { ghostCount = 0; return self; } /**** ***** Application DELEGATE methods. Special things to do on startup, unhide, ***** hide, and so on. ****/ - appWillInit:sender // after init, but before 1st event. { alert = NXGetAlertPanel([NXApp appName], "Just a moment while I load the images...", NULL, NULL, NULL); [alert makeKeyAndOrderFront:self]; return self; } - appDidInit:sender // after init, but before 1st event. { [pauseMenuCell setEnabled:NO]; // methods to load the stuff that takes a while. [loadingPanel makeKeyAndOrderFront:self]; [gameScreen loadPix]; // images, background [loadingPanel orderOut:self]; [preferencesBrain readDefaults:self]; [gameScreen getPreferences]; // set up final init. [gameScreen registerWindow]; // set up dragging. [[gameScreen animate:self] update]; // start up animation [alert orderOut:self]; NXFreeAlertPanel(alert); [topScoreText setIntValue:[highScoreTable highScore:0]]; [levelText setIntValue:1]; [scoreText setIntValue:0]; [[scoreText window] orderFront:self]; // get the stats window visible [gameWindow makeKeyAndOrderFront:self]; // activate game window [gameWindow makeFirstResponder:gameScreen]; // set up first responder if ([preferencesBrain firstTimeCheck]) [infoController readme:self]; else if ([preferencesBrain autoStart]) [self startNewGame:self]; return self; } - appDidBecomeActive:sender { [gameWindow makeKeyAndOrderFront:self]; [gameWindow makeFirstResponder:gameScreen]; if ([preferencesBrain autoUnPause]) [self unpause]; // make sure the windows are layered properly if ([[[scoreText window] delegate] windowUp]) [[scoreText window] orderFront:self]; [gameWindow orderFront:self]; return self; } - appDidHide:sender { [self pause]; return self; // pause game on Command-h } - appDidResignActive:sender { if ([gameScreen demoMode]) return self; [self pause]; return self; // pause game on app deactivate } - appDidUnhide:sender { [gameWindow makeKeyAndOrderFront:self]; [gameWindow makeFirstResponder:gameScreen]; if ([preferencesBrain autoUnPause]) [self unpause]; // make sure the windows are layered properly if ([[[scoreText window] delegate] windowUp]) [[scoreText window] orderFront:self]; [gameWindow orderFront:self]; return self; } - appWillTerminate:sender // update DEFAULTS here { [preferencesBrain writeDefaults:self]; [highScoreTable writeHighScores]; return self; } - quit:sender { if (([gameScreen gameState] != GAMEOVER) && (![gameScreen demoMode]) && ([preferencesBrain alert])) { // Verify that player wants to leave game [self pause]; if (!NXRunAlertPanel(NULL, "There's a game in progress... Do you really want to quit?", "Absolutely.", "No way!", NULL)) { return [self unpause]; } } return [NXApp terminate:sender]; } - windowDidResginMain:sender // do pause if window loses main status { [self pause]; return self; // pause game } - windowDidResignKey:sender // do pause if window loses key status { [self pause]; return self; // pause game } - windowDidBecomeKey:sender // do unpause if window gains key status { [gameWindow makeFirstResponder:gameScreen]; if ([preferencesBrain autoUnPause]) [self unpause]; // unpause on unhide*/ return self; } - windowDidMove:sender // move status with game window { //NXRect gameFrame; //[gameWindow getFrame:&gameFrame]; //[[scoreText window] moveTo:(NX_X(&gameFrame) - 137) // :NX_Y(&gameFrame)]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.