diff -r 2448f5390bd5 -r d8f62c805619 project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m --- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sun Nov 13 12:11:44 2011 -0500 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sun Nov 13 18:23:05 2011 +0100 @@ -26,16 +26,22 @@ #import "AudioManagerController.h" #import "ObjcExports.h" +static UIViewController *callingController; + @implementation GameInterfaceBridge -@synthesize blackView; +@synthesize blackView, savePath, proto; #pragma mark - #pragma mark Instance methods for engine interaction // prepares the controllers for hosting a game --(void) earlyEngineLaunch:(NSString *)pathOrNil withOptions:(NSDictionary *)optionsOrNil { +-(void) earlyEngineLaunch:(NSDictionary *)optionsOrNil { [self retain]; [AudioManagerController stopBackgroundMusic]; - [EngineProtocolNetwork spawnThread:pathOrNil withOptions:optionsOrNil]; + + EngineProtocolNetwork *engineProtocol = [[EngineProtocolNetwork alloc] init]; + self.proto = engineProtocol; + [engineProtocol release]; + [self.proto spawnThread:self.savePath withOptions:optionsOrNil]; // add a black view hiding the background CGRect theFrame = [[UIScreen mainScreen] bounds]; @@ -53,15 +59,19 @@ // keep track of uncompleted games NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - [userDefaults setObject:pathOrNil forKey:@"savedGamePath"]; + [userDefaults setObject:self.savePath forKey:@"savedGamePath"]; [userDefaults synchronize]; // let's launch the engine using this -perfomSelector so that the runloop can deal with queued messages first - [self performSelector:@selector(engineLaunch:) withObject:pathOrNil afterDelay:0.1f]; + [self performSelector:@selector(engineLaunch) withObject:nil afterDelay:0.1f]; } // cleans up everything -(void) lateEngineLaunch { + // notify views below that they are getting the spotlight again + [[[HedgewarsAppDelegate sharedAppDelegate] uiwindow] makeKeyAndVisible]; + [callingController viewWillAppear:YES]; + // remove completed games notification NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"" forKey:@"savedGamePath"]; @@ -78,16 +88,36 @@ // the overlay is not needed any more and can be removed [[OverlayViewController mainOverlay] removeOverlay]; + // engine thread *should* be done by now + NSArray *stats = self.proto.statsArray; + if (stats != nil) { + StatsPageViewController *statsPage = [[StatsPageViewController alloc] initWithStyle:UITableViewStyleGrouped]; + statsPage.statsArray = stats; + statsPage.modalTransitionStyle = UIModalTransitionStyleCoverVertical; + if ([statsPage respondsToSelector:@selector(setModalPresentationStyle:)]) + statsPage.modalPresentationStyle = UIModalPresentationPageSheet; + + [callingController presentModalViewController:statsPage animated:YES]; + [statsPage release]; + } + [stats release]; // we retained the array before + + // can remove the savefile if the replay has ended + if ([HWUtils gameType] == gtSave) + [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil]; + // restart music and we're done [AudioManagerController playBackgroundMusic]; + [HWUtils setGameStatus:gsNone]; + [HWUtils setGameType:gtNone]; [self release]; } // main routine for calling the actual game engine --(void) engineLaunch:(NSString *)pathOrNil { +-(void) engineLaunch { const char *gameArgs[11]; CGFloat width, height; - NSInteger enginePort = [EngineProtocolNetwork activeEnginePort]; + NSInteger enginePort = self.proto.enginePort; CGFloat screenScale = [[UIScreen mainScreen] safeScale]; NSString *ipcString = [[NSString alloc] initWithFormat:@"%d",enginePort]; NSString *localeString = [[NSString alloc] initWithFormat:@"%@.txt",[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]; @@ -139,7 +169,7 @@ gameArgs[ 7] = [[[settings objectForKey:@"music"] stringValue] UTF8String]; //isMusicEnabled gameArgs[ 8] = [[[settings objectForKey:@"alternate"] stringValue] UTF8String]; //cAltDamage gameArgs[ 9] = [rotation UTF8String]; //rotateQt - gameArgs[10] = ([HWUtils gameType] == gtSave) ? [pathOrNil UTF8String] : NULL; //recordFileName + gameArgs[10] = ([HWUtils gameType] == gtSave) ? [self.savePath UTF8String] : NULL; //recordFileName [verticalSize release]; [horizontalSize release]; @@ -154,12 +184,24 @@ [self lateEngineLaunch]; } +-(void) dealloc { + releaseAndNil(blackView); + releaseAndNil(savePath); + releaseAndNil(proto); + [super dealloc]; +} + #pragma mark - #pragma mark Class methods for setting up the engine from outsite ++(void) registerCallingController:(UIViewController *)controller { + callingController = controller; +} + +(void) startGame:(TGameType) type atPath:(NSString *)path withOptions:(NSDictionary *)config { [HWUtils setGameType:type]; id bridge = [[self alloc] init]; - [bridge earlyEngineLaunch:path withOptions:config]; + [bridge setSavePath:path]; + [bridge earlyEngineLaunch:config]; [bridge release]; } @@ -190,27 +232,5 @@ [missionLine release]; } -/* --(void) gameHasEndedWithStats:(NSArray *)stats { - // wrap this around a retain/realse to prevent being deallocated too soon - [self retain]; - // display stats page if there is something to display - if (stats != nil) { - StatsPageViewController *statsPage = [[StatsPageViewController alloc] initWithStyle:UITableViewStyleGrouped]; - statsPage.statsArray = stats; - statsPage.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - if ([statsPage respondsToSelector:@selector(setModalPresentationStyle:)]) - statsPage.modalPresentationStyle = UIModalPresentationPageSheet; - - [self.parentController presentModalViewController:statsPage animated:YES]; - [statsPage release]; - } - - // can remove the savefile if the replay has ended - if ([HWUtils gameType] == gtSave) - [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil]; - [self release]; -} -*/ @end