mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2026-03-20 08:59:51 +01:00
Source release of Wolfenstein 3D Classic Platinum for iOS, 2.1
This commit is contained in:
355
wolf3d/code/iphone/EpisodeViewController.m
Normal file
355
wolf3d/code/iphone/EpisodeViewController.m
Normal file
@@ -0,0 +1,355 @@
|
||||
/*
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user