00001
00002
00003
00004
00005
00006
00007
00008
00009 #import "GuiManager.h"
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 @implementation GuiManager
00034
00035 bool clientRuns = NO;
00036 MetaServerEntry *currentServer = nil;
00037 Universe *universe = nil;
00038 int startUpEvents = 0;
00039
00040
00041
00042 bool multiThreaded = NO;
00043
00044
00045 - (void) playIntroSoundEffect {
00046 [soundPlayer playSoundEffect:@"INTRO_SOUND"];
00047 }
00048
00049 - (id) init {
00050 self = [super init];
00051 if (self != nil) {
00052
00053 universe = [Universe defaultInstance];
00054
00055
00056 client = [[ClientController alloc] initWithUniverse:universe];
00057
00058
00059 soundPlayer = [[SoundPlayer alloc] init];
00060
00061
00062 gameState = GS_NO_SERVER_SELECTED;
00063
00064
00065 [notificationCenter addObserver:self selector:@selector(serverSelected:)
00066 name:@"MS_SERVER_SELECTED" object:nil];
00067 [notificationCenter addObserver:self selector:@selector(serverSlotFound)
00068 name:@"CC_SLOT_FOUND" object:nil];
00069 [notificationCenter addObserver:self selector:@selector(serverDeSelected)
00070 name:@"LC_INVALID_SERVER" object:nil];
00071 [notificationCenter addObserver:self selector:@selector(loginComplete)
00072 name:@"LC_LOGIN_COMPLETE" object:nil];
00073 [notificationCenter addObserver:self selector:@selector(outfitAccepted)
00074 name:@"SP_PICKOK" object:nil];
00075 [notificationCenter addObserver:self selector:@selector(loginComplete)
00076 name:@"SP_PICKNOK" object:nil];
00077
00078 [notificationCenter addObserver:self selector:@selector(iDied)
00079 name:@"CC_GO_OUTFIT" object:nil];
00080 [notificationCenter addObserver:self selector:@selector(commError)
00081 name:@"COMM_TCP_WRITE_ERROR" object:nil];
00082
00083 [notificationCenter addObserver:self selector:@selector(handleTeamMask:)
00084 name:@"SP_MASK" object:nil];
00085
00086
00087
00088
00089 [notificationCenter addObserver:self selector:@selector(increaseStartUpCounter)
00090 name:@"PF_IMAGES_CACHED"];
00091 [notificationCenter addObserver:self selector:@selector(increaseStartUpCounter)
00092 name:@"SP_SOUNDS_CACHED"];
00093 }
00094 return self;
00095 }
00096
00097 - (void) increaseStartUpCounter {
00098
00099 startUpEvents++;
00100 [startUpProgress setIntValue:startUpEvents];
00101 [startUpProgress setNeedsDisplay:YES];
00102 NSLog(@"GuiManager.increaseStartUpCounter got event %d of %d", startUpEvents, NR_OF_EVENTS_BEFORE_SHOWING_MENU);
00103 if (startUpEvents == NR_OF_EVENTS_BEFORE_SHOWING_MENU) {
00104 [menuCntrl raiseMenu:self];
00105 } else if (startUpEvents > NR_OF_EVENTS_BEFORE_SHOWING_MENU) {
00106 NSLog(@"GuiManager.increaseStartUpCounter did not expect this event...");
00107 [menuCntrl raiseMenu:self];
00108 }
00109 }
00110
00111 - (void) awakeFromNib {
00112
00113 [startUpProgress setMaxValue:NR_OF_EVENTS_BEFORE_SHOWING_MENU];
00114
00115
00116
00117
00118 [NSTimer scheduledTimerWithTimeInterval: (1 / FRAME_RATE)
00119 target:self selector:@selector(screenRefreshTimerFired:)
00120 userInfo:nil
00121 repeats:YES];
00122
00123 [loginCntrl setMultiThreaded:multiThreaded];
00124 }
00125
00126 - (void)handleTeamMask:(NSNumber *) mask {
00127
00128
00129 if ((gameState == GS_LOGIN_ACCEPTED) && (!multiThreaded)) {
00130
00131 NSLog(@"GuiManager.handleTeamMask firing up a read");
00132 [client performSelector: @selector(singleReadFromServer)
00133 withObject: self
00134 afterDelay: 1];
00135 }
00136 }
00137
00138 - (void)screenRefreshTimerFired:(NSTimer*)theTimer {
00139
00140
00141
00142
00143
00144 if (gameState == GS_GAME_ACTIVE) {
00145
00146 if (!multiThreaded) {
00147
00148 [client singleReadFromServer];
00149 }
00150
00151
00152 [gameCntrl repaint];
00153 } else {
00154
00155 }
00156
00157
00158
00159 }
00160
00161 - (void)serverSelected:(MetaServerEntry *) selectedServer {
00162
00163 switch (gameState) {
00164 case GS_NO_SERVER_SELECTED:
00165 case GS_SERVER_SELECTED:
00166
00167
00168 if (selectedServer == nil) {
00169 NSLog(@"GuiManager.serverSelected forwarding to deselect");
00170 [self serverDeSelected];
00171 return;
00172 }
00173
00174
00175 gameState = GS_SERVER_SELECTED;
00176 currentServer = selectedServer;
00177
00178
00179 [client stop];
00180
00181 if ([client startClientAt:[selectedServer address]
00182 port:[selectedServer port]
00183 seperate:multiThreaded]) {
00184
00185 NSLog(@"GuiManager.serverSelected connect to server successfull");
00186
00187 if (multiThreaded) {
00188 [self serverConnected];
00189 }
00190
00191 } else {
00192
00193 NSLog(@"GuiManager.serverSelected cannot connect to server!");
00194
00195 [self serverDeSelected];
00196
00197 [selectServerCntrl invalidServer];
00198 }
00199 break;
00200 case GS_SERVER_CONNECTED:
00201 case GS_SERVER_SLOT_FOUND:
00202 case GS_LOGIN_ACCEPTED:
00203
00204 if (currentServer != selectedServer) {
00205
00206 if (currentServer != nil) {
00207
00208 [self serverDeSelected];
00209 }
00210
00211 [self serverSelected:selectedServer];
00212 currentServer = selectedServer;
00213 }
00214 break;
00215 case GS_OUTFIT_ACCEPTED:
00216 case GS_GAME_ACTIVE:
00217 NSLog(@"GuiManager.serverSelected unexpected gameState %d, reseting", gameState);
00218 [self serverDeSelected];
00219 [menuCntrl raiseMenu:self];
00220 break;
00221 default:
00222 NSLog(@"GuiManager.serverSelected unknown gameState %d", gameState);
00223 break;
00224 }
00225
00226 NSLog(@"GuiManager.serverSelected GAMESTATE = %d", gameState);
00227 }
00228
00229 - (void) serverDeSelected {
00230
00231 gameState = GS_NO_SERVER_SELECTED;
00232
00233 [client stop];
00234
00235
00236
00237
00238 [menuCntrl disableLogin];
00239 [localServerCntrl disableLogin];
00240 [selectServerCntrl disableLogin];
00241
00242 [loginCntrl disablePlayerName];
00243 [loginCntrl reset];
00244 currentServer = nil;
00245
00246
00247 [selectServerCntrl deselectServer:self];
00248
00249 NSLog(@"GuiManager.serverDeSelected GAMESTATE = %d", gameState);
00250 }
00251
00252 - (void) serverConnected {
00253
00254 switch (gameState) {
00255
00256 case GS_SERVER_SELECTED:
00257
00258
00259 gameState = GS_SERVER_CONNECTED;
00260 break;
00261 case GS_SERVER_SLOT_FOUND:
00262
00263 break;
00264 case GS_SERVER_CONNECTED:
00265 case GS_OUTFIT_ACCEPTED:
00266 case GS_GAME_ACTIVE:
00267 case GS_LOGIN_ACCEPTED:
00268 case GS_NO_SERVER_SELECTED:
00269 NSLog(@"GuiManager.serverConnected unexpected gameState %d, reseting", gameState);
00270 [self serverDeSelected];
00271 [menuCntrl raiseMenu:self];
00272 break;
00273 default:
00274 NSLog(@"GuiManager.serverConnected unknown gameState %d", gameState);
00275 break;
00276 }
00277
00278
00279 NSLog(@"GuiManager.serverConnected GAMESTATE = %d", gameState);
00280 }
00281
00282 - (void) serverSlotFound {
00283 switch (gameState) {
00284 case GS_NO_SERVER_SELECTED:
00285
00286 case GS_OUTFIT_ACCEPTED:
00287 NSLog(@"GuiManager.serverSlotFound unexpected gameState %d, reseting", gameState);
00288 [self serverDeSelected];
00289 [menuCntrl raiseMenu:self];
00290 break;
00291 case GS_SERVER_CONNECTED:
00292 case GS_SERVER_SELECTED:
00293 case GS_GAME_ACTIVE:
00294 gameState = GS_SERVER_SLOT_FOUND;
00295
00296 [menuCntrl enableLogin];
00297 [localServerCntrl enableLogin];
00298 [selectServerCntrl enableLogin];
00299 [loginCntrl enablePlayerName];
00300 [loginCntrl startClock];
00301
00302
00303
00304
00305
00306
00307 if (![client sendSlotSettingsToServer]) {
00308 NSLog(@"GuiManager.serverSlotFound cannot send slot settings to server!");
00309 [self serverDeSelected];
00310 }
00311 break;
00312 default:
00313 NSLog(@"GuiManager.serverSlotFound unknown gameState %d", gameState);
00314 break;
00315 }
00316
00317 NSLog(@"GuiManager.serverSlotFound GAMESTATE = %d", gameState);
00318 }
00319
00320 - (void) iDied {
00321 [self loginComplete];
00322 }
00323
00324 - (void) loginComplete {
00325 switch (gameState) {
00326 case GS_NO_SERVER_SELECTED:
00327 case GS_SERVER_SELECTED:
00328 case GS_SERVER_CONNECTED:
00329 case GS_OUTFIT_ACCEPTED:
00330 NSLog(@"GuiManager.loginComplete unexpected gameState %d, reseting", gameState);
00331 [self serverDeSelected];
00332 [menuCntrl raiseMenu:self];
00333 break;
00334 case GS_LOGIN_ACCEPTED:
00335 NSLog(@"GuiManager.loginComplete login was not accepted, try again");
00336
00337 break;
00338 case GS_SERVER_SLOT_FOUND:
00339 gameState = GS_LOGIN_ACCEPTED;
00340
00341 [menuCntrl disableLogin];
00342 [localServerCntrl disableLogin];
00343 [selectServerCntrl disableLogin];
00344
00345 [loginCntrl disablePlayerName];
00346
00347
00348 [menuCntrl raiseOutfit:self];
00349
00350 [outfitCntrl setInstructionFieldToDefault];
00351
00352
00353 [notificationCenter addObserver:outfitCntrl selector:@selector(setInstructionField:) name:@"SP_WARNING"
00354 object:nil useLocks:NO useMainRunLoop:YES];
00355
00356 break;
00357 case GS_GAME_ACTIVE:
00358
00359 [outfitCntrl setInstructionFieldToDefault];
00360
00361
00362 [notificationCenter addObserver:outfitCntrl selector:@selector(setInstructionField:) name:@"SP_WARNING"
00363 object:nil useLocks:NO useMainRunLoop:YES];
00364 gameState = GS_LOGIN_ACCEPTED;
00365
00366 [menuCntrl raiseOutfit:self];
00367
00368 break;
00369 default:
00370 NSLog(@"GuiManager.loginComplete unknown gameState %d", gameState);
00371 break;
00372 }
00373 NSLog(@"GuiManager.loginComplete GAMESTATE = %d", gameState);
00374 }
00375
00376 - (void) outfitAccepted {
00377 switch (gameState) {
00378 case GS_NO_SERVER_SELECTED:
00379 case GS_SERVER_SELECTED:
00380 case GS_SERVER_CONNECTED:
00381 case GS_OUTFIT_ACCEPTED:
00382 case GS_SERVER_SLOT_FOUND:
00383 case GS_GAME_ACTIVE:
00384 NSLog(@"GuiManager.outfitAccepted unexpected gameState %d, reseting", gameState);
00385 [self serverDeSelected];
00386 [menuCntrl raiseMenu:self];
00387 break;
00388 case GS_LOGIN_ACCEPTED:
00389 gameState = GS_OUTFIT_ACCEPTED;
00390
00391 [notificationCenter removeObserver:outfitCntrl name:@"SP_WARNING"];
00392 [outfitCntrl setInstructionFieldToDefault];
00393
00394 [self gameEntered];
00395
00396 break;
00397 default:
00398 NSLog(@"GuiManager.outfitAccepted unknown gameState %d", gameState);
00399 break;
00400 }
00401 NSLog(@"GuiManager.outfitAccepted GAMESTATE = %d", gameState);
00402 }
00403
00404 - (void) gameEntered {
00405
00406 switch (gameState) {
00407 case GS_NO_SERVER_SELECTED:
00408 case GS_SERVER_SELECTED:
00409 case GS_SERVER_CONNECTED:
00410 case GS_LOGIN_ACCEPTED:
00411 case GS_SERVER_SLOT_FOUND:
00412 case GS_GAME_ACTIVE:
00413 NSLog(@"GuiManager.gameEntered unexpected gameState %d, reseting", gameState);
00414 [self serverDeSelected];
00415 [menuCntrl raiseMenu:self];
00416 break;
00417 case GS_OUTFIT_ACCEPTED:
00418
00419 [[settingsCntrl keyMap] writeToDefaultFileIfChanged];
00420
00421 [gameCntrl setKeyMap:[settingsCntrl keyMap]];
00422
00423 [soundPlayer setVolumeFx:[settingsCntrl fxLevel]];
00424 [soundPlayer setVolumeMusic:[settingsCntrl musicLevel]];
00425
00426 [menuCntrl raiseGame:self];
00427 [gameCntrl startGame];
00428 gameState = GS_GAME_ACTIVE;
00429
00430 [soundPlayer playSoundEffect:@"ENTER_SHIP_SOUND"];
00431 break;
00432 default:
00433 NSLog(@"GuiManager.gameEntered unknown gameState %d", gameState);
00434 break;
00435 }
00436 NSLog(@"GuiManager.gameEntered GAMESTATE = %d", gameState);
00437 }
00438
00439 - (void) commError {
00440 switch (gameState) {
00441 case GS_NO_SERVER_SELECTED:
00442 case GS_SERVER_SELECTED:
00443 break;
00444 case GS_SERVER_CONNECTED:
00445 case GS_LOGIN_ACCEPTED:
00446 case GS_SERVER_SLOT_FOUND:
00447 case GS_GAME_ACTIVE:
00448 case GS_OUTFIT_ACCEPTED:
00449 NSLog(@"GuiManager.commError unexpected (gameState %d), reseting", gameState);
00450 [self serverDeSelected];
00451 [menuCntrl raiseMenu:self];
00452 break;
00453 default:
00454 NSLog(@"GuiManager.gameEntered unknown gameState %d", gameState);
00455 break;
00456 }
00457 NSLog(@"GuiManager.commError GAMESTATE = %d", gameState);
00458 }
00459
00460
00461
00462
00463
00464
00465
00466
00467 @end