# HG changeset patch # User koda # Date 1274652359 0 # Node ID 972ae3ec178a9426e65ee7f263bfb3557056c947 # Parent cbf71e938164e6fc29091c6abc65cc4650ea2f32 initial support for game modifiers (schemes) diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/GameSetup.h --- a/cocoaTouch/GameSetup.h Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/GameSetup.h Sun May 23 22:05:59 2010 +0000 @@ -21,10 +21,11 @@ @property (nonatomic, retain) NSDictionary *gameConfig; -(void) engineProtocol; --(void) startThread: (NSString *)selector; --(int) sendToEngine: (NSString *)string; --(void) sendTeamData:(NSString *)fileName withPlayingHogs:(NSInteger) playingHogs ofColor:(NSNumber *)color; --(void) sendAmmoData:(NSDictionary *)ammoData forTeams: (NSInteger)numberPlaying; +-(void) startThread:(NSString *)selector; +-(int) sendToEngine:(NSString *)string; +-(void) provideTeamData:(NSString *)teamName forHogs:(NSInteger) numberOfPlayingHogs withHealth:(NSInteger) initialHealth ofColor:(NSNumber *)teamColor; +-(void) provideAmmoData:(NSString *)ammostoreName forPlayingTeams:(NSInteger) numberOfTeams; +-(NSInteger) provideScheme:(NSString *)schemeName; -(const char **)getSettings; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/GameSetup.m --- a/cocoaTouch/GameSetup.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/GameSetup.m Sun May 23 22:05:59 2010 +0000 @@ -58,19 +58,26 @@ // wrapper that computes the length of the message and then sends the command string -(int) sendToEngine: (NSString *)string { - unsigned char length = [string length]; + uint8_t length = [string length]; SDLNet_TCP_Send(csd, &length , 1); return SDLNet_TCP_Send(csd, [string UTF8String], length); } -// unpacks team data from the team.plist to a sequence of commands for engine --(void) sendTeamData:(NSString *)fileName withPlayingHogs:(NSInteger) playingHogs ofColor:(NSNumber *)color{ - NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@", TEAMS_DIRECTORY(), fileName]; +// unpacks team data from the selected team.plist to a sequence of engine commands +-(void) provideTeamData:(NSString *)teamName forHogs:(NSInteger) numberOfPlayingHogs withHealth:(NSInteger) initialHealth ofColor:(NSNumber *)teamColor { + /* + addteam <32charsMD5hash> + addhh + is 0 for human, 1-5 for bots (5 is the most stupid) + */ + + NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@", TEAMS_DIRECTORY(), teamName]; NSDictionary *teamData = [[NSDictionary alloc] initWithContentsOfFile:teamFile]; [teamFile release]; - NSString *teamHashColorAndName = [[NSString alloc] initWithFormat:@"eaddteam %@ %@ %@", [teamData objectForKey:@"hash"], [color stringValue], [teamData objectForKey:@"teamname"]]; + NSString *teamHashColorAndName = [[NSString alloc] initWithFormat:@"eaddteam %@ %@ %@", + [teamData objectForKey:@"hash"], [teamColor stringValue], [teamData objectForKey:@"teamname"]]; [self sendToEngine: teamHashColorAndName]; [teamHashColorAndName release]; @@ -91,10 +98,11 @@ [flag release]; NSArray *hogs = [teamData objectForKey:@"hedgehogs"]; - for (int i = 0; i < playingHogs; i++) { + for (int i = 0; i < numberOfPlayingHogs; i++) { NSDictionary *hog = [hogs objectAtIndex:i]; - NSString *hogLevelHealthAndName = [[NSString alloc] initWithFormat:@"eaddhh %@ %@ %@", [hog objectForKey:@"level"], [hog objectForKey:@"health"], [hog objectForKey:@"hogname"]]; + NSString *hogLevelHealthAndName = [[NSString alloc] initWithFormat:@"eaddhh %@ %d %@", + [hog objectForKey:@"level"], initialHealth, [hog objectForKey:@"hogname"]]; [self sendToEngine: hogLevelHealthAndName]; [hogLevelHealthAndName release]; @@ -106,29 +114,124 @@ [teamData release]; } -// unpacks ammodata from the ammo.plist to a sequence of commands for engine --(void) sendAmmoData:(NSDictionary *)ammoData forTeams: (NSInteger)numberPlaying { +// unpacks ammostore data from the selected ammo.plist to a sequence of engine commands +-(void) provideAmmoData:(NSString *)ammostoreName forPlayingTeams:(NSInteger) numberOfTeams { + + //NSDictionary *ammoData = [[NSDictionary alloc] initWithContentsOfFile:ammoDataFile]; + NSDictionary *ammoData = [[NSDictionary alloc] initWithObjectsAndKeys: + @"9391929422199121032235111001201000000211190911",@"ammostore_initialqt", + @"0405040541600655546554464776576666666155501000",@"ammostore_probability", + @"0000000000000205500000040007004000000000200000",@"ammostore_delay", + @"1311110312111111123114111111111111111211101111",@"ammostore_crate", nil]; + + NSString *ammloadt = [[NSString alloc] initWithFormat:@"eammloadt %@", [ammoData objectForKey:@"ammostore_initialqt"]]; [self sendToEngine: ammloadt]; [ammloadt release]; - NSString *ammdelay = [[NSString alloc] initWithFormat:@"eammprob %@", [ammoData objectForKey:@"ammostore_probability"]]; + NSString *ammprob = [[NSString alloc] initWithFormat:@"eammprob %@", [ammoData objectForKey:@"ammostore_probability"]]; + [self sendToEngine: ammprob]; + [ammprob release]; + + NSString *ammdelay = [[NSString alloc] initWithFormat:@"eammdelay %@", [ammoData objectForKey:@"ammostore_delay"]]; [self sendToEngine: ammdelay]; [ammdelay release]; - NSString *ammprob = [[NSString alloc] initWithFormat:@"eammdelay %@", [ammoData objectForKey:@"ammostore_delay"]]; - [self sendToEngine: ammprob]; - [ammprob release]; - NSString *ammreinf = [[NSString alloc] initWithFormat:@"eammreinf %@", [ammoData objectForKey:@"ammostore_crate"]]; [self sendToEngine: ammreinf]; [ammreinf release]; // sent twice so it applies to both teams NSString *ammstore = [[NSString alloc] initWithString:@"eammstore"]; - for (int i = 0; i < numberPlaying; i++) + for (int i = 0; i < numberOfTeams; i++) [self sendToEngine: ammstore]; [ammstore release]; + + [ammoData release]; +} + +// unpacks scheme data from the selected scheme.plist to a sequence of engine commands +-(NSInteger) provideScheme:(NSString *)schemeName { + NSString *schemePath = [[NSString alloc] initWithFormat:@"%@/%@.plist",SCHEMES_DIRECTORY(),schemeName]; + NSArray *scheme = [[NSArray alloc] initWithContentsOfFile:schemePath]; + int result = 0; + int i = 0; + + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x01; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x10; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x04; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x08; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x20; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x40; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x80; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x100; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x200; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x400; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x800; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x2000; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x4000; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x8000; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x10000; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x20000; + if ([[scheme objectAtIndex:i++] boolValue]) + result |= 0x80000; + + NSString *flags = [[NSString alloc] initWithFormat:@"e$gmflags %d",result]; + [self sendToEngine:flags]; + [flags release]; + + NSString *dmgMod = [[NSString alloc] initWithFormat:@"e$damagepct %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:dmgMod]; + [dmgMod release]; + + NSString *turnTime = [[NSString alloc] initWithFormat:@"e$turntime %d",[[scheme objectAtIndex:i++] intValue] * 1000]; + [self sendToEngine:turnTime]; + [turnTime release]; + + result = [[scheme objectAtIndex:i++] intValue]; // initial health + + NSString *sdTime = [[NSString alloc] initWithFormat:@"e$sd_turns %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:sdTime]; + [sdTime release]; + + NSString *crateDrops = [[NSString alloc] initWithFormat:@"e$casefreq %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:crateDrops]; + [crateDrops release]; + + NSString *minesTime = [[NSString alloc] initWithFormat:@"e$minestime %d",[[scheme objectAtIndex:i++] intValue] * 1000]; + [self sendToEngine:minesTime]; + [minesTime release]; + + NSString *minesNumber = [[NSString alloc] initWithFormat:@"e$landadds %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:minesNumber]; + [minesNumber release]; + + + NSString *dudMines = [[NSString alloc] initWithFormat:@"e$minedudpct %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:dudMines]; + [dudMines release]; + + NSString *explosives = [[NSString alloc] initWithFormat:@"e$explosives %d",[[scheme objectAtIndex:i++] intValue]]; + [self sendToEngine:explosives]; + [explosives release]; + + return result; } // method that handles net setup with engine and keeps connection alive @@ -138,8 +241,8 @@ int eProto; BOOL clientQuit, serverQuit; char buffer[BUFFER_SIZE], string[BUFFER_SIZE]; - Uint8 msgSize; - Uint16 gameTicks; + uint8_t msgSize; + uint16_t gameTicks; serverQuit = NO; @@ -162,7 +265,6 @@ NSLog(@"engineProtocol - Waiting for a client on port %d", ipcPort); 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); @@ -172,7 +274,7 @@ NSLog(@"engineProtocol - Client found"); //first byte of the command alwayas contain the size of the command - SDLNet_TCP_Recv(csd, &msgSize, sizeof(Uint8)); + SDLNet_TCP_Recv(csd, &msgSize, sizeof(uint8_t)); SDLNet_TCP_Recv(csd, buffer, msgSize); gameTicks = SDLNet_Read16 (&buffer[msgSize - 2]); @@ -181,29 +283,14 @@ if ('C' == buffer[0]) { NSLog(@"engineProtocol - sending game config"); - // send config data data - /* - seed is arbitrary string - addteam <32charsMD5hash> - addhh - is 0 for human, 1-5 for bots (5 is the most stupid) - */ // local game [self sendToEngine:@"TL"]; // seed info [self sendToEngine:[self.gameConfig objectForKey:@"seed_command"]]; - // various flags - [self sendToEngine:@"e$gmflags 256"]; - [self sendToEngine:@"e$damagepct 100"]; - [self sendToEngine:@"e$turntime 45000"]; - [self sendToEngine:@"e$minestime 3000"]; - [self sendToEngine:@"e$landadds 4"]; - [self sendToEngine:@"e$sd_turns 15"]; - [self sendToEngine:@"e$casefreq 5"]; - [self sendToEngine:@"e$explosives 2"]; - [self sendToEngine:@"e$minedudpct 0"]; + // scheme (returns initial health) + NSInteger health = [self provideScheme:@"testing"]; // dimension of the map [self sendToEngine:[self.gameConfig objectForKey:@"templatefilter_command"]]; @@ -215,18 +302,13 @@ NSArray *teamsConfig = [self.gameConfig objectForKey:@"teams_list"]; for (NSDictionary *teamData in teamsConfig) { - [self sendTeamData:[teamData objectForKey:@"team"] - withPlayingHogs:[[teamData objectForKey:@"number"] intValue] - ofColor:[teamData objectForKey:@"color"]]; + [self provideTeamData:[teamData objectForKey:@"team"] + forHogs:[[teamData objectForKey:@"number"] intValue] + withHealth:health + ofColor:[teamData objectForKey:@"color"]]; } - NSDictionary *ammoData = [[NSDictionary alloc] initWithObjectsAndKeys: - @"939192942219912103223511100120100000021119091",@"ammostore_initialqt", - @"040504054160065554655446477657666666615550100",@"ammostore_probability", - @"000000000000020550000004000700400000000020000",@"ammostore_delay", - @"131111031211111112311411111111111111121110111",@"ammostore_crate", nil]; - [self sendAmmoData:ammoData forTeams:[teamsConfig count]]; - [ammoData release]; + [self provideAmmoData:nil forPlayingTeams:[teamsConfig count]]; clientQuit = NO; } else { @@ -238,7 +320,7 @@ msgSize = 0; memset(buffer, 0, BUFFER_SIZE); memset(string, 0, BUFFER_SIZE); - if (SDLNet_TCP_Recv(csd, &msgSize, sizeof(Uint8)) <= 0) + if (SDLNet_TCP_Recv(csd, &msgSize, sizeof(uint8_t)) <= 0) clientQuit = YES; if (SDLNet_TCP_Recv(csd, buffer, msgSize) <=0) clientQuit = YES; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/MainMenuViewController.m --- a/cocoaTouch/MainMenuViewController.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/MainMenuViewController.m Sun May 23 22:05:59 2010 +0000 @@ -69,6 +69,8 @@ // create a team createTeamNamed(@"Default Team"); + createSchemeNamed(@"testing ftw"); + // create settings.plist NSMutableDictionary *saveDict = [[NSMutableDictionary alloc] init]; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/OverlayViewController.m --- a/cocoaTouch/OverlayViewController.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/OverlayViewController.m Sun May 23 22:05:59 2010 +0000 @@ -48,30 +48,24 @@ sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); [self chatDisappear]; - [dimTimer setFireDate:HIDING_TIME_DEFAULT]; HW_setLandscape(YES); break; case UIDeviceOrientationLandscapeRight: sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); [self chatDisappear]; - [dimTimer setFireDate:HIDING_TIME_DEFAULT]; HW_setLandscape(YES); break; case UIDeviceOrientationPortrait: sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(270)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); [self chatAppear]; - [self activateOverlay]; - [dimTimer setFireDate:HIDING_TIME_NEVER]; HW_setLandscape(NO); break; case UIDeviceOrientationPortraitUpsideDown: sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); [self chatAppear]; - [self activateOverlay]; - [dimTimer setFireDate:HIDING_TIME_NEVER]; HW_setLandscape(NO); break; default: @@ -98,7 +92,8 @@ [self.view addSubview:writeChatTextField]; } writeChatTextField.alpha = 1; - //[self activateOverlay]; + [self activateOverlay]; + [dimTimer setFireDate:HIDING_TIME_NEVER]; } -(void) chatDisappear { diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h --- a/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h Sun May 23 22:05:59 2010 +0000 @@ -30,8 +30,10 @@ MainMenuViewController *mainViewController; BOOL isInGame; } + +(SDLUIKitDelegate *)sharedAppDelegate; -(void) startSDLgame; +-(void) displayOverlayLater; @end diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m --- a/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m Sun May 23 22:05:59 2010 +0000 @@ -88,9 +88,8 @@ const char **gameArgs = [setup getSettings]; [setup release]; - //NSLog(@"%@",[[[UIApplication sharedApplication] windows]); // since the sdlwindow is not yet created, we add the overlayController with a delay - [self performSelector:@selector(later) withObject:nil afterDelay:4]; + [self performSelector:@selector(displayOverlayLater) withObject:nil afterDelay:4]; // this is the pascal fuction that starts the game (wrapped around isInGame) isInGame = YES; @@ -98,7 +97,6 @@ isInGame = NO; free(gameArgs); - //[overlayController.view removeFromSuperview]; [UIView beginAnimations:@"inserting main controller" context:NULL]; [UIView setAnimationDuration:1]; @@ -106,7 +104,7 @@ [UIView commitAnimations]; } --(void) later { +-(void) displayOverlayLater { // overlay with controls, become visible after 4 seconds, with a transparency effect OverlayViewController *overlayController = [[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil]; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SchemeSettingsViewController.h --- a/cocoaTouch/SchemeSettingsViewController.h Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/SchemeSettingsViewController.h Sun May 23 22:05:59 2010 +0000 @@ -7,10 +7,13 @@ // #import - +@class SingleSchemeViewController; @interface SchemeSettingsViewController : UITableViewController { - + NSMutableArray *listOfSchemes; + SingleSchemeViewController *childController; } +@property (nonatomic, retain) NSMutableArray *listOfSchemes; + @end diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SchemeSettingsViewController.m --- a/cocoaTouch/SchemeSettingsViewController.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/SchemeSettingsViewController.m Sun May 23 22:05:59 2010 +0000 @@ -7,85 +7,88 @@ // #import "SchemeSettingsViewController.h" - +#import "CommodityFunctions.h" +#import "SingleSchemeViewController.h" @implementation SchemeSettingsViewController - - -#pragma mark - -#pragma mark Initialization +@synthesize listOfSchemes; -/* -- (id)initWithStyle:(UITableViewStyle)style { - // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. - if ((self = [super initWithStyle:style])) { - } - return self; +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return rotationManager(interfaceOrientation); } -*/ #pragma mark - #pragma mark View lifecycle - -/* -- (void)viewDidLoad { +-(void) viewDidLoad { [super viewDidLoad]; - - // Uncomment the following line to preserve selection between presentations. - self.clearsSelectionOnViewWillAppear = NO; - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem; -} -*/ - -/* -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; + + UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit",@"from the scheme panel") + style:UIBarButtonItemStyleBordered + target:self + action:@selector(toggleEdit:)]; + self.navigationItem.rightBarButtonItem = editButton; + [editButton release]; + } -*/ -/* -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; -} -*/ -/* -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; -} -*/ -/* -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; -} -*/ - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Override to allow orientations other than the default portrait orientation. - return YES; +-(void) viewWillAppear:(BOOL) animated { + [super viewWillAppear:animated]; + + NSArray *contentsOfDir = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCHEMES_DIRECTORY() error:NULL]; + NSMutableArray *array = [[NSMutableArray alloc] initWithArray:contentsOfDir copyItems:YES]; + self.listOfSchemes = array; + [array release]; + + [self.tableView reloadData]; } +// modifies the navigation bar to add the "Add" and "Done" buttons +-(void) toggleEdit:(id) sender { + BOOL isEditing = self.tableView.editing; + [self.tableView setEditing:!isEditing animated:YES]; + + if (isEditing) { + [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Edit",@"from the scheme panel")]; + [self.navigationItem.rightBarButtonItem setStyle: UIBarButtonItemStyleBordered]; + self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; + } else { + [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Done",@"from the scheme panel")]; + [self.navigationItem.rightBarButtonItem setStyle:UIBarButtonItemStyleDone]; + UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Add",@"from the scheme panel") + style:UIBarButtonItemStyleBordered + target:self + action:@selector(addScheme:)]; + self.navigationItem.leftBarButtonItem = addButton; + [addButton release]; + } +} + +-(void) addScheme:(id) sender { + NSString *fileName = [[NSString alloc] initWithFormat:@"Scheme %u.plist", [self.listOfSchemes count]]; + + createSchemeNamed([fileName stringByDeletingPathExtension]); + + [self.listOfSchemes addObject:fileName]; + [fileName release]; + + // order the array alphabetically, so schemes will keep their position + [self.listOfSchemes sortUsingSelector:@selector(compare:)]; + + [self.tableView reloadData]; +} #pragma mark - #pragma mark Table view data source - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - // Return the number of sections. +-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - // Return the number of rows in the section. - return 1; +-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.listOfSchemes count]; } - -// Customize the appearance of table view cells. -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; @@ -93,84 +96,60 @@ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } - // Configure the cell... + NSUInteger row = [indexPath row]; + NSString *rowString = [[self.listOfSchemes objectAtIndex:row] stringByDeletingPathExtension]; + cell.textLabel.text = rowString; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell; } - -/* -// Override to support conditional editing of the table view. -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the specified item to be editable. - return YES; -} -*/ - - -/* -// Override to support editing the table view. -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { +// delete the row and the file +-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + NSUInteger row = [indexPath row]; - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; - } - else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } + NSString *schemeFile = [[NSString alloc] initWithFormat:@"%@/%@",SCHEMES_DIRECTORY(),[self.listOfSchemes objectAtIndex:row]]; + [[NSFileManager defaultManager] removeItemAtPath:schemeFile error:NULL]; + [schemeFile release]; + + [self.listOfSchemes removeObjectAtIndex:row]; + [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } -*/ - - -/* -// Override to support rearranging the table view. -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { -} -*/ - - -/* -// Override to support conditional rearranging of the table view. -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the item to be re-orderable. - return YES; -} -*/ - #pragma mark - #pragma mark Table view delegate -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - // Navigation logic may go here. Create and push another view controller. - /* - <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; - // ... - // Pass the selected object to the new view controller. - [self.navigationController pushViewController:detailViewController animated:YES]; - [detailViewController release]; - */ +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if (childController == nil) { + childController = [[SingleSchemeViewController alloc] initWithStyle:UITableViewStyleGrouped]; + } + + NSInteger row = [indexPath row]; + NSString *selectedSchemeFile = [self.listOfSchemes objectAtIndex:row]; + + // this must be set so childController can load the correct plist + childController.title = [selectedSchemeFile stringByDeletingPathExtension]; + [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; + + [self.navigationController pushViewController:childController animated:YES]; } #pragma mark - #pragma mark Memory management - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. +-(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; - - // Relinquish ownership any cached data, images, etc that aren't in use. } -- (void)viewDidUnload { - // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. - // For example: self.myOutlet = nil; +-(void) viewDidUnload { + self.listOfSchemes = nil; + childController = nil; } -- (void)dealloc { +-(void) dealloc { + [self.listOfSchemes release]; + [childController release]; [super dealloc]; } diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SingleSchemeViewController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cocoaTouch/SingleSchemeViewController.h Sun May 23 22:05:59 2010 +0000 @@ -0,0 +1,25 @@ +// +// SingleSchemeViewController.h +// Hedgewars +// +// Created by Vittorio on 23/05/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface SingleSchemeViewController : UITableViewController { + UITextField *textFieldBeingEdited; + NSMutableArray *schemeArray; + + NSArray *basicSettingList; + NSArray *gameModifierArray; +} + +@property (nonatomic, retain) UITextField *textFieldBeingEdited; +@property (nonatomic, retain) NSMutableArray *schemeArray; +@property (nonatomic, retain) NSArray *basicSettingList; +@property (nonatomic, retain) NSArray *gameModifierArray; + +@end diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SingleSchemeViewController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cocoaTouch/SingleSchemeViewController.m Sun May 23 22:05:59 2010 +0000 @@ -0,0 +1,317 @@ +// +// SingleSchemeViewController.m +// Hedgewars +// +// Created by Vittorio on 23/05/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import "SingleSchemeViewController.h" +#import +#import "CommodityFunctions.h" +#import "UIImageExtra.h" + +@implementation SingleSchemeViewController +@synthesize textFieldBeingEdited, schemeArray, basicSettingList, gameModifierArray; + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { + return rotationManager(interfaceOrientation); +} + +#pragma mark - +#pragma mark View lifecycle +-(void) viewDidLoad { + [super viewDidLoad]; + + NSArray *mods = [[NSArray alloc] initWithObjects: + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Fort Mode",@""),@"title", + NSLocalizedString(@"Defend your fort and destroy the opponents (two team colours max)",@""),@"description", + @"Forts",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Divide Team",@""),@"title", + NSLocalizedString(@"Teams will start on opposite sides of the terrain (two team colours max)",@""),@"description", + @"TeamsDivide",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Solid Land",@""),@"title", + NSLocalizedString(@"Land can not be destroyed",@""),@"description", + @"Solid",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Add Border",@""),@"title", + NSLocalizedString(@"Add an indestructable border around the terrain",@""),@"description", + @"Border",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Low Gravity",@""),@"title", + NSLocalizedString(@"Lower gravity",@""),@"description", + @"LowGravity",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Laser Sight",@""),@"title", + NSLocalizedString(@"Assisted aiming with laser sight",@""),@"description", + @"LaserSight",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Invulnerable",@""),@"title", + NSLocalizedString(@"All hogs have a personal forcefield",@""),@"description", + @"Invulnerable",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Add Mines",@""),@"title", + NSLocalizedString(@"Enable random mines",@""),@"description", + @"Mines",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Vampirism Mode",@""),@"title", + NSLocalizedString(@"Gain 80% of the damage you do back in health",@""),@"description", + @"Vampiric",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Karma Mode",@""),@"title", + NSLocalizedString(@"Share your opponents pain, share their damage",@""),@"description", + @"Karma",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Artillery Mode",@""),@"title", + NSLocalizedString(@"Your hogs are unable to move, test your aim",@""),@"description", + @"Artillery",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Random Order",@""),@"title", + NSLocalizedString(@"Order of play is random instead of in room order",@""),@"description", + @"RandomOrder",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"King Mode",@""),@"title", + NSLocalizedString(@"Play with a King. If he dies, your side loses",@""),@"description", + @"King",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys: NSLocalizedString(@"Place Hedgehogs",@""),@"title", + NSLocalizedString(@"Take turns placing your hedgehogs pre-game",@""),@"description", + @"PlaceHog",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Clan Shares Ammo",@""),@"title", + NSLocalizedString(@"Ammo is shared between all clan teams",@""),@"description", + @"SharedAmmo",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Disable Girders",@""),@"title", + NSLocalizedString(@"Disable girders when generating random maps",@""),@"description", + @"DisableGirders",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Disable Land Objects",@""),@"title", + NSLocalizedString(@"Disable land objects when generating maps",@""),@"description", + @"DisableLandObjects",@"image",nil], + nil]; + self.gameModifierArray = mods; + [mods release]; + + NSArray *basicSettings = [[NSArray alloc] initWithObjects: + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Damage Modifier",@""),@"title",@"Damage",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Turn Time",@""),@"title",@"Time",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Initial Health",@""),@"title",@"Health",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Sudden Death Timeout",@""),@"title",@"SuddenDeath",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Crate Drops",@""),@"title",@"Box",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Mines Time",@""),@"title",@"Time",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Mines Number",@""),@"title",@"Mine",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Dud Mines Probability",@""),@"title",@"Dud",@"image",nil], + [NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Explosives",@""),@"title",@"Damage",@"image",nil], + nil]; + self.basicSettingList = basicSettings; + [basicSettings release]; +} + +// load from file +-(void) viewWillAppear:(BOOL) animated { + [super viewWillAppear:animated]; + + NSString *schemeFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",SCHEMES_DIRECTORY(),self.title]; + NSMutableArray *scheme = [[NSMutableArray alloc] initWithContentsOfFile:schemeFile]; + self.schemeArray = scheme; + [scheme release]; + [schemeFile release]; +} + +// save to file +-(void) viewWillDisappear:(BOOL) animated { + [super viewWillDisappear:animated]; + + NSString *schemeFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",SCHEMES_DIRECTORY(),self.title]; + [self.schemeArray writeToFile:schemeFile atomically:YES]; + [schemeFile release]; +} + +#pragma mark - +#pragma mark textfield methods +-(void) cancel:(id) sender { + if (textFieldBeingEdited != nil) + [self.textFieldBeingEdited resignFirstResponder]; +} + +// set the new value +-(BOOL) save:(id) sender { + if (textFieldBeingEdited != nil) { + [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@.plist",SCHEMES_DIRECTORY(),self.title] error:NULL]; + self.title = self.textFieldBeingEdited.text; + [self.schemeArray writeToFile:[NSString stringWithFormat:@"%@/%@.plist",SCHEMES_DIRECTORY(),self.title] atomically:YES]; + [self.textFieldBeingEdited resignFirstResponder]; + return YES; + } + return NO; +} + +// the textfield is being modified, update the navigation controller +-(void) textFieldDidBeginEditing:(UITextField *)aTextField{ + self.textFieldBeingEdited = aTextField; + + UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel",@"from schemes table") + style:UIBarButtonItemStylePlain + target:self + action:@selector(cancel:)]; + self.navigationItem.leftBarButtonItem = cancelButton; + [cancelButton release]; + + UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Save",@"from schemes table") + style:UIBarButtonItemStyleDone + target:self + action:@selector(save:)]; + self.navigationItem.rightBarButtonItem = saveButton; + [saveButton release]; +} + +// the textfield has been modified, check for empty strings and restore original navigation bar +-(void) textFieldDidEndEditing:(UITextField *)aTextField{ + if ([textFieldBeingEdited.text length] == 0) + textFieldBeingEdited.text = [NSString stringWithFormat:@"New Scheme"]; + + self.textFieldBeingEdited = nil; + self.navigationItem.rightBarButtonItem = self.navigationItem.backBarButtonItem; + self.navigationItem.leftBarButtonItem = nil; +} + +// limit the size of the field to 64 characters like in original frontend +-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + int limit = 64; + return !([textField.text length] > limit && [string length] > range.length); +} + + +#pragma mark - +#pragma mark Table view data source +-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 3; +} + +-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + switch (section) { + case 0: + return 1; + break; + case 1: + return [self.basicSettingList count]; + break; + case 2: + return [self.gameModifierArray count]; + default: + break; + } + return 0; +} + +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *CellIdentifier0 = @"Cell0"; + static NSString *CellIdentifier1 = @"Cell1"; + static NSString *CellIdentifier2 = @"Cell2"; + + UITableViewCell *cell = nil; + NSInteger row = [indexPath row]; + + switch ([indexPath section]) { + case 0: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier0]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier0] autorelease]; + // create a uitextfield for each row, expand it to take the maximum size + UITextField *aTextField = [[UITextField alloc] + initWithFrame:CGRectMake(5, 12, (cell.frame.size.width + cell.frame.size.width/3) - 42, 25)]; + aTextField.clearsOnBeginEditing = NO; + aTextField.returnKeyType = UIReturnKeyDone; + aTextField.adjustsFontSizeToFitWidth = YES; + aTextField.delegate = self; + aTextField.tag = [indexPath row]; + aTextField.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize] + 2]; + aTextField.clearButtonMode = UITextFieldViewModeWhileEditing; + [aTextField addTarget:self action:@selector(save:) forControlEvents:UIControlEventEditingDidEndOnExit]; + [cell.contentView addSubview:aTextField]; + [aTextField release]; + } + + for (UIView *oneView in cell.contentView.subviews) { + if ([oneView isMemberOfClass:[UITextField class]]) { + // we find the uitextfied and we'll use its tag to understand which one is being edited + UITextField *textFieldFound = (UITextField *)oneView; + textFieldFound.text = self.title; + } + } + cell.detailTextLabel.text = nil; + cell.imageView.image = nil; + break; + case 1: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier1] autorelease]; + } + + UIImage *img = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/icon%@.png",BTN_DIRECTORY(),[[self.basicSettingList objectAtIndex:row] objectForKey:@"image"]]]; + cell.imageView.image = [img scaleToSize:CGSizeMake(40, 40)]; + [img release]; + cell.textLabel.text = [[self.basicSettingList objectAtIndex:row] objectForKey:@"title"]; + cell.detailTextLabel.text = nil; + break; + case 2: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle + reuseIdentifier:CellIdentifier2] autorelease]; + UISwitch *onOff = [[UISwitch alloc] init]; + onOff.tag = row; + [onOff addTarget:self action:@selector(toggleSwitch:) forControlEvents:UIControlEventValueChanged]; + cell.accessoryView = onOff; + [onOff release]; + } + + UIImage *image = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/btn%@.png",BTN_DIRECTORY(),[[self.gameModifierArray objectAtIndex:row] objectForKey:@"image"]]]; + cell.imageView.image = image; + [image release]; + [cell.imageView.layer setCornerRadius:7.0f]; + [cell.imageView.layer setMasksToBounds:YES]; + cell.textLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"title"]; + cell.detailTextLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"description"]; + [(UISwitch *)cell.accessoryView setOn:[[self.schemeArray objectAtIndex:row] boolValue] animated:NO]; + } + + return cell; +} + +-(void) toggleSwitch:(id) sender { + UISwitch *theSwitch = (UISwitch *)sender; + [self.schemeArray replaceObjectAtIndex:theSwitch.tag withObject:[NSNumber numberWithBool:theSwitch.on]]; +} + + +#pragma mark - +#pragma mark Table view delegate +-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + if ([indexPath section] == 0) { + UITableViewCell *cell = [aTableView cellForRowAtIndexPath:indexPath]; + for (UIView *oneView in cell.contentView.subviews) { + if ([oneView isMemberOfClass:[UITextField class]]) { + textFieldBeingEdited = (UITextField *)oneView; + [textFieldBeingEdited becomeFirstResponder]; + } + } + } + [aTableView deselectRowAtIndexPath:indexPath animated:YES]; +} + + +#pragma mark - +#pragma mark Memory management +-(void) didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +-(void) viewDidUnload { + self.textFieldBeingEdited = nil; + self.schemeArray = nil; + self.basicSettingList = nil; + self.gameModifierArray = nil; +} + +-(void) dealloc { + [textFieldBeingEdited release]; + [schemeArray release]; + [basicSettingList release]; + [gameModifierArray release]; + [super dealloc]; +} + + +@end + diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/SingleTeamViewController.m --- a/cocoaTouch/SingleTeamViewController.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/SingleTeamViewController.m Sun May 23 22:05:59 2010 +0000 @@ -29,7 +29,6 @@ #pragma mark - #pragma mark textfield methods -// return to previous table -(void) cancel:(id) sender { if (textFieldBeingEdited != nil) [self.textFieldBeingEdited resignFirstResponder]; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/TeamSettingsViewController.m --- a/cocoaTouch/TeamSettingsViewController.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/TeamSettingsViewController.m Sun May 23 22:05:59 2010 +0000 @@ -25,7 +25,7 @@ -(void) viewDidLoad { [super viewDidLoad]; - UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit",@"from the team navigation") + UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit",@"from the team panel") style:UIBarButtonItemStyleBordered target:self action:@selector(toggleEdit:)]; @@ -51,13 +51,13 @@ [self.tableView setEditing:!isEditing animated:YES]; if (isEditing) { - [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Edit",@"from the team navigation")]; + [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Edit",@"from the team panel")]; [self.navigationItem.rightBarButtonItem setStyle: UIBarButtonItemStyleBordered]; self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; } else { - [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Done",@"from the team navigation")]; + [self.navigationItem.rightBarButtonItem setTitle:NSLocalizedString(@"Done",@"from the team panel")]; [self.navigationItem.rightBarButtonItem setStyle:UIBarButtonItemStyleDone]; - UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Add",@"from the team navigation") + UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Add",@"from the team panel") style:UIBarButtonItemStyleBordered target:self action:@selector(addTeam:)]; @@ -88,7 +88,7 @@ } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [listOfTeams count]; + return [self.listOfTeams count]; } // Customize the appearance of table view cells. @@ -101,7 +101,7 @@ } NSUInteger row = [indexPath row]; - NSString *rowString = [[listOfTeams objectAtIndex:row] stringByDeletingPathExtension]; + NSString *rowString = [[self.listOfTeams objectAtIndex:row] stringByDeletingPathExtension]; cell.textLabel.text = rowString; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; @@ -120,20 +120,6 @@ [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } -/* -// Override to support editing the table view. -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; - } - else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } -} -*/ - #pragma mark - #pragma mark Table view delegate @@ -144,7 +130,6 @@ NSInteger row = [indexPath row]; NSString *selectedTeamFile = [listOfTeams objectAtIndex:row]; - NSLog(@"%@",selectedTeamFile); // this must be set so childController can load the correct plist childController.title = [selectedTeamFile stringByDeletingPathExtension]; @@ -169,7 +154,7 @@ } -(void) dealloc { - [listOfTeams release]; + [self.listOfTeams release]; [childController release]; [super dealloc]; } diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/otherSrc/CommodityFunctions.h --- a/cocoaTouch/otherSrc/CommodityFunctions.h Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/otherSrc/CommodityFunctions.h Sun May 23 22:05:59 2010 +0000 @@ -20,11 +20,14 @@ #define TEAMS_DIRECTORY() [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) \ objectAtIndex:0] stringByAppendingString:@"/Teams/"] +#define SCHEMES_DIRECTORY() [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) \ + objectAtIndex:0] stringByAppendingString:@"/Schemes/"] #define GRAPHICS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/"] #define HATS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Hats/"] #define GRAVES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Graves/"] #define BOTLEVELS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Hedgehog/botlevels"] +#define BTN_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Btn"] #define FLAGS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Flags/"] #define FORTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Forts/"] #define THEMES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Themes/"] @@ -32,6 +35,7 @@ #define VOICES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Sounds/voices/"] void createTeamNamed (NSString *nameWithoutExt); +void createSchemeNamed (NSString *nameWithoutExt); BOOL rotationManager (UIInterfaceOrientation interfaceOrientation); NSInteger randomPort (); void popError (const char *title, const char *message); diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/otherSrc/CommodityFunctions.m --- a/cocoaTouch/otherSrc/CommodityFunctions.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/otherSrc/CommodityFunctions.m Sun May 23 22:05:59 2010 +0000 @@ -23,7 +23,7 @@ for (int i = 0; i < MAX_HOGS; i++) { NSString *hogName = [[NSString alloc] initWithFormat:@"hedgehog %d",i]; - NSDictionary *hog = [[NSDictionary alloc] initWithObjectsAndKeys:@"100",@"health", [NSNumber numberWithInt:0],@"level", + NSDictionary *hog = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:0],@"level", hogName,@"hogname", @"NoHat",@"hat", nil]; [hogName release]; [hedgehogs addObject:hog]; @@ -42,6 +42,52 @@ [theTeam release]; } +void createSchemeNamed (NSString *nameWithoutExt) { + NSString *schemesDirectory = SCHEMES_DIRECTORY(); + + if (![[NSFileManager defaultManager] fileExistsAtPath: schemesDirectory]) { + [[NSFileManager defaultManager] createDirectoryAtPath:schemesDirectory + withIntermediateDirectories:NO + attributes:nil + error:NULL]; + } + + NSArray *theScheme = [[NSArray alloc] initWithObjects: + [NSNumber numberWithBool:NO], //fortmode + [NSNumber numberWithBool:NO], //divideteam + [NSNumber numberWithBool:NO], //solidland + [NSNumber numberWithBool:NO], //addborder + [NSNumber numberWithBool:NO], //lowgravity + [NSNumber numberWithBool:NO], //lasersight + [NSNumber numberWithBool:NO], //invulnerable + [NSNumber numberWithBool:NO], //addmines + [NSNumber numberWithBool:NO], //vampirism + [NSNumber numberWithBool:NO], //karma + [NSNumber numberWithBool:NO], //artillery + [NSNumber numberWithBool:YES], //randomorder + [NSNumber numberWithBool:NO], //king + [NSNumber numberWithBool:NO], //placehedgehogs + [NSNumber numberWithBool:NO], //clansharesammo + [NSNumber numberWithBool:NO], //disablegirders + [NSNumber numberWithBool:NO], //disablelandobjects + [NSNumber numberWithInt:100], //damagemodifier + [NSNumber numberWithInt:45], //turntime + [NSNumber numberWithInt:100], //initialhealth + [NSNumber numberWithInt:15], //suddendeathtimeout + [NSNumber numberWithInt:5], //cratedrops + [NSNumber numberWithInt:3], //minestime + [NSNumber numberWithInt:4], //mines + [NSNumber numberWithInt:0], //dudmines + [NSNumber numberWithInt:2], //explosives + nil]; + + NSString *schemeFile = [[NSString alloc] initWithFormat:@"%@/%@.plist", schemesDirectory, nameWithoutExt]; + + [theScheme writeToFile:schemeFile atomically:YES]; + [schemeFile release]; + [theScheme release]; +} + BOOL rotationManager (UIInterfaceOrientation interfaceOrientation) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) return YES; diff -r cbf71e938164 -r 972ae3ec178a cocoaTouch/otherSrc/SquareButtonView.m --- a/cocoaTouch/otherSrc/SquareButtonView.m Sun May 23 19:37:31 2010 +0000 +++ b/cocoaTouch/otherSrc/SquareButtonView.m Sun May 23 22:05:59 2010 +0000 @@ -7,9 +7,9 @@ // #import "SquareButtonView.h" +#import #import "CommodityFunctions.h" #import "UIImageExtra.h" -#import "QuartzCore/QuartzCore.h" @implementation SquareButtonView @synthesize colorArray, selectedColor, ownerDictionary; diff -r cbf71e938164 -r 972ae3ec178a project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj --- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun May 23 19:37:31 2010 +0000 +++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun May 23 22:05:59 2010 +0000 @@ -41,6 +41,8 @@ 6151347E116C2803001F16D1 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 6151347D116C2803001F16D1 /* Icon-iPad.png */; }; 615134B1116C2C5F001F16D1 /* OverlayViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 615134B0116C2C5F001F16D1 /* OverlayViewController.xib */; }; 615A92911183E31C006CA772 /* MapConfigViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 615A92901183E31C006CA772 /* MapConfigViewController-iPhone.xib */; }; + 615FBA5511A93C9800B139F9 /* SingleSchemeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 615FBA5311A93C9800B139F9 /* SingleSchemeViewController.h */; }; + 615FBA5811A93D6700B139F9 /* SingleSchemeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 615FBA5411A93C9800B139F9 /* SingleSchemeViewController.m */; }; 617814E8118947A200C6A535 /* MapConfigViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 617814E7118947A200C6A535 /* MapConfigViewController-iPad.xib */; }; 61798816114AA34C00BA94A9 /* hwengine.pas in Sources */ = {isa = PBXBuildFile; fileRef = 617987E7114AA34C00BA94A9 /* hwengine.pas */; }; 61798818114AA34C00BA94A9 /* hwLibrary.pas in Sources */ = {isa = PBXBuildFile; fileRef = 617987E9114AA34C00BA94A9 /* hwLibrary.pas */; }; @@ -245,6 +247,8 @@ 6151347D116C2803001F16D1 /* Icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iPad.png"; path = "../../cocoaTouch/resources/Icon-iPad.png"; sourceTree = SOURCE_ROOT; }; 615134B0116C2C5F001F16D1 /* OverlayViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = OverlayViewController.xib; path = ../../cocoaTouch/xib/OverlayViewController.xib; sourceTree = SOURCE_ROOT; }; 615A92901183E31C006CA772 /* MapConfigViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MapConfigViewController-iPhone.xib"; path = "../../cocoaTouch/xib/MapConfigViewController-iPhone.xib"; sourceTree = SOURCE_ROOT; }; + 615FBA5311A93C9800B139F9 /* SingleSchemeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SingleSchemeViewController.h; path = ../../cocoaTouch/SingleSchemeViewController.h; sourceTree = SOURCE_ROOT; }; + 615FBA5411A93C9800B139F9 /* SingleSchemeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SingleSchemeViewController.m; path = ../../cocoaTouch/SingleSchemeViewController.m; sourceTree = SOURCE_ROOT; }; 617814E7118947A200C6A535 /* MapConfigViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MapConfigViewController-iPad.xib"; path = "../../cocoaTouch/xib/MapConfigViewController-iPad.xib"; sourceTree = SOURCE_ROOT; }; 617987E1114AA34C00BA94A9 /* CCHandlers.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = CCHandlers.inc; path = ../../hedgewars/CCHandlers.inc; sourceTree = SOURCE_ROOT; }; 617987E4114AA34C00BA94A9 /* GSHandlers.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = GSHandlers.inc; path = ../../hedgewars/GSHandlers.inc; sourceTree = SOURCE_ROOT; }; @@ -713,6 +717,8 @@ children = ( 61A11ADF1168DC6E00359010 /* SingleTeamViewController.h */, 61A11AE01168DC6E00359010 /* SingleTeamViewController.m */, + 615FBA5311A93C9800B139F9 /* SingleSchemeViewController.h */, + 615FBA5411A93C9800B139F9 /* SingleSchemeViewController.m */, ); name = "second level"; sourceTree = ""; @@ -786,6 +792,7 @@ 61C325491179A336001E70B1 /* openalbridge.h in Headers */, 61C3254B1179A336001E70B1 /* wrappers.h in Headers */, 61AA7ACA117FCC8200FDDD4D /* openalbridge_t.h in Headers */, + 615FBA5511A93C9800B139F9 /* SingleSchemeViewController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -986,7 +993,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\nsvn export --force ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\ncp -R ${PROJECT_DIR}/../../QTfrontend/res/botlevels ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels/.svn*\n\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\n\n#delete desktop frontend translation\nrm -rf ${PROJECT_DIR}/Data/Locale/hedgewars_*\n\n#delete dummy maps\nrm -rf ${PROJECT_DIR}/Data/Maps/{test*,KnockBall,Ruler,BasketBall}\n\n#the following ones must be removed when their support is implemented\n\n#delete some voices\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/{Classic,British,Mobster,Pirate,Robot,Russian,Singer,Surfer}\n\n#delete all names\nrm -rf ${PROJECT_DIR}/Data/Names/\n\n#delete all missions\nrm -rf ${PROJECT_DIR}/Data/Missions/\n\n#delete all reserved hats\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/"; + shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\nsvn export --force ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some files from QTfrontend/res\nmkdir ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/btn*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/icon*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp -R ${PROJECT_DIR}/../../QTfrontend/res/botlevels ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels/.svn*\n\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\n\n#delete desktop frontend translation\nrm -rf ${PROJECT_DIR}/Data/Locale/hedgewars_*\n\n#delete dummy maps\nrm -rf ${PROJECT_DIR}/Data/Maps/{test*,KnockBall,Ruler,BasketBall}\n\n#the following ones must be removed when their support is implemented\n\n#delete some voices\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/{Classic,British,Mobster,Pirate,Robot,Russian,Singer,Surfer}\n\n#delete all names\nrm -rf ${PROJECT_DIR}/Data/Names/\n\n#delete all missions\nrm -rf ${PROJECT_DIR}/Data/Missions/\n\n#delete all reserved hats\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/"; showEnvVarsInLog = 0; }; 9283011B0F10CB2D00CC5A3C /* Build libfpc.a */ = { @@ -1088,6 +1095,7 @@ 61CF4971117E702F00BF05B7 /* SquareButtonView.m in Sources */, 61B22E0F1180FBF400B2FCE0 /* MapConfigViewController.m in Sources */, 61AE62C711A067FE008DC32E /* SplitViewRootController.m in Sources */, + 615FBA5811A93D6700B139F9 /* SingleSchemeViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1169,7 +1177,7 @@ FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/2.5.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; - FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -O-2 -Xs -Cfvfpv2"; + FPC_SPECIFIC_OPTIONS = "-dDEBUGFILE -Ci- -Cr- -Co- -O-2 -Xs -Cfvfpv2"; FPC_UNITS_PATH = "-Fu\"$(PROJECT_DIR)\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DEBUGGING_SYMBOLS = default;