diff -r 589f69a9665c -r 851f36579ed4 project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sun Apr 17 20:52:56 2011 +0200 @@ -0,0 +1,187 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 18/04/2011. + */ + + +#import "GameInterfaceBridge.h" +#import "PascalImports.h" +#import "EngineProtocolNetwork.h" +#import "OverlayViewController.h" + +#define BUFFER_SIZE 255 // like in original frontend + +@implementation GameInterfaceBridge +@synthesize parentController, systemSettings, savePath, overlayController, ipcPort, gameType, engineProtocol; + +-(id) initWithController:(id) viewController { + if (self = [super init]) { + self.parentController = (UIViewController *)viewController; + self.engineProtocol = [[EngineProtocolNetwork alloc] init]; +; + self.savePath = nil; + + self.systemSettings = [NSDictionary dictionaryWithContentsOfFile:SETTINGS_FILE()]; + self.overlayController = [[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil]; + self.ipcPort = randomPort(); + + self.gameType = gtNone; + } + return self; +} + +-(void) dealloc { + releaseAndNil(parentController); + releaseAndNil(engineProtocol); + releaseAndNil(systemSettings); + releaseAndNil(savePath); + releaseAndNil(overlayController); + [super dealloc]; +} + +#pragma mark - +// overlay with controls, become visible later, with a transparency effect since the sdlwindow is not yet created +-(void) displayOverlayLater:(id) object { + NSDictionary *dict = (NSDictionary *)object; + + [self.overlayController setUseClassicMenu:[[dict objectForKey:@"menu"] boolValue]]; + [self.overlayController setInitialOrientation:[[dict objectForKey:@"orientation"] intValue]]; + + UIWindow *gameWindow = (IS_DUALHEAD() ? [HedgewarsAppDelegate sharedAppDelegate].uiwindow : [[UIApplication sharedApplication] keyWindow]); + [gameWindow addSubview:self.overlayController.view]; +} + +// main routine for calling the actual game engine +-(void) startGameEngine { + self.parentController.view.opaque = YES; + self.parentController.view.backgroundColor = [UIColor blackColor]; + self.parentController.view.alpha = 0; + + [UIView beginAnimations:@"fade out to black" context:NULL]; + [UIView setAnimationDuration:1]; + self.parentController.view.alpha = 1; + [UIView commitAnimations]; + + self.engineProtocol.savePath = self.savePath; + [self.engineProtocol spawnThreadOnPort:self.ipcPort]; + + NSDictionary *overlayOptions = [[NSDictionary alloc] initWithObjectsAndKeys: + [NSNumber numberWithInt:self.parentController.interfaceOrientation],@"orientation", + [self.systemSettings objectForKey:@"menu"],@"menu", + nil]; + [self performSelector:@selector(displayOverlayLater:) withObject:overlayOptions afterDelay:1]; + [overlayOptions release]; + + // this is the pascal fuction that starts the game, wrapped around isInGame + [HedgewarsAppDelegate sharedAppDelegate].isInGame = YES; + Game([self gatherGameSettings]); + [HedgewarsAppDelegate sharedAppDelegate].isInGame = NO; + + [UIView beginAnimations:@"fade in" context:NULL]; + [UIView setAnimationDuration:1]; + self.parentController.view.alpha = 0; + [UIView commitAnimations]; +} + +-(void) startLocalGame:(NSDictionary *)withDictionary { + self.gameType = gtLocal; + [self.engineProtocol setGameConfig:withDictionary]; + + NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; + [outputFormatter setDateFormat:@"yyyy-MM-dd '@' HH.mm"]; + NSString *newDateString = [outputFormatter stringFromDate:[NSDate date]]; + self.savePath = [SAVES_DIRECTORY() stringByAppendingFormat:@"%@.hws", newDateString]; + [outputFormatter release]; + + [self startGameEngine]; +} + +-(void) startSaveGame:(NSString *)atPath { + self.gameType = gtSave; + self.savePath = atPath; + [self.engineProtocol setGameConfig:nil]; + + [self startGameEngine]; +} + +#pragma mark - +-(const char **)gatherGameSettings { + const char *gameArgs[10]; + NSInteger width, height, orientation; + NSString *ipcString = [[NSString alloc] initWithFormat:@"%d", self.ipcPort]; + NSString *localeString = [[NSString alloc] initWithFormat:@"%@.txt", [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]; + + if (IS_DUALHEAD()) { + CGRect screenBounds = [[[UIScreen screens] objectAtIndex:1] bounds]; + width = (int) screenBounds.size.width; + height = (int) screenBounds.size.height; + orientation = 0; + } else { + CGRect screenBounds = [[UIScreen mainScreen] bounds]; + width = (int) screenBounds.size.height; + height = (int) screenBounds.size.width; + orientation = (self.parentController.interfaceOrientation == UIDeviceOrientationLandscapeLeft) ? -90 : 90; + } + + NSString *horizontalSize = [[NSString alloc] initWithFormat:@"%d", width]; + NSString *verticalSize = [[NSString alloc] initWithFormat:@"%d", height]; + NSString *rotation = [[NSString alloc] initWithFormat:@"%d", orientation]; + BOOL enhanced = [[self.systemSettings objectForKey:@"enhanced"] boolValue]; + + NSString *modelId = modelType(); + NSInteger tmpQuality; + if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) // = iPhone and iPhone 3G or iPod Touch or iPod Touch 2G + tmpQuality = 0x00000001 | 0x00000002 | 0x00000008 | 0x00000040; // rqLowRes | rqBlurryLand | rqSimpleRope | rqKillFlakes + else if ([modelId hasPrefix:@"iPhone2"] || [modelId hasPrefix:@"iPod3"]) // = iPhone 3GS or iPod Touch 3G + tmpQuality = 0x00000002 | 0x00000040; // rqBlurryLand | rqKillFlakes + else if ([modelId hasPrefix:@"iPad1"] || [modelId hasPrefix:@"iPod4"] || enhanced == NO) // = iPad 1G or iPod Touch 4G or not enhanced mode + tmpQuality = 0x00000002; // rqBlurryLand + else // = everything else + tmpQuality = 0; // full quality + + // disable tooltips on iPhone + if (IS_IPAD() == NO) + tmpQuality = tmpQuality | 0x00000400; + + // prevents using an empty nickname + NSString *username = [self.systemSettings objectForKey:@"username"]; + if ([username length] == 0) + username = [NSString stringWithFormat:@"MobileUser-%@",ipcString]; + + gameArgs[ 0] = [ipcString UTF8String]; //ipcPort + gameArgs[ 1] = [horizontalSize UTF8String]; //cScreenWidth + gameArgs[ 2] = [verticalSize UTF8String]; //cScreenHeight + gameArgs[ 3] = [[NSString stringWithFormat:@"%d",tmpQuality] UTF8String]; //quality + gameArgs[ 4] = "en.txt";//[localeString UTF8String]; //cLocaleFName + gameArgs[ 5] = [username UTF8String]; //UserNick + gameArgs[ 6] = [[[self.systemSettings objectForKey:@"sound"] stringValue] UTF8String]; //isSoundEnabled + gameArgs[ 7] = [[[self.systemSettings objectForKey:@"music"] stringValue] UTF8String]; //isMusicEnabled + gameArgs[ 8] = [[[self.systemSettings objectForKey:@"alternate"] stringValue] UTF8String]; //cAltDamage + gameArgs[ 9] = [rotation UTF8String]; //rotateQt + gameArgs[10] = (self.gameType == gtSave) ? [self.savePath UTF8String] : NULL; //recordFileName + + [verticalSize release]; + [horizontalSize release]; + [rotation release]; + [localeString release]; + [ipcString release]; + return gameArgs; +} + + +@end