mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2025-03-24 19:32:43 +00:00
Source release of Wolfenstein 3D Classic Platinum for iOS, 1.2
This commit is contained in:
parent
a82aba6b94
commit
16304944b4
45 changed files with 10681 additions and 171 deletions
1
wolf3d/code/env/common.h
vendored
1
wolf3d/code/env/common.h
vendored
|
@ -181,6 +181,7 @@ extern void Client_Init( void );
|
|||
#define BUTTON_ATTACK 1
|
||||
#define BUTTON_USE 2
|
||||
#define BUTTON_CHANGE_WEAPON 4
|
||||
#define BUTTON_ALTERNATE_ATTACK 8 //gsh
|
||||
#define BUTTON_ANY 128 // any key whatsoever
|
||||
|
||||
|
||||
|
|
14
wolf3d/code/env/fileio.c
vendored
14
wolf3d/code/env/fileio.c
vendored
|
@ -216,8 +216,6 @@ PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes )
|
|||
pathBase = iphoneDocDirectory;
|
||||
my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename );
|
||||
} else {
|
||||
// extern char iphoneAppDirectory[1024];
|
||||
// pathBase = iphoneAppDirectory;
|
||||
pathBase = FS_Gamedir();
|
||||
my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename );
|
||||
}
|
||||
|
@ -225,7 +223,17 @@ PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes )
|
|||
// high performance file mapping path, avoiding stdio
|
||||
fd = open( netpath, O_RDONLY );
|
||||
if ( fd == -1 ) {
|
||||
return NULL;
|
||||
// return NULL;
|
||||
//if it couldn't be found in that path then check again in the document directory
|
||||
//gsh
|
||||
//pathBase = FS_ForceGamedir();
|
||||
extern char iphoneDocDirectory[1024];
|
||||
pathBase = iphoneDocDirectory;
|
||||
my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename );
|
||||
fd = open( netpath, O_RDONLY );
|
||||
if ( fd == -1 ) { //okay, couldn't find it there either... return null
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
fstat( fd, &s );
|
||||
|
||||
|
|
18
wolf3d/code/env/files.c
vendored
18
wolf3d/code/env/files.c
vendored
|
@ -60,7 +60,7 @@
|
|||
|
||||
|
||||
PRIVATE char fs_gamedir[ MAX_OSPATH ];
|
||||
|
||||
//PRIVATE char fs_soddir[ MAX_OSPATH ]; //gsh
|
||||
|
||||
|
||||
/*
|
||||
|
@ -77,8 +77,24 @@ PRIVATE char fs_gamedir[ MAX_OSPATH ];
|
|||
*/
|
||||
PUBLIC char *FS_Gamedir( void )
|
||||
{
|
||||
/*
|
||||
//gsh... this is a trick to load in where the iphoneDocDirectory is
|
||||
if (currentMap.episode >= 6)
|
||||
{
|
||||
// sprintf( fs_soddir, "%s/SODbase", iphoneDocDirectory ); //if you're downloading the SOD data
|
||||
sprintf( fs_soddir, "%s/", iphoneDocDirectory ); //if you're only downloading the spear maps
|
||||
return fs_soddir;
|
||||
}*/
|
||||
|
||||
return fs_gamedir;
|
||||
}
|
||||
/*
|
||||
//gsh this is so that we can force a non-SOD folder
|
||||
//it's only getting used in the FSOpenFile() of fileio.c
|
||||
PUBLIC char *FS_ForceGamedir( void )
|
||||
{
|
||||
return fs_gamedir;
|
||||
}*/
|
||||
|
||||
|
||||
/*
|
||||
|
|
1
wolf3d/code/env/filesystem.h
vendored
1
wolf3d/code/env/filesystem.h
vendored
|
@ -45,6 +45,7 @@
|
|||
|
||||
extern void FS_InitFilesystem(void);
|
||||
extern char *FS_Gamedir(void);
|
||||
//extern char *FS_ForceGamedir(void); //gsh
|
||||
|
||||
|
||||
|
||||
|
|
2
wolf3d/code/env/sound.c
vendored
2
wolf3d/code/env/sound.c
vendored
|
@ -690,7 +690,7 @@ PRIVATE void Sound_Register( void )
|
|||
{
|
||||
|
||||
s_initSound = Cvar_Get( "s_initSound", "1", CVAR_INIT );
|
||||
s_masterVolume = Cvar_Get( "s_masterVolume", "1.0", CVAR_ARCHIVE );
|
||||
s_masterVolume = Cvar_Get( "s_masterVolume", "0.3", CVAR_ARCHIVE ); //gsh changed this from "1.0" to "0.3" for the volume hack... otherwise it's too loud
|
||||
s_sfxVolume = Cvar_Get( "s_sfxVolume", "1.0", CVAR_ARCHIVE );
|
||||
s_musicVolume = Cvar_Get( "s_musicVolume", "1.0", CVAR_ARCHIVE );
|
||||
s_minDistance = Cvar_Get( "s_minDistance", "0.0", CVAR_ARCHIVE );
|
||||
|
|
36
wolf3d/code/env/sound_sfx_id.c
vendored
36
wolf3d/code/env/sound_sfx_id.c
vendored
|
@ -248,33 +248,57 @@ PUBLIC void Sound_BeginRegistration( void )
|
|||
s_registering = true;
|
||||
}
|
||||
|
||||
|
||||
PUBLIC sfx_t *Sound_RegisterSound( const char *name )
|
||||
{
|
||||
sfx_t *sfx;
|
||||
bool isSpearSound = false;
|
||||
|
||||
if( ! sound_initialized )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( g_version->value == 1 )
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && strncmp(name, "iphone", 6) && currentMap.episode < 9)//added the episode & iphone check... gsh
|
||||
{
|
||||
isSpearSound = true;
|
||||
|
||||
char tempname[ 256 ];
|
||||
|
||||
my_snprintf( tempname, sizeof( tempname ), "sod%s", name );
|
||||
|
||||
sfx = Sound_FindSound( tempname );
|
||||
|
||||
//gsh
|
||||
//Com_Printf("Finding Sound: %s\n", tempname);
|
||||
}
|
||||
else
|
||||
{
|
||||
sfx = Sound_FindSound( name );
|
||||
|
||||
//gsh
|
||||
//Com_Printf("Finding Sound: %s\n", name);
|
||||
}
|
||||
|
||||
/*
|
||||
//original
|
||||
if( ! s_registering )
|
||||
{
|
||||
Sound_LoadSound( sfx );
|
||||
}
|
||||
|
||||
*/
|
||||
//gsh
|
||||
if( ! s_registering )
|
||||
{
|
||||
//if it couldn't be found and we tried finding it in sod
|
||||
//then it might exist in wolf3d
|
||||
if( !Sound_LoadSound( sfx ) && isSpearSound)
|
||||
{
|
||||
sfx = Sound_FindSound( name );
|
||||
//Com_Printf("Finding Sound Again: %s\n", name);
|
||||
|
||||
if( ! s_registering )
|
||||
Sound_LoadSound( sfx ); //try loading again
|
||||
}
|
||||
}
|
||||
|
||||
return sfx;
|
||||
}
|
||||
|
||||
|
|
47
wolf3d/code/env/texture_manager.c
vendored
47
wolf3d/code/env/texture_manager.c
vendored
|
@ -464,14 +464,14 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type )
|
|||
{
|
||||
return r_notexture;
|
||||
}
|
||||
|
||||
|
||||
// Check for file extension
|
||||
len = strlen( name );
|
||||
if( len < 5 )
|
||||
{
|
||||
return r_notexture;
|
||||
}
|
||||
|
||||
|
||||
// look for it in the texture cache
|
||||
for( i = 0, tex = ttextures; i < numttextures; ++i, ++tex )
|
||||
{
|
||||
|
@ -490,7 +490,8 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type )
|
|||
return r_notexture;
|
||||
}
|
||||
|
||||
// Com_Printf( "Loading texture: %s\n", name );
|
||||
//gsh
|
||||
//Com_Printf( "Loading texture: %s\n", name );
|
||||
|
||||
// look for the pre-digested 5551 version
|
||||
strcpy( digested, name );
|
||||
|
@ -514,7 +515,6 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type )
|
|||
{ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, GL_UNSIGNED_BYTE, 2 },
|
||||
};
|
||||
|
||||
|
||||
picHeader_t *ph = (picHeader_t *)fh->filedata;
|
||||
|
||||
int noMips = 0;
|
||||
|
@ -606,7 +606,7 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type )
|
|||
if ( fh == NULL ) {
|
||||
Com_Printf( "Failed to find texture %s\n", name );
|
||||
return r_notexture;
|
||||
}
|
||||
} //else { //added the else...gsh
|
||||
jpgSize = FS_GetFileSize( fh );
|
||||
jpgData = fh->ptrStart;
|
||||
|
||||
|
@ -616,13 +616,48 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type )
|
|||
if ( ! data ) {
|
||||
free( jpgData );
|
||||
return r_notexture;
|
||||
}
|
||||
} //else { //added the else
|
||||
tex = TM_LoadTexture( name, data, width, height, type, bytes );
|
||||
MM_FREE( data );
|
||||
tex->maxS = tex->maxT = 1.0f;
|
||||
return tex;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Com_Printf("Trying to find texture made it to the end\n");
|
||||
|
||||
//gsh.. couldn't find it... try doing it again, but looking in a new location
|
||||
if (spritelocation == SODSPRITESDIRNAME && spritelocation != WL6SPRITESDIRNAME)
|
||||
{
|
||||
//need to remove the 'sod'
|
||||
if (strncmp(spritelocation, name, strlen(spritelocation)) == 0)
|
||||
{
|
||||
char buffer[64];
|
||||
char tempName[64];
|
||||
int offset = strlen(spritelocation) + 1;
|
||||
for (int i = 0; i < strlen(name) - offset; ++i)
|
||||
{
|
||||
buffer[i] = name[i+offset];
|
||||
}
|
||||
buffer[i] = '\0'; //just in case
|
||||
|
||||
spritelocation = WL6SPRITESDIRNAME;
|
||||
|
||||
//TODO:
|
||||
my_snprintf(tempName, sizeof(tempName), "%s/%s", spritelocation, buffer);
|
||||
|
||||
Com_Printf("tempName: %s\n", tempName);
|
||||
Com_Printf("buffer: %s\n", buffer);
|
||||
|
||||
spritelocation = SODSPRITESDIRNAME; //return to sodsprites
|
||||
tex = TM_FindTexture( tempName, type);
|
||||
return tex;
|
||||
}
|
||||
}
|
||||
|
||||
return r_notexture;*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,13 @@
|
|||
#import <OpenGLES/ES1/gl.h>
|
||||
#import <OpenGLES/ES1/glext.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef VOLUMEHACK
|
||||
#import <MediaPlayer/MPVolumeView.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass.
|
||||
The view content is basically an EAGL surface you render your OpenGL scene into.
|
||||
|
@ -49,6 +56,14 @@ Note that setting the view non-opaque will only work if the EAGL surface has an
|
|||
NSTimer *animationTimer;
|
||||
NSTimeInterval animationInterval;
|
||||
|
||||
//gsh... an attempt at hacking the volume button
|
||||
#ifdef VOLUMEHACK
|
||||
MPVolumeView *volumeView;
|
||||
UISlider *volumeViewSlider;
|
||||
float lastFramesVolume;
|
||||
#endif
|
||||
// NSThread *pLoadThread;
|
||||
|
||||
}
|
||||
|
||||
@property NSTimeInterval animationInterval;
|
||||
|
|
|
@ -16,6 +16,11 @@
|
|||
|
||||
#include "wolfiphone.h"
|
||||
|
||||
|
||||
|
||||
//gsh
|
||||
//#define NOTIFYLISTEN //uncomment to receive notifications
|
||||
|
||||
struct AVSystemControllerPrivate;
|
||||
|
||||
@interface AVSystemController : NSObject
|
||||
|
@ -144,6 +149,40 @@ EAGLView *eaglview;
|
|||
((void(*)(int))eglSwapInterval)( 2 );
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef VOLUMEHACK
|
||||
//-------------------
|
||||
// Volume Button Hack
|
||||
//gsh
|
||||
// Note: MediaPlayer framework required for this trick
|
||||
//create a MPVolumeView to hack the volume button
|
||||
CGRect frame = CGRectMake(0, -30, 180, 10); //put this thing offscreen
|
||||
volumeView = [[[MPVolumeView alloc] initWithFrame:frame] autorelease];
|
||||
[volumeView sizeToFit];
|
||||
[self addSubview:volumeView];
|
||||
|
||||
// Find the volume view slider
|
||||
for (UIView *view in [volumeView subviews]){
|
||||
if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
|
||||
volumeViewSlider = (UISlider *)view;
|
||||
}
|
||||
}
|
||||
|
||||
//listen for volume changes
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(volumeListener:)
|
||||
name:@"AVSystemController_SystemVolumeDidChangeNotification"
|
||||
object:nil];
|
||||
|
||||
//---------------------
|
||||
#endif
|
||||
|
||||
#ifdef NOTIFYLISTEN //gsh
|
||||
//this is a general purpose listener
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationListener:)
|
||||
name:nil
|
||||
object:nil];
|
||||
#endif
|
||||
|
||||
// with swapinterval, we want to update as fast as possible
|
||||
float interval = 1.0 / 30.0f;
|
||||
|
@ -155,7 +194,14 @@ EAGLView *eaglview;
|
|||
return self;
|
||||
}
|
||||
|
||||
//gsh
|
||||
- (void)viewDidLoad {
|
||||
|
||||
Com_Printf("\n---------------\nviewDidLoad() called\n---------------\n\n");
|
||||
}
|
||||
|
||||
- (void)drawView {
|
||||
|
||||
[ (wolf3dAppDelegate *)[UIApplication sharedApplication].delegate restartAccelerometerIfNeeded];
|
||||
|
||||
#if 0
|
||||
|
@ -175,11 +221,28 @@ EAGLView *eaglview;
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef VOLUMEHACK
|
||||
//------------------
|
||||
// volume hack
|
||||
|
||||
|
||||
//check for volume adjustments gsh
|
||||
if ( menuState == IPM_CONTROLS)
|
||||
{
|
||||
if (lastFramesVolume != s_masterVolume->value)
|
||||
{
|
||||
lastFramesVolume = s_masterVolume->value;
|
||||
[volumeViewSlider setValue:lastFramesVolume animated:NO];
|
||||
[volumeViewSlider _commitVolumeChange];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
iphoneFrame(); // swapBuffers() will be called from here
|
||||
}
|
||||
|
||||
|
||||
- (void)swapBuffers {
|
||||
// glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
|
||||
loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].beforeSwap = Sys_Milliseconds();
|
||||
|
@ -215,7 +278,11 @@ EAGLView *eaglview;
|
|||
- (void) handleTouches:(NSSet*)touches withEvent:(UIEvent*)event {
|
||||
int touchCount = 0;
|
||||
int points[16];
|
||||
static int previousTouchCount;
|
||||
static int previousTouchCount = 0;
|
||||
|
||||
//gsh
|
||||
if (previousTouchCount == 0)
|
||||
isTouchMoving = 0;
|
||||
|
||||
NSSet *t = [event allTouches];
|
||||
for (UITouch *myTouch in t)
|
||||
|
@ -232,10 +299,12 @@ EAGLView *eaglview;
|
|||
}
|
||||
if (myTouch.phase == UITouchPhaseMoved) {
|
||||
// touch moved handler
|
||||
//gsh, use this for swipe events in the scrolling menus
|
||||
isTouchMoving = 1;
|
||||
}
|
||||
if (myTouch.phase == UITouchPhaseEnded) {
|
||||
touchCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// toggle the console with four touches
|
||||
|
@ -281,11 +350,62 @@ EAGLView *eaglview;
|
|||
[self handleTouches:touches withEvent:event];
|
||||
}
|
||||
|
||||
|
||||
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
|
||||
[self handleTouches:touches withEvent:event];
|
||||
}
|
||||
|
||||
// gsh
|
||||
#ifdef NOTIFYLISTEN
|
||||
- (void) notificationListener:(NSNotification *)notify
|
||||
{
|
||||
Com_Printf("notificationListener: %s\n", [notify.name UTF8String]);
|
||||
//NSString
|
||||
|
||||
if ([notify.name isEqualToString:@"CPDistributedMessagingCenterServerDidTerminateNotification"] && menuState == IPM_STOREKIT)
|
||||
{
|
||||
iphoneMessageBox("Apple Store Failed", "Connection to app store has terminated. Please try again later.");
|
||||
menuState = IPM_MAIN;
|
||||
}
|
||||
//sometimes after requrestProductData() is called we get these notifications
|
||||
//and the storekit no longer responds (making it appear as a crash)
|
||||
/*
|
||||
notificationListener: CPDistributedMessagingCenterServerDidTerminateNotification
|
||||
notificationListener: SKNotificationRequestFinished
|
||||
notificationListener: SKNotificationTransactionsRefreshed
|
||||
notificationListener: CPDistributedMessagingCenterServerDidTerminateNotification
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef VOLUMEHACK
|
||||
//-------------------
|
||||
// Volume Button Hack
|
||||
// gsh
|
||||
// currently this is problematic...
|
||||
// it's slow if the user holds the volume button
|
||||
// let's see if inlining this with the normal game loop is faster
|
||||
// than listening for the event... it's not
|
||||
// Note: MediaPlayer framework required for this trick
|
||||
//-------------------
|
||||
- (void) volumeListener:(NSNotification *)notify
|
||||
{
|
||||
//TODO: provide left/right click attacks
|
||||
if (volumeViewSlider.value < s_masterVolume->value)
|
||||
{
|
||||
|
||||
[volumeViewSlider setValue:s_masterVolume->value animated:NO];//volumeSetting animated:NO];
|
||||
[volumeViewSlider _commitVolumeChange]; //again, ignoring compiler warning complaints
|
||||
//this might have a warning because it's currently undocumented?
|
||||
Cvar_Set("volumeFireDown", "1");
|
||||
}
|
||||
else if (volumeViewSlider.value > s_masterVolume->value)//volumeSetting)
|
||||
{
|
||||
[volumeViewSlider setValue:s_masterVolume->value animated:NO];//volumeSetting animated:NO];
|
||||
[volumeViewSlider _commitVolumeChange]; //again, ignoring compiler warning complaints
|
||||
Cvar_Set("volumeFireUp", "1");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@end
|
||||
|
|
1986
wolf3d/code/iphone/FSCopyObject.c
Normal file
1986
wolf3d/code/iphone/FSCopyObject.c
Normal file
File diff suppressed because it is too large
Load diff
258
wolf3d/code/iphone/FSCopyObject.h
Normal file
258
wolf3d/code/iphone/FSCopyObject.h
Normal file
|
@ -0,0 +1,258 @@
|
|||
/*
|
||||
File: FSCopyObject.h
|
||||
|
||||
Contains: A Copy/Delete Files/Folders engine which uses the HFS+ API's
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Copyright © 2002-2004 Apple Computer, Inc., All Rights Reserved
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __FSCOPYOBJECT_H__
|
||||
#define __FSCOPYOBJECT_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if TARGET_API_MAC_OSX || defined( __APPLE_CC__ )
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#endif
|
||||
|
||||
#define DEBUG 1 /* set to zero if you don't want debug spew */
|
||||
|
||||
#if DEBUG
|
||||
#include <stdio.h>
|
||||
|
||||
#define QuoteExceptionString(x) #x
|
||||
|
||||
#define dwarning(s) do { printf s; fflush(stderr); } while( 0 )
|
||||
|
||||
#define mycheck_noerr( error ) \
|
||||
do { \
|
||||
if( (OSErr) error != noErr ) { \
|
||||
dwarning((QuoteExceptionString(error) " != noErr in File: %s, Function: %s, Line: %d, Error: %d\n", \
|
||||
__FILE__, __FUNCTION__, __LINE__, (OSErr) error)); \
|
||||
} \
|
||||
} while( false )
|
||||
|
||||
#define mycheck( assertion ) \
|
||||
do { \
|
||||
if( ! assertion ) { \
|
||||
dwarning((QuoteExceptionString(assertion) " failed in File: %s, Function: %s, Line: %d\n", \
|
||||
__FILE__, __FUNCTION__, __LINE__)); \
|
||||
} \
|
||||
} while( false )
|
||||
|
||||
#define myverify(assertion) mycheck(assertion)
|
||||
#define myverify_noerr(assertion) mycheck_noerr( (assertion) )
|
||||
#else
|
||||
#define dwarning(s)
|
||||
|
||||
#define mycheck(assertion)
|
||||
#define mycheck_noerr(err)
|
||||
#define myverify(assertion) do { (void) (assertion); } while (0)
|
||||
#define myverify_noerr(assertion) myverify(assertion)
|
||||
#endif
|
||||
|
||||
/*
|
||||
This code takes some tricks/techniques from MoreFilesX (by Jim Luther) and
|
||||
MPFileCopy (by Quinn), wraps them all up into an easy to use API, and adds a bunch of
|
||||
features and bug fixes. It will run on Mac OS 9.1 through 9.2.x and 10.1.x
|
||||
and up (Classic, Carbon and Mach-O)
|
||||
*/
|
||||
|
||||
/* Different options that FSCopyObject can take during a copy */
|
||||
typedef UInt32 DupeAction;
|
||||
enum {
|
||||
kDupeActionStandard, /* will do the copy with no frills */
|
||||
kDupeActionReplace, /* will delete the existing object and then copy over the new one */
|
||||
kDupeActionRename /* will rename the new object if an object of the same name exists */
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma mark CopyObjectFilterProcPtr
|
||||
|
||||
/*
|
||||
This is the prototype for the CallCopyObjectFilterProc function which
|
||||
is called once for each file and directory found by FSCopyObject.
|
||||
The CallCopyObjectFilterProc can use the read-only data it receives for
|
||||
whatever it wants.
|
||||
|
||||
The result of the CallCopyObjectFilterProc function indicates if
|
||||
the copy should be stopped. To stop the copy, return an error; to continue
|
||||
the copy, return noErr.
|
||||
|
||||
The yourDataPtr parameter can point to whatever data structure you might
|
||||
want to access from within the CallCopyObjectFilterProc.
|
||||
|
||||
Note: If an error had occured during the copy of the current object
|
||||
(currentOSErr != noErr) the FSRef etc might not be valid
|
||||
|
||||
containerChanged --> Set to true if the container's contents changed
|
||||
during iteration.
|
||||
currentLevel --> The current recursion level into the container.
|
||||
1 = the container, 2 = the container's immediate
|
||||
subdirectories, etc.
|
||||
currentOSErr --> The current error code, shows the results of the
|
||||
copy of the current object (ref)
|
||||
catalogInfo --> The catalog information for the current object.
|
||||
Only the fields requested by the whichInfo
|
||||
parameter passed to FSIterateContainer are valid.
|
||||
ref --> The FSRef to the current object.
|
||||
spec --> The FSSpec to the current object if the wantFSSpec
|
||||
parameter passed to FSCopyObject is true.
|
||||
name --> The name of the current object if the wantName
|
||||
parameter passed to FSCopyObject is true.
|
||||
yourDataPtr --> An optional pointer to whatever data structure you
|
||||
might want to access from within the
|
||||
CallCopyObjectFilterProc.
|
||||
result <-- To continue the copy, return noErr
|
||||
|
||||
__________
|
||||
|
||||
Also see: FSCopyObject
|
||||
*/
|
||||
|
||||
typedef CALLBACK_API( OSErr , CopyObjectFilterProcPtr ) (
|
||||
Boolean containerChanged,
|
||||
ItemCount currentLevel,
|
||||
OSErr currentOSErr,
|
||||
const FSCatalogInfo *catalogInfo,
|
||||
const FSRef *ref,
|
||||
const FSSpec *spec,
|
||||
const HFSUniStr255 *name,
|
||||
void *yourDataPtr);
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma mark CallCopyObjectFilterProc
|
||||
|
||||
#define CallCopyObjectFilterProc(userRoutine, containerChanged, currentLevel, currentOSErr, catalogInfo, ref, spec, name, yourDataPtr) \
|
||||
(*(userRoutine))((containerChanged), (currentLevel), (currentOSErr), (catalogInfo), (ref), (spec), (name), (yourDataPtr))
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma mark FSCopyObject
|
||||
|
||||
/*
|
||||
The FSCopyObject function takes a source object (can be a file or directory)
|
||||
and copies it (and its contents if it's a directory) to the new destination
|
||||
directory.
|
||||
|
||||
It will call your CopyObjectFilterProcPtr once for each object copied
|
||||
|
||||
The maxLevels parameter is only used when the object is a directory,
|
||||
ignored otherwise.
|
||||
It lets you control how deep the recursion goes.
|
||||
If maxLevels is 1, FSCopyObject only scans the specified directory;
|
||||
if maxLevels is 2, FSCopyObject scans the specified directory and
|
||||
one subdirectory below the specified directory; etc. Set maxLevels to
|
||||
zero to scan all levels.
|
||||
|
||||
The yourDataPtr parameter can point to whatever data structure you might
|
||||
want to access from within your CopyObjectFilterProcPtr.
|
||||
|
||||
source --> The FSRef to the object you want to copy
|
||||
destDir --> The FSRef to the directory you wish to copy source to
|
||||
maxLevels --> Maximum number of directory levels to scan or
|
||||
zero to scan all directory levels, ignored if the
|
||||
object is a file
|
||||
whichInfo --> The fields of the FSCatalogInfo you wish passed
|
||||
to you in your CopyObjectFilterProc
|
||||
dupeAction --> The action to take if an object of the same name exists
|
||||
in the destination
|
||||
newName --> The name you want the new object to have. If you pass
|
||||
in NULL, the source object name will be used.
|
||||
wantFSSpec --> Set to true if you want the FSSpec to each
|
||||
object passed to your CopyObjectFilterProc.
|
||||
wantName --> Set to true if you want the name of each
|
||||
object passed to your CopyObjectFilterProc.
|
||||
filterProcPtr --> A pointer to the CopyObjectFilterProc you
|
||||
want called once for each object found
|
||||
by FSCopyObject.
|
||||
yourDataPtr --> An optional pointer to whatever data structure you
|
||||
might want to access from within the
|
||||
CopyObjectFilterProc.
|
||||
newObjectRef --> An optional pointer to an FSRef that, on return,
|
||||
references the new object. If you don't want this
|
||||
info returned, pass in NULL
|
||||
newObjectSpec --> An optional pointer to an FSSPec that, on return,
|
||||
references the new object. If you don't want this
|
||||
info returned, pass in NULL
|
||||
*/
|
||||
|
||||
OSErr FSCopyObject( const FSRef *source,
|
||||
const FSRef *destDir,
|
||||
ItemCount maxLevels,
|
||||
FSCatalogInfoBitmap whichInfo,
|
||||
DupeAction dupeAction,
|
||||
const HFSUniStr255 *newName, /* can be NULL */
|
||||
Boolean wantFSSpec,
|
||||
Boolean wantName,
|
||||
CopyObjectFilterProcPtr filterProcPtr, /* can be NULL */
|
||||
void *yourDataPtr, /* can be NULL */
|
||||
FSRef *newObjectRef, /* can be NULL */
|
||||
FSSpec *newObjectSpec); /* can be NULL */
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma mark FSDeleteObjects
|
||||
|
||||
/*
|
||||
The FSDeleteObjects function takes an FSRef to a file or directory
|
||||
and attempts to delete it. If the object is a directory, all files
|
||||
and subdirectories in the specified directory are deleted. If a
|
||||
locked file or directory is encountered, it is unlocked and then
|
||||
deleted. After deleting the directory's contents, the directory
|
||||
is deleted. If any unexpected errors are encountered,
|
||||
FSDeleteContainer quits and returns to the caller.
|
||||
|
||||
source --> FSRef to an object (can be file or directory).
|
||||
|
||||
__________
|
||||
*/
|
||||
|
||||
OSErr FSDeleteObjects( const FSRef *source );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
212
wolf3d/code/iphone/GenLinkedList.c
Normal file
212
wolf3d/code/iphone/GenLinkedList.c
Normal file
|
@ -0,0 +1,212 @@
|
|||
/*
|
||||
File: GenLinkedList.c
|
||||
|
||||
Contains: Linked List utility routines
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Copyright © 2003-2004 Apple Computer, Inc., All Rights Reserved
|
||||
*/
|
||||
|
||||
#include "GenLinkedList.h"
|
||||
|
||||
#pragma mark --- Data Structures ---
|
||||
|
||||
/* This is the internal data structure for the nodes in the linked list. */
|
||||
/* */
|
||||
/* Note: The memory pointed to by pNext is owned by the list and is disposed of */
|
||||
/* in DestroyList. It should not be disposed of in any other way. */
|
||||
/* */
|
||||
/* Note: The memory pointed to by pData is owned by the caller of the linked */
|
||||
/* list. The caller is responsible for disposing of this memory. This can be */
|
||||
/* done by simply implementing a DisposeDataProc that will be called on each */
|
||||
/* node in the list, giving the caller a chance to dispose of any memory */
|
||||
/* created. The DisposeDataProc is called from DestroyList */
|
||||
struct GenNode
|
||||
{
|
||||
struct GenNode *pNext; /* Pointer to the next node in the list */
|
||||
GenDataPtr pData; /* The data for this node, owned by caller */
|
||||
};
|
||||
typedef struct GenNode GenNode;
|
||||
|
||||
#pragma mark --- List Implementation ---
|
||||
|
||||
/* Initializes the given GenLinkedList to an empty list. This MUST be */
|
||||
/* called before any operations are performed on the list, otherwise bad things */
|
||||
/* will happen. */
|
||||
void InitLinkedList( GenLinkedList *pList, DisposeDataProcPtr disposeProcPtr)
|
||||
{
|
||||
if( pList == NULL )
|
||||
return;
|
||||
|
||||
pList->pHead = pList->pTail = NULL;
|
||||
pList->NumberOfItems = 0;
|
||||
pList->DisposeProcPtr = disposeProcPtr;
|
||||
}
|
||||
|
||||
/* returns the current number of items in the given list. */
|
||||
/* If pList == NULL, it returns 0 */
|
||||
ItemCount GetNumberOfItems( GenLinkedList *pList )
|
||||
{
|
||||
return (pList) ? pList->NumberOfItems : 0;
|
||||
}
|
||||
|
||||
/* Creates a new node, containing pData, and adds it to the tail of pList. */
|
||||
/* Note: if an error occurs, pList is unchanged. */
|
||||
OSErr AddToTail( GenLinkedList *pList, void *pData )
|
||||
{
|
||||
OSErr err = paramErr;
|
||||
GenNode *tmpNode = NULL;
|
||||
|
||||
if( pList == NULL || pData == NULL )
|
||||
return err;
|
||||
|
||||
/* create memory for new node, if this fails we _must_ bail */
|
||||
err = ( ( tmpNode = (GenNode*) NewPtr( sizeof( GenNode ) ) ) != NULL ) ? noErr : MemError();
|
||||
if( err == noErr )
|
||||
{
|
||||
tmpNode->pData = pData; /* Setup new node */
|
||||
tmpNode->pNext = NULL;
|
||||
|
||||
if( pList->pTail != NULL ) /* more then one item already */
|
||||
((GenNode*) pList->pTail)->pNext = (void*) tmpNode; /* so append to tail */
|
||||
else
|
||||
pList->pHead = (void*) tmpNode; /* no items, so adjust head */
|
||||
|
||||
pList->pTail = (void*) tmpNode;
|
||||
pList->NumberOfItems += 1;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Takes pSrcList and inserts it into pDestList at the location pIter points to. */
|
||||
/* The lists must have the same DisposeProcPtr, but the Data can be different. If pSrcList */
|
||||
/* is empty, it does nothing and just returns */
|
||||
/* */
|
||||
/* If pIter == NULL, insert pSrcList before the head */
|
||||
/* else If pIter == pTail, append pSrcList to the tail */
|
||||
/* else insert pSrcList in the middle somewhere */
|
||||
/* On return: pSrcList is cleared and is an empty list. */
|
||||
/* The data that was owned by pSrcList is now owned by pDestList */
|
||||
void InsertList( GenLinkedList *pDestList, GenLinkedList *pSrcList, GenIteratorPtr pIter )
|
||||
{
|
||||
if( pDestList == NULL || pSrcList == NULL ||
|
||||
pSrcList->pHead == NULL || pSrcList->pTail == NULL ||
|
||||
pDestList->DisposeProcPtr != pSrcList->DisposeProcPtr )
|
||||
return;
|
||||
|
||||
if( pDestList->pHead == NULL && pDestList->pTail == NULL ) /* empty list */
|
||||
{
|
||||
pDestList->pHead = pSrcList->pHead;
|
||||
pDestList->pTail = pSrcList->pTail;
|
||||
}
|
||||
else if( pIter == NULL ) /* insert before head */
|
||||
{
|
||||
/* attach the list */
|
||||
((GenNode*)pSrcList->pTail)->pNext = pDestList->pHead;
|
||||
/* fix up head */
|
||||
pDestList->pHead = pSrcList->pHead;
|
||||
}
|
||||
else if( pIter == pDestList->pTail ) /* append to tail */
|
||||
{
|
||||
/* attach the list */
|
||||
((GenNode*)pDestList->pTail)->pNext = pSrcList->pHead;
|
||||
/* fix up tail */
|
||||
pDestList->pTail = pSrcList->pTail;
|
||||
}
|
||||
else /* insert in middle somewhere */
|
||||
{
|
||||
GenNode *tmpNode = ((GenNode*)pIter)->pNext;
|
||||
((GenNode*)pIter)->pNext = pSrcList->pHead;
|
||||
((GenNode*)pSrcList->pTail)->pNext = tmpNode;
|
||||
}
|
||||
|
||||
pDestList->NumberOfItems += pSrcList->NumberOfItems; /* sync up NumberOfItems */
|
||||
|
||||
InitLinkedList( pSrcList, NULL); /* reset the source list */
|
||||
}
|
||||
|
||||
/* Goes through the list and disposes of any memory we allocated. Calls the DisposeProcPtr,*/
|
||||
/* if it exists, to give the caller a chance to free up their memory */
|
||||
void DestroyList( GenLinkedList *pList )
|
||||
{
|
||||
GenIteratorPtr pIter = NULL,
|
||||
pNextIter = NULL;
|
||||
|
||||
if( pList == NULL )
|
||||
return;
|
||||
|
||||
for( InitIterator( pList, &pIter ), pNextIter = pIter; pIter != NULL; pIter = pNextIter )
|
||||
{
|
||||
Next( &pNextIter ); /* get the next node before we blow away the link */
|
||||
|
||||
if( pList->DisposeProcPtr != NULL )
|
||||
CallDisposeDataProc( pList->DisposeProcPtr, GetData( pIter ) );
|
||||
DisposePtr( (char*) pIter );
|
||||
}
|
||||
|
||||
InitLinkedList( pList, NULL);
|
||||
}
|
||||
|
||||
/*#############################################*/
|
||||
/*#############################################*/
|
||||
/*#############################################*/
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark --- Iterator Implementation ---
|
||||
|
||||
/* Initializes pIter to point at the head of pList */
|
||||
/* This must be called before performing any operations with pIter */
|
||||
void InitIterator( GenLinkedList *pList, GenIteratorPtr *pIter )
|
||||
{
|
||||
if( pList != NULL && pIter != NULL )
|
||||
*pIter = pList->pHead;
|
||||
}
|
||||
|
||||
/* On return, pIter points to the next node in the list. NULL if its gone */
|
||||
/* past the end of the list */
|
||||
void Next( GenIteratorPtr *pIter )
|
||||
{
|
||||
if( pIter != NULL )
|
||||
*pIter = ((GenNode*)*pIter)->pNext;
|
||||
}
|
||||
|
||||
/* Returns the data of the current node that pIter points to */
|
||||
GenDataPtr GetData( GenIteratorPtr pIter )
|
||||
{
|
||||
return ( pIter != NULL ) ? ((GenNode*)pIter)->pData : NULL;
|
||||
}
|
93
wolf3d/code/iphone/GenLinkedList.h
Normal file
93
wolf3d/code/iphone/GenLinkedList.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
File: GenLinkedList.h
|
||||
|
||||
Contains: Linked List utility routines prototypes
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Copyright © 2003-2004 Apple Computer, Inc., All Rights Reserved
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GENLINKEDLIST__
|
||||
#define __GENLINKEDLIST__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if TARGET_API_MAC_OSX || defined( __APPLE_CC__ )
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#endif
|
||||
|
||||
/* This is a quick, simple and generic linked list implementation. I tried */
|
||||
/* to setup the code so that you could use any linked list implementation you */
|
||||
/* want. They just need to support these few functions. */
|
||||
|
||||
typedef void* GenIteratorPtr;
|
||||
typedef void* GenDataPtr;
|
||||
|
||||
/* This is a callback that is called from DestroyList for each node in the */
|
||||
/* list. It gives the caller the oportunity to free any memory they might */
|
||||
/* allocated in each node. */
|
||||
typedef CALLBACK_API( void , DisposeDataProcPtr ) ( GenDataPtr pData );
|
||||
|
||||
#define CallDisposeDataProc( userRoutine, pData ) (*(userRoutine))((pData))
|
||||
|
||||
struct GenLinkedList
|
||||
{
|
||||
GenDataPtr pHead; /* Pointer to the head of the list */
|
||||
GenDataPtr pTail; /* Pointer to the tail of the list */
|
||||
ItemCount NumberOfItems; /* Number of items in the list (mostly for debugging) */
|
||||
DisposeDataProcPtr DisposeProcPtr; /* rountine called to dispose of caller data, can be NULL */
|
||||
};
|
||||
typedef struct GenLinkedList GenLinkedList;
|
||||
|
||||
void InitLinkedList ( GenLinkedList *pList, DisposeDataProcPtr disposeProcPtr );
|
||||
ItemCount GetNumberOfItems( GenLinkedList *pList );
|
||||
OSErr AddToTail ( GenLinkedList *pList, GenDataPtr pData );
|
||||
void InsertList ( GenLinkedList *pDestList, GenLinkedList *pSrcList, GenIteratorPtr pIter );
|
||||
void DestroyList ( GenLinkedList *pList );
|
||||
|
||||
void InitIterator ( GenLinkedList *pList, GenIteratorPtr *pIter );
|
||||
void Next ( GenIteratorPtr *pIter );
|
||||
GenDataPtr GetData ( GenIteratorPtr pIter );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -7,13 +7,13 @@
|
|||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<string>${PRODUCT_NAME}+</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${PRODUCT_NAME}_icon.png</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PROFILE_PREFIX}.${PRODUCT_NAME:identifier}</string>
|
||||
<string>com.idsoftware.${PRODUCT_NAME:identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
|
@ -22,26 +22,28 @@
|
|||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.idsoftware.wolf3dp</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>wolf3dp</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.1</string>
|
||||
<string>1.2</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainWindow</string>
|
||||
<key>UIInterfaceOrientation</key>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<true/>
|
||||
<key>UIStatusBarHidden</key>
|
||||
<true/>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.idsoftware.wolf3d</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>wolf3d</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
104
wolf3d/code/iphone/arialGlyphRects.h
Normal file
104
wolf3d/code/iphone/arialGlyphRects.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
// generated by fontimg
|
||||
//
|
||||
|
||||
typedef struct { unsigned short x0, y0, x1, y1; float xoff, yoff, xadvance; } GlyphRect;
|
||||
|
||||
GlyphRect glyphRects[] = {
|
||||
/* ' ' */ { 2, 2, 2, 2, 0.000000, 0.000000, 7.958042 },
|
||||
/* '!' */ { 6, 2, 9, 22, 2.250000, -20.750000, 7.958042 },
|
||||
/* '"' */ { 14, 2, 21, 9, 1.250000, -20.750000, 10.167832 },
|
||||
/* '#' */ { 26, 2, 41, 23, 0.250000, -21.000000, 15.930070 },
|
||||
/* '$' */ { 46, 2, 59, 27, 1.000000, -22.500000, 15.930070 },
|
||||
/* '%' */ { 64, 2, 86, 24, 1.500000, -21.000000, 25.468531 },
|
||||
/* '&' */ { 92, 2, 109, 23, 1.000000, -21.000000, 19.104895 },
|
||||
/* ''' */ { 114, 2, 117, 9, 1.250000, -20.750000, 5.468532 },
|
||||
/* '(' */ { 122, 2, 129, 29, 1.500000, -21.000000, 9.538462 },
|
||||
/* ')' */ { 134, 2, 141, 29, 1.500000, -21.000000, 9.538462 },
|
||||
/* '*' */ { 146, 2, 155, 11, 0.750000, -21.000000, 11.146853 },
|
||||
/* '+' */ { 160, 2, 173, 15, 1.500000, -17.000000, 16.727272 },
|
||||
/* ',' */ { 178, 2, 181, 9, 2.250000, -3.000000, 7.958042 },
|
||||
/* '-' */ { 186, 2, 194, 4, 0.750000, -8.750000, 9.538462 },
|
||||
/* '.' */ { 198, 2, 201, 5, 2.500000, -3.000000, 7.958042 },
|
||||
/* '/' */ { 206, 2, 214, 23, 0.000000, -21.000000, 7.958042 },
|
||||
/* '0' */ { 218, 2, 231, 23, 1.000000, -20.750000, 15.930070 },
|
||||
/* '1' */ { 236, 2, 243, 22, 3.000000, -20.750000, 15.930070 },
|
||||
/* '2' */ { 2, 34, 15, 54, 0.750000, -20.750000, 15.930070 },
|
||||
/* '3' */ { 20, 34, 33, 55, 1.000000, -20.750000, 15.930070 },
|
||||
/* '4' */ { 38, 34, 52, 54, 0.250000, -20.750000, 15.930070 },
|
||||
/* '5' */ { 58, 34, 72, 54, 1.000000, -20.250000, 15.930070 },
|
||||
/* '6' */ { 76, 34, 89, 55, 1.000000, -20.750000, 15.930070 },
|
||||
/* '7' */ { 94, 34, 107, 54, 1.250000, -20.250000, 15.930070 },
|
||||
/* '8' */ { 112, 34, 125, 55, 1.000000, -20.750000, 15.930070 },
|
||||
/* '9' */ { 130, 34, 143, 55, 1.000000, -20.750000, 15.930070 },
|
||||
/* ':' */ { 148, 34, 151, 49, 2.500000, -15.000000, 7.958042 },
|
||||
/* ';' */ { 156, 34, 159, 53, 2.250000, -15.000000, 7.958042 },
|
||||
/* '<' */ { 164, 34, 177, 48, 1.500000, -17.250000, 16.727272 },
|
||||
/* '=' */ { 182, 34, 195, 42, 1.500000, -14.500000, 16.727272 },
|
||||
/* '>' */ { 200, 34, 213, 48, 1.500000, -17.250000, 16.727272 },
|
||||
/* '?' */ { 218, 34, 231, 55, 1.250000, -21.000000, 15.930070 },
|
||||
/* '@' */ { 2, 60, 28, 87, 1.500000, -21.000000, 29.076923 },
|
||||
/* 'A' */ { 34, 60, 53, 80, -0.250000, -20.750000, 19.104895 },
|
||||
/* 'B' */ { 58, 60, 73, 80, 2.000000, -20.750000, 19.104895 },
|
||||
/* 'C' */ { 78, 60, 96, 81, 1.250000, -21.000000, 20.685314 },
|
||||
/* 'D' */ { 102, 60, 119, 80, 2.000000, -20.750000, 20.685314 },
|
||||
/* 'E' */ { 124, 60, 139, 80, 2.250000, -20.750000, 19.104895 },
|
||||
/* 'F' */ { 144, 60, 158, 80, 2.250000, -20.750000, 17.496504 },
|
||||
/* 'G' */ { 162, 60, 181, 81, 1.500000, -21.000000, 22.279720 },
|
||||
/* 'H' */ { 186, 60, 202, 80, 2.250000, -20.750000, 20.685314 },
|
||||
/* 'I' */ { 208, 60, 211, 80, 2.500000, -20.750000, 7.958042 },
|
||||
/* 'J' */ { 216, 60, 227, 81, 0.750000, -20.750000, 14.321678 },
|
||||
/* 'K' */ { 232, 60, 249, 80, 2.000000, -20.750000, 19.104895 },
|
||||
/* 'L' */ { 2, 92, 15, 112, 2.000000, -20.750000, 15.930070 },
|
||||
/* 'M' */ { 20, 92, 39, 112, 2.000000, -20.750000, 23.860140 },
|
||||
/* 'N' */ { 44, 92, 60, 112, 2.000000, -20.750000, 20.685314 },
|
||||
/* 'O' */ { 66, 92, 85, 113, 1.250000, -21.000000, 22.279720 },
|
||||
/* 'P' */ { 90, 92, 106, 112, 2.000000, -20.750000, 19.104895 },
|
||||
/* 'Q' */ { 110, 92, 130, 114, 1.000000, -21.000000, 22.279720 },
|
||||
/* 'R' */ { 136, 92, 154, 112, 2.250000, -20.750000, 20.685314 },
|
||||
/* 'S' */ { 160, 92, 176, 113, 1.250000, -21.000000, 19.104895 },
|
||||
/* 'T' */ { 182, 92, 198, 112, 0.500000, -20.750000, 17.496504 },
|
||||
/* 'U' */ { 204, 92, 220, 113, 2.250000, -20.750000, 20.685314 },
|
||||
/* 'V' */ { 226, 92, 245, 112, 0.000000, -20.750000, 19.104895 },
|
||||
/* 'W' */ { 2, 120, 28, 140, 0.250000, -20.750000, 27.034966 },
|
||||
/* 'X' */ { 34, 120, 53, 140, 0.000000, -20.750000, 19.104895 },
|
||||
/* 'Y' */ { 58, 120, 77, 140, 0.000000, -20.750000, 19.104895 },
|
||||
/* 'Z' */ { 82, 120, 98, 140, 0.500000, -20.750000, 17.496504 },
|
||||
/* '[' */ { 104, 120, 109, 146, 1.750000, -20.750000, 7.958042 },
|
||||
/* '\' */ { 114, 120, 122, 141, 0.000000, -21.000000, 7.958042 },
|
||||
/* ']' */ { 126, 120, 131, 146, 0.500000, -20.750000, 7.958042 },
|
||||
/* '^' */ { 136, 120, 148, 131, 0.750000, -21.000000, 13.440559 },
|
||||
/* '_' */ { 152, 120, 169, 122, -0.500000, 3.750000, 15.930070 },
|
||||
/* '`' */ { 174, 120, 179, 124, 1.000000, -20.750000, 9.538462 },
|
||||
/* 'a' */ { 184, 120, 197, 135, 1.000000, -15.250000, 15.930070 },
|
||||
/* 'b' */ { 202, 120, 215, 141, 1.750000, -20.750000, 15.930070 },
|
||||
/* 'c' */ { 220, 120, 233, 135, 1.000000, -15.250000, 14.321678 },
|
||||
/* 'd' */ { 238, 120, 251, 141, 0.750000, -20.750000, 15.930070 },
|
||||
/* 'e' */ { 2, 152, 15, 167, 1.000000, -15.250000, 15.930070 },
|
||||
/* 'f' */ { 20, 152, 28, 173, 0.250000, -21.000000, 7.958042 },
|
||||
/* 'g' */ { 34, 152, 47, 173, 0.750000, -15.250000, 15.930070 },
|
||||
/* 'h' */ { 52, 152, 64, 172, 1.750000, -20.750000, 15.930070 },
|
||||
/* 'i' */ { 70, 152, 72, 172, 1.750000, -20.750000, 6.363636 },
|
||||
/* 'j' */ { 78, 152, 84, 179, -1.500000, -20.750000, 6.363636 },
|
||||
/* 'k' */ { 88, 152, 100, 172, 1.750000, -20.750000, 14.321678 },
|
||||
/* 'l' */ { 106, 152, 108, 172, 1.750000, -20.750000, 6.363636 },
|
||||
/* 'm' */ { 114, 152, 134, 167, 1.750000, -15.250000, 23.860140 },
|
||||
/* 'n' */ { 140, 152, 152, 167, 1.750000, -15.250000, 15.930070 },
|
||||
/* 'o' */ { 158, 152, 172, 167, 0.750000, -15.250000, 15.930070 },
|
||||
/* 'p' */ { 178, 152, 191, 173, 1.750000, -15.250000, 15.930070 },
|
||||
/* 'q' */ { 196, 152, 209, 173, 1.000000, -15.250000, 15.930070 },
|
||||
/* 'r' */ { 214, 152, 222, 167, 1.750000, -15.250000, 9.538462 },
|
||||
/* 's' */ { 228, 152, 240, 167, 0.750000, -15.250000, 14.321678 },
|
||||
/* 't' */ { 246, 152, 253, 172, 0.500000, -20.250000, 7.958042 },
|
||||
/* 'u' */ { 2, 184, 14, 199, 1.750000, -15.000000, 15.930070 },
|
||||
/* 'v' */ { 20, 184, 33, 199, 0.250000, -15.000000, 14.321678 },
|
||||
/* 'w' */ { 38, 184, 58, 199, 0.000000, -15.000000, 20.685314 },
|
||||
/* 'x' */ { 64, 184, 78, 199, 0.000000, -15.000000, 14.321678 },
|
||||
/* 'y' */ { 84, 184, 98, 205, 0.250000, -15.000000, 14.321678 },
|
||||
/* 'z' */ { 102, 184, 115, 199, 0.500000, -15.000000, 14.321678 },
|
||||
/* '{' */ { 120, 184, 128, 211, 0.750000, -21.000000, 9.566434 },
|
||||
/* '|' */ { 134, 184, 136, 211, 2.500000, -21.000000, 7.440559 },
|
||||
/* '}' */ { 142, 184, 150, 211, 0.500000, -21.000000, 9.566434 },
|
||||
/* '~' */ { 156, 184, 170, 188, 1.000000, -12.500000, 16.727272 },
|
||||
/* '' */ { 176, 184, 190, 202, 3.500000, -18.000000, 21.482517 }
|
||||
};
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 182 KiB |
|
@ -101,6 +101,14 @@ void pfglVertex2i( GLint x, GLint y ) {
|
|||
immediate[ curr_vertex ] = vab;
|
||||
curr_vertex++;
|
||||
}
|
||||
void pfglVertex2f( GLfloat x, GLfloat y ) {
|
||||
assert( curr_vertex < MAX_VERTS );
|
||||
vab.xyz[ 0 ] = (float)x;
|
||||
vab.xyz[ 1 ] = (float)y;
|
||||
vab.xyz[ 2 ] = 0.0f;
|
||||
immediate[ curr_vertex ] = vab;
|
||||
curr_vertex++;
|
||||
}
|
||||
void pfglColor4ub( GLubyte r, GLubyte g, GLubyte b, GLubyte a ) {
|
||||
vab.c[ 0 ] = r;
|
||||
vab.c[ 1 ] = g;
|
||||
|
|
|
@ -224,6 +224,7 @@ void HudEditFrame() {
|
|||
|
||||
// solid background color and some UI elements for context
|
||||
R_Draw_Fill( 0, 0, 480, 320, gray );
|
||||
|
||||
iphoneDrawFace();
|
||||
iphoneDrawNotifyText();
|
||||
|
||||
|
@ -247,3 +248,336 @@ void HudEditFrame() {
|
|||
}
|
||||
}
|
||||
|
||||
//gsh
|
||||
/*
|
||||
int boundsLeft = 86;//70;
|
||||
int boundsRight = 386;//480-72;
|
||||
int boundsAbove = 80-15;//97;
|
||||
int boundsUnder = 285-15;//320-15;
|
||||
*/
|
||||
//------------------
|
||||
// ConvertFromImageToScreen
|
||||
// This converts a point placed in the screen of the iphone image
|
||||
// to the screen coordinates of the actual iphone
|
||||
// gsh
|
||||
//-------------------
|
||||
void ConvertFromImageToScreen(int *x, int *y, rect_t boundsRect)
|
||||
{
|
||||
int boundsLeft = boundsRect.x;
|
||||
int boundsRight = boundsRect.x + boundsRect.width;
|
||||
int boundsAbove = boundsRect.y;
|
||||
int boundsUnder = boundsRect.y + boundsRect.height;
|
||||
|
||||
int valX = *x;//prevTouches[0][0];
|
||||
int valY = *y;//prevTouches[0][1];
|
||||
|
||||
//int boundsLeft = 64;
|
||||
//int boundsRight = 480-64;
|
||||
int width = boundsRight - boundsLeft;
|
||||
|
||||
//int boundsAbove = 100;
|
||||
//int boundsUnder = 320-10;
|
||||
int height = boundsUnder - boundsAbove;
|
||||
|
||||
valX -= boundsLeft;
|
||||
valX = 480*valX/width;
|
||||
|
||||
valY -= boundsAbove;
|
||||
valY = 320*valY/height;
|
||||
|
||||
*x = valX;
|
||||
*y = valY;
|
||||
}
|
||||
|
||||
//------------------
|
||||
// ConvertFromScreenToImage
|
||||
// This converts a point placed on the screen of the iphone
|
||||
// to the coordinates of the screen of the iphone image
|
||||
// gsh
|
||||
//-------------------
|
||||
void ConvertFromScreenToImage(int *x, int *y, rect_t boundsRect)
|
||||
{
|
||||
int boundsLeft = boundsRect.x;
|
||||
int boundsRight = boundsRect.x + boundsRect.width;
|
||||
int boundsAbove = boundsRect.y;
|
||||
int boundsUnder = boundsRect.y + boundsRect.height;
|
||||
|
||||
int valX = *x;//prevTouches[0][0];
|
||||
int valY = *y;//prevTouches[0][1];
|
||||
|
||||
//int boundsLeft = 64;
|
||||
//int boundsRight = 480-64;
|
||||
int width = boundsRight - boundsLeft;
|
||||
|
||||
//int boundsAbove = 100;
|
||||
//int boundsUnder = 320-10;
|
||||
int height = boundsUnder - boundsAbove;
|
||||
|
||||
valX = width*valX/480;
|
||||
valX += boundsLeft;
|
||||
|
||||
valY = height*valY/320;
|
||||
valY += boundsAbove;
|
||||
|
||||
*x = valX;
|
||||
*y = valY;
|
||||
}
|
||||
|
||||
//------------------
|
||||
// ScaleFromScreenToImage
|
||||
// This converts to the correct scale to draw with
|
||||
// gsh
|
||||
//-------------------
|
||||
void ScaleFromScreenToImage(int *width, int *height, rect_t boundsRect)
|
||||
{
|
||||
int boundsLeft = boundsRect.x;
|
||||
int boundsRight = boundsRect.x + boundsRect.width;
|
||||
int boundsAbove = boundsRect.y;
|
||||
int boundsUnder = boundsRect.y + boundsRect.height;
|
||||
|
||||
int w = *width;
|
||||
int h = *height;
|
||||
|
||||
//int boundsLeft = 64;
|
||||
//int boundsRight = 480-64;
|
||||
int iW = boundsRight - boundsLeft;
|
||||
|
||||
//int boundsAbove = 100;
|
||||
//int boundsUnder = 320-10;
|
||||
int iH = boundsUnder - boundsAbove;
|
||||
|
||||
w = w*iW/480;
|
||||
h = h*iH/320;
|
||||
|
||||
*width = w;
|
||||
*height = h;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
iphoneHudEditFrame
|
||||
Same as HudEditFrame only different
|
||||
gsh
|
||||
==================
|
||||
*/
|
||||
void iphoneHudEditFrame() {
|
||||
int w;
|
||||
int x;
|
||||
colour3_t gray = { 32, 32, 32 };
|
||||
|
||||
int adjustY = 10;
|
||||
|
||||
rect_t boundsRect = RectMake(86, 80-adjustY, 300, 205);
|
||||
|
||||
|
||||
|
||||
//iphoneSetNotifyText( "Drag the controls" );
|
||||
|
||||
if ( numTouches == 0 && numPrevTouches == 1 && dragHud ) {
|
||||
// if it was released near the center, make it inactive
|
||||
int x = prevTouches[0][0];
|
||||
int y = prevTouches[0][1];
|
||||
|
||||
//convert x, y coordinates from iphone_image to screen coordinates
|
||||
ConvertFromImageToScreen( &x, &y, boundsRect);
|
||||
//ConvertFromScreenToImage( &x, &y);
|
||||
|
||||
if ( x > 120 && x < 360 && y > 80 && y < 240 ) {
|
||||
dragHud->hudFlags |= HF_DISABLED;
|
||||
} else {
|
||||
// magnet pull a matchable axis if it is close enough
|
||||
if ( dragHud == &huds.forwardStick ) {
|
||||
SnapSticks( &huds.sideStick, dragHud );
|
||||
SnapSticks( &huds.turnStick, dragHud );
|
||||
}
|
||||
if ( dragHud == &huds.sideStick ) {
|
||||
SnapSticks( &huds.forwardStick, dragHud );
|
||||
}
|
||||
if ( dragHud == &huds.turnStick ) {
|
||||
SnapSticks( &huds.forwardStick, dragHud );
|
||||
}
|
||||
}
|
||||
Sound_StartLocalSound( "iphone/baction_01.wav" );
|
||||
dragHud = NULL;
|
||||
}
|
||||
|
||||
if ( numTouches == 1 && numPrevTouches == 0 ) {
|
||||
// identify the hud being touched for drag
|
||||
int x = touches[0][0];
|
||||
int y = touches[0][1];
|
||||
|
||||
//convert x, y coordinates from iphone_image to screen coordinates
|
||||
ConvertFromImageToScreen( &x, &y, boundsRect);
|
||||
// ConvertFromScreenToImage( &x, &y);
|
||||
|
||||
dragHud = NULL;
|
||||
for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) {
|
||||
if ( x >= hud->x && x - hud->x < hud->width &&
|
||||
y >= hud->y && y - hud->y < hud->height ) {
|
||||
dragHud = hud;
|
||||
//int tempDragX = dragHud->x;
|
||||
//int tempDragY = dragHud->y;
|
||||
//ConvertFromImageToScreen(&, <#int * y#>)
|
||||
dragX = dragHud->x - x;
|
||||
dragY = dragHud->y - y;
|
||||
Sound_StartLocalSound( "iphone/bdown_01.wav" );
|
||||
dragHud->hudFlags &= ~HF_DISABLED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( numTouches == 1 && numPrevTouches == 1 && dragHud ) {
|
||||
// adjust the position of the dragHud
|
||||
int x = touches[0][0];
|
||||
int y = touches[0][1];
|
||||
ConvertFromImageToScreen(&x, &y, boundsRect);
|
||||
|
||||
dragHud->x = x + dragX;
|
||||
dragHud->y = y + dragY;
|
||||
if ( dragHud->x < 0 ) {
|
||||
dragHud->x = 0;
|
||||
}
|
||||
if ( dragHud->x > 480 - dragHud->width ) {
|
||||
dragHud->x = 480 - dragHud->width;
|
||||
}
|
||||
if ( dragHud->y < 0 ) {
|
||||
dragHud->y = 0;
|
||||
}
|
||||
if ( dragHud->y > 320 - dragHud->height ) {
|
||||
dragHud->y = 320 - dragHud->height;
|
||||
}
|
||||
}
|
||||
|
||||
// layout the disabled items in the center
|
||||
w = 0;
|
||||
for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) {
|
||||
if ( hud->hudFlags & HF_DISABLED ) {
|
||||
w += hud->width;
|
||||
}
|
||||
}
|
||||
x = 240 - w / 2;
|
||||
|
||||
for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) {
|
||||
if ( hud->hudFlags & HF_DISABLED ) {
|
||||
hud->x = x;
|
||||
hud->y = 160-hud->height/2;
|
||||
x += hud->width;
|
||||
}
|
||||
}
|
||||
|
||||
// decide where the menu button, map button, and ammo will draw
|
||||
|
||||
// solid background color and some UI elements for context
|
||||
R_Draw_Fill( 0, 0, 480, 320, gray );
|
||||
|
||||
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
||||
//iphoneDrawPic(240-108, 0, 217, 50, "iphone/header_advanced.tga");
|
||||
iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_advanced.tga");
|
||||
|
||||
//gsh
|
||||
iphoneDrawPic(10, 60-adjustY, 462, 250, "iphone/iphone_image.tga");
|
||||
// iphoneDrawPic(0, 320-240, 480, 240, "iphone/iphone_image.tga");
|
||||
|
||||
|
||||
// iphoneDrawFace();
|
||||
// iphoneDrawNotifyText();
|
||||
|
||||
|
||||
// draw the active items at their current locations
|
||||
for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) { //nice foreach loop!
|
||||
if ( hud->hudFlags & HF_DISABLED ) {
|
||||
pfglColor3f( 0.5, 0.5, 0.5 );
|
||||
}
|
||||
if ( hud == &huds.ammo ) {
|
||||
int x = huds.ammo.x + huds.ammo.width / 2;
|
||||
int y = huds.ammo.y;
|
||||
int w = 48;
|
||||
int h = 48;
|
||||
|
||||
ConvertFromScreenToImage(&x, &y, boundsRect);
|
||||
ScaleFromScreenToImage(&w, &h, boundsRect);
|
||||
|
||||
iphoneDrawNumber( x, y, 99, w, h );
|
||||
} else {
|
||||
int x = hud->x;
|
||||
int y = hud->y;
|
||||
int w = hud->width;
|
||||
int h = hud->height;
|
||||
|
||||
ConvertFromScreenToImage(&x, &y, boundsRect);
|
||||
ScaleFromScreenToImage(&w, &h, boundsRect);
|
||||
|
||||
iphoneDrawPicNum( x, y, w, h, hud->glTexNum );
|
||||
}
|
||||
pfglColor3f( 1, 1, 1 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// draw the back button
|
||||
if ( iphoneDrawPicWithTouch( 0, 0, 64, 36, "iphone/button_back.tga" ) ) {
|
||||
menuState = IPM_CONTROLS;
|
||||
iphoneSetNotifyText( "" );
|
||||
}
|
||||
|
||||
//x = 64;
|
||||
//if (revLand->value)
|
||||
x = 480-64;
|
||||
// draw the menu button
|
||||
if ( iphoneDrawPicWithTouch( x, 0, 64, 36, "iphone/menu.tga" ) ) {
|
||||
//if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_menu_yellow.tga" ) ) {
|
||||
menuState = IPM_MAIN;
|
||||
iphoneSetNotifyText( "" );
|
||||
}
|
||||
|
||||
/*
|
||||
//------------------------------------
|
||||
//Draw volume up/down settings... gsh
|
||||
int width = 64*9/10;
|
||||
int height = 36;//48*9/10;
|
||||
|
||||
int y = 0;
|
||||
y = 0;
|
||||
x = 480-width;
|
||||
if (revLand->value){
|
||||
y = 320-height;
|
||||
x = 0;
|
||||
}
|
||||
|
||||
//gsh
|
||||
if ((int)volumeFireUpSetting->value) {
|
||||
if (iphoneDrawPicWithTouch( x, y, width, height, "iphone/button_pistol.tga" ))
|
||||
Cvar_Set("volumeFireUpSetting", "0");
|
||||
}
|
||||
else {
|
||||
if (iphoneDrawPicWithTouch( x, y, width, height, "iphone/button_knife.tga" ))
|
||||
Cvar_Set("volumeFireUpSetting", "1");
|
||||
}
|
||||
|
||||
|
||||
x = 480-width-width-5;
|
||||
if (revLand->value)
|
||||
x = width+5;
|
||||
|
||||
if ((int)volumeFireDownSetting->value) {
|
||||
if (iphoneDrawPicWithTouch( x, y, width, height, "iphone/button_pistol.tga" ))
|
||||
Cvar_Set("volumeFireDownSetting", "0");
|
||||
}
|
||||
else {
|
||||
if (iphoneDrawPicWithTouch( x, y, width, height, "iphone/button_knife.tga" ))
|
||||
Cvar_Set("volumeFireDownSetting", "1");
|
||||
}
|
||||
//-----------------------------------
|
||||
*/
|
||||
//draw the instructions
|
||||
//if (revLand->value)
|
||||
// iphoneDrawText(x+width+20, 300, 16, 16, "Drag the controls to customize");
|
||||
//else
|
||||
// iphoneCenterText(240, 300, "Drag each element of the controls to customize");
|
||||
iphoneCenterArialText(245, 315, 0.8f, "Drag each element of the controls to customize");
|
||||
}
|
||||
|
||||
|
|
39
wolf3d/code/iphone/iphone_alerts.h
Normal file
39
wolf3d/code/iphone/iphone_alerts.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* iphone_alerts.h
|
||||
* wolf3d
|
||||
*
|
||||
* Created by Greg Hodges on 7/14/09.
|
||||
* Copyright 2009 id software. All rights reserved.
|
||||
*
|
||||
* C wrappers for the UIAlertView.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
|
||||
Copyright (C) 2009 Id Software, Inc.
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __IPHONE_ALERTS__
|
||||
#define __IPHONE_ALERTS__
|
||||
|
||||
void iphoneMessageBox(char *title, char *message);
|
||||
void iphoneKillMessageBox();
|
||||
void iphoneYesNoBox(char *title, char *message);
|
||||
|
||||
#endif
|
110
wolf3d/code/iphone/iphone_alerts.m
Normal file
110
wolf3d/code/iphone/iphone_alerts.m
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* iphone_alerts.c
|
||||
* wolf3d
|
||||
*
|
||||
* Created by Greg Hodges on 7/14/09.
|
||||
* Copyright 2009 id software. All rights reserved.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
|
||||
Copyright (C) 2009 Id Software, Inc.
|
||||
|
||||
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 "iphone_alerts.h"
|
||||
#import "wolf3dAppDelegate.h"
|
||||
|
||||
|
||||
/*
|
||||
==================================
|
||||
MessageBox
|
||||
Provides a basic pop-up message box
|
||||
===================================
|
||||
*/
|
||||
UIAlertView *alert;
|
||||
|
||||
void InitAlert()
|
||||
{
|
||||
alert = [[UIAlertView alloc] initWithTitle:@"Title"
|
||||
message:@"Message"
|
||||
delegate:nil
|
||||
cancelButtonTitle:@"OK"
|
||||
otherButtonTitles: nil];
|
||||
}
|
||||
|
||||
|
||||
void iphoneMessageBox(char *title, char *message)
|
||||
{
|
||||
//check if alert exists and initialize if it isn't
|
||||
if (!alert)
|
||||
{
|
||||
InitAlert();
|
||||
}
|
||||
|
||||
NSString *nsTitle = [[NSString alloc] initWithCString:title];
|
||||
NSString *nsMessage = [[NSString alloc] initWithCString:message];
|
||||
|
||||
alert.title = nsTitle;
|
||||
alert.message = nsMessage;
|
||||
|
||||
[alert show];
|
||||
}
|
||||
|
||||
void iphoneKillMessageBox()
|
||||
{
|
||||
[alert dismissWithClickedButtonIndex:alert.cancelButtonIndex animated:NO];
|
||||
}
|
||||
|
||||
#if 1
|
||||
/*
|
||||
==================================
|
||||
YesNoBox
|
||||
Provides a yes/no box. The
|
||||
appdelegate responds to this
|
||||
through the UIAlerViewDelegate
|
||||
ClickedButton call.
|
||||
===================================
|
||||
*/
|
||||
UIAlertView *alertYesNo;
|
||||
|
||||
void InitAlertYesNo()
|
||||
{
|
||||
alertYesNo = [[UIAlertView alloc] initWithTitle:@"Title"
|
||||
message:@"Message"
|
||||
delegate:(wolf3dAppDelegate *)[UIApplication sharedApplication].delegate//nil
|
||||
cancelButtonTitle:@"No"
|
||||
otherButtonTitles:@"Yes", nil];
|
||||
}
|
||||
|
||||
void iphoneYesNoBox(char *title, char *message)
|
||||
{
|
||||
if (!alertYesNo)
|
||||
{
|
||||
InitAlertYesNo();
|
||||
}
|
||||
|
||||
NSString *nsTitle = [[NSString alloc] initWithCString:title];
|
||||
NSString *nsMessage = [[NSString alloc] initWithCString:message];
|
||||
|
||||
alertYesNo.title = nsTitle;
|
||||
alertYesNo.message = nsMessage;
|
||||
|
||||
[alertYesNo show];
|
||||
}
|
||||
#endif
|
359
wolf3d/code/iphone/iphone_downloadSOD.m
Normal file
359
wolf3d/code/iphone/iphone_downloadSOD.m
Normal file
|
@ -0,0 +1,359 @@
|
|||
//
|
||||
// iphone_downloadSOD.m
|
||||
// wolf3d
|
||||
//
|
||||
// Created by Greg Hodges on 6/8/09.
|
||||
// Copyright 2009 id software. All rights reserved.
|
||||
//
|
||||
/*
|
||||
|
||||
Copyright (C) 2009 Id Software, Inc.
|
||||
|
||||
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 "../wolfiphone.h"
|
||||
#import "wolf3dAppDelegate.h"
|
||||
#import "iphone_alerts.h"
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#import <SystemConfiguration/SCNetworkReachability.h> //this is for testing network availability
|
||||
|
||||
//Note: in order to link the zlib library into the build from usr/lib/libz.ylib
|
||||
// the flag -lz was added to the OTHER_LDFLAGS under the build options.
|
||||
// To get there: right click on the wolf3d project. choose get info.
|
||||
// Click on build and scroll to "Other Link Flags" under "Linking"
|
||||
|
||||
|
||||
extern void Com_Printf(const char* fmt, ... );
|
||||
extern void my_snprintf( char *dest, size_t size, const char *format, ... );
|
||||
|
||||
#ifdef SPEARSTOREKIT
|
||||
extern void PurchaseSOD();
|
||||
extern bool isStorekitAvailable;
|
||||
#endif
|
||||
extern char iphoneDocDirectory[1024];
|
||||
extern menuState_t menuState;
|
||||
|
||||
|
||||
int inf(FILE *source, FILE *dest);
|
||||
void zerr(int ret);
|
||||
|
||||
|
||||
//this is used for determining if we have the correctly sized data
|
||||
const unsigned int DownloadFileSize = 45583; //size of maps
|
||||
|
||||
//-----------------------------
|
||||
// TestURLConnection
|
||||
// Test for internet access
|
||||
//-----------------------------
|
||||
int TestURLConnection()
|
||||
{
|
||||
Com_Printf("Testing URL Connection\n");
|
||||
|
||||
//We wish to be able to test connectability to both apple and id
|
||||
//because we need to communicate to both in order to complete the Spear of Destiny Transaction
|
||||
|
||||
char *hostid = "www.idsoftware.com";
|
||||
char *hostApple = "www.apple.com";
|
||||
SCNetworkReachabilityFlags flags[2];
|
||||
SCNetworkReachabilityRef reachability;
|
||||
BOOL gotFlags[2];
|
||||
|
||||
reachability = SCNetworkReachabilityCreateWithName(NULL, hostid);
|
||||
gotFlags[0] = SCNetworkReachabilityGetFlags(reachability, &flags[0]);
|
||||
CFRelease(reachability);
|
||||
|
||||
reachability = SCNetworkReachabilityCreateWithName(NULL, hostApple);
|
||||
gotFlags[1] = SCNetworkReachabilityGetFlags(reachability, &flags[1]);
|
||||
CFRelease(reachability);
|
||||
|
||||
|
||||
if (gotFlags[0] && gotFlags[1])
|
||||
{
|
||||
// kSCNetworkReachabilityFlagsReachable indicates that the specified nodename or address can
|
||||
// be reached using the current network configuration.
|
||||
if ((flags[0] & kSCNetworkReachabilityFlagsReachable) && (flags[1] & kSCNetworkReachabilityFlagsReachable))
|
||||
{
|
||||
Com_Printf("Both Hosts were reached\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: alert user they cannot download SOD
|
||||
iphoneMessageBox("Host Server Unavailable", "Check your internet connection and try again later.");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------
|
||||
// OpenURLConnection
|
||||
// This connects to a server and downloads the file located there
|
||||
//-----------------------------
|
||||
void OpenURLConnection( const char *url )
|
||||
{
|
||||
Com_Printf( "ConnectURL char *: %s\n", url );
|
||||
|
||||
//convert url to nsstring
|
||||
NSString *nssURL = [NSString stringWithUTF8String: url];
|
||||
|
||||
// create the request
|
||||
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:nssURL]
|
||||
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
||||
timeoutInterval:60.0];
|
||||
|
||||
// create the connection with the request
|
||||
// and start loading the data
|
||||
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest
|
||||
delegate:(wolf3dAppDelegate *)[UIApplication sharedApplication].delegate];
|
||||
|
||||
if (!theConnection)
|
||||
{
|
||||
// inform the user that the download could not be made
|
||||
Com_Printf("Connection failed... no download plausible\n");
|
||||
|
||||
//inform user
|
||||
iphoneMessageBox("Connection Failed", "The install was unable to download. Check your internet connection and try again later.");
|
||||
|
||||
//return to main menu
|
||||
menuState = IPM_MAIN;
|
||||
}
|
||||
}
|
||||
|
||||
//============================
|
||||
// DisplayWrongVersionedOS
|
||||
// Display to the user they have the wrong OS version and cannot use storekit
|
||||
//=============================
|
||||
void DisplayWrongVersionedOS()
|
||||
{
|
||||
iphoneMessageBox("Feature Unavailable", "Your device is not updated. This feature requires OS 3.0 or higher.");
|
||||
}
|
||||
|
||||
//============================
|
||||
// BeginStoreKit
|
||||
// This starts the purchasing process of the storekit framework
|
||||
//=============================
|
||||
#ifdef SPEARSTOREKIT
|
||||
void BeginStoreKit()
|
||||
{
|
||||
//only start the storekit API if it exists
|
||||
if (isStorekitAvailable)
|
||||
{
|
||||
if (TestURLConnection()) //check URL connection again
|
||||
{
|
||||
menuState = IPM_STOREKIT;
|
||||
Com_Printf("BeginStoreKit() called\n");
|
||||
PurchaseSOD();
|
||||
}
|
||||
}
|
||||
else
|
||||
DisplayWrongVersionedOS();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//============================
|
||||
// DownloadSOD
|
||||
// starts the download process of SOD
|
||||
// this is called after purchase of the SOD levels is confirmed
|
||||
//=============================
|
||||
void DownloadSOD()
|
||||
{
|
||||
menuState = IPM_DOWNLOADPROGRESS; //change the menu to the download screen
|
||||
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//check if download.tgz already exists and delete if it does
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [documentsDirectory stringByAppendingString:@"/downloadedfile.tgz"];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (file) //file exists... delete it, we do not care to append to a pre-exisiting file
|
||||
{
|
||||
if( remove( [fileatpath UTF8String] ) != 0 )
|
||||
Com_Printf("Error deleting buffer\n");
|
||||
else
|
||||
Com_Printf("Deleted buffer\n");
|
||||
}
|
||||
|
||||
//TODO: change this url to what will eventually be the permanent location
|
||||
OpenURLConnection("http://gregory.hodges.googlepages.com/spearMaps.tgz");
|
||||
|
||||
//after this the control automatically goes back to the appDelegate where it receives the packets of downloaded information
|
||||
}
|
||||
|
||||
unsigned int dataAmount = 0;
|
||||
unsigned int dataTotalAmount = 0;
|
||||
extern unsigned int totalDownloaded;
|
||||
//int hasBeenMessaged = 0;
|
||||
|
||||
//============================
|
||||
// AppendData
|
||||
// adds a packet of data directly to file
|
||||
//============================
|
||||
void AppendDataToFile(NSData* data)
|
||||
{
|
||||
NSUInteger length = [data length];
|
||||
|
||||
dataAmount = (unsigned int)length;
|
||||
dataTotalAmount += dataAmount;
|
||||
totalDownloaded = dataTotalAmount; //update the download screen with the total downloaded
|
||||
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [documentsDirectory stringByAppendingString:@"/downloadedfile.tgz"];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (!file) //file does not exist... create and append file
|
||||
{
|
||||
NSLog(@"open file failed\ncreating file with path: %@\n", fileatpath);
|
||||
[[NSFileManager defaultManager] createFileAtPath:fileatpath
|
||||
contents:data
|
||||
attributes:nil];
|
||||
return;
|
||||
}
|
||||
|
||||
//seek to end of file and append data
|
||||
[file seekToEndOfFile];
|
||||
[file writeData:data];
|
||||
[file closeFile];
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===========================
|
||||
// DecompressData
|
||||
// Calls into untgz.c to start data inflation
|
||||
// this function should not be getting called
|
||||
//============================
|
||||
void DecompressData()
|
||||
{
|
||||
Com_Printf("Starting DecompressData");
|
||||
|
||||
char path[1024];
|
||||
my_snprintf(path, sizeof(path), "%s/downloadedfile.tgz", iphoneDocDirectory);
|
||||
}
|
||||
|
||||
//================================
|
||||
// IsSpearPurchased
|
||||
// returns 1 if Spear was purchased
|
||||
//================================
|
||||
int IsSpearPurchased()
|
||||
{
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [documentsDirectory stringByAppendingString:@"/SpearPurchased.log"];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (file)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//================================
|
||||
// IsSpearInstalled
|
||||
// returns 1 if Spear is installed
|
||||
//================================
|
||||
int IsSpearInstalled()
|
||||
{
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [documentsDirectory stringByAppendingString:@"/SpearInstalled.log"];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (file)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//================================
|
||||
// WriteDownloadLog
|
||||
// records that we've finished installing SOD
|
||||
// but haven't completed the purchase
|
||||
//================================
|
||||
void WriteInstallLog()
|
||||
{
|
||||
char *buffer = "useless data";
|
||||
NSData *data = [[NSData alloc] initWithBytes: (void *)buffer length: strlen(buffer)];
|
||||
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [documentsDirectory stringByAppendingString:@"/SpearInstalled.log"];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (!file) //file does not exist... create and append file
|
||||
{
|
||||
NSLog(@"open file failed\ncreating file with path: %@\n", fileatpath);
|
||||
[[NSFileManager defaultManager] createFileAtPath:fileatpath
|
||||
contents:data
|
||||
attributes:nil];
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//================================
|
||||
// FinalizeDownload
|
||||
// Installs the needed files for SOD and
|
||||
// removes any unwanted data
|
||||
//================================
|
||||
extern void iphoneWriteConfig();
|
||||
void FinalizeDownload()
|
||||
{
|
||||
// get the documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
NSString *fileName = [documentsDirectory stringByAppendingString:@"/downloadedfile.tgz"];
|
||||
|
||||
//inflate the data and store in its appropriate directory
|
||||
DecompressData();
|
||||
|
||||
//TODO: After inflating data... we should delete the downloadedfile.tgz
|
||||
if( remove( [fileName UTF8String] ) != 0 )
|
||||
Com_Printf( "Error deleting downloadedfile.tgz\n" );
|
||||
else
|
||||
Com_Printf( "downloadedfile.tgz successfully deleted\n" );
|
||||
|
||||
|
||||
iphoneKillMessageBox();
|
||||
|
||||
//write a file that lets wolf3d know that SOD is installed
|
||||
WriteInstallLog();
|
||||
|
||||
#ifdef SPEARSTOREKIT
|
||||
//start the storekit
|
||||
BeginStoreKit();
|
||||
#endif
|
||||
}
|
223
wolf3d/code/iphone/iphone_downloadUserMap.m
Normal file
223
wolf3d/code/iphone/iphone_downloadUserMap.m
Normal file
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
* iphone_downloadUserMap.c
|
||||
* wolf3d
|
||||
*
|
||||
* Created by Greg Hodges on 7/20/09.
|
||||
* Copyright 2009 id software. All rights reserved.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
|
||||
Copyright (C) 2009 Id Software, Inc.
|
||||
|
||||
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 "../wolfiphone.h"
|
||||
#import "wolf3dAppDelegate.h"
|
||||
#import "iphone_alerts.h"
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern void Com_Printf(const char* fmt, ... );
|
||||
extern void my_snprintf( char *dest, size_t size, const char *format, ... );
|
||||
|
||||
extern char iphoneDocDirectory[1024];
|
||||
extern menuState_t menuState;
|
||||
|
||||
|
||||
int inf(FILE *source, FILE *dest);
|
||||
void zerr(int ret);
|
||||
|
||||
|
||||
char mapName[1024];// = "/";
|
||||
|
||||
//this is used for determining if we have the correctly sized data
|
||||
const unsigned int DownloadUserFileSize = 4096; //max size of maps?
|
||||
|
||||
|
||||
//-----------------------------
|
||||
// DownloadURLConnection
|
||||
// This connects to a server and downloads the file located there
|
||||
//-----------------------------
|
||||
void DownloadURLConnection( char *url )
|
||||
{
|
||||
Com_Printf( "ConnectURL char *: %s\n", url );
|
||||
|
||||
int length = strlen(url);
|
||||
if (length <= 4)
|
||||
{
|
||||
iphoneMessageBox("error", "url is not a valid map name. Maps must end in \".map\"");
|
||||
return;
|
||||
}
|
||||
|
||||
length = strlen(url);
|
||||
//acquire file name of map
|
||||
int pos = length;
|
||||
while (pos > 0)
|
||||
{
|
||||
--pos;
|
||||
if (url[pos] == '/')
|
||||
break;
|
||||
}
|
||||
++pos;
|
||||
strcpy(mapName, url + pos);
|
||||
|
||||
//-------------------------------------------------
|
||||
//check if this file already exists... if so, delete the old one
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//get maps directory
|
||||
NSString *mapsDirectory = [documentsDirectory stringByAppendingString:@"/usermaps/"];
|
||||
|
||||
DIR *dp = opendir ([mapsDirectory UTF8String]);
|
||||
if (dp != NULL)
|
||||
{
|
||||
struct dirent *ep;
|
||||
while (ep = readdir (dp))
|
||||
{
|
||||
//if you find a .DS_Store file... ignore it!
|
||||
if ( strcmp(ep->d_name, ".DS_Store") == 0 )
|
||||
continue;
|
||||
if ( strcmp(ep->d_name, ".") == 0 )
|
||||
continue;
|
||||
if ( strcmp(ep->d_name, "..") == 0 )
|
||||
continue;
|
||||
|
||||
if (strcmp(ep->d_name, mapName) == 0)
|
||||
{
|
||||
printf("found a file with name: %s\n", mapName);
|
||||
printf("overwiting file\n");
|
||||
//TODO: delete this file
|
||||
char buffer[2048];
|
||||
sprintf(buffer, "%s%s", [mapsDirectory UTF8String], mapName);
|
||||
printf("removing at: %s\n", buffer);
|
||||
remove(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
//convert url to nsstring
|
||||
NSString *nssURL = [NSString stringWithUTF8String: url];
|
||||
|
||||
// create the request
|
||||
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:nssURL]
|
||||
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
||||
timeoutInterval:60.0];
|
||||
|
||||
// create the connection with the request
|
||||
// and start loading the data
|
||||
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest
|
||||
delegate:(wolf3dAppDelegate *)[UIApplication sharedApplication].delegate];
|
||||
|
||||
if (!theConnection)
|
||||
{
|
||||
// inform the user that the download could not be made
|
||||
Com_Printf("Connection failed... no download plausible\n");
|
||||
|
||||
//inform user
|
||||
iphoneMessageBox("Connection Failed", "Can not download. Check your internet connection, file url and try again later.");
|
||||
|
||||
//return to main menu
|
||||
menuState = IPM_MAIN;
|
||||
}
|
||||
|
||||
menuState = IPM_DOWNLOADPROGRESS;
|
||||
}
|
||||
|
||||
unsigned int userDataAmount = 0;
|
||||
unsigned int userDataTotalAmount = 0;
|
||||
extern unsigned int totalDownloaded;
|
||||
|
||||
//============================
|
||||
// AppendData
|
||||
// adds a packet of data directly to file
|
||||
//============================
|
||||
void AppendUserDataToFile(NSData* data)
|
||||
{
|
||||
NSUInteger length = [data length];
|
||||
|
||||
userDataAmount = (unsigned int)length;
|
||||
userDataTotalAmount += userDataAmount;
|
||||
totalDownloaded = userDataTotalAmount; //update the download screen with the total downloaded
|
||||
|
||||
//get documents directory
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
//get maps directory
|
||||
NSString *mapsDirectory = [documentsDirectory stringByAppendingString:@"/usermaps/"];
|
||||
|
||||
//check if maps directory exists, if not create maps directory
|
||||
mkdir([mapsDirectory UTF8String], 0755);
|
||||
|
||||
//create/open file for saving
|
||||
NSString *fileatpath = [mapsDirectory stringByAppendingString:[NSString stringWithUTF8String:mapName]];
|
||||
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:fileatpath];
|
||||
|
||||
if (!file) //file does not exist... create and append file
|
||||
{
|
||||
NSLog(@"open file failed\ncreating file with path: %@\n", fileatpath);
|
||||
[[NSFileManager defaultManager] createFileAtPath:fileatpath
|
||||
contents:data
|
||||
attributes:nil];
|
||||
return;
|
||||
}
|
||||
|
||||
//seek to end of file and append data
|
||||
[file seekToEndOfFile];
|
||||
[file writeData:data];
|
||||
[file closeFile];
|
||||
}
|
||||
|
||||
//================================
|
||||
// FinalizeUserDownload
|
||||
//================================
|
||||
extern int Level_VerifyMap( const char *levelname );
|
||||
extern int iphoneGetUserMapLevelByName(const char *mapName);
|
||||
void FinalizeUserDownload()
|
||||
{
|
||||
char buffer[1024];
|
||||
sprintf(buffer, "usermaps/%s", mapName);
|
||||
|
||||
//we need to verify that this is a true .map file
|
||||
if (Level_VerifyMap(buffer) == 0)
|
||||
{
|
||||
//it wasn't a valid map. Inform user and delete
|
||||
iphoneMessageBox("invalid map", "downloaded file is an invalid map");
|
||||
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
|
||||
char buffer2[2048];
|
||||
sprintf(buffer2, "%s/usermaps/%s", [documentsDirectory UTF8String], mapName);
|
||||
remove(buffer2);
|
||||
menuState = IPM_MAIN;
|
||||
return;
|
||||
}
|
||||
|
||||
//start this map immediately!
|
||||
menuState = IPM_EPISODE;
|
||||
iphonePreloadBeforePlay();
|
||||
int level = iphoneGetUserMapLevelByName(mapName);
|
||||
iphoneStartUserMap(10, level, currentMap.skill, mapName);
|
||||
}
|
|
@ -120,8 +120,9 @@ brown plant
|
|||
cp 136.5551 ~/dev/iphone/wolf3d/base/sprites/013.5551
|
||||
|
||||
*/
|
||||
|
||||
#include <pthread.h> //gsh
|
||||
#include "../wolfiphone.h"
|
||||
#include "arialGlyphRects.h" //gsh... cass made a nice fontimage helper. We might as well use it.
|
||||
|
||||
currentMap_t currentMap;
|
||||
|
||||
|
@ -131,12 +132,16 @@ int iphoneFrameNum;
|
|||
int intermissionTriggerFrame;
|
||||
int slowAIFrame;
|
||||
|
||||
//gsh
|
||||
int returnButtonFrameNum = 0;
|
||||
|
||||
// console mode
|
||||
int consoleActive;
|
||||
|
||||
// the native iPhone code should set the following each frame:
|
||||
int numTouches;
|
||||
int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top
|
||||
int isTouchMoving = 0; //gsh
|
||||
float tilt; // -1.0 to 1.0
|
||||
float tiltPitch;
|
||||
|
||||
|
@ -150,6 +155,9 @@ int prevTouches[5][2];
|
|||
|
||||
texture_t *numberPics[10];
|
||||
|
||||
//gsh
|
||||
texture_t *arialFontTexture;
|
||||
|
||||
char *mugshotnames[ NUM_MUGSHOTS ] =
|
||||
{
|
||||
"iphone/FACE1APIC.tga",
|
||||
|
@ -181,7 +189,11 @@ char *mugshotnames[ NUM_MUGSHOTS ] =
|
|||
"iphone/FACE7CPIC.tga",
|
||||
|
||||
"iphone/FACE8APIC.tga",
|
||||
"iphone/GOTGATLINGPIC.tga"
|
||||
"iphone/GOTGATLINGPIC.tga",
|
||||
|
||||
"iphone/GODMODEFACE0PIC.tga",
|
||||
"iphone/GODMODEFACE1PIC.tga",
|
||||
"iphone/GODMODEFACE2PIC.tga",
|
||||
};
|
||||
|
||||
int damageflash;
|
||||
|
@ -308,6 +320,439 @@ int iphoneCenterText( int x, int y, const char *str ) {
|
|||
return l * step;
|
||||
}
|
||||
|
||||
//gsh
|
||||
void iphoneCenterTextWithColor(int x, int y, const char *str, colour4_t color ) {
|
||||
|
||||
pfglColor4f(color[0], color[1], color[2], color[3]);
|
||||
|
||||
iphoneCenterText(x, y, str);
|
||||
|
||||
pfglColor4f(1, 1, 1, 1);
|
||||
}
|
||||
/*
|
||||
==================
|
||||
iphoneDrawArialText
|
||||
left justified arial text
|
||||
gsh
|
||||
Returns the width in pixels
|
||||
==================
|
||||
*/
|
||||
int iphoneDrawArialText( int x, int y, float scale, const char *str ) {
|
||||
/*
|
||||
int l = strlen( str );
|
||||
int i;
|
||||
font_t *myfont = myfonts[0];
|
||||
// int scale;
|
||||
int step = 10;
|
||||
|
||||
// scale = 16;
|
||||
int left_margin = x;
|
||||
*/
|
||||
texture_t *gl;
|
||||
|
||||
gl = TM_FindTexture( "iphone/arialImageLAL_white-alpha.tga", TT_Pic );
|
||||
if( ! gl ) {
|
||||
Com_Printf( "Can't find pic: %s\n", "iphone/arialImageLAL_white-alpha.tga" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
R_Bind( gl->texnum );
|
||||
|
||||
|
||||
// float fx = x;
|
||||
// float fy = y;
|
||||
|
||||
// int scale = 1;//16;
|
||||
// float scale = 0.9f;
|
||||
|
||||
pfglBegin( GL_QUADS );
|
||||
|
||||
while ( *str ) {
|
||||
int i = *str;
|
||||
if ( i >= ' ' && i < 128 ) {
|
||||
GlyphRect *glyph = &glyphRects[i-32];
|
||||
|
||||
// the glyphRects don't include the shadow outline
|
||||
float x0 = ( glyph->x0 - 2 ) / 256.0;
|
||||
float y0 = ( glyph->y0 - 2 ) / 256.0;
|
||||
float x1 = ( glyph->x1 + 3 ) / 256.0;
|
||||
float y1 = ( glyph->y1 + 3 ) / 256.0;
|
||||
|
||||
|
||||
float width = ( x1 - x0 ) * 256 * scale;
|
||||
float height = ( y1 - y0 ) * 256 * scale;
|
||||
|
||||
// float xoff = ( glyph->xoff - 1 ) * scale;
|
||||
float yoff = ( glyph->yoff - 1 ) * scale;
|
||||
|
||||
if (i == 'l' || i == 'I' || i == 'h' || i == 'i')
|
||||
yoff += 1;
|
||||
|
||||
pfglTexCoord2f( x0, y0 );
|
||||
// pfglVertex2f( fx + xoff, fy + yoff );
|
||||
pfglVertex2i( x, y + yoff);
|
||||
|
||||
pfglTexCoord2f( x1, y0 );
|
||||
// pfglVertex2f( fx + xoff + width, fy + yoff );
|
||||
pfglVertex2i( x+width, y + yoff);
|
||||
|
||||
pfglTexCoord2f( x1, y1);
|
||||
// pfglVertex2f( fx + xoff + width, fy + yoff + height );
|
||||
pfglVertex2i( x+width, y+height + yoff );
|
||||
|
||||
pfglTexCoord2f( x0, y1);
|
||||
// pfglVertex2f( fx + xoff, fy + yoff + height );
|
||||
pfglVertex2i( x, y+height + yoff);
|
||||
|
||||
// with our default texture, the difference is negligable
|
||||
// fx += glyph->xadvance * scale;
|
||||
x += glyph->xadvance * scale;
|
||||
// fx += ceil(glyph->xadvance); // with the outline, ceil is probably the right thing
|
||||
}
|
||||
str++;
|
||||
}
|
||||
|
||||
pfglEnd();
|
||||
|
||||
return x;
|
||||
}
|
||||
/*
|
||||
==================
|
||||
iphoneCenterArialText
|
||||
center justified arial text
|
||||
gsh
|
||||
Returns the width in pixels
|
||||
==================
|
||||
*/
|
||||
int iphoneCenterArialText( int x, int y, float scale, const char *str )
|
||||
{
|
||||
const char *strcopy = str;
|
||||
float width = 0;
|
||||
while ( *str )
|
||||
{
|
||||
int i = *str;
|
||||
if ( i >= ' ' && i < 128 ) {
|
||||
|
||||
GlyphRect *glyph = &glyphRects[i-32];
|
||||
width += glyph->xadvance * scale;
|
||||
}
|
||||
++str;
|
||||
}
|
||||
|
||||
return iphoneDrawArialText( x - width/2, y, scale, strcopy );
|
||||
}
|
||||
/*
|
||||
==================
|
||||
iphoneDrawArialTextInBox
|
||||
center justified arial text
|
||||
gsh
|
||||
Returns the width in pixels
|
||||
==================
|
||||
*/
|
||||
int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ) {
|
||||
int l = strlen( str );
|
||||
int i;
|
||||
|
||||
if (paragraph.x > boxRect.x + boxRect.width)
|
||||
return 0;
|
||||
if (paragraph.x + lineLength < boxRect.x)
|
||||
return 0;
|
||||
|
||||
int x = paragraph.x;
|
||||
int y = paragraph.y;
|
||||
// Com_Printf("y value: %i\n", y);
|
||||
// int width = paragraph.width; //font width
|
||||
// int height = paragraph.height; //font height
|
||||
|
||||
const int left_margin = x+5;
|
||||
int step = 10;
|
||||
|
||||
texture_t *gl;
|
||||
|
||||
gl = TM_FindTexture( "iphone/arialImageLAL_white-alpha.tga", TT_Pic );
|
||||
if( ! gl ) {
|
||||
Com_Printf( "Can't find pic: %s\n", "iphone/arialImageLAL_white-alpha.tga" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
R_Bind( gl->texnum );
|
||||
pfglBegin( GL_QUADS );
|
||||
|
||||
int lengthOfNextWord = 0;
|
||||
float scale = 0.65f;//0.9f;
|
||||
|
||||
for ( i = 0 ; i < l ; i++/*, x += step*/ ) {
|
||||
int m = str[i];
|
||||
GlyphRect *glyph = &glyphRects[m-32];
|
||||
|
||||
float x0 = ( glyph->x0 - 2 ) / 256.0;
|
||||
float y0 = ( glyph->y0 - 2 ) / 256.0;
|
||||
float x1 = ( glyph->x1 + 3 ) / 256.0;
|
||||
float y1 = ( glyph->y1 + 3 ) / 256.0;
|
||||
|
||||
float width = ( x1 - x0 ) * 256 * scale;
|
||||
float height = ( y1 - y0 ) * 256 * scale;
|
||||
|
||||
// float xoff = ( glyph->xoff - 1 ) * scale;
|
||||
float yoff = ( glyph->yoff - 1 ) * scale;
|
||||
|
||||
|
||||
//int row, col;
|
||||
//float frow, fcol;
|
||||
int num = str[i];
|
||||
|
||||
//check when to new-line
|
||||
if ( num == ' ' ) {
|
||||
float w = 0;
|
||||
int n = i + 1;
|
||||
while ( str[n] != ' ' && str[n] != '\0' && str[n] != '\n') {
|
||||
//++n;
|
||||
int m = str[n];
|
||||
GlyphRect *glyph2 = &glyphRects[m-32];
|
||||
w += glyph2->xadvance * scale;
|
||||
++n;
|
||||
}
|
||||
lengthOfNextWord = n - i - 1;
|
||||
// Com_Printf("length of word: %i\n", n - i - 1);
|
||||
// Com_Printf("length of word pixels: %f\n",w);
|
||||
|
||||
if ( w + x > lineLength + left_margin ) {
|
||||
y += 30*scale;
|
||||
x = left_margin;
|
||||
}
|
||||
else
|
||||
x += 10*scale;
|
||||
//whil
|
||||
//x += 10*scale;
|
||||
continue;
|
||||
}
|
||||
if (num == '\n') {
|
||||
y += 30*scale;
|
||||
x = left_margin;
|
||||
continue;
|
||||
}/*
|
||||
if (x + glyph->xadvance * scale > left_margin + lineLength) {
|
||||
y += 30*scale;
|
||||
x = left_margin;// + width;
|
||||
}*/
|
||||
|
||||
//check rendering boundaries
|
||||
if (x < boxRect.x+10) {
|
||||
x += glyph->xadvance * scale + 1;
|
||||
continue;
|
||||
}
|
||||
if (x + glyph->xadvance * scale > boxRect.x + boxRect.width) {
|
||||
x += glyph->xadvance * scale + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (y > boxRect.y + boxRect.height)
|
||||
break;
|
||||
|
||||
pfglTexCoord2f( x0, y0 );
|
||||
pfglVertex2i( x, y + yoff);
|
||||
|
||||
pfglTexCoord2f( x1, y0 );
|
||||
pfglVertex2i( x+width, y + yoff);
|
||||
|
||||
pfglTexCoord2f( x1, y1);
|
||||
pfglVertex2i( x+width, y+height + yoff );
|
||||
|
||||
pfglTexCoord2f( x0, y1);
|
||||
pfglVertex2i( x, y+height + yoff);
|
||||
|
||||
x += glyph->xadvance * scale + 1;
|
||||
|
||||
}
|
||||
|
||||
pfglEnd();
|
||||
|
||||
return l * step;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int iphoneDrawText( int x, int y, int width, int height, const char *str ) {
|
||||
int l = strlen( str );
|
||||
int i;
|
||||
font_t *myfont = myfonts[0];
|
||||
// int scale;
|
||||
int step = 10;
|
||||
|
||||
// scale = 16;
|
||||
int left_margin = x;
|
||||
|
||||
R_Bind( myfont->texfont->texnum );
|
||||
//R_Bind(arialFontTexture->texnum );
|
||||
pfglBegin( GL_QUADS );
|
||||
|
||||
for ( i = 0 ; i < l ; i++, x += step ) {
|
||||
int row, col;
|
||||
float frow, fcol;
|
||||
int num = str[i];
|
||||
|
||||
if ( num == ' ' ) {
|
||||
continue;
|
||||
}
|
||||
if (num == '\n') {
|
||||
y += height;
|
||||
x = left_margin;
|
||||
}
|
||||
|
||||
row = (num >> 4) - 2;
|
||||
col = num & 15;
|
||||
|
||||
frow = row * myfont->hFrac;
|
||||
fcol = col * myfont->wFrac;
|
||||
|
||||
pfglTexCoord2f( fcol, frow );
|
||||
pfglVertex2i( x, y );
|
||||
|
||||
pfglTexCoord2f( fcol+myfont->wFrac, frow );
|
||||
pfglVertex2i( x+width, y );
|
||||
|
||||
pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac );
|
||||
pfglVertex2i( x+width, y+height );
|
||||
|
||||
pfglTexCoord2f( fcol, frow+myfont->hFrac );
|
||||
pfglVertex2i( x, y+height );
|
||||
}
|
||||
|
||||
pfglEnd();
|
||||
|
||||
return l * step;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
iphoneDrawTextWithColor
|
||||
gsh
|
||||
==================
|
||||
*/
|
||||
void iphoneDrawTextWithColor( rect_t rect, const char *str, float colors[4] ) {
|
||||
|
||||
pfglColor4f(colors[0], colors[1], colors[2], colors[3]);
|
||||
iphoneDrawText(rect.x, rect.y, rect.width, rect.height, str);
|
||||
pfglColor4f(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
iphoneDrawMapName
|
||||
gsh
|
||||
==================
|
||||
*/
|
||||
void iphoneDrawMapName( rect_t rect, const char *str ) {
|
||||
|
||||
rect.y += 25;
|
||||
rect.x += 110;//80;
|
||||
/*
|
||||
float colors[4] = { 0, 0, 0, 1 };
|
||||
iphoneDrawTextWithColor(RectMake(rect.x+1, rect.y+1, rect.width, rect.height), str, colors);
|
||||
iphoneDrawTextWithColor(RectMake(rect.x+2, rect.y+2, rect.width, rect.height), str, colors);
|
||||
|
||||
colors[0] = 225.0f/255;
|
||||
colors[1] = 166.0f/255;
|
||||
iphoneDrawTextWithColor(rect, str, colors);
|
||||
*/
|
||||
|
||||
pfglColor4f(0, 0, 0, 1);
|
||||
iphoneDrawArialText(rect.x + 1, rect.y + 1, 0.9f, str);
|
||||
iphoneDrawArialText(rect.x + 2, rect.y + 2, 0.9f, str);
|
||||
pfglColor4f(225.0f/255, 166.0f/255, 0, 1);
|
||||
pfglColor4f(225.0f/255, 242.0f/255, 0, 1);
|
||||
iphoneDrawArialText(rect.x, rect.y, 0.9f, str);
|
||||
pfglColor4f(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
iphoneDrawTextInBox
|
||||
gsh
|
||||
Returns the width in pixels
|
||||
==================
|
||||
*/
|
||||
int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ) {
|
||||
int l = strlen( str );
|
||||
int i;
|
||||
font_t *myfont = myfonts[0];
|
||||
|
||||
int x = paragraph.x;
|
||||
int y = paragraph.y;
|
||||
int width = paragraph.width; //font width
|
||||
int height = paragraph.height; //font height
|
||||
|
||||
int left_margin = x;
|
||||
int step = 10;
|
||||
|
||||
R_Bind( myfont->texfont->texnum );
|
||||
pfglBegin( GL_QUADS );
|
||||
|
||||
int lengthOfNextWord = 0;
|
||||
|
||||
for ( i = 0 ; i < l ; i++, x += step ) {
|
||||
int row, col;
|
||||
float frow, fcol;
|
||||
int num = str[i];
|
||||
|
||||
//check when to new-line
|
||||
if ( num == ' ' ) {
|
||||
int n = i+1;
|
||||
while (str[n] != ' ' && str[n] != '\0' && str[n] != '\n') {
|
||||
++n;
|
||||
}
|
||||
lengthOfNextWord = n - i;// - 1;
|
||||
if (x + lengthOfNextWord*step > left_margin + lineLength) {
|
||||
y += height;
|
||||
x = left_margin;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (num == '\n') {
|
||||
y += height;
|
||||
x = left_margin;
|
||||
continue;
|
||||
}
|
||||
if (x + width > left_margin + lineLength) {
|
||||
y += height;
|
||||
x = left_margin + width;
|
||||
}
|
||||
|
||||
//check rendering boundaries
|
||||
if (x < boxRect.x)
|
||||
continue;
|
||||
if (x + width > boxRect.x + boxRect.width)
|
||||
continue;
|
||||
if (y < boxRect.y)
|
||||
continue;
|
||||
if (y + height > boxRect.y + boxRect.height)
|
||||
continue;
|
||||
|
||||
row = (num >> 4) - 2;
|
||||
col = num & 15;
|
||||
|
||||
frow = row * myfont->hFrac;
|
||||
fcol = col * myfont->wFrac;
|
||||
|
||||
pfglTexCoord2f( fcol, frow );
|
||||
pfglVertex2i( x, y );
|
||||
|
||||
pfglTexCoord2f( fcol+myfont->wFrac, frow );
|
||||
pfglVertex2i( x+width, y );
|
||||
|
||||
pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac );
|
||||
pfglVertex2i( x+width, y+height );
|
||||
|
||||
pfglTexCoord2f( fcol, frow+myfont->hFrac );
|
||||
pfglVertex2i( x, y+height );
|
||||
}
|
||||
|
||||
pfglEnd();
|
||||
|
||||
return l * step;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
|
@ -358,7 +803,7 @@ int TouchReleased( int x, int y, int w, int h ) {
|
|||
}
|
||||
|
||||
if ( !downPrev ) {
|
||||
if ( downNow ) {
|
||||
if ( downNow && !isTouchMoving ) {
|
||||
Sound_StartLocalSound( "iphone/bdown_01.wav" );
|
||||
}
|
||||
// wasn't down the previous frame
|
||||
|
@ -370,14 +815,16 @@ int TouchReleased( int x, int y, int w, int h ) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
if ( numTouches == numPrevTouches ) {
|
||||
if ( numTouches == numPrevTouches && !isTouchMoving ) {
|
||||
// finger dragged off
|
||||
Sound_StartLocalSound( "iphone/baborted_01.wav" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
// released
|
||||
Sound_StartLocalSound( "iphone/baction_01.wav" );
|
||||
if ( !isTouchMoving ) { //gsh, added the if !isTouchMoving check
|
||||
// released
|
||||
Sound_StartLocalSound( "iphone/baction_01.wav" );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -652,6 +1099,28 @@ PRIVATE void CreateIphoneUserCmd()
|
|||
if ( tiltFire->value > 0 && tiltPitch < tiltFire->value ) {
|
||||
cmd->buttons |= BUTTON_ATTACK;
|
||||
}
|
||||
|
||||
#ifdef VOLUMHACK
|
||||
//gsh... attempting a left/right click attack
|
||||
if ( volumeFireUp->value ) {
|
||||
|
||||
if ((int)volumeFireUpSetting->value)
|
||||
cmd->buttons |= BUTTON_ATTACK;
|
||||
else
|
||||
cmd->buttons |= BUTTON_ALTERNATE_ATTACK;
|
||||
|
||||
Cvar_Set("volumeFireUp", "0");
|
||||
}
|
||||
else if ( volumeFireDown->value ) {
|
||||
|
||||
if ((int)volumeFireDownSetting->value)
|
||||
cmd->buttons |= BUTTON_ATTACK;
|
||||
else
|
||||
cmd->buttons |= BUTTON_ALTERNATE_ATTACK;
|
||||
|
||||
Cvar_Set("volumeFireDown", "0");
|
||||
}
|
||||
#endif
|
||||
|
||||
// tapping the weapon issues the nextWeapon impulse
|
||||
if ( TouchReleased( 240 - 40, 320 - 80 - 64, 80, 64 ) ) {
|
||||
|
@ -680,11 +1149,14 @@ iphoneHighlightPicWhenTouched
|
|||
Draw transparent except when touched
|
||||
=================
|
||||
*/
|
||||
//gsh TODO: change hud alphas
|
||||
//TODO: make this cvar setable and adjustable in settings menu
|
||||
//float alphaValueForHudControls = 1;//0.5f;
|
||||
void iphoneHighlightPicNumWhenTouched( int x, int y, int w, int h, int glTexNum ) {
|
||||
if ( TouchDown( x, y, w, h ) ) {
|
||||
pfglColor4f(1,1,1,1);
|
||||
} else {
|
||||
pfglColor4f(1,1,1,0.5);
|
||||
pfglColor4f(1,1,1,hudAlpha->value);//0.5);
|
||||
}
|
||||
iphoneDrawPicNum( x, y, w, h, glTexNum );
|
||||
pfglColor4f(1,1,1,1);
|
||||
|
@ -752,6 +1224,7 @@ void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight )
|
|||
for( i = 0 ; i < length ; i++ ) {
|
||||
int digit = string[i] - '0';
|
||||
tex = numberPics[digit];
|
||||
|
||||
R_Bind( tex->texnum );
|
||||
pfglBegin( GL_QUADS );
|
||||
|
||||
|
@ -828,6 +1301,10 @@ void iphoneDrawFace() {
|
|||
h = 0;
|
||||
}
|
||||
pic = mugshotnames[ 3*((100-h)/16)+Player.faceframe ];
|
||||
|
||||
//gsh
|
||||
if ((Player.flags & FL_GODMODE))
|
||||
pic = mugshotnames[ 23+Player.faceframe ];
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -901,11 +1378,79 @@ void iphoneDrawNotifyText() {
|
|||
}
|
||||
}
|
||||
|
||||
--notifyFrameNum; //gsh
|
||||
|
||||
// pfglColor4f( 1, 1, 1, f );
|
||||
//iphoneCenterText( 240, 5, notifyText );
|
||||
// iphoneDrawArialText( 200, 20, 0.7f, notifyText ); //gsh
|
||||
pfglColor4f( 0, 0, 0, f );
|
||||
iphoneCenterArialText( 240+1, 20+1, 0.8f, notifyText); //gsh
|
||||
iphoneCenterArialText( 240+2, 20+2, 0.8f, notifyText); //gsh
|
||||
iphoneCenterArialText( 240+3, 20+3, 0.8f, notifyText); //gsh
|
||||
pfglColor4f( 1, 1, 1, f );
|
||||
iphoneCenterText( 240, 5, notifyText );
|
||||
iphoneCenterArialText( 240, 20, 0.8f, notifyText); //gsh
|
||||
pfglColor4f( 1, 1, 1, 1 );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
iphoneDrawReturnButton
|
||||
|
||||
Displays a button that allows the player to return to the map screen.
|
||||
But it only displays for a few seconds.
|
||||
==================
|
||||
*/
|
||||
void iphoneDrawReturnButton() {
|
||||
|
||||
if (returnButtonFrameNum <= 0)
|
||||
return;
|
||||
|
||||
// display for three seconds, then fade over 0.3
|
||||
float f = iphoneFrameNum - returnButtonFrameNum - 80;
|
||||
if ( f < 0 ) {
|
||||
f = 1.0;
|
||||
} else {
|
||||
f = 1.0 - f * 0.1f;
|
||||
if ( f < 0 ) {
|
||||
returnButtonFrameNum = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//always be semi-transparent
|
||||
if ( f > 0.5f )
|
||||
f = 0.5f;
|
||||
|
||||
pfglColor4f( 1, 1, 1, f );
|
||||
if (iphoneDrawPicWithTouch( 240-32, 32, 64, 48, "iphone/button_back.tga")) {//int x, int y, int w, int h, const char *pic )) {
|
||||
menuState = IPM_MAPS;
|
||||
returnButtonFrameNum = 0;
|
||||
|
||||
//if it's a spear map, it needs special attention
|
||||
if (currentMap.episode > 5 && currentMap.episode < 10)
|
||||
{
|
||||
//get the level number
|
||||
int levelNum = currentMap.episode*10 + currentMap.map;
|
||||
|
||||
if (levelNum == 78 || (levelNum >= 60 && levelNum < 65)) {
|
||||
episode->value = 6;
|
||||
}
|
||||
else if (levelNum == 79 || (levelNum >= 65 && levelNum < 70)) {
|
||||
episode->value = 7;
|
||||
}
|
||||
else if (levelNum >= 70 && levelNum < 76) {
|
||||
episode->value = 8;
|
||||
}
|
||||
else if (levelNum == 76 || levelNum == 77 || levelNum == 80) {
|
||||
episode->value = 9;
|
||||
}
|
||||
}
|
||||
}
|
||||
pfglColor4f( 1, 1, 1, 1 );
|
||||
|
||||
--returnButtonFrameNum;
|
||||
}
|
||||
|
||||
void iphoneStartBonusFlash() {
|
||||
bonusFrameNum = iphoneFrameNum;
|
||||
}
|
||||
|
@ -936,14 +1481,14 @@ void iphoneSetAttackDirection( int dir ) {
|
|||
attackDirTime[1] = iphoneFrameNum;
|
||||
}
|
||||
}
|
||||
|
||||
//gsh... note to self: this is where the controls are drawn
|
||||
void iphoneDrawHudControl( hudPic_t *hud ) {
|
||||
if ( hud->hudFlags & HF_DISABLED ) {
|
||||
return;
|
||||
}
|
||||
iphoneHighlightPicNumWhenTouched( hud->x, hud->y, hud->width, hud->height, hud->glTexNum );
|
||||
}
|
||||
|
||||
//gsh... note to self: this is where menu/map buttons are drawn
|
||||
int iphoneDrawHudButton( hudPic_t *hud ) {
|
||||
if ( hud->hudFlags & HF_DISABLED ) {
|
||||
return 0;
|
||||
|
@ -1007,7 +1552,7 @@ iphoneFrame
|
|||
==================
|
||||
*/
|
||||
void iphoneFrame() {
|
||||
unsigned char blendColor[4];
|
||||
unsigned char blendColor[4] = { 0, 0, 0, 0 };
|
||||
|
||||
iphoneFrameNum++;
|
||||
loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].enterFrame = Sys_Milliseconds();
|
||||
|
@ -1052,6 +1597,12 @@ void iphoneFrame() {
|
|||
//------------------
|
||||
// normal gameplay
|
||||
//------------------
|
||||
|
||||
//this is a hack for "Floor 18, Part II: Death's Door"
|
||||
//there's no gold key to leave the first room
|
||||
//so we give it to the player here... gsh
|
||||
if (currentMap.episode == 8 && !(Player.items & ITEM_KEY_1))
|
||||
Player.items |= ITEM_KEY_1;
|
||||
|
||||
if( Player.playstate != ex_dead )
|
||||
{
|
||||
|
@ -1125,16 +1676,19 @@ void iphoneFrame() {
|
|||
blendColor[0] = 255;
|
||||
blendColor[1] = 0;
|
||||
blendColor[2] = 0;
|
||||
blendColor[3] = deathFadeIntensity;
|
||||
blendColor[3] = deathFadeIntensity;
|
||||
deathFadeIntensity += 2;
|
||||
if( deathFadeIntensity >= 240 ) {
|
||||
deathFadeIntensity = 0;
|
||||
PL_NewGame( &Player );
|
||||
iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill );
|
||||
if (currentMap.episode >=9) //gsh
|
||||
iphoneStartUserMap( currentMap.episode, currentMap.map, currentMap.skill, NULL );
|
||||
else
|
||||
iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill );
|
||||
}
|
||||
} else {
|
||||
iphoneDrawWeapon();
|
||||
if( damageflash ) {
|
||||
if( damageflash ) {
|
||||
blendColor[0] = 255;
|
||||
blendColor[1] = 0;
|
||||
blendColor[2] = 0;
|
||||
|
@ -1160,6 +1714,9 @@ void iphoneFrame() {
|
|||
}
|
||||
|
||||
iphoneDrawNotifyText();
|
||||
|
||||
//gsh
|
||||
iphoneDrawReturnButton();
|
||||
|
||||
iphoneDrawMapView();
|
||||
|
||||
|
@ -1180,7 +1737,7 @@ void iphoneFrame() {
|
|||
if ( iphoneDrawHudButton( &huds.map ) ) {
|
||||
iphoneOpenAutomap();
|
||||
}
|
||||
|
||||
|
||||
Client_Screen_DrawConsole();
|
||||
|
||||
ShowTilt(); // debug tool
|
||||
|
@ -1189,4 +1746,20 @@ void iphoneFrame() {
|
|||
iphoneSavePrevTouches();
|
||||
|
||||
SysIPhoneSwapBuffers(); // do the swapbuffers
|
||||
|
||||
}
|
||||
|
||||
void iphoneDrawLoading()
|
||||
{
|
||||
Com_Printf("Draw Loading!\n");
|
||||
// unsigned char blendColor[4];
|
||||
|
||||
iphoneSet2D();
|
||||
|
||||
//draw stuff here
|
||||
iphoneDrawText(100, 100, 16, 16, "Drawing Loading!");//, <#int y#>, <#int width#>, <#int height#>, <#const char * str#>)
|
||||
|
||||
SysIPhoneSwapBuffers(); // do the swapbuffers
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
#include "../wolfiphone.h"
|
||||
|
||||
|
||||
cvar_t *controlScheme;
|
||||
cvar_t *sensitivity;
|
||||
cvar_t *stickTurnBase;
|
||||
|
@ -42,6 +41,13 @@ cvar_t *tiltMove;
|
|||
cvar_t *tiltDeadBand;
|
||||
cvar_t *tiltAverages;
|
||||
cvar_t *tiltFire;
|
||||
#ifdef VOLUMEHACK
|
||||
cvar_t *volumeFireUp; //gsh
|
||||
cvar_t *volumeFireDown; //gsh
|
||||
cvar_t *volumeFireUpSetting; //gsh
|
||||
cvar_t *volumeFireDownSetting; //gsh
|
||||
#endif
|
||||
cvar_t *hudAlpha; //gsh
|
||||
cvar_t *music;
|
||||
cvar_t *showTilt;
|
||||
cvar_t *showTime;
|
||||
|
@ -56,6 +62,10 @@ cvar_t *autoFire;
|
|||
|
||||
W32 sys_frame_time;
|
||||
|
||||
#ifdef STOREKIT
|
||||
extern void CheckForStorekitExistence(); //gsh
|
||||
#endif
|
||||
|
||||
void Sys_Error( const char *format, ... )
|
||||
{
|
||||
va_list argptr;
|
||||
|
@ -101,7 +111,12 @@ void Reset_f() {
|
|||
void iphoneStartup() {
|
||||
char *s;
|
||||
int start = Sys_Milliseconds();
|
||||
|
||||
|
||||
#ifdef STOREKIT
|
||||
//check for storekit framework and set appropriate flags... gsh
|
||||
CheckForStorekitExistence();
|
||||
#endif
|
||||
|
||||
// temporary
|
||||
const char *systemVersion = SysIPhoneGetOSVersion();
|
||||
printf( "systemVersion = %s\n", systemVersion );
|
||||
|
@ -119,6 +134,7 @@ void iphoneStartup() {
|
|||
Con_Init();
|
||||
FS_InitFilesystem();
|
||||
|
||||
|
||||
// We need to add the early commands twice, because
|
||||
// a basedir or cddir needs to be set before execing
|
||||
// config files, but we want other parms to override
|
||||
|
@ -137,9 +153,7 @@ void iphoneStartup() {
|
|||
Cvar_Get( "version", s, CVAR_SERVERINFO | CVAR_NOSET );
|
||||
|
||||
Con_Init();
|
||||
|
||||
Sound_Init();
|
||||
|
||||
Game_Init(); // game and player init
|
||||
|
||||
Cbuf_AddText( "exec config.cfg\n" );
|
||||
|
@ -165,6 +179,13 @@ void iphoneStartup() {
|
|||
tiltTurn = Cvar_Get( "tiltTurn", "0", CVAR_ARCHIVE );
|
||||
tiltMove = Cvar_Get( "tiltMove", "0", CVAR_ARCHIVE );
|
||||
tiltFire = Cvar_Get( "tiltFire", "0", CVAR_ARCHIVE );
|
||||
#ifdef VOLUMEHACK
|
||||
volumeFireUp = Cvar_Get( "volumeFireUp", "0", 0 ); //gsh
|
||||
volumeFireDown = Cvar_Get( "volumeFireDown", "0", 0 ); //gsh
|
||||
volumeFireUpSetting = Cvar_Get( "volumeFireUpSetting", "1", CVAR_ARCHIVE ); //gsh // 1 = primary
|
||||
volumeFireDownSetting = Cvar_Get( "volumeFireDownSetting", "0", CVAR_ARCHIVE ); //gsh // 0 = secondary
|
||||
#endif
|
||||
hudAlpha = Cvar_Get("hudAlpha", "1.0", CVAR_ARCHIVE); //gsh
|
||||
music = Cvar_Get( "music", "1", CVAR_ARCHIVE );
|
||||
tiltDeadBand = Cvar_Get( "tiltDeadBand", "0.08", CVAR_ARCHIVE );
|
||||
tiltAverages = Cvar_Get( "tiltAverages", "3", CVAR_ARCHIVE );
|
||||
|
@ -181,7 +202,8 @@ void iphoneStartup() {
|
|||
|
||||
// make sure volume changes and incoming calls draw the right orientation
|
||||
SysIPhoneSetUIKitOrientation( revLand->value );
|
||||
|
||||
|
||||
/* //if we don't preload the ogg files then we have faster start ups... gsh
|
||||
// preload all the ogg FM synth sounds
|
||||
Com_Printf( "before ogg preload: %i msec\n", Sys_Milliseconds() - start );
|
||||
|
||||
|
@ -210,7 +232,7 @@ void iphoneStartup() {
|
|||
Sound_RegisterSound( "lsfx/078.wav" );
|
||||
Sound_RegisterSound( "lsfx/080.wav" );
|
||||
Sound_RegisterSound( "lsfx/085.wav" );
|
||||
Sound_RegisterSound( "lsfx/086.wav" );
|
||||
Sound_RegisterSound( "lsfx/086.wav" );*/
|
||||
|
||||
// these should get overwritten by LoadTheGame
|
||||
memset( ¤tMap, 0, sizeof( currentMap ) );
|
||||
|
@ -218,12 +240,13 @@ void iphoneStartup() {
|
|||
currentMap.episode = 0;
|
||||
HudSetForScheme( 0 );
|
||||
|
||||
|
||||
Com_Printf( "before LoadTheGame: %i msec\n", Sys_Milliseconds() - start );
|
||||
|
||||
|
||||
if ( !LoadTheGame() ) {
|
||||
PL_NewGame( &Player );
|
||||
iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// always start at main menu
|
||||
|
@ -236,7 +259,7 @@ void iphoneStartup() {
|
|||
===================
|
||||
iphonePreloadBeforePlay
|
||||
|
||||
This couold all be done at startup, but moving a bit of the delay
|
||||
This could all be done at startup, but moving a bit of the delay
|
||||
to after pressing the resume button works a little better.
|
||||
===================
|
||||
*/
|
||||
|
|
478
wolf3d/code/iphone/iphone_mapselector.c
Normal file
478
wolf3d/code/iphone/iphone_mapselector.c
Normal file
|
@ -0,0 +1,478 @@
|
|||
/*
|
||||
* iphone_mapselector.c
|
||||
* wolf3d
|
||||
*
|
||||
* Created by Greg Hodges on 7/2/09.
|
||||
* Copyright 2009 id software. All rights reserved.
|
||||
*
|
||||
*/
|
||||
#include "../wolfiphone.h"
|
||||
#include <dirent.h>
|
||||
|
||||
const char levelNames[][29] = {
|
||||
"E1 level 1",
|
||||
"E1 level 2",
|
||||
"E1 level 3",
|
||||
#ifndef LITE
|
||||
"E1 level 4",
|
||||
"E1 level 5",
|
||||
"E1 level 6",
|
||||
"E1 level 7",
|
||||
"E1 level 8",
|
||||
"E1 Boss ",
|
||||
"E1 Secret ",
|
||||
"E2 level 1",
|
||||
"E2 level 2",
|
||||
"E2 level 3",
|
||||
"E2 level 4",
|
||||
"E2 level 5",
|
||||
"E2 level 6",
|
||||
"E2 level 7",
|
||||
"E2 level 8",
|
||||
"E2 Boss ",
|
||||
"E2 Secret ",
|
||||
"E3 level 1",
|
||||
"E3 level 2",
|
||||
"E3 level 3",
|
||||
"E3 level 4",
|
||||
"E3 level 5",
|
||||
"E3 level 6",
|
||||
"E3 level 7",
|
||||
"E3 level 8",
|
||||
"E3 Boss ",
|
||||
"E3 Secret ",
|
||||
"E4 level 1",
|
||||
"E4 level 2",
|
||||
"E4 level 3",
|
||||
"E4 level 4",
|
||||
"E4 level 5",
|
||||
"E4 level 6",
|
||||
"E4 level 7",
|
||||
"E4 level 8",
|
||||
"E4 Boss ",
|
||||
"E4 Secret ",
|
||||
"E5 level 1",
|
||||
"E5 level 2",
|
||||
"E5 level 3",
|
||||
"E5 level 4",
|
||||
"E5 level 5",
|
||||
"E5 level 6",
|
||||
"E5 level 7",
|
||||
"E5 level 8",
|
||||
"E5 Boss ",
|
||||
"E5 Secret ",
|
||||
"E5 level 1",
|
||||
"E6 level 2",
|
||||
"E6 level 3",
|
||||
"E6 level 4",
|
||||
"E6 level 5",
|
||||
"E6 level 6",
|
||||
"E6 level 7",
|
||||
"E6 level 8",
|
||||
"E6 Boss ",
|
||||
"E6 Secret ",
|
||||
"Floor 1: Tunnels 1 ",
|
||||
"Floor 2: Tunnels 2 ",
|
||||
"Floor 3: Tunnels 3 ",
|
||||
"Floor 4: Tunnels 4 ",
|
||||
"Floor 5: Tunnels Boss ",
|
||||
"Floor 6: Dungeons 1 ",
|
||||
"Floor 7: Dungeons 2 ",
|
||||
"Floor 8: Dungeons 3 ",
|
||||
"Floor 9: Dungeons 4 ",
|
||||
"Floor 10: Dungeons Boss ",
|
||||
"Floor 11: Castle 1 ",
|
||||
"Floor 12: Castle 2 ",
|
||||
"Floor 13: Castle 3 ",
|
||||
"Floor 14: Castle 4 ",
|
||||
"Floor 15: Castle 5 ",
|
||||
"Floor 16: Castle Boss ",
|
||||
"Floor 17: Ramparts ",
|
||||
"Floor 18: Death Knight ",
|
||||
"Floor 19: Secret 1 ",
|
||||
"Floor 20: Secret 2 ",
|
||||
"Floor 21: Angel of Death",
|
||||
#endif
|
||||
};
|
||||
|
||||
int dragVelocity = 0; //velocity for the scrolling maps
|
||||
int dragPosition = 32; //position for the scrolling maps
|
||||
|
||||
extern int BackButton();
|
||||
#ifdef SPEARSTOREKIT
|
||||
extern void GetSpearOfDestiny( int x, int y );
|
||||
#endif
|
||||
extern int iphoneDrawPicWithTouchAndColor( int x, int y, int w, int h, const char *pic, colour4_t color );
|
||||
extern void iphoneStartUserMap( int episodeNum, int mapNum, int skillLevel, char *mapName );
|
||||
|
||||
|
||||
#ifdef LITE
|
||||
extern void GetMoreLevels( int x, int y );
|
||||
#endif
|
||||
|
||||
//==========================================
|
||||
// iphoneUpdateDrags()
|
||||
// Updates the touches for the scrolling maps
|
||||
//==========================================
|
||||
void iphoneUpdateDrags(int numMaps, int skillSides, int height, int spacing, int numUserMaps)
|
||||
{
|
||||
//Update drag/touch info
|
||||
int x = 64;
|
||||
int w = 480 - skillSides - 64;
|
||||
int y = 0;
|
||||
int h = 320;
|
||||
|
||||
if (TouchDown(x, y, w, h))
|
||||
{
|
||||
if (!numPrevTouches)
|
||||
prevTouches[0][1] = touches[0][1];
|
||||
else if (numTouches == 1)
|
||||
dragVelocity = prevTouches[0][1] - touches[0][1];
|
||||
}
|
||||
|
||||
//boundary check the drags
|
||||
int num = numMaps+1+6;
|
||||
if (g_version-> value == SPEAROFDESTINY)
|
||||
num = numMaps + 7;
|
||||
|
||||
num += numUserMaps + 1;
|
||||
|
||||
if (dragPosition < 320 - (height+spacing)*(num) - 20)
|
||||
dragPosition < 320 - (height+spacing)*(num) - 20;
|
||||
else if (dragPosition > 40)
|
||||
dragPosition = 40;
|
||||
|
||||
if (dragPosition < 320 - (height+spacing)*(num))
|
||||
dragVelocity = -1;
|
||||
else if (dragPosition > 32)
|
||||
dragVelocity = 1;
|
||||
|
||||
//update the drags
|
||||
dragPosition -= dragVelocity;
|
||||
|
||||
//retard the velocity
|
||||
if (dragVelocity > 0)
|
||||
--dragVelocity;
|
||||
else if (dragVelocity < 0)
|
||||
++dragVelocity;
|
||||
|
||||
}
|
||||
|
||||
//==========================================
|
||||
// iphoneDrawRewards()
|
||||
// Draws the rewards on each level
|
||||
//==========================================
|
||||
int forceDrawRewards = 0;
|
||||
void iphoneDrawRewards(int m, int s, int x, int y)
|
||||
{
|
||||
int ch = currentMap.mapFlags[s][m];
|
||||
// bit1 = attempted
|
||||
// bit2 = completed
|
||||
// bit3 = 100% kills
|
||||
// bit4 = 100% secrets
|
||||
// bit5 = 100% treasure
|
||||
|
||||
//ch = 4+8+16+32; //used for testing proper placement
|
||||
|
||||
x += 80;
|
||||
int startX = x;
|
||||
|
||||
//x += 66;//375;
|
||||
y -= 27;//10;
|
||||
|
||||
int width = 40;//22;
|
||||
int height = 40;//22;
|
||||
int spacing = -12;
|
||||
// draw award shadows
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/kills_shadow.tga" ); x += width + spacing;
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/secrets_shadow.tga" ); x += width + spacing;
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/treasure_shadow.tga" ); x += width + spacing;
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/partime_shadow.tga" ); //x += width + 5;
|
||||
|
||||
x = startX;
|
||||
|
||||
// draw awards
|
||||
if ( (ch & MF_KILLS) || forceDrawRewards) {
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/kills.tga" );
|
||||
}
|
||||
x += width + spacing;
|
||||
if ( (ch & MF_SECRETS) || forceDrawRewards) {
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/secrets.tga" );
|
||||
}
|
||||
x += width + spacing;
|
||||
if ( (ch & MF_TREASURE) || forceDrawRewards) {
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/treasure.tga" );
|
||||
}
|
||||
x += width + spacing;
|
||||
if ( (ch & MF_TIME) || forceDrawRewards) {
|
||||
iphoneDrawPic( x,y+23, width, height, "iphone/partime.tga" );
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================
|
||||
// iphoneDrawUserMaps()
|
||||
// This function scans through the custom maps
|
||||
// and displays the ones on screen
|
||||
//==========================================
|
||||
int iphoneDrawUserMaps(int Yoffset, int height, int spacing, int skillValue)
|
||||
{
|
||||
int numMaps = 0;
|
||||
|
||||
DIR *dp;
|
||||
struct dirent *ep;
|
||||
char mapBuffer[1024];
|
||||
|
||||
int length = strlen(iphoneDocDirectory);
|
||||
strcpy(mapBuffer, iphoneDocDirectory);
|
||||
strcpy(mapBuffer + length, "/usermaps/");
|
||||
|
||||
dp = opendir (mapBuffer);
|
||||
|
||||
if (dp != NULL)
|
||||
{
|
||||
int y = Yoffset;
|
||||
if (g_version->value != SPEAROFDESTINY) //make space for the purchase SOD button
|
||||
y += height + spacing + spacing;
|
||||
|
||||
//draw the custom map spacing
|
||||
y += height + spacing;
|
||||
iphoneDrawPic( 0, y, 480-80, height, "iphone/button_epSOD.tga");
|
||||
|
||||
|
||||
while (ep = readdir (dp))
|
||||
{
|
||||
++numMaps;
|
||||
if (numMaps < 3) //skip the '.' and '..'
|
||||
continue;
|
||||
|
||||
y += height + spacing;
|
||||
Com_Printf("value y: %i\n", y);
|
||||
|
||||
//TODO: draw the names!
|
||||
if ( y >= -height && y < 320 )
|
||||
{
|
||||
|
||||
//draw maps and touch
|
||||
int alpha = 128;
|
||||
//colour4_t colorSecret = { 80, 0, 0, alpha };
|
||||
colour4_t colorNoTry = { 0, 0, 0, alpha };
|
||||
|
||||
if ( iphoneDrawPicWithTouchAndColor( 0, y, 480-80, height, "iphone/menu_bar.tga", colorNoTry) && dragVelocity == 0 )//&& isSecretAvailable )
|
||||
{
|
||||
//reset the player to new
|
||||
PL_NewGame( &Player );
|
||||
|
||||
//set episode and map numbers and load map
|
||||
int e = 9; //9 will be used to show a custom map
|
||||
Cvar_SetValue( episode->name, e );
|
||||
iphonePreloadBeforePlay(); //This prevents crashes when loading SOD maps
|
||||
iphoneStartUserMap( e, numMaps - 3, skillValue, ep->d_name );
|
||||
}
|
||||
|
||||
iphoneDrawText( 100, y + 16, 16, 16, ep->d_name );
|
||||
//iphoneCenterText( 160, y + 16, ep->d_name );
|
||||
|
||||
//draw the rewards
|
||||
iphoneDrawRewards(numMaps-2+90, skillValue, 0, y);
|
||||
}
|
||||
}
|
||||
closedir (dp);
|
||||
|
||||
--numMaps;
|
||||
--numMaps;
|
||||
}
|
||||
|
||||
Com_Printf("numMaps: %i\n", numMaps);
|
||||
|
||||
return numMaps;
|
||||
}
|
||||
|
||||
//==========================================
|
||||
// iphoneSelectMapMenu()
|
||||
// A doom classic style map selector
|
||||
//==========================================
|
||||
void iphoneSelectMapMenu()
|
||||
{
|
||||
int s; //skill
|
||||
char str[64];
|
||||
|
||||
// highlight the current skill selection
|
||||
int skillValue = (int)skill->value;
|
||||
if (skillValue < 0)
|
||||
skillValue = 0;
|
||||
if (skillValue > 3)
|
||||
skillValue = 3;
|
||||
|
||||
int skillSides = 80;
|
||||
|
||||
int e = 0; //episode
|
||||
|
||||
int m, map; //mission/map
|
||||
int height = 48;
|
||||
int spacing = 10;
|
||||
int y = 0;
|
||||
|
||||
char strMission[80];
|
||||
strMission[79] = '\0';
|
||||
|
||||
#ifdef LITE
|
||||
int numMaps = 3;//5;
|
||||
#else
|
||||
int numMaps = 60;
|
||||
if (g_version->value == SPEAROFDESTINY)
|
||||
numMaps = 60 + 21;
|
||||
#endif
|
||||
|
||||
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
||||
|
||||
//check for BackButton touches
|
||||
if ( BackButton() ) {
|
||||
menuState = IPM_MAIN;
|
||||
return;
|
||||
}
|
||||
|
||||
//we want to use the menu selector bar
|
||||
my_snprintf( str, sizeof( str ), "iphone/menu_bar.tga" );
|
||||
|
||||
//iterate through the maps... drawing only the visible maps
|
||||
for (m = 0; m < numMaps; m++)
|
||||
{
|
||||
|
||||
//Draws the spacing between each episode
|
||||
e = m/10;
|
||||
if (e < 6)
|
||||
{
|
||||
y = dragPosition + ((height + spacing) * e*11);// + ((height + spacing) * (e+1));
|
||||
if ( y >= -height && y < 320 )
|
||||
{
|
||||
my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 );
|
||||
iphoneDrawPic( 0, y, 480-80, height, str);
|
||||
}
|
||||
|
||||
y = dragPosition + ((height + spacing) * m) + ((height + spacing) * (e+1));
|
||||
}
|
||||
else
|
||||
{
|
||||
y = dragPosition + ((height + spacing) * 6*11);
|
||||
if ( y >= -height && y < 320 )
|
||||
{
|
||||
my_snprintf( str, sizeof( str ), "iphone/button_epSOD.tga");
|
||||
iphoneDrawPic( 0, y, 480-80, height, str);
|
||||
}
|
||||
y = dragPosition + ((height + spacing) * m) + ((height + spacing) * 7);
|
||||
}
|
||||
|
||||
//we want to use the menu selector bar
|
||||
my_snprintf( str, sizeof( str ), "iphone/menu_bar.tga" );
|
||||
|
||||
//only draw the maps that are currently viewable
|
||||
if ( y >= -height && y < 320 )
|
||||
{
|
||||
e = m/10;
|
||||
map = m%10;
|
||||
|
||||
//color maps
|
||||
int ch = currentMap.mapFlags[skillValue][m];
|
||||
|
||||
int alpha = 128;
|
||||
colour4_t colorSecret = { 80, 0, 0, alpha };
|
||||
colour4_t colorNoTry = { 0, 0, 0, alpha };
|
||||
colour4_t colorTried = { 80, 80, 0, alpha };
|
||||
colour4_t colorCompleted = { 0, 80, 0, alpha };
|
||||
colour4_t colorBlink = { 80, 80, 80, alpha };
|
||||
|
||||
unsigned char *color = colorNoTry;
|
||||
bool isSecretAvailable = true;
|
||||
|
||||
if ( map == 9 && !( ch & MF_TRIED ) && e < 6) //if it's the 9th and not SOD
|
||||
{
|
||||
color = colorSecret;
|
||||
isSecretAvailable = false;
|
||||
}
|
||||
else if ( (m == 79 || m == 78) && !(ch & MF_TRIED) ) //if it's the secret SOD levels
|
||||
{
|
||||
color = colorSecret;
|
||||
isSecretAvailable = false;
|
||||
} else if ( ch & MF_COMPLETED ) {
|
||||
color = colorCompleted;
|
||||
} else if ( ch & MF_TRIED ) {
|
||||
color = colorTried;
|
||||
} else {
|
||||
color = colorNoTry;
|
||||
}
|
||||
|
||||
//blink the level you're currently on
|
||||
if ( ( iphoneFrameNum & 8 ) && map == currentMap.map && e == currentMap.episode )
|
||||
color = colorBlink;
|
||||
|
||||
//draw maps and touch
|
||||
if ( iphoneDrawPicWithTouchAndColor( 0, y, 480-80, height, str, color) && dragVelocity == 0 && isSecretAvailable )
|
||||
{
|
||||
//reset the player to new
|
||||
PL_NewGame( &Player );
|
||||
|
||||
//set episode and map numbers and load map
|
||||
Cvar_SetValue( episode->name, e );
|
||||
iphonePreloadBeforePlay(); //This prevents crashes when loading SOD maps
|
||||
iphoneStartMap( e, map, skillValue );
|
||||
}
|
||||
|
||||
//draw the rewards
|
||||
iphoneDrawRewards(m, skillValue, 0, y);
|
||||
|
||||
//draw the episode and map over the selection bar
|
||||
my_snprintf( strMission, sizeof( strMission ), "%s", levelNames[m] );
|
||||
iphoneDrawText( 100, y + 16, 16, 16, strMission );
|
||||
// iphoneCenterText( 160, y + 16, strMission );
|
||||
}
|
||||
}
|
||||
|
||||
int numUserMaps = 0;
|
||||
|
||||
#ifdef LITE
|
||||
//buy more episodes button
|
||||
GetMoreLevels( 0, dragPosition + (height + spacing) * (m+1) );
|
||||
#else
|
||||
#if 0
|
||||
//buy more episodes button
|
||||
if (g_version->value != SPEAROFDESTINY)
|
||||
GetSpearOfDestiny( 0, dragPosition + (height + spacing) * (m+6) );
|
||||
#endif
|
||||
//TODO: Draw user maps
|
||||
numUserMaps = iphoneDrawUserMaps(y, height, spacing, skillValue);
|
||||
#endif
|
||||
|
||||
//Update the scrolling drags
|
||||
iphoneUpdateDrags(numMaps, skillSides, height, spacing, numUserMaps);
|
||||
|
||||
|
||||
//Draw/choose the skills on the right side of the screen
|
||||
for ( s = 0 ; s < 4 ; s++ )
|
||||
{
|
||||
my_snprintf( str, sizeof( str ), "iphone/button_skill%i.tga", s+1 );
|
||||
|
||||
if ( s != (int)skill->value ) {
|
||||
pfglColor3f( 0.5, 0.5, 0.5 );
|
||||
}
|
||||
if ( iphoneDrawPicWithTouch( 480 - skillSides, skillSides*s, skillSides, skillSides, str ) ) {
|
||||
Cvar_SetValue( skill->name, s );
|
||||
skillValue = s;
|
||||
break;
|
||||
}
|
||||
pfglColor3f( 1, 1, 1 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Draw a bar that covers empty space
|
||||
iphoneDrawPic(0, 0, 480-80, 32, "iphone/menu_bar.tga");
|
||||
|
||||
//levels header
|
||||
iphoneDrawPic(240-64, 0, 128, 32, "iphone/header_levels.tga");
|
||||
|
||||
BackButton(); //this is kinda cheap...
|
||||
//we want the back button to render on top
|
||||
//but we also want it to check for touches before the maps
|
||||
//so we call this function twice
|
||||
//(at the beginning for touches; the end for rendering)
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -23,7 +23,7 @@
|
|||
//#define EPISODE_ONE_ONLY
|
||||
|
||||
// this is the version number displayed on the menu screen
|
||||
#define WOLF_IPHONE_VERSION 1.1
|
||||
#define WOLF_IPHONE_VERSION 1.2//1.1
|
||||
|
||||
extern viddef_t viddef;
|
||||
|
||||
|
@ -33,13 +33,19 @@ typedef enum menuState {
|
|||
IPM_SKILL,
|
||||
IPM_EPISODE,
|
||||
IPM_MAPS,
|
||||
IPM_MAPSELECTOR, //gsh
|
||||
IPM_CONTROLS,
|
||||
IPM_INTERMISSION,
|
||||
IPM_VICTORY,
|
||||
IPM_AUTOMAP,
|
||||
IPM_STATS,
|
||||
IPM_HUDEDIT
|
||||
|
||||
IPM_HUDEDIT,
|
||||
IPM_DOWNLOADPROGRESS, //gsh
|
||||
IPM_STOREKIT, //gsh
|
||||
// IPM_LOADING, //gsh
|
||||
IPM_TRIVIA, //gsh
|
||||
IPM_MORE, //gsh
|
||||
IPM_DOWNLOADINSTRUCTIONS, //gsh
|
||||
} menuState_t;
|
||||
|
||||
extern menuState_t menuState;
|
||||
|
@ -51,7 +57,7 @@ void iphoneDrawMenus();
|
|||
#define SAVEGAME_VERSION 108
|
||||
|
||||
#define MAX_SKILLS 4
|
||||
#define MAX_MAPS 60
|
||||
#define MAX_MAPS 81 //60 changed by gsh to allow for SOD levels
|
||||
|
||||
#define MF_TRIED 1
|
||||
#define MF_COMPLETED 2
|
||||
|
@ -69,15 +75,25 @@ typedef struct {
|
|||
int mapFlags[MAX_SKILLS][MAX_MAPS];
|
||||
} currentMap_t;
|
||||
|
||||
//gsh
|
||||
typedef struct {
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
} rect_t;
|
||||
rect_t RectMake(int x, int y, int width, int height);
|
||||
|
||||
extern currentMap_t currentMap;
|
||||
|
||||
void iphoneStartMap( int episodeNum, int mapNum, int skillLevel );
|
||||
void iphoneStartUserMap( int episodeNum, int mapNum, int skillLevel, char *mapName ); //gsh
|
||||
|
||||
extern char iphoneDocDirectory[1024];
|
||||
extern char iphoneAppDirectory[1024];
|
||||
|
||||
extern texture_t *numberPics[10];
|
||||
#define NUM_MUGSHOTS 23
|
||||
#define NUM_MUGSHOTS 26//23
|
||||
extern char *mugshotnames[ NUM_MUGSHOTS ];
|
||||
|
||||
extern vec3_t vnull;
|
||||
|
@ -100,6 +116,13 @@ extern cvar_t *tiltMove;
|
|||
extern cvar_t *tiltDeadBand;
|
||||
extern cvar_t *tiltAverages;
|
||||
extern cvar_t *tiltFire;
|
||||
#ifdef VOLUMEHACK
|
||||
extern cvar_t *volumeFireUp; //gsh
|
||||
extern cvar_t *volumeFireDown; //gsh
|
||||
extern cvar_t *volumeFireUpSetting; //gsh
|
||||
extern cvar_t *volumeFireDownSetting; //gsh
|
||||
#endif
|
||||
extern cvar_t *hudAlpha; //gsh
|
||||
extern cvar_t *music;
|
||||
extern cvar_t *showTilt;
|
||||
extern cvar_t *showTime;
|
||||
|
@ -115,6 +138,7 @@ extern cvar_t *autoFire;
|
|||
// the native iPhone code should set the following each frame:
|
||||
extern int numTouches;
|
||||
extern int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top
|
||||
extern int isTouchMoving; //gsh
|
||||
extern float tilt; // -1.0 to 1.0
|
||||
extern float tiltPitch;
|
||||
|
||||
|
@ -135,6 +159,14 @@ void LoadWallTexture( int wallPicNum );
|
|||
int TouchDown( int x, int y, int w, int h );
|
||||
int TouchReleased( int x, int y, int w, int h );
|
||||
int iphoneCenterText( int x, int y, const char *str );
|
||||
void iphoneCenterTextWithColor( int x, int y, const char *str, colour4_t color ); //gsh
|
||||
int iphoneDrawText( int x, int y, int width, int height, const char *str ); //gsh
|
||||
int iphoneDrawArialText( int x, int y, float scale, const char *str ); //gsh
|
||||
int iphoneCenterArialText( int x, int y, float scale, const char *str ); //gsh
|
||||
int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ); //gsh
|
||||
void iphoneDrawTextWithColor( rect_t rect, const char *str, float colors[4] ); //gsh
|
||||
void iphoneDrawMapName( rect_t rect, const char *str ); //gsh
|
||||
int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ); //gsh
|
||||
void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight );
|
||||
void iphoneDrawPic( int x, int y, int w, int h, const char *pic );
|
||||
int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic );
|
||||
|
@ -166,6 +198,12 @@ typedef struct {
|
|||
int width, height;
|
||||
int glTexNum;
|
||||
int hudFlags;
|
||||
int drawWidth, drawHeight; //from here down (in the struct) is from doom iphone... gsh
|
||||
int touchWidth, touchHeight;
|
||||
texture_t *texture;
|
||||
bool drawAsLimit;
|
||||
float touchState;
|
||||
//struct touch_s *touch;
|
||||
} hudPic_t;
|
||||
|
||||
//#define ALLOW_MAP_VIEW_HUD
|
||||
|
@ -188,6 +226,7 @@ extern hud_t huds;
|
|||
void HudSetForScheme( int schemeNum );
|
||||
void HudSetTexnums();
|
||||
void HudEditFrame();
|
||||
void iphoneHudEditFrame();
|
||||
|
||||
|
||||
|
||||
|
@ -199,6 +238,7 @@ void iphoneStartDamageFlash( int points );
|
|||
void iphoneSetAttackDirection( int dir );
|
||||
void iphoneStartIntermission( int framesFromNow );
|
||||
void iphoneSetNotifyText( const char *str, ... );
|
||||
void iphoneSetLevelNotifyText(); //gsh
|
||||
|
||||
//---------------------------------------
|
||||
// interfaces to Objective-C land
|
||||
|
|
1409
wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3
Normal file
1409
wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3
Normal file
File diff suppressed because it is too large
Load diff
578
wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser
Normal file
578
wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser
Normal file
|
@ -0,0 +1,578 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
1D6058900D05DD3D006BFB54 /* wolf3d */ = {
|
||||
activeExec = 0;
|
||||
executables = (
|
||||
ED0A8CE41069A9CF001E0547 /* wolf3d */,
|
||||
);
|
||||
};
|
||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||
activeBuildConfigurationName = Release;
|
||||
activeExecutable = ED0A8CE41069A9CF001E0547 /* wolf3d */;
|
||||
activeSDKPreference = iphonesimulator2.0;
|
||||
activeTarget = 1D6058900D05DD3D006BFB54 /* wolf3d */;
|
||||
addToTargets = (
|
||||
1D6058900D05DD3D006BFB54 /* wolf3d */,
|
||||
);
|
||||
codeSenseManager = ED0A8CFA1069A9F5001E0547 /* Code sense */;
|
||||
executables = (
|
||||
ED0A8CE41069A9CF001E0547 /* wolf3d */,
|
||||
);
|
||||
perUserDictionary = {
|
||||
PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
|
||||
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
|
||||
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
|
||||
PBXFileTableDataSourceColumnWidthsKey = (
|
||||
20,
|
||||
563,
|
||||
20,
|
||||
48,
|
||||
43,
|
||||
43,
|
||||
20,
|
||||
);
|
||||
PBXFileTableDataSourceColumnsKey = (
|
||||
PBXFileDataSource_FiletypeID,
|
||||
PBXFileDataSource_Filename_ColumnID,
|
||||
PBXFileDataSource_Built_ColumnID,
|
||||
PBXFileDataSource_ObjectSize_ColumnID,
|
||||
PBXFileDataSource_Errors_ColumnID,
|
||||
PBXFileDataSource_Warnings_ColumnID,
|
||||
PBXFileDataSource_Target_ColumnID,
|
||||
);
|
||||
};
|
||||
PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
|
||||
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
|
||||
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
|
||||
PBXFileTableDataSourceColumnWidthsKey = (
|
||||
20,
|
||||
523,
|
||||
60,
|
||||
20,
|
||||
48,
|
||||
43,
|
||||
43,
|
||||
);
|
||||
PBXFileTableDataSourceColumnsKey = (
|
||||
PBXFileDataSource_FiletypeID,
|
||||
PBXFileDataSource_Filename_ColumnID,
|
||||
PBXTargetDataSource_PrimaryAttribute,
|
||||
PBXFileDataSource_Built_ColumnID,
|
||||
PBXFileDataSource_ObjectSize_ColumnID,
|
||||
PBXFileDataSource_Errors_ColumnID,
|
||||
PBXFileDataSource_Warnings_ColumnID,
|
||||
);
|
||||
};
|
||||
PBXPerProjectTemplateStateSaveDate = 280108689;
|
||||
PBXWorkspaceStateSaveDate = 280108689;
|
||||
};
|
||||
perUserProjectItems = {
|
||||
ED0653B61087719F00E5450B /* PBXTextBookmark */ = ED0653B61087719F00E5450B /* PBXTextBookmark */;
|
||||
ED0653B81087719F00E5450B /* PBXTextBookmark */ = ED0653B81087719F00E5450B /* PBXTextBookmark */;
|
||||
ED2754531085141B009C891E /* PBXTextBookmark */ = ED2754531085141B009C891E /* PBXTextBookmark */;
|
||||
ED2754551085141B009C891E /* PlistBookmark */ = ED2754551085141B009C891E /* PlistBookmark */;
|
||||
ED2754561085141B009C891E /* PBXTextBookmark */ = ED2754561085141B009C891E /* PBXTextBookmark */;
|
||||
ED2E5C05106C886700F57B9D /* PBXTextBookmark */ = ED2E5C05106C886700F57B9D /* PBXTextBookmark */;
|
||||
ED2E5C06106C886700F57B9D /* PBXTextBookmark */ = ED2E5C06106C886700F57B9D /* PBXTextBookmark */;
|
||||
ED2E5C0A106C886700F57B9D /* PBXTextBookmark */ = ED2E5C0A106C886700F57B9D /* PBXTextBookmark */;
|
||||
ED2E5C0B106C886700F57B9D /* PBXTextBookmark */ = ED2E5C0B106C886700F57B9D /* PBXTextBookmark */;
|
||||
ED3703CD106C20620059C5F8 /* PlistBookmark */ = ED3703CD106C20620059C5F8 /* PlistBookmark */;
|
||||
ED45402110B21F0900DCFA32 /* PBXTextBookmark */ = ED45402110B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402210B21F0900DCFA32 /* PBXTextBookmark */ = ED45402210B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402310B21F0900DCFA32 /* PBXTextBookmark */ = ED45402310B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402410B21F0900DCFA32 /* PBXTextBookmark */ = ED45402410B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402510B21F0900DCFA32 /* PBXTextBookmark */ = ED45402510B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402610B21F0900DCFA32 /* PBXTextBookmark */ = ED45402610B21F0900DCFA32 /* PBXTextBookmark */;
|
||||
ED45402710B21F0900DCFA32 /* PlistBookmark */ = ED45402710B21F0900DCFA32 /* PlistBookmark */;
|
||||
ED4AC98010742365000706D8 /* PBXTextBookmark */ = ED4AC98010742365000706D8 /* PBXTextBookmark */;
|
||||
ED4AC98210742365000706D8 /* PBXTextBookmark */ = ED4AC98210742365000706D8 /* PBXTextBookmark */;
|
||||
ED4AC9AB10743318000706D8 /* PBXTextBookmark */ = ED4AC9AB10743318000706D8 /* PBXTextBookmark */;
|
||||
ED4AC9AC10743318000706D8 /* PBXTextBookmark */ = ED4AC9AC10743318000706D8 /* PBXTextBookmark */;
|
||||
ED845AB1109F5B3500F673AC /* PBXTextBookmark */ = ED845AB1109F5B3500F673AC /* PBXTextBookmark */;
|
||||
ED845AB2109F5B3500F673AC /* PlistBookmark */ = ED845AB2109F5B3500F673AC /* PlistBookmark */;
|
||||
EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */ = EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */;
|
||||
EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */;
|
||||
EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */;
|
||||
EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */;
|
||||
EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */;
|
||||
EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */;
|
||||
};
|
||||
sourceControlManager = ED0A8CF91069A9F5001E0547 /* Source Control */;
|
||||
userBuildSettings = {
|
||||
};
|
||||
};
|
||||
43AF6B940F996DA200777569 /* iphone_sys.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {852, 1050}}";
|
||||
sepNavSelRange = "{1419, 24}";
|
||||
sepNavVisRange = "{771, 1684}";
|
||||
};
|
||||
};
|
||||
43CF03090F56D5C200E4A23D /* iphone_loop.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavFolds = "{\n c = (\n {\n l = \"int y\";\n r = \"{41674, 9}\";\n s = 1;\n },\n {\n l = \"int width\";\n r = \"{41685, 13}\";\n s = 1;\n },\n {\n l = \"int height\";\n r = \"{41700, 14}\";\n s = 1;\n },\n {\n l = \"const char * str\";\n r = \"{41716, 20}\";\n s = 1;\n }\n );\n r = \"{0, 41792}\";\n s = 0;\n}";
|
||||
sepNavIntBoundsRect = "{{0, 0}, {1061, 24388}}";
|
||||
sepNavSelRange = "{27221, 8}";
|
||||
sepNavVisRange = "{26941, 622}";
|
||||
};
|
||||
};
|
||||
43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 5418}}";
|
||||
sepNavSelRange = "{1413, 4}";
|
||||
sepNavVisRange = "{970, 956}";
|
||||
};
|
||||
};
|
||||
7229CC270F6B3222004123C5 /* wolf_actors.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 6398}}";
|
||||
sepNavSelRange = "{84, 0}";
|
||||
sepNavVisRange = "{0, 1418}";
|
||||
};
|
||||
};
|
||||
7229CC8E0F6B3363004123C5 /* wolfiphone.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 1260}}";
|
||||
sepNavSelRange = "{1906, 27}";
|
||||
sepNavVisRange = "{812, 1122}";
|
||||
};
|
||||
};
|
||||
7229CE460F6C89F8004123C5 /* EAGLView.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {786, 6650}}";
|
||||
sepNavSelRange = "{0, 0}";
|
||||
sepNavVisRange = "{10594, 1878}";
|
||||
};
|
||||
};
|
||||
7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 654}}";
|
||||
sepNavSelRange = "{0, 0}";
|
||||
sepNavVisRange = "{0, 1205}";
|
||||
};
|
||||
};
|
||||
7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {1074, 5012}}";
|
||||
sepNavSelRange = "{3930, 0}";
|
||||
sepNavVisRange = "{5119, 1271}";
|
||||
};
|
||||
};
|
||||
72935B1E0F6B2D9D0085DD28 /* arch.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 3808}}";
|
||||
sepNavSelRange = "{2579, 0}";
|
||||
sepNavVisRange = "{2465, 1040}";
|
||||
};
|
||||
};
|
||||
72935B630F6B2D9D0085DD28 /* tga.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 10822}}";
|
||||
sepNavSelRange = "{1562, 2}";
|
||||
sepNavVisRange = "{1162, 856}";
|
||||
};
|
||||
};
|
||||
72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 3850}}";
|
||||
sepNavSelRange = "{1009, 0}";
|
||||
sepNavVisRange = "{0, 1316}";
|
||||
};
|
||||
};
|
||||
72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {900, 56714}}";
|
||||
sepNavSelRange = "{66944, 0}";
|
||||
sepNavVisRange = "{62588, 1640}";
|
||||
};
|
||||
};
|
||||
ED0653B61087719F00E5450B /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */;
|
||||
name = "iphone_sys.m: 40";
|
||||
rLen = 24;
|
||||
rLoc = 1419;
|
||||
rType = 0;
|
||||
vrLen = 1684;
|
||||
vrLoc = 771;
|
||||
};
|
||||
ED0653B81087719F00E5450B /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */;
|
||||
name = "iphone_sys.m: 40";
|
||||
rLen = 24;
|
||||
rLoc = 1419;
|
||||
rType = 0;
|
||||
vrLen = 1684;
|
||||
vrLoc = 771;
|
||||
};
|
||||
ED0A8CE41069A9CF001E0547 /* wolf3d */ = {
|
||||
isa = PBXExecutable;
|
||||
activeArgIndices = (
|
||||
);
|
||||
argumentStrings = (
|
||||
);
|
||||
autoAttachOnCrash = 1;
|
||||
breakpointsEnabled = 0;
|
||||
configStateDict = {
|
||||
};
|
||||
customDataFormattersEnabled = 1;
|
||||
debuggerPlugin = GDBDebugging;
|
||||
disassemblyDisplayState = 0;
|
||||
dylibVariantSuffix = "";
|
||||
enableDebugStr = 1;
|
||||
environmentEntries = (
|
||||
);
|
||||
executableSystemSymbolLevel = 0;
|
||||
executableUserSymbolLevel = 0;
|
||||
libgmallocEnabled = 0;
|
||||
name = wolf3d;
|
||||
savedGlobals = {
|
||||
};
|
||||
sourceDirectories = (
|
||||
);
|
||||
variableFormatDictionary = {
|
||||
};
|
||||
};
|
||||
ED0A8CF91069A9F5001E0547 /* Source Control */ = {
|
||||
isa = PBXSourceControlManager;
|
||||
fallbackIsa = XCSourceControlManager;
|
||||
isSCMEnabled = 0;
|
||||
scmConfiguration = {
|
||||
};
|
||||
};
|
||||
ED0A8CFA1069A9F5001E0547 /* Code sense */ = {
|
||||
isa = PBXCodeSenseManager;
|
||||
indexTemplatePath = "";
|
||||
};
|
||||
ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 7434}}";
|
||||
sepNavSelRange = "{1756, 0}";
|
||||
sepNavVisRange = "{1108, 1549}";
|
||||
};
|
||||
};
|
||||
ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {948, 6706}}";
|
||||
sepNavSelRange = "{7865, 0}";
|
||||
sepNavVisRange = "{1577, 1229}";
|
||||
};
|
||||
};
|
||||
ED0A8D101069ACA8001E0547 /* iphone_store.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 654}}";
|
||||
sepNavSelRange = "{0, 0}";
|
||||
sepNavVisRange = "{0, 1253}";
|
||||
};
|
||||
};
|
||||
ED0A8D111069ACA8001E0547 /* iphone_store.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {741, 5964}}";
|
||||
sepNavSelRange = "{673, 17}";
|
||||
sepNavVisRange = "{0, 1394}";
|
||||
};
|
||||
};
|
||||
ED2754531085141B009C891E /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */;
|
||||
name = "EAGLView.m: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1878;
|
||||
vrLoc = 10594;
|
||||
};
|
||||
ED2754551085141B009C891E /* PlistBookmark */ = {
|
||||
isa = PlistBookmark;
|
||||
fRef = 8D1107310486CEB800E47090 /* Info.plist */;
|
||||
fallbackIsa = PBXBookmark;
|
||||
isK = 0;
|
||||
kPath = (
|
||||
UIPrerenderedIcon,
|
||||
);
|
||||
name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist;
|
||||
rLen = 0;
|
||||
rLoc = 2147483647;
|
||||
};
|
||||
ED2754561085141B009C891E /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */;
|
||||
name = "EAGLView.m: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1878;
|
||||
vrLoc = 10594;
|
||||
};
|
||||
ED2E5C05106C886700F57B9D /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */;
|
||||
name = "iphone_downloadSOD.m: 61";
|
||||
rLen = 0;
|
||||
rLoc = 1756;
|
||||
rType = 0;
|
||||
vrLen = 1549;
|
||||
vrLoc = 1108;
|
||||
};
|
||||
ED2E5C06106C886700F57B9D /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED2E5C07106C886700F57B9D /* OpenTGA.c */;
|
||||
name = "OpenTGA.c: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 722;
|
||||
vrLoc = 12240;
|
||||
};
|
||||
ED2E5C07106C886700F57B9D /* OpenTGA.c */ = {
|
||||
isa = PBXFileReference;
|
||||
lastKnownFileType = sourcecode.c.c;
|
||||
name = OpenTGA.c;
|
||||
path = /Users/greghodges/Desktop/MyTGAConverter/OpenTGA.c;
|
||||
sourceTree = "<absolute>";
|
||||
};
|
||||
ED2E5C0A106C886700F57B9D /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */;
|
||||
name = "iphone_downloadSOD.m: 61";
|
||||
rLen = 0;
|
||||
rLoc = 1756;
|
||||
rType = 0;
|
||||
vrLen = 1549;
|
||||
vrLoc = 1108;
|
||||
};
|
||||
ED2E5C0B106C886700F57B9D /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED2E5C0C106C886700F57B9D /* OpenTGA.c */;
|
||||
name = "OpenTGA.c: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 722;
|
||||
vrLoc = 12240;
|
||||
};
|
||||
ED2E5C0C106C886700F57B9D /* OpenTGA.c */ = {
|
||||
isa = PBXFileReference;
|
||||
lastKnownFileType = sourcecode.c.c;
|
||||
name = OpenTGA.c;
|
||||
path = /Users/greghodges/Desktop/MyTGAConverter/OpenTGA.c;
|
||||
sourceTree = "<absolute>";
|
||||
};
|
||||
ED3703CD106C20620059C5F8 /* PlistBookmark */ = {
|
||||
isa = PlistBookmark;
|
||||
fRef = ED3703CE106C20620059C5F8;
|
||||
fallbackIsa = PBXBookmark;
|
||||
isK = 0;
|
||||
kPath = (
|
||||
);
|
||||
rLen = 0;
|
||||
rLoc = 2147483647;
|
||||
};
|
||||
ED3703CE106C20620059C5F8 = {
|
||||
isa = PBXFileReference;
|
||||
lastKnownFileType = folder;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ED45402110B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */;
|
||||
name = "wolf_actors.c: 5";
|
||||
rLen = 0;
|
||||
rLoc = 84;
|
||||
rType = 0;
|
||||
vrLen = 1418;
|
||||
vrLoc = 0;
|
||||
};
|
||||
ED45402210B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */;
|
||||
name = "wolf3dAppDelegate.m: 124";
|
||||
rLen = 0;
|
||||
rLoc = 3930;
|
||||
rType = 0;
|
||||
vrLen = 1271;
|
||||
vrLoc = 5119;
|
||||
};
|
||||
ED45402310B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */;
|
||||
name = "wolf3dAppDelegate.h: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1205;
|
||||
vrLoc = 0;
|
||||
};
|
||||
ED45402410B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */;
|
||||
name = "wolf_actors.c: 5";
|
||||
rLen = 0;
|
||||
rLoc = 84;
|
||||
rType = 0;
|
||||
vrLen = 1418;
|
||||
vrLoc = 0;
|
||||
};
|
||||
ED45402510B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */;
|
||||
name = "wolf3dAppDelegate.m: 124";
|
||||
rLen = 0;
|
||||
rLoc = 3930;
|
||||
rType = 0;
|
||||
vrLen = 1271;
|
||||
vrLoc = 5119;
|
||||
};
|
||||
ED45402610B21F0900DCFA32 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */;
|
||||
name = "wolf3dAppDelegate.h: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1205;
|
||||
vrLoc = 0;
|
||||
};
|
||||
ED45402710B21F0900DCFA32 /* PlistBookmark */ = {
|
||||
isa = PlistBookmark;
|
||||
fRef = 8D1107310486CEB800E47090 /* Info.plist */;
|
||||
fallbackIsa = PBXBookmark;
|
||||
isK = 0;
|
||||
kPath = (
|
||||
UIPrerenderedIcon,
|
||||
);
|
||||
name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist;
|
||||
rLen = 0;
|
||||
rLoc = 2147483647;
|
||||
};
|
||||
ED4AC98010742365000706D8 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */;
|
||||
name = "ConvertTGA.c: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1082;
|
||||
vrLoc = 18055;
|
||||
};
|
||||
ED4AC98210742365000706D8 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */;
|
||||
name = "ConvertTGA.c: 1";
|
||||
rLen = 0;
|
||||
rLoc = 0;
|
||||
rType = 0;
|
||||
vrLen = 1082;
|
||||
vrLoc = 18055;
|
||||
};
|
||||
ED4AC9AB10743318000706D8 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */;
|
||||
name = "wolf3dAppDelegate.m: 124";
|
||||
rLen = 0;
|
||||
rLoc = 3930;
|
||||
rType = 0;
|
||||
vrLen = 1417;
|
||||
vrLoc = 3274;
|
||||
};
|
||||
ED4AC9AC10743318000706D8 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */;
|
||||
name = "iphone_menus.c: 1111";
|
||||
rLen = 13;
|
||||
rLoc = 31543;
|
||||
rType = 0;
|
||||
vrLen = 2083;
|
||||
vrLoc = 30775;
|
||||
};
|
||||
ED845AB1109F5B3500F673AC /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */;
|
||||
name = "iphone_menus.c: 2407";
|
||||
rLen = 0;
|
||||
rLoc = 66944;
|
||||
rType = 0;
|
||||
vrLen = 1640;
|
||||
vrLoc = 62588;
|
||||
};
|
||||
ED845AB2109F5B3500F673AC /* PlistBookmark */ = {
|
||||
isa = PlistBookmark;
|
||||
fRef = 8D1107310486CEB800E47090 /* Info.plist */;
|
||||
fallbackIsa = PBXBookmark;
|
||||
isK = 0;
|
||||
kPath = (
|
||||
UIPrerenderedIcon,
|
||||
);
|
||||
name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist;
|
||||
rLen = 0;
|
||||
rLoc = 2147483647;
|
||||
};
|
||||
EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */;
|
||||
name = "iphone_main.c: 50";
|
||||
rLen = 4;
|
||||
rLoc = 1413;
|
||||
rType = 0;
|
||||
vrLen = 956;
|
||||
vrLoc = 970;
|
||||
};
|
||||
EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */ = {
|
||||
isa = PBXFileReference;
|
||||
lastKnownFileType = sourcecode.c.c;
|
||||
name = ConvertTGA.c;
|
||||
path = /Users/greghodges/Desktop/MyTGAConverter/ConvertTGA.c;
|
||||
sourceTree = "<absolute>";
|
||||
};
|
||||
EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */;
|
||||
name = "iphone_loop.c: 1226";
|
||||
rLen = 0;
|
||||
rLoc = 28766;
|
||||
rType = 0;
|
||||
vrLen = 942;
|
||||
vrLoc = 28216;
|
||||
};
|
||||
EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */;
|
||||
name = "iphone_mapselector.c: 341";
|
||||
rLen = 0;
|
||||
rLoc = 7865;
|
||||
rType = 0;
|
||||
vrLen = 1229;
|
||||
vrLoc = 1577;
|
||||
};
|
||||
EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */;
|
||||
name = "iphone_loop.c: 1226";
|
||||
rLen = 0;
|
||||
rLoc = 28766;
|
||||
rType = 0;
|
||||
vrLen = 942;
|
||||
vrLoc = 28216;
|
||||
};
|
||||
EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */;
|
||||
name = "iphone_main.c: 272";
|
||||
rLen = 0;
|
||||
rLoc = 7878;
|
||||
rType = 0;
|
||||
vrLen = 1550;
|
||||
vrLoc = 7519;
|
||||
};
|
||||
EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */ = {
|
||||
isa = PBXTextBookmark;
|
||||
fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */;
|
||||
name = "iphone_mapselector.c: 341";
|
||||
rLen = 0;
|
||||
rLoc = 7865;
|
||||
rType = 0;
|
||||
vrLen = 1229;
|
||||
vrLoc = 1577;
|
||||
};
|
||||
}
|
|
@ -95,11 +95,17 @@
|
|||
72935BA20F6B2D9D0085DD28 /* zmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B720F6B2D9D0085DD28 /* zmem.c */; };
|
||||
72A7E8F70F5F2063005B83C0 /* iphone_menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; };
|
||||
72B5FF390F7E5C3D00C8A372 /* hud.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B5FF380F7E5C3D00C8A372 /* hud.c */; };
|
||||
ED0A8D121069ACA8001E0547 /* iphone_alerts.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */; };
|
||||
ED0A8D131069ACA8001E0547 /* iphone_downloadSOD.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; };
|
||||
ED0A8D141069ACA8001E0547 /* iphone_downloadUserMap.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */; };
|
||||
ED0A8D151069ACA8001E0547 /* iphone_mapselector.c in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; };
|
||||
ED0A8D161069ACA8001E0547 /* iphone_store.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D111069ACA8001E0547 /* iphone_store.m */; };
|
||||
ED3703B4106C1CD40059C5F8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
1D6058910D05DD3D006BFB54 /* wolf3dlite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wolf3dlite.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1D6058910D05DD3D006BFB54 /* wolf3d.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wolf3d.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
|
||||
28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
|
||||
|
@ -257,6 +263,15 @@
|
|||
72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_menus.c; sourceTree = "<group>"; };
|
||||
72B5FF380F7E5C3D00C8A372 /* hud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hud.c; sourceTree = "<group>"; };
|
||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arialGlyphRects.h; sourceTree = "<group>"; };
|
||||
ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_alerts.h; sourceTree = "<group>"; };
|
||||
ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_alerts.m; sourceTree = "<group>"; };
|
||||
ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_downloadSOD.m; sourceTree = "<group>"; };
|
||||
ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_downloadUserMap.m; sourceTree = "<group>"; };
|
||||
ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_mapselector.c; sourceTree = "<group>"; };
|
||||
ED0A8D101069ACA8001E0547 /* iphone_store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_store.h; sourceTree = "<group>"; };
|
||||
ED0A8D111069ACA8001E0547 /* iphone_store.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_store.m; sourceTree = "<group>"; };
|
||||
ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -271,6 +286,7 @@
|
|||
4333CCE80F5CC23E00AE2B6F /* AudioToolbox.framework in Frameworks */,
|
||||
43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */,
|
||||
720EBBAE0F82E0BB003F989A /* QuartzCore.framework in Frameworks */,
|
||||
ED3703B4106C1CD40059C5F8 /* SystemConfiguration.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -280,7 +296,7 @@
|
|||
19C28FACFE9D520D11CA2CBB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1D6058910D05DD3D006BFB54 /* wolf3dlite.app */,
|
||||
1D6058910D05DD3D006BFB54 /* wolf3d.app */,
|
||||
4364BF3E0F5CB25900F29317 /* dist.plist */,
|
||||
);
|
||||
name = Products;
|
||||
|
@ -301,6 +317,14 @@
|
|||
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */,
|
||||
ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */,
|
||||
ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */,
|
||||
ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */,
|
||||
ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */,
|
||||
ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */,
|
||||
ED0A8D101069ACA8001E0547 /* iphone_store.h */,
|
||||
ED0A8D111069ACA8001E0547 /* iphone_store.m */,
|
||||
72935B180F6B2D630085DD28 /* env */,
|
||||
7229CC5A0F6B324A004123C5 /* tremor */,
|
||||
72935B190F6B2D720085DD28 /* wolf */,
|
||||
|
@ -337,6 +361,7 @@
|
|||
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */,
|
||||
720EBBAD0F82E0BB003F989A /* QuartzCore.framework */,
|
||||
4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */,
|
||||
43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */,
|
||||
|
@ -517,7 +542,7 @@
|
|||
);
|
||||
name = wolf3d;
|
||||
productName = wolf3d;
|
||||
productReference = 1D6058910D05DD3D006BFB54 /* wolf3dlite.app */;
|
||||
productReference = 1D6058910D05DD3D006BFB54 /* wolf3d.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
@ -649,6 +674,11 @@
|
|||
7229CE550F6C8CDE004123C5 /* gles_glue.c in Sources */,
|
||||
72B5FF390F7E5C3D00C8A372 /* hud.c in Sources */,
|
||||
43AF6B950F996DA200777569 /* iphone_sys.m in Sources */,
|
||||
ED0A8D121069ACA8001E0547 /* iphone_alerts.m in Sources */,
|
||||
ED0A8D131069ACA8001E0547 /* iphone_downloadSOD.m in Sources */,
|
||||
ED0A8D141069ACA8001E0547 /* iphone_downloadUserMap.m in Sources */,
|
||||
ED0A8D151069ACA8001E0547 /* iphone_mapselector.c in Sources */,
|
||||
ED0A8D161069ACA8001E0547 /* iphone_store.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -678,7 +708,7 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Cass Everitt";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = wolf3d_Prefix.pch;
|
||||
|
@ -687,7 +717,7 @@
|
|||
INFOPLIST_FILE = Info.plist;
|
||||
PRODUCT_NAME = wolf3d;
|
||||
PROFILE_PREFIX = nu.r3;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "94041F5C-2EDC-4F49-AF97-95ECE6BB398D";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
@ -766,12 +796,13 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack";
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722";
|
||||
SDKROOT = iphoneos2.0;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
|
@ -781,7 +812,7 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Cass Everitt";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = wolf3d_Prefix.pch;
|
||||
|
@ -793,7 +824,7 @@
|
|||
INFOPLIST_FILE = Info.plist;
|
||||
PRODUCT_NAME = wolf3dlite;
|
||||
PROFILE_PREFIX = nu.r3;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "94041F5C-2EDC-4F49-AF97-95ECE6BB398D";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722";
|
||||
};
|
||||
name = ReleaseLite;
|
||||
};
|
||||
|
@ -853,17 +884,51 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack";
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722";
|
||||
SDKROOT = iphoneos2.0;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
ED2751531083BE8C009C891E /* Distribution */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software";
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F";
|
||||
SDKROOT = iphoneos2.0;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
name = Distribution;
|
||||
};
|
||||
ED2751541083BE8C009C891E /* Distribution */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = wolf3d_Prefix.pch;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = IPHONE;
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
PRODUCT_NAME = wolf3d;
|
||||
PROFILE_PREFIX = nu.r3;
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F";
|
||||
};
|
||||
name = Distribution;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
|
@ -876,6 +941,7 @@
|
|||
43AE7CA50F61EC4E00B2F562 /* ReleaseLite */,
|
||||
4364BF490F5CB27300F29317 /* AdHocDist */,
|
||||
431181710F994C5400FF9351 /* AdHocDistLite */,
|
||||
ED2751541083BE8C009C891E /* Distribution */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
|
@ -889,6 +955,7 @@
|
|||
43AE7CA40F61EC4E00B2F562 /* ReleaseLite */,
|
||||
4364BF480F5CB27300F29317 /* AdHocDist */,
|
||||
431181700F994C5400FF9351 /* AdHocDistLite */,
|
||||
ED2751531083BE8C009C891E /* Distribution */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
|
|
|
@ -24,10 +24,12 @@
|
|||
|
||||
@class EAGLView;
|
||||
|
||||
@interface wolf3dAppDelegate : NSObject <UIApplicationDelegate, UIAccelerometerDelegate> {
|
||||
@interface wolf3dAppDelegate : NSObject <UIApplicationDelegate, UIAccelerometerDelegate, UIAlertViewDelegate> {
|
||||
UIWindow *window;
|
||||
EAGLView *glView;
|
||||
int lastAccelUpdateMsec;
|
||||
|
||||
// UIAlertView *alertPurchaseSpear;
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) IBOutlet UIWindow *window;
|
||||
|
|
|
@ -22,6 +22,36 @@
|
|||
#import "EAGLView.h"
|
||||
#import <AudioToolbox/AudioServices.h>
|
||||
#include "../wolfiphone.h"
|
||||
#include <pthread.h>
|
||||
|
||||
//added for downloading SOD content from the internet... added by gsh
|
||||
extern void Com_Printf(const char* fmt, ... );
|
||||
//extern void AppendData(NSData* data);
|
||||
extern void AppendDataToFile(NSData* data);
|
||||
extern void AppendUserDataToFile(NSData* data);
|
||||
//extern void SaveData();
|
||||
|
||||
//used for downloading custom made map
|
||||
extern void FinalizeUserDownload();
|
||||
|
||||
#if SPEARSTOREKIT
|
||||
//was used for storekit
|
||||
extern void FinalizeDownload();
|
||||
extern int IsSpearPurchased();
|
||||
extern int IsSpearInstalled();
|
||||
extern void BeginStoreKit();
|
||||
extern void GetSpear();
|
||||
#endif
|
||||
|
||||
extern void DownloadURLConnection(char *url);
|
||||
|
||||
extern int wasCalledFromDownloadInstructionsMenu;
|
||||
extern void iphoneSet2D();
|
||||
|
||||
|
||||
//extern bool isAlive;
|
||||
|
||||
|
||||
|
||||
@interface UIApplication (Private)
|
||||
|
||||
|
@ -67,11 +97,47 @@ void SysIPhoneVibrate() {
|
|||
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
|
||||
accelerometer.delegate = self;
|
||||
accelerometer.updateInterval = 0.01;
|
||||
|
||||
|
||||
// do all the game startup work
|
||||
iphoneStartup();
|
||||
|
||||
#if SPEARSTOREKIT
|
||||
//check if user downloaded spear but didn't purchase
|
||||
if (IsSpearInstalled() && !IsSpearPurchased())
|
||||
{
|
||||
alertPurchaseSpear = [[UIAlertView alloc] initWithTitle:@""//Title"
|
||||
message:@"You have downloaded and installed Spear of Destiny. Would you like to unlock those levels by purchasing it for $1.99?"
|
||||
delegate:self
|
||||
cancelButtonTitle:@"No"
|
||||
otherButtonTitles:@"Yes", nil];
|
||||
|
||||
[alertPurchaseSpear show];
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
//this is so that we can respond to alertView events (messageboxes)
|
||||
//but this should only respond to the alertPurchaseSpear
|
||||
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
//this is if they clicked yes to going to the map instructions website
|
||||
if (wasCalledFromDownloadInstructionsMenu && buttonIndex == 1) {
|
||||
SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/mapinstructions/" );
|
||||
return;
|
||||
}
|
||||
|
||||
//if they clicked yes to going to the idsoftware website
|
||||
if (buttonIndex == 1)
|
||||
SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/" );
|
||||
|
||||
/*
|
||||
if (alertPurchaseSpear && (alertPurchaseSpear == actionSheet))
|
||||
{
|
||||
if (buttonIndex != actionSheet.cancelButtonIndex)
|
||||
BeginStoreKit();
|
||||
}*/
|
||||
}
|
||||
|
||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||
}
|
||||
|
@ -84,10 +150,70 @@ void SysIPhoneVibrate() {
|
|||
iphoneShutdown();
|
||||
}
|
||||
|
||||
#if 1
|
||||
extern char urlbuffer[1024];
|
||||
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
|
||||
// wolf3d:foo should launch wolf3d now... next, add useful URL parameter encoding
|
||||
|
||||
|
||||
#ifdef LITE
|
||||
iphoneMessageBox("Lite version", "This is a Lite version. You must purchase Wolfenstein3D to get this feature.");
|
||||
return NO;
|
||||
#endif
|
||||
|
||||
if (!url)
|
||||
return NO;
|
||||
|
||||
NSString *str = [url absoluteString]; //in the future we may wish to parse this string
|
||||
//for commands that wolf3d might follow
|
||||
//for now we'll just start the storekit
|
||||
char buffer[1024];
|
||||
|
||||
if(![str getCString:buffer maxLength:1024 encoding:NSUTF8StringEncoding])
|
||||
{
|
||||
iphoneMessageBox("Not Valid", "There were encoding errors. Make sure the link is less than 1023 characters in length.");
|
||||
return NO;
|
||||
}
|
||||
|
||||
//iphoneMessageBox("URL", buffer);
|
||||
/*
|
||||
if (strcmp(buffer, "wolf3d:foo") == 0)
|
||||
GetSpear();
|
||||
*/
|
||||
char *pstr = buffer;//&buffer[strlen(buffer) - 5];
|
||||
pstr += strlen(buffer) - 4;
|
||||
|
||||
if (strcmp(pstr, ".map") != 0)
|
||||
{
|
||||
iphoneMessageBox("Not Valid", "URL is not a valid map. Maps must end in \".map\"");
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
if (strncmp(buffer, "wolf3dp:", 8) == 0)
|
||||
{
|
||||
|
||||
char cURL[1024];
|
||||
char *http = "http:";
|
||||
strcpy(cURL, http);
|
||||
strcpy(cURL + 5, buffer + 8);
|
||||
//strcpy(cURL, "http://gregory.hodges.googlepages.com/SODmm.tgz"); //TODO: delete me
|
||||
Com_Printf("wolf3dp: installing map %s\n", cURL);
|
||||
strcpy(urlbuffer, cURL);
|
||||
//download and install this map
|
||||
//iphoneMessageBox("wolf3d:", "it's a map TODO install");
|
||||
//InstallUserMap();
|
||||
DownloadURLConnection(cURL);
|
||||
}
|
||||
else
|
||||
{
|
||||
iphoneMessageBox("Not Valid", "URL is not a valid map. Identifier must start with \"wolf3dp:\"");
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
|
@ -101,7 +227,7 @@ void SysIPhoneVibrate() {
|
|||
// I have no idea why this seems to happen sometimes...
|
||||
if ( Sys_Milliseconds() - lastAccelUpdateMsec > 1000 ) {
|
||||
static int count;
|
||||
if ( ++count < 100 ) {
|
||||
if ( ++count < 5 ) {
|
||||
printf( "Restarting accelerometer updates.\n" );
|
||||
}
|
||||
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
|
||||
|
@ -121,6 +247,104 @@ void SysIPhoneVibrate() {
|
|||
lastAccelUpdateMsec = Sys_Milliseconds();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
// connection
|
||||
// called by the app when data is received during download
|
||||
// gsh
|
||||
//-------------------------------------------------------------
|
||||
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
|
||||
{
|
||||
// lock the game out temporarily
|
||||
pthread_mutex_t eventMutex;
|
||||
pthread_mutex_lock( &eventMutex );
|
||||
/*
|
||||
//display the network activity indicator
|
||||
UIApplication* app = [UIApplication sharedApplication];
|
||||
app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO
|
||||
app.statusBarHidden = NO;
|
||||
*/
|
||||
// append the new data to file
|
||||
AppendUserDataToFile(data);
|
||||
|
||||
// the game is free to copy the appendedData size now
|
||||
pthread_mutex_unlock( &eventMutex );
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// connectionDidFinishLoading
|
||||
// this is called when the app finishes downloading
|
||||
// the new Spear of Destiny Levels
|
||||
// gsh
|
||||
//------------------------------------------------------------------------
|
||||
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
|
||||
{
|
||||
Com_Printf("connectionDidFinishLoading called\n");
|
||||
/*
|
||||
//no need to display network traffic anymore
|
||||
UIApplication* app = [UIApplication sharedApplication];
|
||||
app.networkActivityIndicatorVisible = NO; // to stop it, set this to NO
|
||||
app.statusBarHidden = YES;
|
||||
*/
|
||||
//release the connection
|
||||
[connection release];
|
||||
|
||||
//uncompress/move files/delete unwanted
|
||||
FinalizeUserDownload();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// connection didFailWithError
|
||||
// if the connection fails during the download then this is called
|
||||
// gsh
|
||||
//------------------------------------------------------------------------
|
||||
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
|
||||
{
|
||||
//let user know that the connection failed
|
||||
iphoneMessageBox("Connection Failed", "Please check your connection and try again later.");
|
||||
|
||||
//return the user to the main menu
|
||||
menuState = IPM_MAIN;
|
||||
/*
|
||||
//no need to display network traffic anymore
|
||||
UIApplication* app = [UIApplication sharedApplication];
|
||||
app.networkActivityIndicatorVisible = NO; // to stop it, set this to NO
|
||||
app.statusBarHidden = YES; */
|
||||
}
|
||||
/*
|
||||
- (void)setDownloadResponse:(NSURLResponse *)aDownloadResponse
|
||||
{
|
||||
[aDownloadResponse retain];
|
||||
[downloadResponse release];
|
||||
downloadResponse = aDownloadResponse;
|
||||
}
|
||||
|
||||
- (void)download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response
|
||||
{
|
||||
// reset the progress, this might be called multiple times
|
||||
bytesReceived=0;
|
||||
|
||||
// retain the response to use later
|
||||
[self setDownloadResponse:response];
|
||||
}
|
||||
|
||||
- (void)download:(NSURLDownload *)download didReceiveDataOfLength:(unsigned)length
|
||||
{
|
||||
long long expectedLength=[[self downloadResponse] expectedContentLength];
|
||||
|
||||
bytesReceived=bytesReceived+length;
|
||||
|
||||
if (expectedLength != NSURLResponseUnknownLength) {
|
||||
// if the expected content length is
|
||||
// available, display percent complete
|
||||
float percentComplete=(bytesReceived/(float)expectedLength)*100.0;
|
||||
NSLog(@"Percent complete - %f",percentComplete);
|
||||
} else {
|
||||
// if the expected content length is
|
||||
// unknown just log the progress
|
||||
NSLog(@"Bytes received - %d",bytesReceived);
|
||||
}
|
||||
}
|
||||
*/
|
||||
@end
|
||||
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 8.7 KiB |
|
@ -71,8 +71,8 @@ PUBLIC void A_DeathScream( entity_t *self )
|
|||
{
|
||||
switch( self->type )
|
||||
{
|
||||
case en_mutant:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
case en_mutant: //added 0's to all of these in order to check if sounds are correct... gsh
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/033.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -83,7 +83,7 @@ PUBLIC void A_DeathScream( entity_t *self )
|
|||
break;
|
||||
|
||||
case en_guard:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( dsodsounds[ US_RndT() % 6 ] ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ PUBLIC void A_DeathScream( entity_t *self )
|
|||
break;
|
||||
|
||||
case en_officer:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/046.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ PUBLIC void A_DeathScream( entity_t *self )
|
|||
break;
|
||||
|
||||
case en_ss:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/035.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ PUBLIC void A_DeathScream( entity_t *self )
|
|||
break;
|
||||
|
||||
case en_dog:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/031.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ PUBLIC void A_FirstSighting( entity_t *self )
|
|||
break;
|
||||
|
||||
case en_officer:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/043.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -918,7 +918,7 @@ PUBLIC void T_Projectile( entity_t *self )
|
|||
{
|
||||
if( self->type == en_rocket || self->type == en_hrocket )
|
||||
{ // rocket ran into obstacle, draw explosion!
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh )
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/001.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
|
|
@ -924,7 +924,8 @@ PUBLIC void T_Bite( entity_t *self )
|
|||
{
|
||||
long dx, dy;
|
||||
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/076.wav" ), 1, ATTN_NORM, 0 );
|
||||
// Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/076.wav" ), 1, ATTN_NORM, 0 ); //gsh this was the original code
|
||||
Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/002.wav" ), 1, ATTN_NORM, 0 ); //gsh changed to this... the original code wasn't the correct sound file
|
||||
|
||||
dx = ABS( Player.position.origin[ 0 ] - self->x ) - TILEGLOBAL;
|
||||
if( dx <= MINACTORDIST )
|
||||
|
@ -1156,7 +1157,7 @@ PUBLIC void T_Shoot( entity_t *self )
|
|||
switch( self->type )
|
||||
{
|
||||
case en_ss:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9 )//added the episode check... gsh)
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/020.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -1175,7 +1176,7 @@ PUBLIC void T_Shoot( entity_t *self )
|
|||
break;
|
||||
|
||||
default:
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh)
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/038.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
@ -1302,7 +1303,7 @@ PUBLIC void T_Launch( entity_t *self )
|
|||
default:
|
||||
proj->type = en_rocket;
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh)
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/008.wav" ), 1, ATTN_NORM, 0 );
|
||||
}
|
||||
|
|
|
@ -19,6 +19,20 @@
|
|||
*/
|
||||
|
||||
#include "../wolfiphone.h"
|
||||
/*
|
||||
void ReplaceText(char* original, char* insert, int nInsertAt)
|
||||
{
|
||||
int sizeInsert = sizeof(insert);
|
||||
int sizeOriginal = sizeof(original); //should be 1024
|
||||
|
||||
for (int i = 0; i < sizeInsert; i++)
|
||||
{
|
||||
original[nInsertAt + i] = insert[i];
|
||||
}
|
||||
|
||||
|
||||
|
||||
}*/
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------------
|
||||
|
@ -34,14 +48,15 @@
|
|||
*/
|
||||
PUBLIC void Client_PrepRefresh( const char *r_mapname )
|
||||
{
|
||||
char mapname[ 32 ];
|
||||
// char mapname[ 32 ];
|
||||
char mapname[ 64 ]; //gsh, decided to allow longer map names
|
||||
|
||||
if( ! r_mapname || ! *r_mapname )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 10)//added the episode check... gsh)
|
||||
{
|
||||
spritelocation = SODSPRITESDIRNAME;
|
||||
}
|
||||
|
@ -78,7 +93,47 @@ PUBLIC void Client_PrepRefresh( const char *r_mapname )
|
|||
|
||||
// clear any lines of console text
|
||||
Con_ClearNotify();
|
||||
|
||||
|
||||
//gsh
|
||||
//this is a hack... to save space on the download... we've removed the music
|
||||
//so instead we're going to replace the SOD music with wolf3d music here
|
||||
//however, we don't have to worry about that now that we package the SOD music
|
||||
//with the binary
|
||||
/*
|
||||
if (currentMap.episode >= 6) //if it's the SOD levels
|
||||
{
|
||||
char *source;
|
||||
switch (currentMap.episode * 10 + currentMap.map)
|
||||
{
|
||||
case 60: source = "ZEROHOUR.ogg"; break;
|
||||
case 61: source = "CORNER.ogg"; break;
|
||||
case 62: source = "DUNGEON.ogg"; break;
|
||||
case 63: source = "ENDLEVEL.ogg"; break;
|
||||
case 64: source = "FUNKYOU.ogg"; break;
|
||||
case 65: source = "HEADACHE.ogg"; break;
|
||||
case 66: source = "HITLWLTZ.ogg"; break;
|
||||
case 67: source = "INTROCW3.ogg"; break;
|
||||
case 68: source = "NAZI_NOR.ogg"; break;
|
||||
case 69: source = "NAZI_OMI.ogg"; break;
|
||||
case 70: source = "NAZI_RAP.ogg"; break;
|
||||
case 71: source = "PACMAN.ogg"; break;
|
||||
case 72: source = "POW.ogg"; break;
|
||||
case 73: source = "PREGNANT.ogg"; break;
|
||||
case 74: source = "ROSTER.ogg"; break;
|
||||
case 75: source = "SALUTE.ogg"; break;
|
||||
case 76: source = "SEARCHN.ogg"; break;
|
||||
case 77: source = "SUSPENSE.ogg"; break;
|
||||
case 78: source = "TWELFTH.ogg"; break;
|
||||
case 79: source = "URAHERO.ogg"; break;
|
||||
case 80: source = "ULTIMATE.ogg"; break;
|
||||
default:
|
||||
source = "CORNER.ogg";
|
||||
}
|
||||
strcpy(levelData.musicName + 6, source); //the '6' is to get us past the "music/" part of musicName
|
||||
levelData.musicName[6 + strlen(source)] = '\0';
|
||||
}*/
|
||||
|
||||
Com_Printf("Starting Music Track: %s\n", levelData.musicName);
|
||||
Sound_StartBGTrack( levelData.musicName, levelData.musicName );
|
||||
|
||||
Player.playstate = ex_playing;
|
||||
|
|
|
@ -905,7 +905,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
|
||||
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh)
|
||||
{
|
||||
statinfo = static_sod;
|
||||
num_statics = sizeof( static_sod ) / sizeof( static_sod[ 0 ] );
|
||||
|
@ -933,6 +933,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
filesize = FS_GetFileSize( fhandle );
|
||||
if( filesize < MAPHEADER_SIZE )
|
||||
{
|
||||
Com_Printf("Map file size is smaller than mapheader size\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -943,6 +944,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
FS_ReadFile( &signature, 1, 4, fhandle );
|
||||
if( signature != MAP_SIGNATURE )
|
||||
{
|
||||
Com_Printf("File signature does not match MAP_SIGNATURE\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -973,6 +975,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength +
|
||||
length[ 0 ] + length[ 1 ] + length[ 2 ]) )
|
||||
{
|
||||
Com_Printf("filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength + etc\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -990,6 +993,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
|
||||
if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength) )
|
||||
{
|
||||
Com_Printf("filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1165,6 +1169,114 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname )
|
|||
return newMap;
|
||||
}
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------------
|
||||
Function: Level_VerifyMap
|
||||
|
||||
Parameters: level file name
|
||||
|
||||
Returns: 0 if invalid map, 1 otherwise
|
||||
|
||||
Notes:
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
*/
|
||||
PUBLIC int Level_VerifyMap( const char *levelname )
|
||||
{
|
||||
W16 rle;
|
||||
W32 offset[ 3 ];
|
||||
W16 length[ 3 ];
|
||||
W16 w, h;
|
||||
W32 signature;
|
||||
W32 ceiling, floor;
|
||||
filehandle_t *fhandle;
|
||||
W16 mapNameLength;
|
||||
char *mapName = NULL;
|
||||
W16 musicNameLength;
|
||||
char *musicName = NULL;
|
||||
SW32 filesize;
|
||||
int value = 1;
|
||||
|
||||
|
||||
fhandle = FS_OpenFile( levelname, FA_FILE_IPHONE_DOC_DIR );
|
||||
if( ! fhandle )
|
||||
{
|
||||
value = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
filesize = FS_GetFileSize( fhandle );
|
||||
if( filesize < MAPHEADER_SIZE )
|
||||
{
|
||||
value = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
FS_ReadFile( &signature, 1, 4, fhandle );
|
||||
if( signature != MAP_SIGNATURE )
|
||||
{
|
||||
value = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
FS_ReadFile( &rle, 2, 1, fhandle );
|
||||
|
||||
FS_ReadFile( &w, 2, 1, fhandle );
|
||||
FS_ReadFile( &h, 2, 1, fhandle );
|
||||
|
||||
FS_ReadFile( &ceiling, 4, 1, fhandle );
|
||||
FS_ReadFile( &floor, 4, 1, fhandle );
|
||||
|
||||
|
||||
FS_ReadFile( &length, 2, 3, fhandle );
|
||||
FS_ReadFile( &offset, 4, 3, fhandle );
|
||||
|
||||
|
||||
FS_ReadFile( &mapNameLength, 1, 2, fhandle );
|
||||
FS_ReadFile( &musicNameLength, 1, 2, fhandle );
|
||||
|
||||
FS_ReadFile( &levelstate.fpartime, sizeof( float ), 1, fhandle );
|
||||
|
||||
FS_ReadFile( levelstate.spartime, sizeof( W8 ), 5, fhandle );
|
||||
levelstate.spartime[ 5 ] = '\0';
|
||||
|
||||
|
||||
if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength +
|
||||
length[ 0 ] + length[ 1 ] + length[ 2 ]) )
|
||||
{
|
||||
value = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
mapName = Z_Malloc( mapNameLength + 1 );
|
||||
musicName = Z_Malloc( musicNameLength + 1 );
|
||||
|
||||
|
||||
FS_ReadFile( mapName, 1, mapNameLength, fhandle );
|
||||
mapName[ mapNameLength ] = '\0';
|
||||
|
||||
|
||||
FS_ReadFile( musicName, 1, musicNameLength, fhandle );
|
||||
musicName[ musicNameLength ] = '\0';
|
||||
|
||||
|
||||
if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength) )
|
||||
{
|
||||
value = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
FS_CloseFile(fhandle);
|
||||
if (mapName) {
|
||||
Z_Free(mapName);
|
||||
}
|
||||
if (musicName) {
|
||||
Z_Free(musicName);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -140,8 +140,7 @@ extern void ProcessGuards( void );
|
|||
|
||||
|
||||
#define WL6SPRITESDIRNAME "sprites"
|
||||
#define SODSPRITESDIRNAME "sodsprites"
|
||||
|
||||
#define SODSPRITESDIRNAME "sodsprites"//"sprites" //gsh was originally "sodsprites"
|
||||
|
||||
extern char *spritelocation;
|
||||
|
||||
|
|
|
@ -70,7 +70,9 @@ PUBLIC void Game_Init( void )
|
|||
|
||||
episode = Cvar_Get( "episode", "0", CVAR_ARCHIVE );
|
||||
skill = Cvar_Get( "skill", "1", CVAR_ARCHIVE );
|
||||
g_version = Cvar_Get( "g_version", "0", CVAR_ARCHIVE );
|
||||
// g_version = Cvar_Get( "g_version", "0", CVAR_ARCHIVE );
|
||||
g_version = Cvar_Get( "g_version", "1", CVAR_ARCHIVE ); //we should make a #ifdef for "special version"
|
||||
//this version is to come with spear
|
||||
|
||||
#ifndef LITE
|
||||
Cmd_AddCommand( "map", Map_f );
|
||||
|
|
|
@ -83,6 +83,7 @@ PRIVATE _boolean PL_ChangeWeapon( player_t *self, int weapon )
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
self->weapon =
|
||||
self->pendingweapon = weapon;
|
||||
|
||||
|
@ -461,7 +462,7 @@ PRIVATE void PL_PlayerAttack( player_t *self, _boolean re_attack )
|
|||
-----------------------------------------------------------------------------
|
||||
*/
|
||||
PUBLIC void PL_Process( player_t *self, LevelData_t *lvl )
|
||||
{
|
||||
{
|
||||
int n;
|
||||
|
||||
self->madenoise = false;
|
||||
|
@ -489,11 +490,34 @@ PUBLIC void PL_Process( player_t *self, LevelData_t *lvl )
|
|||
if( Player.cmd.buttons & BUTTON_ATTACK )
|
||||
{
|
||||
self->flags |= PL_FLAG_ATTCK;
|
||||
|
||||
|
||||
//gsh
|
||||
if (self->previousweapon != WEAPON_KNIFE && self->previousweapon)
|
||||
{
|
||||
//self->weapon = self->previousweapon;
|
||||
PL_ChangeWeapon(self, self->previousweapon);
|
||||
}
|
||||
|
||||
self->attackframe = 0;
|
||||
self->attackcount = attackinfo[ self->weapon ][ 0 ].tics;
|
||||
self->weaponframe = attackinfo[ self->weapon ][ 0 ].frame;
|
||||
} else if ( Player.cmd.buttons & BUTTON_CHANGE_WEAPON ) {
|
||||
}
|
||||
else if ( Player.cmd.buttons & BUTTON_ALTERNATE_ATTACK ) //gsh
|
||||
{
|
||||
self->flags |= PL_FLAG_ATTCK;
|
||||
|
||||
// PL_ChangeWeapon(self, WEAPON_KNIFE);
|
||||
if (self->weapon != WEAPON_KNIFE)
|
||||
{
|
||||
self->previousweapon = self->weapon;
|
||||
self->weapon = WEAPON_KNIFE;
|
||||
}
|
||||
|
||||
self->attackframe = 0;
|
||||
self->attackcount = attackinfo[ self->weapon ][ 0 ].tics;
|
||||
self->weaponframe = attackinfo[ self->weapon ][ 0 ].frame;
|
||||
}
|
||||
else if ( Player.cmd.buttons & BUTTON_CHANGE_WEAPON ) {
|
||||
self->pendingweapon=self->weapon;
|
||||
for( n = 0 ; n < 4; ++n )
|
||||
{
|
||||
|
@ -559,9 +583,51 @@ PUBLIC void PL_Spawn( placeonplane_t location, LevelData_t *lvl )
|
|||
|
||||
Areas_ConnectAreas( Player.areanumber );
|
||||
|
||||
//gsh
|
||||
iphoneSetLevelNotifyText();
|
||||
/*
|
||||
char str[128];
|
||||
sprintf( str, "Entering level E%iM%i", currentMap.episode + 1, currentMap.map + 1 );
|
||||
//sprintf( str, "Entering level E%iM%i", currentMap.episode + 1, currentMap.map + 1 );
|
||||
//gsh
|
||||
if (currentMap.episode < 6)
|
||||
sprintf( str, "Entering level E%iM%i", currentMap.episode+1, currentMap.map+1 );
|
||||
else if (currentMap.episode < 10) {
|
||||
int currentLevel = currentMap.episode * 10 + currentMap.map;
|
||||
switch (currentLevel) {
|
||||
case 60: case 61: case 62: case 63: case 64:
|
||||
sprintf( str, "Entering Tunnels %i", currentLevel-60+1);
|
||||
break;
|
||||
case 78:
|
||||
sprintf( str, "Entering Tunnels %i", 6);
|
||||
break;
|
||||
case 65: case 66: case 67: case 68: case 69:
|
||||
sprintf( str, "Entering Dungeons %i", currentLevel-65+1);
|
||||
break;
|
||||
case 79:
|
||||
sprintf( str, "Entering Dungeons %i", 6);
|
||||
break;
|
||||
case 70: case 71: case 72: case 73: case 74: case 75:
|
||||
sprintf( str, "Entering Castle");
|
||||
break;
|
||||
case 76:
|
||||
sprintf( str, "Entering Ramparts");
|
||||
break;
|
||||
case 77:
|
||||
sprintf( str, "Entering Death Knight");
|
||||
break;
|
||||
case 80:
|
||||
sprintf( str, "Entering Dungeon Dimension");
|
||||
break;
|
||||
default:
|
||||
sprintf( str, " ");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
sprintf( str, "Entering level custom %i", /*currentMap.episode+1,* currentMap.map+1 );
|
||||
|
||||
iphoneSetNotifyText( str );
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -918,6 +984,7 @@ PUBLIC void PL_NewGame( player_t *self )
|
|||
self->ammo[ AMMO_BULLETS ] = 16; // JDC: changed for iphone 8;
|
||||
self->lives = 3;
|
||||
|
||||
self->previousweapon = WEAPON_KNIFE; //gsh
|
||||
self->weapon = self->pendingweapon = WEAPON_PISTOL;
|
||||
self->items = ITEM_WEAPON_1 | ITEM_WEAPON_2;
|
||||
self->next_extra = EXTRAPOINTS;
|
||||
|
@ -973,6 +1040,7 @@ PUBLIC _boolean PL_Reborn( player_t *self )
|
|||
self->weaponframe = 0;
|
||||
self->flags = 0;
|
||||
|
||||
self->previousweapon = WEAPON_KNIFE; //gsh
|
||||
self->weapon = self->pendingweapon = WEAPON_PISTOL;
|
||||
self->items = ITEM_WEAPON_1 | ITEM_WEAPON_2;
|
||||
|
||||
|
|
|
@ -135,6 +135,7 @@ typedef struct player_s
|
|||
int old_score, score, next_extra;
|
||||
unsigned items; // (keys, weapon)
|
||||
int weapon, pendingweapon;
|
||||
int previousweapon; //gsh
|
||||
// additional info
|
||||
int attackframe, attackcount, weaponframe; // attack info
|
||||
unsigned flags;
|
||||
|
|
|
@ -254,7 +254,8 @@ PRIVATE int Pow_Give( pow_t type )
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/064.wav" ), 1, ATTN_NORM, 0 );
|
||||
// Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/064.wav" ), 1, ATTN_NORM, 0 ); //gsh, I don't like this sound
|
||||
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/031.wav" ), 1, ATTN_NORM, 0 ); //gsh, I like this sound
|
||||
break;
|
||||
|
||||
case pow_machinegun:
|
||||
|
@ -290,14 +291,22 @@ PRIVATE int Pow_Give( pow_t type )
|
|||
|
||||
case pow_spear:
|
||||
{
|
||||
char szTextMsg[ 256 ];
|
||||
//gsh char szTextMsg[ 256 ];
|
||||
|
||||
Com_Printf("Spear of Destiny picked up!!\n");
|
||||
|
||||
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sodsfx/109.wav" ), 1, ATTN_NORM, 0 );
|
||||
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sfx/109.wav" ), 1, ATTN_NORM, 0 ); //gsh
|
||||
iphoneSetNotifyText( "Spear of Destiny" );
|
||||
|
||||
my_snprintf( szTextMsg, sizeof( szTextMsg ),
|
||||
/* //gsh
|
||||
my_snprintf( szTextMsg, sizeof( szTextMsg ), //this is supposed to load the last level... but it isn't
|
||||
"loading ; map s%.2d.map\n", 20 );
|
||||
Cbuf_AddText( szTextMsg );
|
||||
*/
|
||||
|
||||
//this might be a bit of a hack. But it works.
|
||||
//Load the last level... gsh
|
||||
iphoneStartMap(8, 0, currentMap.skill);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ PUBLIC _boolean PushWall_Push( int x, int y, dir4type dir )
|
|||
iphoneSetNotifyText( "You found a secret!" );
|
||||
}
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh ).. TODO: fix sfx and other media
|
||||
{
|
||||
Sound_StartSound( NULL, 1, CHAN_AUTO, Sound_RegisterSound( "sfx/030.wav" ), 1, ATTN_STATIC, 0 );
|
||||
}
|
||||
|
|
|
@ -59,7 +59,14 @@ PUBLIC void R_BeginRegistration( const char *map )
|
|||
++texture_registration_sequence;
|
||||
|
||||
|
||||
my_snprintf( fullname, sizeof( fullname ), "maps/%s.map", map );
|
||||
//my_snprintf( fullname, sizeof( fullname ), "maps/%s.map", map );
|
||||
if ( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 10) //add if/else... gsh
|
||||
my_snprintf( fullname, sizeof( fullname ), "%s.map", map );
|
||||
else if (currentMap.episode >= 10)
|
||||
my_snprintf( fullname, sizeof( fullname ), "%s.map", map );
|
||||
else
|
||||
my_snprintf( fullname, sizeof( fullname ), "maps/%s.map", map );
|
||||
|
||||
|
||||
// Door_ResetDoors( &r_world->Doors );
|
||||
Powerup_Reset();
|
||||
|
@ -74,13 +81,13 @@ PUBLIC void R_BeginRegistration( const char *map )
|
|||
|
||||
if( r_world == NULL )
|
||||
{
|
||||
Com_Printf( "Could not load map (%s)\n", map );
|
||||
Com_Printf( "Could not load map (%s) in R_BeginRegistration\n", map );
|
||||
return;
|
||||
}
|
||||
|
||||
levelstate.floornum = floornumber;
|
||||
|
||||
if( g_version->value == SPEAROFDESTINY )
|
||||
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9) //added the episode check... gsh)
|
||||
{
|
||||
if( strlen( map ) >= 2 )
|
||||
{
|
||||
|
|
|
@ -85,3 +85,5 @@
|
|||
|
||||
#include "iphone/iphone_wolf.h"
|
||||
|
||||
#include "iphone_alerts.h"
|
||||
|
||||
|
|
Loading…
Reference in a new issue