move all preview drawing code into its own class (for a simplified and more readable MapConfigViewController)
--- a/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Sep 26 23:48:03 2010 +0200
@@ -337,6 +337,11 @@
if ([staticMap length] != 0)
[self sendToEngine:staticMap];
+ // lua script (if set)
+ NSString *script = [self.gameConfig objectForKey:@"script_command"];
+ if ([script length] != 0)
+ [self sendToEngine:script];
+
// theme info
[self sendToEngine:[self.gameConfig objectForKey:@"theme_command"]];
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Sep 26 23:48:03 2010 +0200
@@ -20,7 +20,7 @@
#import <UIKit/UIKit.h>
-#import "SDL_net.h"
+#import "MapPreviewButtonView.h"
@protocol MapConfigDelegate <NSObject>
@@ -29,10 +29,9 @@
@end
-@interface MapConfigViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
+@interface MapConfigViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, MapPreviewViewDelegate> {
id<MapConfigDelegate> delegate;
- TCPsocket sd, csd;
NSInteger oldValue; //slider
NSInteger oldPage; //segmented control
BOOL busy;
@@ -47,7 +46,7 @@
NSString *staticMapCommand;
// various widgets in the view
- UIButton *previewButton;
+ MapPreviewButtonView *previewButton;
UITableView *tableView;
UILabel *maxLabel;
UILabel *sizeLabel;
@@ -62,8 +61,8 @@
@property (nonatomic,retain) id<MapConfigDelegate> delegate;
-@property (nonatomic) NSInteger maxHogs;
-@property (nonatomic) BOOL busy;
+@property (nonatomic,assign) NSInteger maxHogs;
+@property (nonatomic,assign) BOOL busy;
@property (nonatomic,retain) NSString *seedCommand;
@property (nonatomic,retain) NSString *templateFilterCommand;
@property (nonatomic,retain) NSString *mapGenCommand;
@@ -71,7 +70,7 @@
@property (nonatomic,retain) NSString *themeCommand;
@property (nonatomic,retain) NSString *staticMapCommand;
-@property (nonatomic,retain) IBOutlet UIButton *previewButton;
+@property (nonatomic,retain) IBOutlet MapPreviewButtonView *previewButton;
@property (nonatomic,retain) IBOutlet UITableView *tableView;
@property (nonatomic,retain) IBOutlet UILabel *maxLabel;
@property (nonatomic,retain) IBOutlet UILabel *sizeLabel;
@@ -92,10 +91,6 @@
-(void) turnOnWidgets;
-(void) turnOffWidgets;
-(void) setLabelText:(NSString *)str;
--(void) setButtonImage:(UIImage *)img;
-(void) updatePreview;
--(void) updatePreviewWithMap:(NSInteger) index;
-
--(const uint8_t *)engineProtocol:(NSInteger) port;
@end
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Sep 26 23:48:03 2010 +0200
@@ -23,10 +23,7 @@
#import "PascalImports.h"
#import "CommodityFunctions.h"
#import "UIImageExtra.h"
-#import "SDL_net.h"
-#import <pthread.h>
-#define INDICATOR_TAG 7654
@implementation MapConfigViewController
@synthesize previewButton, maxHogs, seedCommand, templateFilterCommand, mapGenCommand, mazeSizeCommand, themeCommand, staticMapCommand,
@@ -37,130 +34,6 @@
return rotationManager(interfaceOrientation);
}
-#pragma mark -
-#pragma mark Preview Handling
--(int) sendToEngine: (NSString *)string {
- unsigned char length = [string length];
-
- SDLNet_TCP_Send(csd, &length , 1);
- return SDLNet_TCP_Send(csd, [string UTF8String], length);
-}
-
--(const uint8_t *)engineProtocol:(NSInteger) port {
- IPaddress ip;
- BOOL serverQuit = NO;
- static uint8_t map[128*32];
-
- if (SDLNet_Init() < 0) {
- DLog(@"SDLNet_Init: %s", SDLNet_GetError());
- serverQuit = YES;
- }
-
- // Resolving the host using NULL make network interface to listen
- if (SDLNet_ResolveHost(&ip, NULL, port) < 0) {
- DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
- serverQuit = YES;
- }
-
- // Open a connection with the IP provided (listen on the host's port)
- if (!(sd = SDLNet_TCP_Open(&ip))) {
- DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), port);
- serverQuit = YES;
- }
-
- // launch the preview here so that we're sure the tcp channel is open
- pthread_t thread_id;
- pthread_create(&thread_id, NULL, (void *)GenLandPreview, (void *)port);
- pthread_detach(thread_id);
-
- DLog(@"Waiting for a client on port %d", port);
- while (!serverQuit) {
- /* This check the sd if there is a pending connection.
- * If there is one, accept that, and open a new socket for communicating */
- csd = SDLNet_TCP_Accept(sd);
- if (NULL != csd) {
- DLog(@"Client found");
-
- [self sendToEngine:self.seedCommand];
- [self sendToEngine:self.templateFilterCommand];
- [self sendToEngine:self.mapGenCommand];
- [self sendToEngine:self.mazeSizeCommand];
- [self sendToEngine:@"!"];
-
- memset(map, 0, 128*32);
- SDLNet_TCP_Recv(csd, map, 128*32);
- SDLNet_TCP_Recv(csd, &maxHogs, sizeof(uint8_t));
-
- SDLNet_TCP_Close(csd);
- serverQuit = YES;
- }
- }
-
- SDLNet_TCP_Close(sd);
- SDLNet_Quit();
- return map;
-}
-
--(void) drawingThread {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- // select the port for IPC and launch the preview generation through engineProtocol:
- int port = randomPort();
- const uint8_t *map = [self engineProtocol:port];
- uint8_t mapExp[128*32*8];
-
- // draw the buffer (1 pixel per component, 0= transparent 1= color)
- int k = 0;
- for (int i = 0; i < 32*128; i++) {
- unsigned char byte = map[i];
- for (int j = 0; j < 8; j++) {
- // select the color based on the leftmost bit
- if ((byte & 0x80) != 0)
- mapExp[k] = 100;
- else
- mapExp[k] = 255;
- // shift to next bit
- byte <<= 1;
- k++;
- }
- }
- CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
- CGContextRef bitmapImage = CGBitmapContextCreate(mapExp, 256, 128, 8, 256, colorspace, kCGImageAlphaNone);
- CGColorSpaceRelease(colorspace);
-
- CGImageRef previewCGImage = CGBitmapContextCreateImage(bitmapImage);
- CGContextRelease(bitmapImage);
- UIImage *previewImage = [[UIImage alloc] initWithCGImage:previewCGImage];
- CGImageRelease(previewCGImage);
- previewCGImage = nil;
-
- // set the preview image (autoreleased) in the button and the maxhog label on the main thread to prevent a leak
- [self performSelectorOnMainThread:@selector(setButtonImage:) withObject:[previewImage makeRoundCornersOfSize:CGSizeMake(12, 12)] waitUntilDone:NO];
- [previewImage release];
- [self performSelectorOnMainThread:@selector(setLabelText:) withObject:[NSString stringWithFormat:@"%d", maxHogs] waitUntilDone:NO];
-
- // restore functionality of button and remove the spinning wheel on the main thread to prevent a leak
- [self performSelectorOnMainThread:@selector(turnOnWidgets) withObject:nil waitUntilDone:NO];
-
- [pool release];
- //Invoking this method should be avoided as it does not give your thread a chance to clean up any resources it allocated during its execution.
- //[NSThread exit];
-
- /*
- // http://developer.apple.com/mac/library/qa/qa2001/qa1037.html
- UIGraphicsBeginImageContext(CGSizeMake(256,128));
- CGContextRef context = UIGraphicsGetCurrentContext();
- UIGraphicsPushContext(context);
-
- CGContextSetRGBFillColor(context, 0.5, 0.5, 0.7, 1.0);
- CGContextFillRect(context,CGRectMake(xc,yc,1,1));
-
- UIGraphicsPopContext();
- UIImage *previewImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- */
-}
-
-(IBAction) mapButtonPressed {
playSound(@"clickSound");
[self updatePreview];
@@ -176,77 +49,26 @@
NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
CFRelease(uuid);
NSString *seedCmd = [[NSString alloc] initWithFormat:@"eseed {%@}", seed];
- [seed release];
self.seedCommand = seedCmd;
[seedCmd release];
NSIndexPath *theIndex;
if (segmentedControl.selectedSegmentIndex != 1) {
- // remove the current preview and title
- [self.previewButton setImage:nil forState:UIControlStateNormal];
- [self.previewButton setTitle:nil forState:UIControlStateNormal];
-
- // don't display preview on slower device, too slow and memory hog
- NSString *modelId = modelType();
- if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) {
- busy = NO;
- [self.previewButton setTitle:NSLocalizedString(@"Preview not available",@"") forState:UIControlStateNormal];
- } else {
- // prevent other events and add an activity while the preview is beign generated
- [self turnOffWidgets];
-
- // add a very nice spinning wheel
- UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]
- initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
- indicator.center = CGPointMake(previewButton.bounds.size.width / 2, previewButton.bounds.size.height / 2);
- indicator.tag = INDICATOR_TAG;
- [indicator startAnimating];
- [self.previewButton addSubview:indicator];
- [indicator release];
-
- // let's draw in a separate thread so the gui can work; at the end it restore other widgets
- [NSThread detachNewThreadSelector:@selector(drawingThread) toTarget:self withObject:nil];
- }
-
+ // prevent other events and add an activity while the preview is beign generated
+ [self turnOffWidgets];
+ [self.previewButton updatePreviewWithSeed:seed];
theIndex = [NSIndexPath indexPathForRow:(random()%[self.themeArray count]) inSection:0];
} else {
theIndex = [NSIndexPath indexPathForRow:(random()%[self.mapArray count]) inSection:0];
+ // the preview for static maps is loaded in didSelectRowAtIndexPath
}
- [self.tableView reloadData];
+ [seed release];
+
+ // perform as if user clicked on an entry
[self tableView:self.tableView didSelectRowAtIndexPath:theIndex];
[self.tableView scrollToRowAtIndexPath:theIndex atScrollPosition:UITableViewScrollPositionNone animated:YES];
}
-// instead of drawing a random map we load an image; this function is called by didSelectRowAtIndexPath only
--(void) updatePreviewWithMap:(NSInteger) index {
- // change the preview button
- NSString *fileImage = [[NSString alloc] initWithFormat:@"%@/%@/preview.png", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]];
- UIImage *image = [[UIImage alloc] initWithContentsOfFile:fileImage];
- [fileImage release];
- [self.previewButton setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal];
- [image release];
-
- // update label
- maxHogs = 18;
- NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]];
- NSString *contents = [[NSString alloc] initWithContentsOfFile:fileCfg encoding:NSUTF8StringEncoding error:NULL];
- [fileCfg release];
- NSArray *split = [contents componentsSeparatedByString:@"\n"];
- [contents release];
-
- // set the theme and map here
- self.themeCommand = [NSString stringWithFormat:@"etheme %@", [split objectAtIndex:0]];
- self.staticMapCommand = [NSString stringWithFormat:@"emap %@", [self.mapArray objectAtIndex:index]];
-
- // if the number is not set we keep 18 standard;
- // sometimes it's not set but there are trailing characters, we get around them with the second equation
- if ([split count] > 1 && [[split objectAtIndex:1] intValue] > 0)
- maxHogs = [[split objectAtIndex:1] intValue];
- NSString *max = [[NSString alloc] initWithFormat:@"%d",maxHogs];
- self.maxLabel.text = max;
- [max release];
-}
-
-(void) turnOffWidgets {
busy = YES;
self.previewButton.alpha = 0.5f;
@@ -262,35 +84,21 @@
self.segmentedControl.enabled = YES;
self.slider.enabled = YES;
busy = NO;
-
- UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)[self.previewButton viewWithTag:INDICATOR_TAG];
- if (indicator) {
- [indicator stopAnimating];
- [indicator removeFromSuperview];
- }
}
-(void) setLabelText:(NSString *)str {
+ self.maxHogs = [str intValue];
self.maxLabel.text = str;
}
--(void) setButtonImage:(UIImage *)img {
- [self.previewButton setBackgroundImage:img forState:UIControlStateNormal];
-}
-
--(void) restoreBackgroundImage {
- // white rounded rectangle as background image for previewButton
- UIGraphicsBeginImageContext(CGSizeMake(256,128));
- CGContextRef context = UIGraphicsGetCurrentContext();
- UIGraphicsPushContext(context);
-
- CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
- CGContextFillRect(context,CGRectMake(0,0,256,128));
-
- UIGraphicsPopContext();
- UIImage *bkgImg = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- [self.previewButton setBackgroundImage:[bkgImg makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal];
+-(NSDictionary *)getDataForEngine {
+ NSDictionary *dictForEngine = [NSDictionary dictionaryWithObjectsAndKeys:
+ self.seedCommand,@"seedCommand",
+ self.templateFilterCommand,@"templateFilterCommand",
+ self.mapGenCommand,@"mapGenCommand",
+ self.mazeSizeCommand,@"mazeSizeCommand",
+ nil];
+ return dictForEngine;
}
#pragma mark -
@@ -340,6 +148,28 @@
return cell;
}
+// this set details for a static map (called by didSelectRowAtIndexPath)
+-(void) setDetailsForStaticMap:(NSInteger) index {
+ // update label
+ maxHogs = 18;
+ NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]];
+ NSString *contents = [[NSString alloc] initWithContentsOfFile:fileCfg encoding:NSUTF8StringEncoding error:NULL];
+ [fileCfg release];
+ NSArray *split = [contents componentsSeparatedByString:@"\n"];
+ [contents release];
+
+ // set the theme and map here
+ self.themeCommand = [NSString stringWithFormat:@"etheme %@", [split objectAtIndex:0]];
+ self.staticMapCommand = [NSString stringWithFormat:@"emap %@", [self.mapArray objectAtIndex:index]];
+
+ // if the number is not set we keep 18 standard;
+ // sometimes it's not set but there are trailing characters, we get around them with the second equation
+ if ([split count] > 1 && [[split objectAtIndex:1] intValue] > 0)
+ maxHogs = [[split objectAtIndex:1] intValue];
+ NSString *max = [[NSString alloc] initWithFormat:@"%d",maxHogs];
+ self.maxLabel.text = max;
+ [max release];
+}
#pragma mark -
#pragma mark Table view delegate
@@ -348,12 +178,14 @@
int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow) {
+ [self.tableView reloadData];
if (self.segmentedControl.selectedSegmentIndex != 1) {
- NSString *theme = [self.themeArray objectAtIndex:newRow];
- self.themeCommand = [NSString stringWithFormat:@"etheme %@", theme];
+ // just change the theme, don't update preview
+ self.themeCommand = [NSString stringWithFormat:@"etheme %@", [self.themeArray objectAtIndex:newRow]];
} else {
- // theme and map are set in the function below
- [self updatePreviewWithMap:newRow];
+ NSString *fileImage = [NSString stringWithFormat:@"%@/%@/preview.png",MAPS_DIRECTORY(),[self.mapArray objectAtIndex:newRow]];
+ [self.previewButton updatePreviewWithFile:fileImage];
+ [self setDetailsForStaticMap:newRow];
}
UITableViewCell *newCell = [aTableView cellForRowAtIndexPath:indexPath];
@@ -456,7 +288,6 @@
}
// perform actions based on the activated section, then call updatePreview to visually update the selection
-// updatePreview will call didSelectRowAtIndexPath which will call the right update routine)
// and if necessary update the table with a slide animation
-(IBAction) segmentedControlChanged:(id) sender {
NSString *mapgen, *staticmap;
@@ -477,7 +308,6 @@
staticmap = @"map Bamboo";
self.slider.enabled = NO;
self.sizeLabel.text = NSLocalizedString(@"No filter",@"");
- [self restoreBackgroundImage];
break;
case 2: // Maze
@@ -539,11 +369,6 @@
[array release];
self.mapArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MAPS_DIRECTORY() error:NULL];
- busy = NO;
-
- // draw a white background
- [self restoreBackgroundImage];
-
// initialize some "default" values
self.sizeLabel.text = NSLocalizedString(@"All",@"");
self.slider.value = 0.05f;
@@ -564,7 +389,8 @@
oldValue = 5;
oldPage = 0;
-
+ busy = NO;
+
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.tableView setBackgroundView:nil];
self.view.backgroundColor = [UIColor clearColor];
@@ -575,8 +401,8 @@
}
-(void) viewDidAppear:(BOOL) animated {
+ [self updatePreview];
[super viewDidAppear:animated];
- [self updatePreview];
}
#pragma mark -
@@ -589,7 +415,6 @@
#pragma mark -
-(void) didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
- //[previewButton setImage:nil forState:UIControlStateNormal];
MSG_MEMCLEAN();
}
@@ -643,5 +468,4 @@
[super dealloc];
}
-
@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h Sun Sep 26 23:48:03 2010 +0200
@@ -0,0 +1,49 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2010 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * 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 26/09/2010.
+ */
+
+
+#import <UIKit/UIKit.h>
+#import "SDL_net.h"
+
+@protocol MapPreviewViewDelegate <NSObject>
+
+-(void) turnOnWidgets;
+-(void) setLabelText:(NSString *)string;
+-(NSDictionary *)getDataForEngine;
+
+@end
+
+@interface MapPreviewButtonView : UIButton {
+ id<MapPreviewViewDelegate> delegate;
+ TCPsocket sd, csd;
+ NSInteger maxHogs;
+}
+
+@property (nonatomic,assign) id<MapPreviewViewDelegate> delegate;
+
+
+-(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state;
+-(void) setImageRounded:(UIImage *)image forState:(UIControlState)state;
+-(void) setImageRoundedForNormalState:(UIImage *)image;
+-(void) updatePreviewWithSeed:(NSString *)seed;
+-(void) updatePreviewWithFile:(NSString *)filePath;
+-(NSDictionary *)getDataForEngine;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Sun Sep 26 23:48:03 2010 +0200
@@ -0,0 +1,246 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2010 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * 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 26/09/2010.
+ */
+
+
+#import "MapPreviewButtonView.h"
+#import "MapConfigViewController.h"
+#import "UIImageExtra.h"
+#import <pthread.h>
+
+#define INDICATOR_TAG 7654
+
+@implementation MapPreviewButtonView
+@synthesize delegate;
+
+-(id) initWithFrame:(CGRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ delegate = nil;
+ [self setBackgroundImageRounded:[UIImage whiteImage:frame.size] forState:UIControlStateNormal];
+ }
+ return self;
+}
+
+-(id) initWithCoder:(NSCoder *)aDecoder {
+ if ((self = [super initWithCoder:aDecoder])) {
+ delegate = nil;
+ [self setBackgroundImageRounded:[UIImage whiteImage:self.frame.size] forState:UIControlStateNormal];
+ }
+ return self;
+}
+
+-(void) dealloc {
+ self.delegate = nil;
+ [super dealloc];
+}
+
+#pragma mark -
+#pragma mark image wrappers
+-(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state {
+ [self setBackgroundImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal];
+}
+
+-(void) setImageRounded:(UIImage *)image forState:(UIControlState)state {
+ [self setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal];
+}
+
+-(void) setImageRoundedForNormalState:(UIImage *)image {
+ [self setImageRounded:image forState:UIControlStateNormal];
+}
+
+#pragma mark -
+#pragma mark preview
+-(int) sendToEngine:(NSString *)string {
+ unsigned char length = [string length];
+
+ SDLNet_TCP_Send(csd, &length, 1);
+ return SDLNet_TCP_Send(csd, [string UTF8String], length);
+}
+
+-(const uint8_t *)engineProtocol {
+ IPaddress ip;
+ BOOL serverQuit = NO;
+ static uint8_t map[128*32];
+ int port = randomPort();
+
+ if (SDLNet_Init() < 0) {
+ DLog(@"SDLNet_Init: %s", SDLNet_GetError());
+ serverQuit = YES;
+ }
+
+ // Resolving the host using NULL make network interface to listen
+ if (SDLNet_ResolveHost(&ip, NULL, port) < 0) {
+ DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
+ serverQuit = YES;
+ }
+
+ // Open a connection with the IP provided (listen on the host's port)
+ if (!(sd = SDLNet_TCP_Open(&ip))) {
+ DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), port);
+ serverQuit = YES;
+ }
+
+ // launch the preview here so that we're sure the tcp channel is open
+ pthread_t thread_id;
+ pthread_create(&thread_id, NULL, (void *)GenLandPreview, (void *)port);
+ pthread_detach(thread_id);
+
+ DLog(@"Waiting for a client on port %d", port);
+ while (!serverQuit) {
+ /* This check the sd if there is a pending connection.
+ * If there is one, accept that, and open a new socket for communicating */
+ csd = SDLNet_TCP_Accept(sd);
+ if (NULL != csd) {
+ DLog(@"Client found");
+
+ NSDictionary *dictForEngine = [self getDataForEngine];
+ [self sendToEngine:[dictForEngine objectForKey:@"seedCommand"]];
+ [self sendToEngine:[dictForEngine objectForKey:@"templateFilterCommand"]];
+ [self sendToEngine:[dictForEngine objectForKey:@"mapGenCommand"]];
+ [self sendToEngine:[dictForEngine objectForKey:@"mazeSizeCommand"]];
+ [self sendToEngine:@"!"];
+
+ memset(map, 0, 128*32);
+ SDLNet_TCP_Recv(csd, map, 128*32);
+ SDLNet_TCP_Recv(csd, &maxHogs, sizeof(uint8_t));
+
+ SDLNet_TCP_Close(csd);
+ serverQuit = YES;
+ }
+ }
+
+ SDLNet_TCP_Close(sd);
+ SDLNet_Quit();
+ return map;
+}
+
+-(void) drawingThread {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ const uint8_t *map = [self engineProtocol];
+ uint8_t mapExp[128*32*8];
+
+ // draw the buffer (1 pixel per component, 0= transparent 1= color)
+ int k = 0;
+ for (int i = 0; i < 32*128; i++) {
+ unsigned char byte = map[i];
+ for (int j = 0; j < 8; j++) {
+ // select the color based on the leftmost bit
+ if ((byte & 0x80) != 0)
+ mapExp[k] = 100;
+ else
+ mapExp[k] = 255;
+ // shift to next bit
+ byte <<= 1;
+ k++;
+ }
+ }
+ CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
+ CGContextRef bitmapImage = CGBitmapContextCreate(mapExp, 256, 128, 8, 256, colorspace, kCGImageAlphaNone);
+ CGColorSpaceRelease(colorspace);
+
+ CGImageRef previewCGImage = CGBitmapContextCreateImage(bitmapImage);
+ CGContextRelease(bitmapImage);
+ UIImage *previewImage = [[UIImage alloc] initWithCGImage:previewCGImage];
+ CGImageRelease(previewCGImage);
+ previewCGImage = nil;
+
+ // all these are performed on the main thread to prevent a leak
+ [self performSelectorOnMainThread:@selector(setImageRoundedForNormalState:)
+ withObject:previewImage
+ waitUntilDone:NO];
+ [previewImage release];
+ [self performSelectorOnMainThread:@selector(setLabelText:)
+ withObject:[NSString stringWithFormat:@"%d", maxHogs]
+ waitUntilDone:NO];
+ [self performSelectorOnMainThread:@selector(turnOnWidgets)
+ withObject:nil
+ waitUntilDone:NO];
+ [self performSelectorOnMainThread:@selector(removeIndicator)
+ withObject:nil
+ waitUntilDone:NO];
+
+ [pool release];
+
+ /*
+ // http://developer.apple.com/mac/library/qa/qa2001/qa1037.html
+ UIGraphicsBeginImageContext(CGSizeMake(256,128));
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ UIGraphicsPushContext(context);
+ CGContextSetRGBFillColor(context, 0.5, 0.5, 0.7, 1.0);
+ CGContextFillRect(context,CGRectMake(xc,yc,1,1));
+ UIGraphicsPopContext();
+ UIImage *previewImage = UIGraphicsGetImageFromCurrentImageContext();
+ UIGraphicsEndImageContext();
+ */
+}
+
+-(void) updatePreviewWithSeed:(NSString *)seed {
+ // remove the current preview and title
+ [self setImage:nil forState:UIControlStateNormal];
+ [self setTitle:nil forState:UIControlStateNormal];
+
+ // don't display preview on slower device, too slow and memory hog
+ NSString *modelId = modelType();
+ if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) {
+ //self.delegate.busy = NO;
+ [self setTitle:NSLocalizedString(@"Preview not available",@"") forState:UIControlStateNormal];
+ } else {
+ // add a very nice spinning wheel
+ UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]
+ initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
+ indicator.center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);
+ indicator.tag = INDICATOR_TAG;
+ [indicator startAnimating];
+ [self addSubview:indicator];
+ [indicator release];
+
+ // let's draw in a separate thread so the gui can work; at the end it restore other widgets
+ [NSThread detachNewThreadSelector:@selector(drawingThread) toTarget:self withObject:nil];
+ }
+}
+
+-(void) updatePreviewWithFile:(NSString *)filePath {
+ UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];
+ [self setImageRounded:image forState:UIControlStateNormal];
+ [image release];
+}
+
+-(void) removeIndicator {
+ UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)[self viewWithTag:INDICATOR_TAG];
+ if (indicator) {
+ [indicator stopAnimating];
+ [indicator removeFromSuperview];
+ }
+}
+
+#pragma mark -
+#pragma mark delegate
+-(void) turnOnWidgets {
+ [self.delegate turnOnWidgets];
+}
+
+-(void) setLabelText:(NSString *)string {
+ [self.delegate setLabelText:string];
+}
+
+-(NSDictionary *)getDataForEngine {
+ return [self.delegate getDataForEngine];
+}
+
+@end
--- a/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.h Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.h Sun Sep 26 23:48:03 2010 +0200
@@ -35,7 +35,7 @@
+(SDLUIKitDelegate *)sharedAppDelegate;
-(void) startSDLgame:(NSDictionary *)gameDictionary;
--(void) displayOverlayLater;
+-(void) displayOverlayLater:(NSNumber *)isNetGame ;
@end
--- a/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Sep 26 23:48:03 2010 +0200
@@ -33,5 +33,6 @@
-(UIImage *)convertToNegative;
-(UIImage *)maskImageWith:(UIImage *)maskImage;
-(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh;
++(UIImage *)whiteImage:(CGSize) ofSize;
@end
--- a/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Sep 26 23:48:03 2010 +0200
@@ -220,4 +220,19 @@
return result;
}
++(UIImage *)whiteImage:(CGSize) ofSize {
+ // white rounded rectangle as background image for previewButton
+ UIGraphicsBeginImageContext(ofSize);
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ UIGraphicsPushContext(context);
+
+ CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
+ CGContextFillRect(context,CGRectMake(0,0,ofSize.width,ofSize.height));
+
+ UIGraphicsPopContext();
+ UIImage *bkgImg = UIGraphicsGetImageFromCurrentImageContext();
+ UIGraphicsEndImageContext();
+ return bkgImg;
+}
+
@end
--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Sep 26 23:48:03 2010 +0200
@@ -138,6 +138,7 @@
6199E86D12464A8E00DADF8C /* surpise.png in Resources */ = {isa = PBXBuildFile; fileRef = 6199E86C12464A8E00DADF8C /* surpise.png */; };
619C5ACF124F7DE200D041AE /* libLua.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 619C5ACE124F7DDF00D041AE /* libLua.a */; };
619C5AF4124F7E3100D041AE /* LuaPas.pas in Sources */ = {isa = PBXBuildFile; fileRef = 619C5AF3124F7E3100D041AE /* LuaPas.pas */; };
+ 619C5BA2124FA59000D041AE /* MapPreviewButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */; };
61A1188511683A8C00359010 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61A117FE1168322700359010 /* CoreGraphics.framework */; settings = {ATTRIBUTES = (Required, ); }; };
61A118D311683CD100359010 /* HedgewarsTitle.png in Resources */ = {isa = PBXBuildFile; fileRef = 611FD9CB1155A28C00C2203D /* HedgewarsTitle.png */; };
61B3D71C11EA6F2700EC7420 /* uKeys.pas in Sources */ = {isa = PBXBuildFile; fileRef = 617987FE114AA34C00BA94A9 /* uKeys.pas */; };
@@ -687,21 +688,21 @@
isa = PBXContainerItemProxy;
containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */;
proxyType = 2;
- remoteGlobalIDString = 1D6058910D05DD3D006BFB54 /* Lua.app */;
+ remoteGlobalIDString = 1D6058910D05DD3D006BFB54;
remoteInfo = "Test Lua";
};
619C5ACB124F7DDF00D041AE /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */;
proxyType = 2;
- remoteGlobalIDString = 506EE05E10304ED200A389B3 /* libcocos2d libraries.a */;
+ remoteGlobalIDString = 506EE05E10304ED200A389B3;
remoteInfo = "cocos2d libraries";
};
619C5ACD124F7DDF00D041AE /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */;
proxyType = 2;
- remoteGlobalIDString = E14CF7C110ABC177005470B6 /* libLua.a */;
+ remoteGlobalIDString = E14CF7C110ABC177005470B6;
remoteInfo = Lua;
};
928301590F10E41300CC5A3C /* PBXContainerItemProxy */ = {
@@ -878,6 +879,8 @@
619C09E911E8B8D600F1DF16 /* title_small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = title_small.png; path = "Resources/Frontend-iPhone/title_small.png"; sourceTree = "<group>"; };
619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lua.xcodeproj; path = ../../../Library/Lua/Lua.xcodeproj; sourceTree = SOURCE_ROOT; };
619C5AF3124F7E3100D041AE /* LuaPas.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = LuaPas.pas; path = ../../hedgewars/LuaPas.pas; sourceTree = SOURCE_ROOT; };
+ 619C5BA0124FA59000D041AE /* MapPreviewButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MapPreviewButtonView.h; path = Classes/MapPreviewButtonView.h; sourceTree = "<group>"; };
+ 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MapPreviewButtonView.m; path = Classes/MapPreviewButtonView.m; sourceTree = "<group>"; };
61A117FE1168322700359010 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
61C079E211F35A300072BF46 /* EditableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditableCellView.h; sourceTree = "<group>"; };
61C079E311F35A300072BF46 /* EditableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditableCellView.m; sourceTree = "<group>"; };
@@ -1013,6 +1016,8 @@
6165922D11CA9BD500D6E256 /* UIImageExtra.m */,
611D9B10124949D000008271 /* NSStringExtra.h */,
611D9B11124949D000008271 /* NSStringExtra.m */,
+ 619C5BA0124FA59000D041AE /* MapPreviewButtonView.h */,
+ 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */,
);
name = "Other Sources";
sourceTree = "<group>";
@@ -2251,6 +2256,7 @@
611D9B12124949D000008271 /* NSStringExtra.m in Sources */,
611D9BFB12497E9800008271 /* SavedGamesViewController.m in Sources */,
619C5AF4124F7E3100D041AE /* LuaPas.pas in Sources */,
+ 619C5BA2124FA59000D041AE /* MapPreviewButtonView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
--- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib Sun Sep 26 23:48:03 2010 +0200
@@ -565,6 +565,14 @@
</object>
<int key="connectionID">113</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="326163764"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">114</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -743,13 +751,14 @@
<string>79.IBPluginDependency</string>
<string>8.IBPluginDependency</string>
<string>80.IBPluginDependency</string>
+ <string>9.CustomClassName</string>
<string>9.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>MapConfigViewController</string>
<string>UIResponder</string>
- <string>{{288, 290}, {1024, 768}}</string>
+ <string>{{205, 295}, {1024, 768}}</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
@@ -770,6 +779,7 @@
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>MapPreviewButtonView</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
</object>
@@ -789,7 +799,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">113</int>
+ <int key="maxID">114</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -866,7 +876,7 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>UILabel</string>
- <string>UIButton</string>
+ <string>MapPreviewButtonView</string>
<string>UISegmentedControl</string>
<string>UILabel</string>
<string>UISlider</string>
@@ -897,7 +907,7 @@
</object>
<object class="IBToOneOutletInfo">
<string key="name">previewButton</string>
- <string key="candidateClassName">UIButton</string>
+ <string key="candidateClassName">MapPreviewButtonView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">segmentedControl</string>
@@ -922,6 +932,25 @@
<string key="minorKey">Classes/MapConfigViewController.h</string>
</object>
</object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MapPreviewButtonView</string>
+ <string key="superclassName">UIButton</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">delegate</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">delegate</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">delegate</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/MapPreviewButtonView.h</string>
+ </object>
+ </object>
</object>
<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
<bool key="EncodedWithXMLCoder">YES</bool>
--- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib Sun Sep 26 16:28:04 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib Sun Sep 26 23:48:03 2010 +0200
@@ -302,6 +302,14 @@
</object>
<int key="connectionID">33</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="326163764"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">34</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -383,6 +391,7 @@
<string>25.IBPluginDependency</string>
<string>7.IBPluginDependency</string>
<string>8.IBPluginDependency</string>
+ <string>9.CustomClassName</string>
<string>9.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
@@ -396,6 +405,7 @@
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>MapPreviewButtonView</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
</object>
@@ -415,7 +425,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">33</int>
+ <int key="maxID">34</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -492,7 +502,7 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>UILabel</string>
- <string>UIButton</string>
+ <string>MapPreviewButtonView</string>
<string>UISegmentedControl</string>
<string>UILabel</string>
<string>UISlider</string>
@@ -523,7 +533,7 @@
</object>
<object class="IBToOneOutletInfo">
<string key="name">previewButton</string>
- <string key="candidateClassName">UIButton</string>
+ <string key="candidateClassName">MapPreviewButtonView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">segmentedControl</string>
@@ -548,6 +558,25 @@
<string key="minorKey">Classes/MapConfigViewController.h</string>
</object>
</object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MapPreviewButtonView</string>
+ <string key="superclassName">UIButton</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">delegate</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">delegate</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">delegate</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/MapPreviewButtonView.h</string>
+ </object>
+ </object>
</object>
<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
<bool key="EncodedWithXMLCoder">YES</bool>