mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2025-04-01 07:21:40 +00:00
355 lines
10 KiB
Objective-C
355 lines
10 KiB
Objective-C
/*
|
|
|
|
Copyright (C) 2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the WOLF3D iOS v2.1 GPL Source Code.
|
|
|
|
|
|
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; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
#import "EpisodeViewController.h"
|
|
#import "LevelSelectViewController.h"
|
|
|
|
#import "wolfiphone.h"
|
|
|
|
#define TOTAL_EPISODES 10
|
|
|
|
static const char * const EpisodeNames[TOTAL_EPISODES][2] = {
|
|
{ "Episode 1", "Escape from Wolfenstein" },
|
|
{ "Episode 2", "Operation: Eisenfaust" },
|
|
{ "Episode 3", "Die, Fuhrer, Die!" },
|
|
{ "Episode 4", "A Dark Secret" },
|
|
{ "Episode 5", "Trail of the Madman" },
|
|
{ "Episode 6", "Confrontation" },
|
|
{ "Spear of Destiny", "Tunnels" },
|
|
{ "Spear of Destiny", "Dungeons" },
|
|
{ "Spear of Destiny", "Castle" },
|
|
{ "Spear of Destiny", "Ramparts" }
|
|
};
|
|
|
|
|
|
// A class extension to declare private methods
|
|
@interface EpisodeViewController (PrivateMethods)
|
|
- (void)startLevelSelect;
|
|
- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath;
|
|
- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell;
|
|
- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath;
|
|
- (void)scrollToRow:(int)row;
|
|
@end
|
|
|
|
@interface EpisodeViewController ()
|
|
|
|
@property (nonatomic, retain) UITableView *episodeList;
|
|
|
|
@end
|
|
|
|
@implementation EpisodeViewController
|
|
|
|
@synthesize episodeList;
|
|
@synthesize episodeCell;
|
|
|
|
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
|
|
/*
|
|
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
|
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
|
if (self) {
|
|
// Custom initialization.
|
|
}
|
|
return self;
|
|
}
|
|
*/
|
|
|
|
/*
|
|
// Implement loadView to create a view hierarchy programmatically, without using a nib.
|
|
- (void)loadView {
|
|
}
|
|
*/
|
|
|
|
|
|
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
// TODO: Select the current episode. Haven't yet figured out a good way to get the table
|
|
// view to load with a default row selected, so for now always select episode 1.
|
|
int initialEpisode = 0;
|
|
|
|
NSIndexPath *initialPath = [NSIndexPath indexPathForRow:initialEpisode inSection:0];
|
|
|
|
[self.episodeList selectRowAtIndexPath:initialPath animated:YES scrollPosition:UITableViewScrollPositionNone];
|
|
[self handleSelectionAtIndexPath:initialPath];
|
|
}
|
|
|
|
|
|
|
|
// Override to allow orientations other than the default portrait orientation.
|
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
|
|
// Return YES for supported orientations.
|
|
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
|
|
}
|
|
|
|
|
|
- (void)didReceiveMemoryWarning {
|
|
// Releases the view if it doesn't have a superview.
|
|
[super didReceiveMemoryWarning];
|
|
|
|
// Release any cached data, images, etc. that aren't in use.
|
|
}
|
|
|
|
- (void)viewDidUnload {
|
|
[super viewDidUnload];
|
|
// Release any retained subviews of the main view.
|
|
// e.g. self.myOutlet = nil;
|
|
|
|
[self.episodeList release];
|
|
self.episodeList = nil;
|
|
}
|
|
|
|
|
|
- (void)dealloc {
|
|
[super dealloc];
|
|
}
|
|
|
|
// Sets the current episode with the sender's tag. IF the user selects a platinum episode but
|
|
// only has the lite version of the app, prompt him to buy the platinum version.
|
|
- (IBAction)setEpisode:(id)sender {
|
|
NSInteger requestedEpisode = [sender tag];
|
|
|
|
if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM || requestedEpisode == 0 ) {
|
|
Cvar_SetValue( episode->name, [sender tag] );
|
|
[self startLevelSelect];
|
|
} else {
|
|
// Prompt user to buy platinum version
|
|
iphonePromptToBuyPlatinum();
|
|
}
|
|
}
|
|
|
|
- (IBAction)back:(id)sender {
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
|
|
- (IBAction)next:(id)sender {
|
|
LevelSelectViewController *lsc = [[LevelSelectViewController alloc] initWithNibName:@"LevelSelectView" bundle:nil];
|
|
[self.navigationController pushViewController:lsc animated:YES];
|
|
[lsc release];
|
|
}
|
|
|
|
|
|
- (IBAction)pageDown:(id)sender {
|
|
// If the user taps the page down button, we want to scroll the table view so that the first
|
|
// non-visible row becomes visible. To do this, we can get the array of visible index paths,
|
|
// find the maximum row within the array, and scroll to the row just after that.
|
|
|
|
NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows];
|
|
|
|
int maxRow = 0;
|
|
|
|
for ( NSIndexPath* path in visibleIndexPaths ) {
|
|
maxRow = maxRow < path.row ? path.row: maxRow;
|
|
}
|
|
|
|
const int rowToMakeVisible = maxRow + 1;
|
|
|
|
[self scrollToRow:rowToMakeVisible];
|
|
|
|
}
|
|
|
|
|
|
- (IBAction)pageUp:(id)sender {
|
|
|
|
// If the user taps the page up button, we want to scroll the table view so that the first
|
|
// non-visible row becomes visible. To do this, we can get the array of visible index paths,
|
|
// find the minimum row within the array, and scroll to the row just before that.
|
|
|
|
NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows];
|
|
|
|
int minRow = TOTAL_EPISODES - 1;
|
|
|
|
for ( NSIndexPath* path in visibleIndexPaths ) {
|
|
minRow = minRow < path.row ? minRow: path.row;
|
|
}
|
|
|
|
const int rowToMakeVisible = minRow - 1;
|
|
|
|
[self scrollToRow:rowToMakeVisible];
|
|
|
|
}
|
|
|
|
- (void)scrollToRow:(int)row {
|
|
const int clampedRowMax = row < TOTAL_EPISODES? row: TOTAL_EPISODES-1;
|
|
const int clampedRow = clampedRowMax < 0? 0: clampedRowMax;
|
|
|
|
NSIndexPath* pathToMakeVisible = [NSIndexPath indexPathForRow:clampedRow inSection:0];
|
|
|
|
[self.episodeList scrollToRowAtIndexPath:pathToMakeVisible atScrollPosition:UITableViewScrollPositionNone animated:YES];
|
|
}
|
|
|
|
- (void)startLevelSelect {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
========================
|
|
|
|
UITableView interface
|
|
|
|
========================
|
|
*/
|
|
|
|
- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath {
|
|
|
|
// Prompt for In-App Purchase when the user selects a level that is not currently available.
|
|
if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) {
|
|
if ( indexPath.row > 0 ) {
|
|
iphonePromptToBuyPlatinum();
|
|
return;
|
|
}
|
|
}
|
|
|
|
Cvar_SetValue( episode->name, indexPath.row );
|
|
|
|
[self setCellSelected:YES atIndexPath:indexPath];
|
|
|
|
/*
|
|
int episodeIndex = episode->value;
|
|
int levelIndex = indexPath.row;
|
|
|
|
|
|
|
|
|
|
realEpisode = episodeIndex;
|
|
realMap = levelIndex;
|
|
|
|
if ( episodeIndex >= NUM_ORIGINAL_EPISODES ) {
|
|
switch (episodeIndex)
|
|
{
|
|
case 6:
|
|
if (levelIndex == 5) {
|
|
realEpisode = 7;
|
|
realMap = 8;
|
|
}
|
|
break;
|
|
case 7:
|
|
realEpisode = 6;
|
|
realMap += 5;
|
|
break;
|
|
case 8:
|
|
realEpisode = 7;
|
|
if (levelIndex == 6)
|
|
realMap = 9;
|
|
break;
|
|
case 9:
|
|
if ( levelIndex == 0) { realEpisode = 7; realMap = 6; }
|
|
if ( levelIndex == 1) { realEpisode = 7; realMap = 7; }
|
|
if ( levelIndex == 2) { realEpisode = 8; realMap = 0; }
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
return TOTAL_EPISODES;
|
|
}
|
|
|
|
static CGRect maximumNameLabelFrame = { { 0.0, 0.0 }, { 0.0, 0.0 } };
|
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
static NSString *MyIdentifier = @"MyIdentifier";
|
|
UITableViewCell *cell = (UITableViewCell*)[self.episodeList dequeueReusableCellWithIdentifier:MyIdentifier];
|
|
|
|
if (cell == nil) {
|
|
//cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
|
|
[[NSBundle mainBundle] loadNibNamed:@"EpisodeCell" owner:self options:nil];
|
|
|
|
if ( episodeCell == nil ) {
|
|
// Couldn't create from nib file, load a default cell.
|
|
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
|
|
} else {
|
|
cell = episodeCell;
|
|
self.episodeCell = nil;
|
|
|
|
// Save the good label size here before it gets modified by the code below.
|
|
UILabel *episodeNameLabel;
|
|
episodeNameLabel = (UILabel *)[cell viewWithTag:2];
|
|
|
|
maximumNameLabelFrame = episodeNameLabel.frame;
|
|
}
|
|
}
|
|
|
|
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
|
|
|
BOOL isCellSelected = ( episode->value == indexPath.row)? YES: NO;
|
|
|
|
[self setCellSelected:isCellSelected cell:cell];
|
|
|
|
UILabel *episodeNumberLabel;
|
|
episodeNumberLabel = (UILabel *)[cell viewWithTag:1];
|
|
episodeNumberLabel.text = [NSString stringWithCString:EpisodeNames[indexPath.row][0] encoding:NSASCIIStringEncoding];
|
|
|
|
UILabel *episodeNameLabel;
|
|
episodeNameLabel = (UILabel *)[cell viewWithTag:2];
|
|
NSString* episodeNameText = [NSString stringWithCString:EpisodeNames[indexPath.row][1] encoding:NSASCIIStringEncoding];
|
|
|
|
CGSize expectedLabelSize = [episodeNameText sizeWithFont:episodeNameLabel.font
|
|
constrainedToSize:maximumNameLabelFrame.size
|
|
lineBreakMode:episodeNameLabel.lineBreakMode];
|
|
|
|
//adjust the label the the new height.
|
|
CGRect newFrame = maximumNameLabelFrame;
|
|
newFrame.size.height = expectedLabelSize.height;
|
|
episodeNameLabel.frame = newFrame;
|
|
|
|
episodeNameLabel.text = episodeNameText;
|
|
|
|
return cell;
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
|
|
[self handleSelectionAtIndexPath:indexPath];
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
[self setCellSelected:NO atIndexPath:indexPath];
|
|
}
|
|
|
|
- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath {
|
|
// Get the cell that was selected.
|
|
UITableViewCell * cell = [episodeList cellForRowAtIndexPath:indexPath];
|
|
|
|
[self setCellSelected:selected cell:cell];
|
|
}
|
|
|
|
- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell {
|
|
// Get the "selected" image
|
|
UIView * selectionFrame = [cell viewWithTag:3];
|
|
|
|
// Show the selected image
|
|
selectionFrame.hidden = !selected;
|
|
|
|
|
|
}
|
|
|
|
@end
|