Source release of Wolfenstein 3D Classic Platinum for iOS, 1.2

This commit is contained in:
Travis Bradshaw 2012-01-31 16:57:34 -06:00
parent a82aba6b94
commit 16304944b4
45 changed files with 10681 additions and 171 deletions

View file

@ -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

View file

@ -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 );

View file

@ -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;
}*/
/*

View file

@ -45,6 +45,7 @@
extern void FS_InitFilesystem(void);
extern char *FS_Gamedir(void);
//extern char *FS_ForceGamedir(void); //gsh

View file

@ -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 );

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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

File diff suppressed because it is too large Load diff

View 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

View 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;
}

View 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

View file

@ -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>

View 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

View file

@ -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;

View file

@ -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");
}

View 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

View 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

View 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
}

View 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);
}

View file

@ -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
}

View file

@ -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( &currentMap, 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.
===================
*/

View 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

View file

@ -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

File diff suppressed because it is too large Load diff

View 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;
};
}

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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 );
}

View file

@ -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 );
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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 );

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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 );
}

View file

@ -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 )
{

View file

@ -85,3 +85,5 @@
#include "iphone/iphone_wolf.h"
#include "iphone_alerts.h"