mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2026-03-19 16:39:49 +01:00
315 lines
8.2 KiB
Objective-C
315 lines
8.2 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 "LevelSelectViewController.h"
|
|
#import "wolf3dAppDelegate.h"
|
|
#import "wolfiphone.h"
|
|
#import "MissionTableViewCell.h"
|
|
#import "UITableViewScrolling.h"
|
|
|
|
#define NUM_ORIGINAL_EPISODES 6
|
|
#define NUM_SPEAR_EPISODES 4
|
|
|
|
#define MAX_SPEAR_MAPS_PER_EPISODE 7
|
|
|
|
extern int returnButtonFrameNum;
|
|
|
|
|
|
static int numLevelsTable[] = {
|
|
10, 10, 10, 10, 10, 10, // All six classic episodes have 10 levels
|
|
// Spear of Destiny episodes
|
|
6, // Tunnels
|
|
5, // Dungeon
|
|
7, // Castle
|
|
3 }; // Ramparts
|
|
|
|
|
|
// Private properties and methods
|
|
@interface LevelSelectViewController ()
|
|
|
|
@property (nonatomic, retain) UITableView *missionList;
|
|
|
|
@end
|
|
|
|
@implementation LevelSelectViewController
|
|
|
|
@synthesize missionList;
|
|
|
|
// 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];
|
|
|
|
[self.missionList reloadData];
|
|
|
|
// Select the first row by default
|
|
int levelToSelect = 0;
|
|
|
|
if ( (int)episode->value == currentMap.episode ) {
|
|
levelToSelect = currentMap.map;
|
|
}
|
|
|
|
NSIndexPath *ip=[NSIndexPath indexPathForRow:levelToSelect inSection:0];
|
|
[self.missionList selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionNone];
|
|
[self handleSelectionAtIndexPath:ip];
|
|
}
|
|
|
|
|
|
/*
|
|
========================
|
|
|
|
UITableView interface
|
|
|
|
========================
|
|
*/
|
|
|
|
- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath {
|
|
int episodeIndex = episode->value;
|
|
int levelIndex = indexPath.row;
|
|
|
|
// Prompt for In-App Purchase when the user selects a level that is not currently available.
|
|
if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) {
|
|
if ( levelIndex >= 3 ) {
|
|
iphonePromptToBuyPlatinum();
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
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 the number of levels based on the episode
|
|
int episodeIndex = episode->value;
|
|
|
|
|
|
|
|
return numLevelsTable[ episodeIndex ];
|
|
}
|
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
static NSString *MyIdentifier = @"MyIdentifier";
|
|
MissionTableViewCell *cell = (MissionTableViewCell*)[self.missionList dequeueReusableCellWithIdentifier:MyIdentifier];
|
|
if (cell == nil) {
|
|
cell = [[[MissionTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
|
|
}
|
|
|
|
// Cell configuration
|
|
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
|
|
|
// Cell text configuration
|
|
NSString* levelName = [NSString stringWithFormat:@"Level %d", indexPath.row + 1 ];
|
|
|
|
int episodeIndex = episode->value;
|
|
int levelIndex = indexPath.row;
|
|
|
|
if ( episodeIndex < NUM_ORIGINAL_EPISODES ) {
|
|
// Wolfenstein episodes are the first six, and they all follow the pattern of 8 levels,
|
|
// one boss level, and one secret level.
|
|
if ( levelIndex == 8 ) {
|
|
levelName = @"Boss";
|
|
} else if ( levelIndex == 9 ) {
|
|
levelName = @"Secret";
|
|
}
|
|
} else {
|
|
// These are the Spear of Destiny levels.
|
|
|
|
// Level name lookup
|
|
static const char* const spearLevelNameTable[ NUM_SPEAR_EPISODES ][ MAX_SPEAR_MAPS_PER_EPISODE ] = {
|
|
{ "Level 1", "Level 2", "Level 3", "Level 4", "Boss", "Secret", NULL },
|
|
{ "Level 1", "Level 2", "Level 3", "Level 4", "Boss", NULL, NULL },
|
|
{ "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Boss", "Secret" },
|
|
{ "Ramparts", "Death Knight", "Dungeon Dimension", NULL, NULL, NULL, NULL } };
|
|
|
|
const char * spearLevelName = "";
|
|
|
|
int spearEpisode = episodeIndex - NUM_ORIGINAL_EPISODES;
|
|
|
|
if ( 0 <= spearEpisode && spearEpisode < NUM_SPEAR_EPISODES ) {
|
|
spearLevelName = spearLevelNameTable[ spearEpisode ][ levelIndex ];
|
|
}
|
|
|
|
levelName = [NSString stringWithCString:spearLevelName encoding:NSASCIIStringEncoding ];
|
|
}
|
|
|
|
cell.textLabel.text = levelName;
|
|
|
|
cell.textLabel.textColor = [UIColor lightGrayColor];
|
|
cell.textLabel.highlightedTextColor = [UIColor colorWithRed:98.0/255.0 green:149.0/255.0 blue:212.0/255.0 alpha:1.0];
|
|
|
|
return cell;
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
|
|
forRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
|
|
int fontSize = 32;
|
|
|
|
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
|
|
fontSize = 48;
|
|
}
|
|
|
|
cell.textLabel.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2"
|
|
size:fontSize];
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
|
|
[self handleSelectionAtIndexPath:indexPath];
|
|
}
|
|
|
|
// 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.missionList = nil;
|
|
|
|
}
|
|
|
|
|
|
- (void)dealloc {
|
|
[super dealloc];
|
|
}
|
|
|
|
|
|
- (IBAction)next:(id)sender {
|
|
|
|
int levelNum = realEpisode*10+realMap;
|
|
int ch = currentMap.mapFlags[ (int)skill->value ][levelNum];
|
|
|
|
// don't let them go to the secret level unless they earned it
|
|
if ( (int)episode->value >= NUM_ORIGINAL_EPISODES ) {
|
|
if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) ) {
|
|
return;
|
|
}
|
|
} else {
|
|
if ( realMap == 9 && !( ch & MF_TRIED ) ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate];
|
|
|
|
[app stopMenuMusic];
|
|
|
|
[app showOpenGL];
|
|
|
|
|
|
PL_NewGame( &Player );
|
|
iphonePreloadBeforePlay();
|
|
|
|
int clampedSkill = skill->value;
|
|
if ( clampedSkill < 0 ) {
|
|
clampedSkill = 0;
|
|
}
|
|
if ( clampedSkill > 3 ) {
|
|
clampedSkill = 3;
|
|
}
|
|
|
|
iphoneStartMap( realEpisode, realMap, clampedSkill );
|
|
iphoneFrameNum = 0;
|
|
returnButtonFrameNum = 100;
|
|
|
|
Sound_StartBGTrack( levelData.musicName, levelData.musicName);
|
|
}
|
|
|
|
- (IBAction)back:(id)sender {
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
|
|
- (IBAction)pageDown:(id)sender {
|
|
UITableViewScrollingPageDown( self.missionList, numLevelsTable[(int)episode->value] );
|
|
}
|
|
|
|
|
|
- (IBAction)pageUp:(id)sender {
|
|
UITableViewScrollingPageUp( self.missionList, numLevelsTable[(int)episode->value] );
|
|
}
|
|
|
|
|
|
@end
|
|
|
|
|