This is Xoxeroids.m in view mode; [Download] [Up]
#import "Xoxeroids.h" #import "BackView.h" #import "Asteroid.h" #import "Base.h" #import "Eye.h" #import "XXShip.h" #import "Mine.h" #import "MineFragment.h" #import "Explosion.h" #import "Rocket.h" #import "RocketMatrix.h" #import "Cannon.h" #import "Cannonball.h" #import "ActorMgr.h" #import "SoundMgr.h" #import "KeyTimer.h" #import "GOLetter.h" #import "Cave.h" #import "RotBox.h" #import "Thinker.h" int HISND, EEOOSND; int rocketCount; // cache classes for speed in identifying int xx_asteroid, xx_base, xx_cannon, xx_cannonball, xx_eye; int xx_mine, xx_minefragment, xx_rocket, xx_ship; @implementation Xoxeroids - newGame { XXShip *myShip; score = 0; lives = 3; nextBonus = 10000; myShip = (XXShip *)ship; if (myShip) myShip->bigGuns = NO; return self; } // invoked only by the actor manager - _createLevel:(int)lev { int i; NXRect r; badGuyCount = explosionCount = shipCount = rocketCount = 0; if ((lev > 1) && (lev < 6)) [actorMgr newActor:(int)[CrabNebula class] for:self tag:0]; ship = [actorMgr newActor:xx_ship for:self tag:GOOD]; space = [actorMgr newActor:xx_space for:self tag:0]; [mainView getBounds:&r]; [space newSize:&r.size]; [[mainView window] setTitle:"Xoxeroids"]; for (i=0; i<lev+3; i++) { [actorMgr newActor:xx_asteroid for:self tag:(i%4)]; } for (i=0; i<lev+2; i++) { [actorMgr newActor:xx_mine for:self tag:i]; } // starting at level 2, every 3 levels add 1 for (i=0; i<((lev+1)/3); i++) { [actorMgr newActor:xx_cannon for:self tag:i]; } // starting at level 4, every 3 levels add 1 for (i=0; i<((lev-1)/3); i++) { [actorMgr newActor:xx_base for:self tag:i]; } if (lev > 5) [actorMgr newActor:(int)[RocketMatrix class] for:self tag:0]; if (lev > 7) [actorMgr newActor:(int)[Cave class] for:self tag:0]; if ((lev % 3) == 0) [actorMgr newActor:(int)[RotBox class] for:self tag:0]; [soundMgr playSound: HISND at:0.5]; oldScore = score; oldLives = lives; oldBonus = nextBonus; return self; } - infoView { return infoView; } - didActivate:(Actor *)theActor { if(theActor->actorType == xx_ship) shipCount++; else if(theActor->actorType == xx_explosion) { if (shipCount > 0) explosionCount++; } else if(theActor->actorType == xx_rocket) { rocketCount++; if (theActor->alliance == EVIL) badGuyCount++; } else { if ((theActor->alliance == EVIL) && (theActor->actorType != (int)[RotBox class])) badGuyCount++; } return self; } - didRetire:(Actor *)theActor { NXRect r; if(theActor->actorType == xx_ship) { if (--lives <= 0) { [GOLetter gameOver:self]; [actorMgr setGameStatus: GAME_DYING]; } shipCount--; } else if((theActor->actorType == xx_spacespin) && ([actorMgr gameStatus] != GAME_DYING)) [actorMgr requestLevel: level+1]; else if(theActor->actorType == xx_explosion) { if (--explosionCount <= 0) { if (shipCount <= 0) { if ([actorMgr gameStatus] != GAME_DYING) [actorMgr requestLevel: level]; } // else if (badGuyCount <= 0) else if ((badGuyCount <= 0) && (explosionCount == 0)) { // nextLevel = level+1; space = [actorMgr newActor:xx_spacespin for:self tag:0]; [mainView getBounds:&r]; [space newSize:&r.size]; } } } else { if (theActor->alliance == EVIL) badGuyCount--; if(theActor->actorType == xx_rocket) rocketCount--; } return self; } - keyDown:(NXEvent *)theEvent { if (theEvent->data.key.repeat > 0) return self; switch(theEvent->data.key.charCode) { case 'z': // rotate left [ship setTurning:LEFT down:YES time:theEvent->time]; break; case 'x': // rotate right [ship setTurning:RIGHT down:YES time:theEvent->time]; break; case '.': // fire [ship fire]; break; case ',': // thrust [ship setThrusting:YES time:theEvent->time]; break; case ' ': // shields [ship setShields:1]; break; } return self; } - keyUp:(NXEvent *)theEvent { switch(theEvent->data.key.charCode) { case 'z': // rotate left [ship setTurning:LEFT down:NO time:theEvent->time]; break; case 'x': // rotate right [ship setTurning:RIGHT down:NO time:theEvent->time]; break; case ',': // thrust [ship setThrusting:NO time:theEvent->time]; break; case ' ': // shields [ship setShields:0]; break; } return self; } - scenarioSelected { score = oldScore; lives = oldLives; nextBonus = oldBonus; ship = [actorMgr newActor:xx_ship for:self tag:GOOD]; [ship scenarioSelected]; return self; } - scenarioDeselected { return self; } - newSize:(NXSize *)s { [space newSize:s]; return self; } - (COLLISION_PARADIGM)collisionParadigm { return GOOD_V_EVIL; } - init { char path[256]; id cv, subviews; [super init]; if ([[NXBundle bundleForClass:[self class]] getPath:path forResource:"xoxeroids" ofType:"nib"]) { [NXApp loadNibFile:path owner:self withNames:NO fromZone:[self zone]]; cv = [uselessView contentView]; subviews = [cv subviews]; while ([subviews count] > 0) [scoreView addSubview:[subviews objectAt:0]]; } HISND = [soundMgr addSound:"sndHi" sender:self]; EEOOSND = [soundMgr addSound:"sndEeOo" sender:self]; xx_asteroid = (int)[Asteroid class]; xx_base = (int)[Base class]; xx_cannon = (int)[Cannon class]; xx_cannonball = (int)[Cannonball class]; xx_eye = (int)[Eye class]; xx_mine = (int)[Mine class]; xx_minefragment = (int)[MineFragment class]; xx_rocket = (int)[Rocket class]; xx_ship = (int)[XXShip class]; [[NXApp delegate] addImageResource:"explosionM" for: [Explosion class]]; [[NXApp delegate] addImageResource:"explosionS" for: [Explosion class]]; [[NXApp delegate] addSoundResource: EXP1SND]; [[NXApp delegate] addSoundResource: EXP2SND]; [[NXApp delegate] addSoundResource: EXP3SND]; [[NXApp delegate] addSoundResource: BULLET1SND]; [[NXApp delegate] addSoundResource: SHIPSND]; return self; } - tile { NXRect r; char title[50]; sprintf(title,"Xoxeroids level %d",level); [[gcontentView window] setTitle:title]; [gcontentView getBounds:&r]; r.size.height -= 40; r.origin.y += 40; [abackView setFrame:&r]; [gcontentView getBounds:&r]; r.size.height = 40; [scoreView setFrame:&r]; [gcontentView addSubview:abackView]; [gcontentView addSubview:scoreView]; return abackView; } - gotoLevel:sender { int lvl = [sender intValue]; if (lvl > 0 && lvl <=2000) { [actorMgr requestLevel:lvl]; lives = 20; } return self; } - oneStep { if (timeInMS > scoreTime) { [scoreView oneStep]; scoreTime = timeInMS + 600; } return self; } - (int)addToScore:(int)val for:dude gen:(int)age { if (dude == ship) { score += val; if (score >= nextBonus) { lives++; nextBonus += 10000; } } return score; } - (int)setScore:(int)val for:dude { score = val; return score; } - (int) score { return score; } - (int) lives { return lives; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.