mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2026-03-19 16:39:49 +01:00
4103 lines
114 KiB
C
4103 lines
114 KiB
C
/*
|
|
|
|
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.
|
|
|
|
*/
|
|
//gsh
|
|
//#define NUM_TOUCHFRAME 10
|
|
|
|
#include "../wolfiphone.h"
|
|
|
|
int intermissionStartFrameNum;
|
|
int hasReleased;
|
|
|
|
menuState_t menuState;
|
|
colour4_t highlightColor = { 128, 128, 128, 255 };
|
|
colour4_t colorPressed = { 128, 128, 0, 255 };
|
|
|
|
//-------------
|
|
// These are for the download progress menu
|
|
extern unsigned int dataAmount; //gsh... provides us information with the amount of data we've downloaded
|
|
unsigned int totalDownloaded = 0;
|
|
extern const unsigned int DownloadFileSize;
|
|
extern unsigned int userDataAmount; //gsh... provides us information with the amount of data we've downloaded
|
|
extern const unsigned int DownloadUserFileSize;
|
|
//--------------
|
|
//gsh
|
|
int wasDLInstructionsCalledFromEpisodeMenu = 0;
|
|
int wasCalledFromDownloadInstructionsMenu = 0;
|
|
/*
|
|
=========================
|
|
iphoneSetLevelNotifyText
|
|
gsh
|
|
=========================
|
|
*/
|
|
void iphoneSetLevelNotifyText()
|
|
{
|
|
char str[128];
|
|
|
|
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 Secret");//, 6);
|
|
break;
|
|
case 65: case 66: case 67: case 68: case 69:
|
|
sprintf( str, "Entering Dungeons %i", currentLevel-65+1);
|
|
break;
|
|
case 70: case 71: case 72: case 73: case 74: case 75:
|
|
sprintf( str, "Entering Castle %i", currentLevel - 70 + 1);
|
|
break;
|
|
case 79:
|
|
sprintf( str, "Entering Castle Secret");//, 6);
|
|
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 );
|
|
}
|
|
|
|
/*
|
|
==================
|
|
RectMake
|
|
gsh
|
|
==================
|
|
*/
|
|
rect_t RectMake(int x, int y, int width, int height)
|
|
{
|
|
rect_t rect;
|
|
rect.x = x;
|
|
rect.y = y;
|
|
rect.width = width;
|
|
rect.height = height;
|
|
return rect;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawPicNum
|
|
|
|
==================
|
|
*/
|
|
void iphoneDrawPicNum( int x, int y, int w, int h, int glTexNum ) {
|
|
R_Bind( glTexNum );
|
|
pfglBegin( GL_QUADS );
|
|
|
|
pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y );
|
|
pfglTexCoord2f( 1.0f, 0.0f ); pfglVertex2i( x+w, y );
|
|
pfglTexCoord2f( 1.0f, 1.0f ); pfglVertex2i( x+w, y+h );
|
|
pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h );
|
|
|
|
pfglEnd();
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawPic
|
|
|
|
==================
|
|
*/
|
|
void iphoneDrawPic( int x, int y, int w, int h, const char *pic ) {
|
|
texture_t *gl;
|
|
|
|
gl = TM_FindTexture( pic, TT_Pic );
|
|
if( ! gl ) {
|
|
Com_Printf( "Can't find pic: %s\n", pic );
|
|
return;
|
|
}
|
|
|
|
R_Bind( gl->texnum );
|
|
pfglBegin( GL_QUADS );
|
|
|
|
pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y );
|
|
pfglTexCoord2f( gl->maxS, 0.0f ); pfglVertex2i( x+w, y );
|
|
pfglTexCoord2f( gl->maxS, gl->maxT ); pfglVertex2i( x+w, y+h );
|
|
pfglTexCoord2f( 0.0f, gl->maxT ); pfglVertex2i( x, y+h );
|
|
|
|
pfglEnd();
|
|
}
|
|
|
|
//gsh
|
|
void iphoneDrawPicInBox( rect_t drawRect, const char *pic, rect_t boxRect )
|
|
{
|
|
texture_t *gl;
|
|
|
|
gl = TM_FindTexture( pic, TT_Pic );
|
|
if( ! gl ) {
|
|
Com_Printf( "Can't find pic: %s\n", pic );
|
|
return;
|
|
}
|
|
|
|
|
|
int newX = drawRect.x;
|
|
int newY = drawRect.y;
|
|
int newW = drawRect.width;
|
|
int newH = drawRect.height;
|
|
|
|
float u0 = 0;
|
|
float u1 = gl->maxS;
|
|
float v0 = 0;
|
|
float v1 = gl->maxT;
|
|
|
|
|
|
if (drawRect.x > boxRect.x + boxRect.width)
|
|
return; //we're not in box... //newX = boxX + boxW;
|
|
if (drawRect.x + drawRect.width < boxRect.x)
|
|
return;
|
|
if (drawRect.y > boxRect.y + boxRect.height)
|
|
return;
|
|
if (drawRect.y + drawRect.height < boxRect.y)
|
|
return;
|
|
|
|
if (drawRect.x < boxRect.x) {
|
|
newX = boxRect.x;
|
|
u0 = gl->maxS * ((float)(boxRect.x - drawRect.x))/((float)drawRect.width);
|
|
newW = drawRect.width - (boxRect.x - drawRect.x);
|
|
}
|
|
if (drawRect.x + drawRect.width > boxRect.x + boxRect.width) {
|
|
newW = boxRect.x + boxRect.width - drawRect.x;
|
|
u1 = gl->maxS * ((float)(newW))/((float)drawRect.width);
|
|
}
|
|
if (drawRect.y < boxRect.y) {
|
|
newY = boxRect.y;
|
|
v0 = gl->maxT * ((float)(boxRect.y - drawRect.y))/((float)drawRect.height);
|
|
newH = drawRect.height - (boxRect.y - drawRect.y);
|
|
}
|
|
if (drawRect.y + drawRect.height > boxRect.y + boxRect.height) {
|
|
newH = boxRect.y + boxRect.height - drawRect.y;
|
|
v1 = gl->maxT * ((float)(newH))/((float)drawRect.height);
|
|
}
|
|
|
|
|
|
R_Bind( gl->texnum );
|
|
pfglBegin( GL_QUADS );
|
|
|
|
//float u, v;
|
|
//u = ((float)newX)/((float)x);
|
|
//v = ((float)newY)/((float)y);
|
|
pfglTexCoord2f( u0, v0 ); pfglVertex2i( newX, newY );
|
|
pfglTexCoord2f( u1, v0 ); pfglVertex2i( newX+newW, newY );
|
|
pfglTexCoord2f( u1, v1 ); pfglVertex2i( newX+newW, newY+newH );
|
|
pfglTexCoord2f( u0, v1 ); pfglVertex2i( newX, newY+newH );
|
|
|
|
pfglEnd();
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawPicWithTouch
|
|
|
|
==================
|
|
*/
|
|
int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic ) {
|
|
int r = TouchReleased( x, y, w, h );
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
iphoneDrawPic( x, y, w, h, pic );
|
|
if ( TouchDown( x, y, w, h ) ) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( x, y, w, h, color );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
//gsh
|
|
int iphoneDrawPicWithTouchSpecified( rect_t drawRect, rect_t touchRect, const char *pic) {//int x, int y, int w, int h, int touchX, int touchY, int touchW, int touchH, const char *pic ) {
|
|
int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height );
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
iphoneDrawPic( drawRect.x, drawRect.y, drawRect.width, drawRect.height, pic );
|
|
if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) ) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( drawRect.x, drawRect.y, drawRect.width, drawRect.height, color );
|
|
}
|
|
return r;
|
|
}
|
|
//gsh
|
|
int iphoneDrawPicInBoxWithTouchSpecified( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect ) {
|
|
|
|
//make sure touches are in drawing bounds
|
|
if (touchRect.x < boundingRect.x) {
|
|
touchRect.width -= boundingRect.x - touchRect.x;
|
|
touchRect.x = boundingRect.x;
|
|
}
|
|
if (touchRect.x + touchRect.width > boundingRect.x + boundingRect.width)
|
|
touchRect.width = boundingRect.x + boundingRect.width - touchRect.x;
|
|
if (touchRect.y < boundingRect.y) {
|
|
touchRect.height -= boundingRect.y - touchRect.y;
|
|
touchRect.y = boundingRect.y;
|
|
}
|
|
if (touchRect.y + touchRect.height > boundingRect.y + boundingRect.height)
|
|
touchRect.height = boundingRect.y + boundingRect.height - touchRect.y;
|
|
|
|
int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height );
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
// iphoneDrawPic( x, y, w, h, pic );
|
|
// iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH );
|
|
iphoneDrawPicInBox( drawRect, pic, boundingRect );
|
|
// iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH )
|
|
if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) ) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, color );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
//gsh
|
|
int iphoneDrawPicInBoxWithTouchAndVelocity( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect, int dragVelocity ) {
|
|
|
|
//make sure touches are in drawing bounds
|
|
if (touchRect.x < boundingRect.x) {
|
|
touchRect.width -= boundingRect.x - touchRect.x;
|
|
touchRect.x = boundingRect.x;
|
|
}
|
|
if (touchRect.x + touchRect.width > boundingRect.x + boundingRect.width)
|
|
touchRect.width = boundingRect.x + boundingRect.width - touchRect.x;
|
|
if (touchRect.y < boundingRect.y) {
|
|
touchRect.height -= boundingRect.y - touchRect.y;
|
|
touchRect.y = boundingRect.y;
|
|
}
|
|
if (touchRect.y + touchRect.height > boundingRect.y + boundingRect.height)
|
|
touchRect.height = boundingRect.y + boundingRect.height - touchRect.y;
|
|
|
|
int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height );
|
|
|
|
//if the object is moving, then it shouldn't be selectable
|
|
if ( dragVelocity )
|
|
r = 0;
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
// iphoneDrawPic( x, y, w, h, pic );
|
|
// iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH );
|
|
iphoneDrawPicInBox( drawRect, pic, boundingRect );
|
|
// iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH )
|
|
if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) && !dragVelocity) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, color );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
|
|
//gsh
|
|
int iphoneDrawPicInBoxWithTouchSpecifiedAndColor( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect, colour4_t color ) {
|
|
|
|
//make sure touches are in drawing bounds
|
|
if (touchRect.x < boundingRect.x) {
|
|
touchRect.width -= boundingRect.x - touchRect.x;
|
|
touchRect.x = boundingRect.x;
|
|
}
|
|
if (touchRect.x + touchRect.width > boundingRect.x + boundingRect.width)
|
|
touchRect.width = boundingRect.x + boundingRect.width - touchRect.x;
|
|
if (touchRect.y < boundingRect.y) {
|
|
touchRect.height -= boundingRect.y - touchRect.y;
|
|
touchRect.y = boundingRect.y;
|
|
}
|
|
if (touchRect.y + touchRect.height > boundingRect.y + boundingRect.height)
|
|
touchRect.height = boundingRect.y + boundingRect.height - touchRect.y;
|
|
|
|
int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height );
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
// iphoneDrawPic( x, y, w, h, pic );
|
|
// iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH );
|
|
iphoneDrawPicInBox( drawRect, pic, boundingRect );
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, color );
|
|
// iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH )
|
|
if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) ) {
|
|
colour4_t colorWhite = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, colorWhite );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
//gsh
|
|
int iphoneDrawPicInBoxWithTouchColorAndVelocity( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect, colour4_t color, int dragVelocity ) {
|
|
|
|
//make sure touches are in drawing bounds
|
|
if (touchRect.x < boundingRect.x) {
|
|
touchRect.width -= boundingRect.x - touchRect.x;
|
|
touchRect.x = boundingRect.x;
|
|
}
|
|
if (touchRect.x + touchRect.width > boundingRect.x + boundingRect.width)
|
|
touchRect.width = boundingRect.x + boundingRect.width - touchRect.x;
|
|
if (touchRect.y < boundingRect.y) {
|
|
touchRect.height -= boundingRect.y - touchRect.y;
|
|
touchRect.y = boundingRect.y;
|
|
}
|
|
if (touchRect.y + touchRect.height > boundingRect.y + boundingRect.height)
|
|
touchRect.height = boundingRect.y + boundingRect.height - touchRect.y;
|
|
|
|
int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height );
|
|
|
|
if (dragVelocity)
|
|
r = 0;
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
// iphoneDrawPic( x, y, w, h, pic );
|
|
// iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH );
|
|
iphoneDrawPicInBox( drawRect, pic, boundingRect );
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, color );
|
|
// iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH )
|
|
if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) && !dragVelocity ) {
|
|
colour4_t colorWhite = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, colorWhite );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawPicWithTouchAndColor
|
|
gsh
|
|
==================
|
|
*/
|
|
int iphoneDrawPicWithTouchAndColor( int x, int y, int w, int h, const char *pic, colour4_t color ) {
|
|
int r = TouchReleased( x, y, w, h );
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
// pfglColor3f( 1, 1, 1 );
|
|
}
|
|
// glColor4f( 0.5f, 0.5f, 1, 0 );
|
|
iphoneDrawPic( x, y, w, h, pic );
|
|
R_Draw_Blend( x, y, w, h, color );
|
|
if ( TouchDown( x, y, w, h ) ) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( x, y, w, h, color );
|
|
}
|
|
// glColor4f( 1, 1, 1, 1 );
|
|
return r;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawPicInBoxWithTouchAndColor
|
|
gsh
|
|
==================
|
|
*/
|
|
int iphoneDrawPicInBoxWithTouchAndColor( rect_t drawRect, const char *pic, colour4_t color, rect_t boxRect ) {
|
|
int r = TouchReleased(drawRect.x, drawRect.y, drawRect.width, drawRect.height)
|
|
& TouchReleased(boxRect.x, boxRect.y, boxRect.width, boxRect.height); //touch must be inside both boxes!
|
|
|
|
if ( r ) {
|
|
// make sure it is full intensity if it is touch-released, even if
|
|
// it wasn't active previously
|
|
// pfglColor3f( 1, 1, 1 );
|
|
}
|
|
|
|
iphoneDrawPicInBox( drawRect, pic, boxRect );
|
|
|
|
if (drawRect.x + drawRect.width < boxRect.x)
|
|
return 0;
|
|
if (drawRect.x > boxRect.x + boxRect.width)
|
|
return 0;
|
|
if (drawRect.y + drawRect.height < boxRect.y)
|
|
return 0;
|
|
if (drawRect.y > boxRect.y + boxRect.height)
|
|
return 0;
|
|
|
|
if (drawRect.x < boxRect.x) { drawRect.x = boxRect.x; }
|
|
if (drawRect.x + drawRect.width > boxRect.x + boxRect.width) { drawRect.width = boxRect.x + boxRect.width - drawRect.x; }
|
|
if (drawRect.y < boxRect.y) { drawRect.y = boxRect.y; }
|
|
if (drawRect.y + drawRect.height > boxRect.y + boxRect.height) { drawRect.height = boxRect.y + boxRect.height - drawRect.y; }
|
|
|
|
R_Draw_Blend( drawRect.x, drawRect.y, drawRect.width, drawRect.height, color );
|
|
if ( TouchDown( drawRect.x, drawRect.y, drawRect.width, drawRect.height ) ) {
|
|
colour4_t color = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( drawRect.x, drawRect.y, drawRect.width, drawRect.height, color );
|
|
}
|
|
// glColor4f( 1, 1, 1, 1 );
|
|
return r;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
==================
|
|
iphoneSlider
|
|
|
|
==================
|
|
*/
|
|
void iphoneSlider( int x, int y, int w, int h, const char *title, cvar_t *cvar,
|
|
float min, float max ) {
|
|
float value = cvar->value;
|
|
char str[80];
|
|
float f = ( value - min ) / ( max - min );
|
|
|
|
if ( f < 0 ) {
|
|
f = 0;
|
|
}
|
|
if ( f > 1 ) {
|
|
f = 1;
|
|
}
|
|
|
|
// draw the background
|
|
iphoneDrawPic( x, y, w, h, "iphone/slider_bar_underlay.tga");//stat_bar_2.tga" );
|
|
|
|
// draw the current range
|
|
texture_t *gl;
|
|
|
|
gl = TM_FindTexture( "iphone/slider_bar.tga", TT_Pic );//stat_bar_1.tga", TT_Pic );
|
|
assert( gl );
|
|
R_Bind( gl->texnum );
|
|
pfglBegin( GL_QUADS );
|
|
|
|
pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y );
|
|
pfglTexCoord2f( f, 0.0f ); pfglVertex2i( x+w*f, y );
|
|
pfglTexCoord2f( f, 1.0f ); pfglVertex2i( x+w*f, y+h );
|
|
pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h );
|
|
|
|
pfglEnd();
|
|
|
|
//gsh... draw the finger catch
|
|
iphoneDrawPic( x+w*f-12, y, 24, h, "iphone/slider_knob.tga" );//finger_catch.tga" );
|
|
|
|
|
|
// draw the title and fraction
|
|
sprintf( str, "%s : %i%%", title, (int)(f*100) );
|
|
//colour4_t color = {0, 0, 0, 1};
|
|
pfglColor4f(0, 0, 0, 1); //gsh
|
|
// y -= 3;
|
|
iphoneDrawArialText(x + w/6 + 1, y+h*8/10 + 1, 0.9f, str);
|
|
iphoneDrawArialText(x + w/6 + 2, y+h*8/10 + 2, 0.9f, str);
|
|
iphoneDrawArialText(x + w/6 + 3, y+h*8/10 + 3, 0.9f, str);
|
|
//iphoneCenterTextWithColor(x+ w/2 +1, y+h/2-8 +1, str, color);
|
|
//iphoneCenterTextWithColor(x+ w/2 +2, y+h/2-8 +2, str, color);
|
|
//iphoneCenterTextWithColor(x+ w/2 +3, y+h/2-8 +3, str, color);
|
|
//iphoneCenterText( x+ w/2, y+h/2-8, str );
|
|
pfglColor4f(1, 1, 1, 1);
|
|
iphoneDrawArialText(x + w/6, y+h*8/10, 0.9f, str);
|
|
|
|
// check for touches
|
|
if ( numTouches > 0 && touches[0][0] >= x && touches[0][0] < x + w
|
|
&& touches[0][1] >= y && touches[0][1] < y+ h ) {
|
|
float newValue;
|
|
float delta;
|
|
|
|
f = (float)( touches[0][0] - x ) / w;
|
|
// round to tenths
|
|
f = (int)( ( f + 0.05 ) * 10 ) * 0.1f;
|
|
if ( f < 0 ) {
|
|
f = 0;
|
|
}
|
|
if ( f > 1.0 ) {
|
|
f = 1.0;
|
|
}
|
|
|
|
newValue = min + f * ( max - min );
|
|
delta = fabs( newValue - cvar->value );
|
|
if ( f == 0 && cvar->value == 0 ) {
|
|
// special case of disable-at-0
|
|
} else if ( delta > 0.01 ) {
|
|
Cvar_SetValue( cvar->name, newValue );
|
|
Sound_StartLocalSound( "iphone/slide_01.wav" );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
==================
|
|
BackButton
|
|
|
|
==================
|
|
*/
|
|
int BackButton() {
|
|
if ( iphoneDrawPicWithTouch( 0, 0, 64, 36, "iphone/button_back.tga" ) ) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//gsh... a back button on the other side of the screen
|
|
int BackButton2() {
|
|
if ( iphoneDrawPicWithTouch( 480-64, 0, 64, 36, "iphone/button_back.tga" ) ) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//gsh
|
|
int BackButton3( int x, int y ) {
|
|
if ( iphoneDrawPicWithTouch( x, y, 64, 36, "iphone/button_back.tga" ) ) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
MenuButton
|
|
gsh
|
|
==================
|
|
*/
|
|
int MenuButton() {
|
|
if ( iphoneDrawPicWithTouch( 480-64, 0, 64, 36, "iphone/menu.tga" ) ) {
|
|
// if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/menu.tga" ) ) {
|
|
// if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_menu_yellow.tga" ) ) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
void GetMoreLevels( int x, int y ) {
|
|
if ( iphoneDrawPicWithTouch( x, y, 128, 64, "iphone/button_levels.tga" ) ) {
|
|
// directly to the app store for more levels
|
|
SysIPhoneOpenURL( "http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=309470478" );
|
|
}
|
|
}
|
|
|
|
//gsh
|
|
#if 0
|
|
extern void DownloadSOD();
|
|
extern void BeginStoreKit();
|
|
extern void DisplayWrongVersionedOS();
|
|
extern int TestURLConnection();//const char *url);
|
|
extern bool isStorekitAvailable;
|
|
//extern int IsSpearInstalled();
|
|
//extern void iphoneActivateConsole();
|
|
#endif
|
|
|
|
//=================================
|
|
// GetSpear
|
|
//gsh
|
|
//===================================
|
|
#if 0
|
|
void GetSpear(void)
|
|
{
|
|
if (isStorekitAvailable)
|
|
{
|
|
if (TestURLConnection()) //check URL connection
|
|
{
|
|
/* //it's been decided to pre-package spear of destiny with wolf3d
|
|
//however users will need to in-app purchase it to unlock
|
|
//only download the data if doesn't exist, otherwise just enter the storekit
|
|
if (!IsSpearInstalled())
|
|
DownloadSOD();
|
|
else*/
|
|
BeginStoreKit();
|
|
}
|
|
}
|
|
else
|
|
DisplayWrongVersionedOS();
|
|
}
|
|
#endif
|
|
//=================================
|
|
// GetSpearOfDestiny
|
|
//gsh
|
|
//===================================
|
|
#if 0
|
|
void GetSpearOfDestiny( int x, int y )
|
|
{
|
|
if ( iphoneDrawPicWithTouch( x, y, 128, 64, "iphone/button_levels.tga" ) )
|
|
{
|
|
totalDownloaded = 0; //reset the totalDownload to zero
|
|
|
|
Com_Printf("GetSpearOfDestiny called\n");
|
|
|
|
GetSpear();
|
|
}
|
|
}
|
|
#endif
|
|
/*
|
|
==================
|
|
SaveTheGame
|
|
|
|
==================
|
|
*/
|
|
extern W8 areaconnect[ NUMAREAS ][ NUMAREAS ];
|
|
extern _boolean areabyplayer[ NUMAREAS ];
|
|
|
|
void SaveTheGame() {
|
|
FILE *f;
|
|
char path[1024];
|
|
int version = SAVEGAME_VERSION;
|
|
int i;
|
|
|
|
my_snprintf( path, sizeof( path ), "%s/savegame.bin", iphoneDocDirectory );
|
|
f = fopen( path, "wb" );
|
|
if( ! f ) {
|
|
Com_Printf( "Could not open savegame.bin.\n" );
|
|
return;
|
|
}
|
|
|
|
// turn the r_world->Doors.doors from pointers to indexes
|
|
// ok to be destructive, because we are quiting
|
|
for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) {
|
|
int index = r_world->Doors.Doors[i] - &r_world->Doors.DoorMap[0][0];
|
|
assert( index >= 0 && index < 4096 );
|
|
r_world->Doors.Doors[i] = (void *)index;
|
|
}
|
|
|
|
// this is only used for the mutant death face, so just
|
|
// clear it instead of fixing it up
|
|
Player.LastAttacker = NULL;
|
|
|
|
currentMap.version = SAVEGAME_VERSION;
|
|
fwrite( ¤tMap, 1,sizeof(currentMap), f );
|
|
|
|
fwrite( &huds, 1,sizeof(huds), f);
|
|
|
|
fwrite( &levelData, 1,sizeof(levelData), f );
|
|
fwrite( &LevelRatios, 1,sizeof(LevelRatios), f );
|
|
fwrite( &levelstate, 1,sizeof(levelstate), f );
|
|
fwrite( Guards, 1,sizeof(Guards), f );
|
|
fwrite( areaconnect, 1,sizeof(areaconnect), f );
|
|
fwrite( areabyplayer, 1,sizeof(areabyplayer), f );
|
|
fwrite( &PWall, 1,sizeof(PWall), f );
|
|
fwrite( &Player, 1,sizeof(Player), f );
|
|
fwrite( &version, 1,sizeof(version), f );
|
|
|
|
fclose( f );
|
|
}
|
|
|
|
/*
|
|
==================
|
|
LoadTheGame
|
|
|
|
==================
|
|
*/
|
|
int LoadTheGame() {
|
|
FILE *f;
|
|
char path[1024];
|
|
int version;
|
|
int i;
|
|
int oldCompleted;
|
|
|
|
my_snprintf( path, sizeof( path ), "%s/savegame.bin", iphoneDocDirectory );
|
|
f = fopen( path, "rb" );
|
|
if( ! f ) {
|
|
Com_Printf( "Could not open savegame.bin.\n" );
|
|
return 0;
|
|
}
|
|
|
|
fread( ¤tMap, 1,sizeof(currentMap) , f);
|
|
|
|
if ( currentMap.version != SAVEGAME_VERSION ) {
|
|
Com_Printf( "Savegame header version mismatch: %i != %i\n", currentMap.version, SAVEGAME_VERSION );
|
|
fclose( f );
|
|
return 0;
|
|
}
|
|
|
|
|
|
Com_Printf("episode: %i\nmap: %i\n", currentMap.episode, currentMap.map);
|
|
|
|
// load the huds
|
|
fread( &huds, 1,sizeof(huds), f);
|
|
|
|
// do a normal map start
|
|
Cvar_SetValue( skill->name, currentMap.skill );
|
|
PL_NewGame( &Player );
|
|
|
|
oldCompleted = currentMap.levelCompleted;
|
|
if (currentMap.episode < 9) //gsh... added the episode check
|
|
iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill );
|
|
else
|
|
iphoneStartUserMap(currentMap.episode, currentMap.map, currentMap.skill, NULL);
|
|
|
|
currentMap.levelCompleted = oldCompleted;
|
|
|
|
// load modifiactions on top
|
|
fread( &levelData, 1,sizeof(levelData), f);
|
|
fread( &LevelRatios, 1,sizeof(LRstruct), f );
|
|
fread( &levelstate, 1,sizeof(levelstate), f );
|
|
fread( Guards, 1,sizeof(Guards), f );
|
|
fread( areaconnect, 1,sizeof(areaconnect), f );
|
|
fread( areabyplayer, 1,sizeof(areabyplayer), f );
|
|
fread( &PWall, 1,sizeof(PWall), f );
|
|
fread( &Player, 1,sizeof(Player), f );
|
|
fread( &version, 1,sizeof(version), f );
|
|
|
|
fclose( f );
|
|
|
|
if ( version != SAVEGAME_VERSION ) {
|
|
Com_Printf( "Savegame trailer version mismatch: %i != %i\n", version, SAVEGAME_VERSION );
|
|
return 0;
|
|
}
|
|
|
|
// turn the r_world->Doors.doors back to pointers
|
|
for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) {
|
|
int index = (int)r_world->Doors.Doors[i];
|
|
assert( index >= 0 && index < 4096 );
|
|
r_world->Doors.Doors[i] = &r_world->Doors.DoorMap[0][0] + index;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneGetUserMapName
|
|
|
|
This matches the incoming mapNumber with the correct
|
|
map name in the maps directory. Returns 1 if successful
|
|
and 0 if failed
|
|
gsh
|
|
==================
|
|
*/
|
|
int iphoneGetUserMapName(int mapNumber, char *mapName)
|
|
{
|
|
int numMaps = 0;
|
|
int returnValue = 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)
|
|
{
|
|
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;
|
|
*/
|
|
++numMaps;
|
|
if (numMaps < 3) //skip the '.' and '..'
|
|
continue;
|
|
|
|
if (mapNumber == (numMaps - 3))
|
|
{
|
|
strcpy(mapName, ep->d_name);
|
|
returnValue = 1;
|
|
break;
|
|
}
|
|
|
|
}
|
|
//(void) closedir (dp);
|
|
closedir (dp);
|
|
}
|
|
|
|
Com_Printf("numMaps: %i\n", numMaps);
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneGetUserMapName
|
|
|
|
This matches the incoming mapNumber with the correct
|
|
map name in the maps directory. Returns 1 if successful
|
|
and 0 if failed
|
|
gsh
|
|
==================
|
|
*/
|
|
int iphoneGetUserMapLevelByName(const char *mapName)
|
|
{
|
|
int numMaps = 0;
|
|
int returnValue = 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)
|
|
{
|
|
while (ep = readdir (dp))
|
|
{
|
|
if (strcmp(ep->d_name, mapName) == 0)
|
|
{
|
|
return numMaps-3+1;
|
|
}
|
|
|
|
/*
|
|
//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;
|
|
*/
|
|
++numMaps;
|
|
/*
|
|
if (numMaps < 3) //skip the '.' and '..'
|
|
continue;
|
|
|
|
if (mapNumber == (numMaps - 3))
|
|
{
|
|
strcpy(mapName, ep->d_name);
|
|
returnValue = 1;
|
|
break;
|
|
}*/
|
|
|
|
}
|
|
//(void) closedir (dp);
|
|
closedir (dp);
|
|
}
|
|
|
|
Com_Printf("numMaps: %i\n", numMaps);
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
|
|
/*
|
|
==================
|
|
iphoneStartUserMap
|
|
gsh
|
|
This does not reset the player, so call PL_NewGame( &Player ) if it is a new start.
|
|
==================
|
|
*/
|
|
void iphoneStartUserMap( int episodeNum, int mapNum, int skillLevel, char *mapName ) {
|
|
char command[128];
|
|
int levelNum = episodeNum*10+mapNum;
|
|
|
|
Com_Printf( "iphoneStartMap( %i, %i, %i )\n", episodeNum, mapNum, skillLevel );
|
|
|
|
// get the sound playing
|
|
Sound_Update( vnull, vnull, vnull, vnull );
|
|
|
|
// clean up game feedback
|
|
damageflash = 0;
|
|
bonusFrameNum = 0;
|
|
attackDirTime[0] = 0;
|
|
attackDirTime[1] = 0;
|
|
|
|
// note that this has been tried now
|
|
currentMap.mapFlags[currentMap.skill][levelNum] |= MF_TRIED;
|
|
|
|
// start the game
|
|
currentMap.episode = episodeNum;
|
|
currentMap.map = mapNum;
|
|
currentMap.skill = skillLevel;
|
|
currentMap.levelCompleted = 0;
|
|
|
|
Cvar_SetValue( skill->name, skillLevel );
|
|
Cvar_SetValue( episode->name, episodeNum );
|
|
|
|
Com_Printf("episode: %i\nmap: %i\n", currentMap.episode, currentMap.map);
|
|
|
|
if (episodeNum >= 10 && mapName)
|
|
{
|
|
sprintf( command, "usermaps/%s", mapName );
|
|
Com_Printf("command: %s\n", command);
|
|
}
|
|
else if (episodeNum >= 10) //mapName was null... we must find what it's called
|
|
{
|
|
Com_Printf("episode number check true\n");
|
|
mapName = (char *)malloc(sizeof(char)*1024); //sizeof(char) should just be 1 byte
|
|
if (iphoneGetUserMapName(mapNum, mapName))
|
|
{
|
|
sprintf(command, "usermaps/%s", mapName);
|
|
}
|
|
else
|
|
{
|
|
Com_Printf("iphoneGetUserMapName failed");
|
|
currentMap.episode = 0;
|
|
currentMap.map = 0;
|
|
sprintf( command, "w%i%i", currentMap.episode, currentMap.map ); //load first map if mapName not found
|
|
}
|
|
free(mapName);
|
|
}
|
|
else if (episodeNum >= 6)
|
|
{
|
|
FS_InitFilesystem(); //is this really needed?
|
|
sprintf( command, "maps/s%i%i", currentMap.episode - 6, currentMap.map);
|
|
}
|
|
else
|
|
{
|
|
sprintf( command, "w%i%i", currentMap.episode, currentMap.map );
|
|
}
|
|
Com_Printf("command: %s\n", command);
|
|
Client_PrepRefresh( command );
|
|
|
|
menuState = IPM_GAME;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneStartMap
|
|
|
|
This does not reset the player, so call PL_NewGame( &Player ) if it is a new start.
|
|
==================
|
|
*/
|
|
void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ) {
|
|
char command[128];
|
|
int levelNum = episodeNum*10+mapNum;
|
|
|
|
Com_Printf( "iphoneStartMap( %i, %i, %i )\n", episodeNum, mapNum, skillLevel );
|
|
|
|
// get the sound playing
|
|
Sound_Update( vnull, vnull, vnull, vnull );
|
|
|
|
// clean up game feedback
|
|
damageflash = 0;
|
|
bonusFrameNum = 0;
|
|
attackDirTime[0] = 0;
|
|
attackDirTime[1] = 0;
|
|
|
|
// note that this has been tried now
|
|
currentMap.mapFlags[currentMap.skill][levelNum] |= MF_TRIED;
|
|
|
|
// start the game
|
|
currentMap.episode = episodeNum;
|
|
currentMap.map = mapNum;
|
|
currentMap.skill = skillLevel;
|
|
currentMap.levelCompleted = 0;
|
|
|
|
Cvar_SetValue( skill->name, skillLevel );
|
|
Cvar_SetValue( episode->name, episodeNum );
|
|
|
|
//added by gsh 6/9/2009... load the SOD maps if they were chosen
|
|
if (episodeNum >= 6)
|
|
{
|
|
// FS_InitFilesystem();
|
|
sprintf( command, "maps/s%i%i", currentMap.episode - 6, currentMap.map);
|
|
}
|
|
else
|
|
{
|
|
sprintf( command, "w%i%i", currentMap.episode, currentMap.map );
|
|
}
|
|
Com_Printf("command: %s\n", command);
|
|
Client_PrepRefresh( command );
|
|
|
|
menuState = IPM_GAME;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneMainMenu
|
|
|
|
==================
|
|
*/
|
|
extern int notifyFrameNum; //gsh
|
|
void iphoneMainMenu() {
|
|
char str[80];
|
|
float scale = 40 / 32.0;
|
|
|
|
//iphoneDrawPic( 480-256, 0, 256, 128, "iphone/wolf_logo.tga" );
|
|
//iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main.tga" ); //gsh
|
|
iphoneDrawPic(0, 0, 264, 250, "iphone/wolfplatinum_logo.tga");
|
|
/*gsh
|
|
#ifdef LITE
|
|
iphoneDrawPic( -20, 0, 256, 64, "iphone/ep_1.tga" );
|
|
GetMoreLevels( 0, 96 );
|
|
#else
|
|
iphoneDrawPic( -20, 0, 256, 64, "iphone/ep_1_6.tga" );
|
|
if (g_version->value != SPEAROFDESTINY) //gsh
|
|
GetSpearOfDestiny( 0, 96 );
|
|
else
|
|
iphoneDrawPic( 10, 100, 200, 100, "iphone/spear_logo.tga" ); //gsh
|
|
#endif*/
|
|
|
|
// we don't need the logo here now that we have a splash screen
|
|
// iphoneDrawPic( 0, 320 - 128, 128, 128, "iphone/id_logo.tga" );
|
|
|
|
// if ( iphoneDrawPicWithTouch( 300 - 64*scale, 80, 128*scale, 64*scale, "iphone/button_resume.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( 360 - 64*scale, 20, 128*scale, 32*scale, "iphone/button_resume.tga" ) ) { //gsh
|
|
iphonePreloadBeforePlay();
|
|
|
|
// if the game was saved at the intermission screen, immediately
|
|
// bring it back up when it is loaded
|
|
if ( currentMap.levelCompleted ) {
|
|
iphoneStartIntermission( 0 );
|
|
} else {
|
|
//reset the notification so that we can see which level we've loaded.. gsh
|
|
iphoneSetLevelNotifyText();
|
|
iphoneFrameNum = 0;
|
|
notifyFrameNum = 60;
|
|
menuState = IPM_GAME;
|
|
}
|
|
}
|
|
|
|
//gsh
|
|
if (currentMap.episode < 9)
|
|
sprintf( str, "E%iM%i", currentMap.episode+1, currentMap.map+1 );
|
|
else
|
|
sprintf( str, "custom %i", currentMap.map+1 );
|
|
|
|
// iphoneCenterText( 300, 80+34*scale, str );
|
|
// iphoneCenterText( 360, 34*scale, str ); //gsh
|
|
|
|
// if ( iphoneDrawPicWithTouch( 300 - 64*scale, 170, 128*scale, 32*scale, "iphone/button_control.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( 360 - 64*scale, 120, 128*scale, 32*scale, "iphone/button_settings.tga" ) ) { //gsh
|
|
menuState = IPM_CONTROLS;
|
|
}
|
|
// if ( iphoneDrawPicWithTouch( 300 - 64*scale, 220, 128*scale, 32*scale, "iphone/button_new.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( 360 - 64*scale, 70, 128*scale, 32*scale, "iphone/button_new.tga" ) ) { //gsh
|
|
menuState = IPM_SKILL;//IPM_MAPSELECTOR;//IPM_SKILL; //gsh
|
|
}
|
|
// if ( iphoneDrawPicWithTouch( 300 - 64*scale, 270, 128*scale, 32*scale, "iphone/button_web.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( 100 - 64*scale, 250, 64, 64, "iphone/id_logo.tga" ) ) { //gsh
|
|
wasCalledFromDownloadInstructionsMenu = 0;
|
|
iphoneYesNoBox("Website", "This will navigate you to idsoftware.com. Continue?");
|
|
// SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein3dclassic/" );
|
|
}
|
|
//gsh
|
|
// if (iphoneDrawPicWithTouch(100 - 64*scale, 270, 128*scale, 32*scale, "iphone/button_control.tga" ) ) {
|
|
if (iphoneDrawPicWithTouch(360 - 64*scale, 220, 128*scale, 32*scale, "iphone/button_more.tga" ) ) { //gsh
|
|
menuState = IPM_MORE;//IPM_TRIVIA;
|
|
}
|
|
|
|
int x = 360;
|
|
int y = 170;
|
|
if ( SysIPhoneOtherAudioIsPlaying() ) {
|
|
// iphoneDrawPic( 480 - 64, 220, 64, 64, "iphone/music_off.tga" );
|
|
iphoneDrawPic( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_off.tga" ); //gsh
|
|
} else {
|
|
if ( music->value ) {
|
|
//if ( iphoneDrawPicWithTouch( 480 - 64, 220, 64, 64, "iphone/music_on.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_on.tga" ) ) { //gsh
|
|
Cvar_SetValue( music->name, 0 );
|
|
Sound_StopBGTrack();
|
|
}
|
|
} else {
|
|
//if ( iphoneDrawPicWithTouch( 480 - 64, 220, 64, 64, "iphone/music_off.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_off.tga" ) ) { //gsh
|
|
Cvar_SetValue( music->name, 1 );
|
|
Sound_StartBGTrack( levelData.musicName, levelData.musicName );
|
|
}
|
|
}
|
|
}
|
|
|
|
sprintf( str, "v%3.1f", WOLF_IPHONE_VERSION );
|
|
iphoneCenterText( 460, 300, str );
|
|
}
|
|
|
|
//==========================================
|
|
// iphoneUpdateControlDrags()
|
|
// Updates the touches for the scrolling maps
|
|
//==========================================
|
|
void iphoneUpdateControlDrags(int numPresets, int x, int y, int w, int h, int spacing, int *dragPosition, int *dragVelocity)
|
|
{
|
|
//Update drag/touch info
|
|
// int x = 0;
|
|
// int w = 480;// - skillSides - 64;
|
|
/*
|
|
if (TouchDown(x, y, w, h))
|
|
{
|
|
if (!numPrevTouches)
|
|
prevTouches[0][0] = touches[0][0];
|
|
else if (numTouches == 1)
|
|
*dragVelocity = touches[0][0] - prevTouches[0][0];
|
|
}*/
|
|
|
|
//update the drags
|
|
*dragPosition += *dragVelocity;
|
|
/*
|
|
//int rightBoundary = 240 - 2*width;//480/2 - (numPresets*width/2 + spacing);
|
|
if (*dragPosition < -270-10)//(numPresets*(width+spacing))/2 )
|
|
*dragPosition = -270-10;//(numPresets*(width+spacing))/2;
|
|
else if (*dragPosition > 70+10)//rightBoundary)
|
|
*dragPosition = 70+10;//rightBoundary;
|
|
|
|
if (*dragPosition < -270)
|
|
*dragVelocity = 2;
|
|
else if (*dragPosition > 70)
|
|
*dragVelocity = -2;
|
|
*/
|
|
|
|
//retard the velocity
|
|
if (*dragVelocity > 0)
|
|
--*dragVelocity;
|
|
else if (*dragVelocity < 0)
|
|
++*dragVelocity;
|
|
|
|
}
|
|
#if 0
|
|
/*
|
|
==================
|
|
iphoneControlMenu
|
|
|
|
==================
|
|
*/
|
|
void iphoneControlMenu() {
|
|
int i;
|
|
|
|
int x = 0;
|
|
int y = 0;
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
|
|
|
|
|
|
x = 480-128*9/10;
|
|
if ( iphoneDrawPicWithTouch( x, y, 128*9/10, 36/*32*9/10*/, "iphone/advanced_button.tga" ) ) {
|
|
Cvar_SetValue( controlScheme->name, -1 );
|
|
iphonePreloadBeforePlay(); // make sure all the hud textures are loaded
|
|
menuState = IPM_HUDEDIT;
|
|
}
|
|
|
|
x = 240-108*9/10;
|
|
iphoneDrawPic(x, y, 217*9/10, 50*9/10, "iphone/header_settings.tga");
|
|
|
|
//update the drags
|
|
int startPosition = 70;
|
|
static int dragPosition = 70;
|
|
static int dragVelocity = 0;
|
|
|
|
y = 20;
|
|
x = 0;
|
|
|
|
if (iphoneDrawPicWithTouch(9, y+60, 64, 64, "iphone/button_left.tga") )
|
|
dragVelocity = -20;//-18;
|
|
if (iphoneDrawPicWithTouch(411, y+60, 64, 64, "iphone/button_right.tga") )
|
|
dragVelocity = 20;//18;
|
|
|
|
int size = 160;//180;//110;
|
|
//iphoneUpdateControlDrags(4, 70, y+25, size*2, size - 53, 10, &dragPosition, &dragVelocity );
|
|
|
|
//update the drags
|
|
dragPosition += dragVelocity;
|
|
|
|
//retard the drags
|
|
if (dragVelocity > 0)
|
|
--dragVelocity;
|
|
else if (dragVelocity < 0)
|
|
++dragVelocity;
|
|
|
|
//stop dragging when we're slow and close to a node
|
|
if ((dragVelocity < 10 && dragVelocity > 0) || (dragVelocity > -10 && dragVelocity < 0))
|
|
{
|
|
if (abs((dragPosition-startPosition)%(size+10)) < 7)
|
|
{
|
|
dragVelocity = 0;
|
|
int tx = dragPosition - startPosition;
|
|
int n = tx/(size+10);//480;
|
|
dragPosition = n*(size+10) + startPosition;
|
|
|
|
}
|
|
}
|
|
if (dragVelocity == 0)
|
|
{
|
|
int spacing = 10;
|
|
int height = size;
|
|
int n = (dragPosition - startPosition) / (height+spacing);
|
|
|
|
int nodePosition = n*(height+spacing) + startPosition;
|
|
if (nodePosition != dragPosition)
|
|
{
|
|
int nodePositionPlus = nodePosition + (height+spacing);
|
|
int nodePositionMinus = nodePosition - (height+spacing);
|
|
int distMinus = abs(nodePositionMinus - dragPosition);
|
|
int distPlus = abs(nodePositionPlus - dragPosition);
|
|
int dist = abs(nodePosition - dragPosition);
|
|
|
|
|
|
int diff = nodePosition - dragPosition;
|
|
|
|
if (distMinus < distPlus && distMinus < dist)
|
|
diff = nodePositionMinus - dragPosition;
|
|
else if (distPlus < dist && distPlus < distMinus)
|
|
diff = nodePositionPlus - dragPosition;
|
|
|
|
if (diff < 0) {
|
|
dragVelocity -= 5;
|
|
}
|
|
else {
|
|
dragVelocity += 5;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//draw the preset layouts
|
|
for ( i = 0 ; i < 4 ; i++ ) {
|
|
char str[128];
|
|
int remap[4] = { 3,4,1,2}; // artist named them differently than intended...
|
|
sprintf( str, "iphone/iphone_preset_%i.tga", remap[i] );
|
|
if ( i != controlScheme->value ) {
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
int thisX = 5 + (size+10) * i + dragPosition;
|
|
|
|
//wrap presets around in a circle
|
|
if (thisX > 70 + 480 -140)
|
|
thisX -= (size+10) * 4;
|
|
|
|
if (thisX < 70 - 480 + 140)
|
|
thisX += (size+10) * 4;
|
|
|
|
if (dragPosition > 70 + (size+10) * 4 )
|
|
dragPosition = 70;
|
|
|
|
if (dragPosition < 70 - (size+10) * 4 )
|
|
dragPosition = 70;
|
|
|
|
if ( iphoneDrawPicInBoxWithTouchSpecified( RectMake(thisX, y+50, size, size/2),
|
|
RectMake(thisX, y + 25, size, size - 53),
|
|
str,
|
|
RectMake(70, 0, 480-140, 320) )
|
|
&& !dragVelocity)
|
|
{
|
|
Cvar_SetValue( controlScheme->name, i );
|
|
HudSetForScheme( i );
|
|
}
|
|
pfglColor3f( 1, 1, 1 );
|
|
|
|
char buffer[32];
|
|
sprintf(buffer, "Preset %i", i+1);
|
|
|
|
pfglColor3f( 0, 0, 0 );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+1, y+125+1, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+2, y+125+2, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+3, y+125+3, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
pfglColor3f( 1, 1, 1 );
|
|
iphoneDrawTextInBox( RectMake(thisX+35, y+125, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
}
|
|
|
|
|
|
int sliderHeight = 25;//35;
|
|
int sliderSpacing = 10;
|
|
int sliderY = y + size;// - 13;//190;//170;
|
|
int sliderX = 80;//20;
|
|
int sliderWidth = 320;//440;
|
|
|
|
//sensitivity slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "sensitivity", sensitivity, 0, 1 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
|
|
//tilt move speed slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "tilt move speed", tiltMove, 5000, 30000 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
if ( tiltMove->value == 5000 ) {
|
|
Cvar_SetValue( tiltMove->name, 0 );
|
|
}
|
|
if ( tiltMove->value ) {
|
|
Cvar_SetValue( tiltTurn->name, 0 );
|
|
}
|
|
|
|
//tilt turn speed slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "tilt turn speed", tiltTurn, 500, 3000 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
if ( tiltTurn->value == 500 ) {
|
|
Cvar_SetValue( tiltTurn->name, 0 );
|
|
}
|
|
if ( tiltTurn->value ) {
|
|
Cvar_SetValue( tiltMove->name, 0 );
|
|
}
|
|
|
|
//hud alpha slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "hud alpha", hudAlpha, 0, 1 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
|
|
y = 0;
|
|
x = 480-74;
|
|
if (revLand->value)
|
|
{
|
|
y = 320-32;
|
|
x = 74-64;
|
|
}
|
|
|
|
#ifdef VOLUMEHACK
|
|
//Draw volume up/down settings... gsh
|
|
|
|
if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) {
|
|
if ((int)volumeFireUpSetting->value)
|
|
Cvar_Set("volumeFireUpSetting", "0");
|
|
else
|
|
Cvar_Set("volumeFireUpSetting", "1");
|
|
}
|
|
|
|
if ((int)volumeFireUpSetting->value)
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_pistol.tga");
|
|
else
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_knife.tga");
|
|
|
|
x = 480-145;
|
|
if (revLand->value)
|
|
x = 145-64;
|
|
|
|
if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) {
|
|
if ((int)volumeFireDownSetting->value)
|
|
Cvar_Set("volumeFireDownSetting", "0");
|
|
else
|
|
Cvar_Set("volumeFireDownSetting", "1");
|
|
}
|
|
|
|
if ((int)volumeFireDownSetting->value)
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_pistol.tga");
|
|
else
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_knife.tga");
|
|
#endif
|
|
}
|
|
#endif
|
|
/*
|
|
==================
|
|
iphoneControlMenu
|
|
gsh... different from above
|
|
==================
|
|
*/
|
|
void iphoneControlMenu() {
|
|
int i;
|
|
|
|
int x = 0;
|
|
int y = 0;
|
|
|
|
iphoneDrawPic(x, y, 480, 320, "iphone/submenus_background_image.tga");
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
|
|
x = 480-128*9/10;
|
|
if ( iphoneDrawPicWithTouch( x, y, 128*9/10, 36, "iphone/advanced_button.tga" ) ) {
|
|
Cvar_SetValue( controlScheme->name, -1 );
|
|
iphonePreloadBeforePlay(); // make sure all the hud textures are loaded
|
|
menuState = IPM_HUDEDIT;
|
|
}
|
|
|
|
x = 240-108*9/10;
|
|
iphoneDrawPic(x, y, 217*9/10, 50*9/10, "iphone/header_settings.tga");
|
|
|
|
//update the position of the control settings
|
|
const int startPosition = 70;
|
|
static int currentPreset = 0;
|
|
int numPresets = 4;
|
|
|
|
//update the drags
|
|
static int Position = 70;
|
|
|
|
y = 20;
|
|
x = 0;
|
|
|
|
static int moveRight = 0;
|
|
|
|
//move right or left, depending on button pushed
|
|
if (iphoneDrawPicWithTouch(9, y+60, 64, 64, "iphone/button_left.tga") ) {
|
|
moveRight = 0;
|
|
++currentPreset;
|
|
if (currentPreset > numPresets-1) {
|
|
currentPreset = 0;//1;
|
|
|
|
}
|
|
}
|
|
if (iphoneDrawPicWithTouch(411, y+60, 64, 64, "iphone/button_right.tga") ) {
|
|
moveRight = 1;
|
|
--currentPreset;
|
|
if (currentPreset < 0) {
|
|
currentPreset = numPresets-1;//2;
|
|
}
|
|
}
|
|
|
|
|
|
int width = 160;//305;
|
|
int spacing = 10;//215;//175;
|
|
|
|
int size = width;// + spacing;
|
|
|
|
int destinationPosition = startPosition - currentPreset*(width+spacing);
|
|
|
|
//if we are not where we are supposed to be... get us there
|
|
if (Position != destinationPosition)
|
|
{
|
|
int oldPosition = Position;
|
|
int deltaPos = destinationPosition - Position;
|
|
|
|
//move entities
|
|
int moveDistance = 8;
|
|
if ( moveRight )
|
|
{
|
|
Position += moveDistance;
|
|
if (destinationPosition < Position && destinationPosition > oldPosition)
|
|
Position = destinationPosition;
|
|
}
|
|
else //move left
|
|
{
|
|
Position -= moveDistance;
|
|
if (destinationPosition > Position && destinationPosition < oldPosition)
|
|
Position = destinationPosition;
|
|
}
|
|
|
|
//check if the current position has crossed over the destination position
|
|
if ( abs(deltaPos) <= 16)
|
|
Position = destinationPosition;
|
|
}
|
|
|
|
|
|
//draw the preset layouts
|
|
for ( i = 0 ; i < 4 ; i++ ) {
|
|
char str[128];
|
|
int remap[4] = { 3,4,1,2}; // artist named them differently than intended...
|
|
sprintf( str, "iphone/iphone_preset_%i.tga", remap[i] );
|
|
if ( i != controlScheme->value ) {
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
int thisX = 5 + (size+10) * i + Position;
|
|
|
|
//wrap presets around in a circle
|
|
if (thisX > 70 + 480 -140)
|
|
thisX -= (size+10) * 4;
|
|
|
|
if (thisX < 70 - 480 + 140)
|
|
thisX += (size+10) * 4;
|
|
|
|
if (Position > 70)//70 + (size+10) * 4 )
|
|
Position = 70 - (size+10)*4;
|
|
|
|
if (Position < 70 - (size+10) * 4 )
|
|
Position = 70;
|
|
|
|
if ( iphoneDrawPicInBoxWithTouchSpecified( RectMake(thisX, y+50, size, size/2),
|
|
RectMake(thisX, y + 25, size, size - 53),
|
|
str,
|
|
RectMake(70, 0, 480-140, 320) ) )
|
|
{
|
|
Cvar_SetValue( controlScheme->name, i );
|
|
HudSetForScheme( i );
|
|
}
|
|
pfglColor3f( 1, 1, 1 );
|
|
|
|
char buffer[32];
|
|
sprintf(buffer, "Preset %i", i+1);
|
|
|
|
pfglColor3f( 0, 0, 0 );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+1, y+125+1, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+2, y+125+2, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
iphoneDrawTextInBox( RectMake(thisX+35+3, y+125+3, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
pfglColor3f( 1, 1, 1 );
|
|
iphoneDrawTextInBox( RectMake(thisX+35, y+125, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) );
|
|
}
|
|
|
|
|
|
int sliderHeight = 25;//35;
|
|
int sliderSpacing = 10;
|
|
int sliderY = y + size;// - 13;//190;//170;
|
|
int sliderX = 80;//20;
|
|
int sliderWidth = 320;//440;
|
|
|
|
//sensitivity slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "sensitivity", sensitivity, 0, 1 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
|
|
//tilt move speed slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "tilt move speed", tiltMove, 5000, 30000 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
if ( tiltMove->value == 5000 ) {
|
|
Cvar_SetValue( tiltMove->name, 0 );
|
|
}
|
|
if ( tiltMove->value ) {
|
|
Cvar_SetValue( tiltTurn->name, 0 );
|
|
}
|
|
|
|
//tilt turn speed slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "tilt turn speed", tiltTurn, 500, 3000 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
if ( tiltTurn->value == 500 ) {
|
|
Cvar_SetValue( tiltTurn->name, 0 );
|
|
}
|
|
if ( tiltTurn->value ) {
|
|
Cvar_SetValue( tiltMove->name, 0 );
|
|
}
|
|
|
|
//hud alpha slider
|
|
iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "hud alpha", hudAlpha, 0, 1 );
|
|
sliderY += sliderHeight + sliderSpacing;
|
|
|
|
y = 0;
|
|
x = 480-74;
|
|
if (revLand->value)
|
|
{
|
|
y = 320-32;
|
|
x = 74-64;
|
|
}
|
|
|
|
#ifdef VOLUMEHACK
|
|
//Draw volume up/down settings... gsh
|
|
|
|
if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) {
|
|
if ((int)volumeFireUpSetting->value)
|
|
Cvar_Set("volumeFireUpSetting", "0");
|
|
else
|
|
Cvar_Set("volumeFireUpSetting", "1");
|
|
}
|
|
|
|
if ((int)volumeFireUpSetting->value)
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_pistol.tga");
|
|
else
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_knife.tga");
|
|
|
|
|
|
x = 480-145;
|
|
if (revLand->value)
|
|
x = 145-64;
|
|
|
|
if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) {
|
|
if ((int)volumeFireDownSetting->value)
|
|
Cvar_Set("volumeFireDownSetting", "0");
|
|
else
|
|
Cvar_Set("volumeFireDownSetting", "1");
|
|
}
|
|
|
|
if ((int)volumeFireDownSetting->value)
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_pistol.tga");
|
|
else
|
|
iphoneDrawPic(x, y, 64, 32, "iphone/button_knife.tga");
|
|
#endif
|
|
}
|
|
|
|
|
|
/*
|
|
==================
|
|
iphoneSkillMenu
|
|
|
|
==================
|
|
*/
|
|
void iphoneSkillMenu() {
|
|
int s;
|
|
char str[64];
|
|
|
|
//gsh
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
|
|
//gsh
|
|
iphoneDrawPic(0, 0, 480, 48, "iphone/header_how_tough_are_you.tga");
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
|
|
// highlight the current skill selection
|
|
s = (int)skill->value;
|
|
// R_Draw_Fill( 80, 40+64*s, 320, 64, highlightColor );
|
|
|
|
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( 112, 40+64*s, 256, 64, str ) ) {
|
|
if ( iphoneDrawPicWithTouch( 112, 60+64*s, 256, 64, str ) ) {
|
|
Cvar_SetValue( skill->name, s );
|
|
menuState = IPM_EPISODE;
|
|
}
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
==================
|
|
iphoneEpisodeMenu
|
|
|
|
==================
|
|
*/
|
|
void iphoneEpisodeMenu() {
|
|
int e;
|
|
char str[64];
|
|
#ifdef LITE
|
|
int numE = 1;
|
|
#else
|
|
int numE = 6;
|
|
//gsh
|
|
if (g_version->value == SPEAROFDESTINY)
|
|
numE = 9;
|
|
#endif
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_SKILL;
|
|
}
|
|
|
|
// 96 x 48 images
|
|
for ( e = 0 ; e < numE ; e++ ) {
|
|
|
|
//gsh... added the if and button_epSOD
|
|
if (e < 6)
|
|
my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 );
|
|
else
|
|
my_snprintf(str, sizeof( str), "iphone/button_epSOD.tga");
|
|
|
|
if ( e != (int)episode->value ) {
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
int height = 32;//48;//gsh... 96x32
|
|
if ( iphoneDrawPicWithTouch( 48, 32+height*e, 384, height, str ) ) {
|
|
Cvar_SetValue( episode->name, e );
|
|
menuState = IPM_MAPS;
|
|
}/*gsh
|
|
if ( iphoneDrawPicWithTouch( 48, 32+48*e, 384, 48, str ) ) {
|
|
Cvar_SetValue( episode->name, e );
|
|
menuState = IPM_MAPS;
|
|
}*/
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
|
|
#ifdef LITE
|
|
// buy more episodes button
|
|
GetMoreLevels( 240 - 64, 200 );
|
|
#else
|
|
#if 0
|
|
if (g_version->value != SPEAROFDESTINY) //gsh
|
|
GetSpearOfDestiny( 240 - 64, 232 );
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneUpdateScrollingDrags
|
|
gsh
|
|
==================
|
|
*/
|
|
//int scrollingFlags = 0;
|
|
void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperLimit, int lowerLimit, int padding, rect_t touchRect)
|
|
{
|
|
static int oldVelocity = 0;
|
|
|
|
|
|
//if Touch is in touchable area
|
|
// if (TouchDown(touchRect.x, touchRect.y, touchRect.width, touchRect.height))
|
|
if (TouchDown( 0, 0, 480, 320) )//|| isTouchMoving)
|
|
{
|
|
if (!numPrevTouches)
|
|
prevTouches[0][1] = touches[0][1];
|
|
else if (numTouches == 1)
|
|
*dragVelocity = touches[0][1] - prevTouches[0][1];
|
|
|
|
//if (*dragVelocity < 3)
|
|
// isTouchMoving = 0;
|
|
|
|
/*
|
|
Com_Printf("update drags: Touch is down!\n");
|
|
Com_Printf("dragVelocity: %i\n", *dragVelocity);
|
|
Com_Printf("prevTouch: %i\n", prevTouches[0][1]);
|
|
Com_Printf("touch: %i\n", touches[0][1]);
|
|
*/
|
|
}
|
|
// else if (*dragVelocity == 0) //this returns the position to a node position
|
|
else if (abs(*dragVelocity) < 5) //this returns the position to a node position
|
|
{
|
|
int startPosition = 70 - 10;
|
|
int height = 48;
|
|
int spacing = 20;
|
|
int nodePosition = upperLimit + padding;
|
|
|
|
|
|
int n = (*dragPosition - startPosition) / (height+spacing);
|
|
|
|
nodePosition = n*(height+spacing) + startPosition;// - 5;
|
|
/* if (nodePosition != *dragPosition)
|
|
{/*
|
|
int nodePositionPlus = nodePosition + (height+spacing);
|
|
int nodePositionMinus = nodePosition - (height+spacing);
|
|
int distMinus = abs(nodePositionMinus - *dragPosition);
|
|
int distPlus = abs(nodePositionPlus - *dragPosition);
|
|
int dist = abs(nodePosition - *dragPosition);
|
|
|
|
|
|
int diff = nodePosition - *dragPosition;
|
|
|
|
if (distMinus < distPlus && distMinus < dist)
|
|
diff = nodePositionMinus - *dragPosition;
|
|
else if (distPlus < dist && distPlus < distMinus)
|
|
diff = nodePositionPlus - *dragPosition;
|
|
|
|
if (diff < 0)
|
|
--*dragVelocity;
|
|
else
|
|
++*dragVelocity;
|
|
*
|
|
if (oldVelocity > 0)
|
|
++*dragVelocity;
|
|
else if (oldVelocity < 0)
|
|
--*dragVelocity;
|
|
}*/
|
|
|
|
//let's try a different way to continue our path
|
|
if (nodePosition != *dragPosition && oldVelocity > 0)
|
|
{
|
|
int minSpeed = 5;
|
|
if (oldVelocity > 0) {
|
|
*dragVelocity = minSpeed;
|
|
int newPosition = *dragPosition + *dragVelocity;
|
|
|
|
Com_Printf("newPosition: %i\n", newPosition);
|
|
Com_Printf("nodePosition: %i\n", nodePosition);
|
|
Com_Printf("dragPosition: %i\n\n\n", *dragPosition);
|
|
|
|
if ( newPosition > nodePosition ) {
|
|
*dragPosition = nodePosition;
|
|
*dragVelocity = 0;
|
|
}
|
|
}/*
|
|
else if (oldVelocity < 0) {
|
|
*dragVelocity = -minSpeed;
|
|
int newPosition = *dragPosition + *dragVelocity;
|
|
|
|
Com_Printf("newPosition: %i\n", newPosition);
|
|
Com_Printf("nodePosition: %i\n", nodePosition);
|
|
Com_Printf("dragPosition: %i\n\n\n", *dragPosition);
|
|
|
|
if ( newPosition < nodePosition - height ){//(height + spacing)) {
|
|
*dragPosition = nodePosition;
|
|
*dragVelocity = 0;
|
|
}
|
|
}*/
|
|
}
|
|
|
|
nodePosition = (n-1)*(height+spacing) + startPosition;// - 10;//5;
|
|
// if (nodePosition - (height + spacing - 5) != *dragPosition && oldVelocity < 0)
|
|
if (nodePosition != *dragPosition && oldVelocity < 0)
|
|
{
|
|
int minSpeed = 5;
|
|
|
|
//else if (oldVelocity < 0) {
|
|
*dragVelocity = -minSpeed;
|
|
int newPosition = *dragPosition + *dragVelocity;
|
|
// nodePosition -= height + spacing - 5;
|
|
|
|
Com_Printf("newPosition: %i\n", newPosition);
|
|
Com_Printf("nodePosition: %i\n", nodePosition);
|
|
Com_Printf("dragPosition: %i\n\n\n", *dragPosition);
|
|
|
|
if ( newPosition < nodePosition /*- height*/ ){//(height + spacing)) {
|
|
*dragPosition = nodePosition;
|
|
*dragVelocity = 0;
|
|
}
|
|
//}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
oldVelocity = *dragVelocity;
|
|
|
|
|
|
//update the drags
|
|
*dragPosition += *dragVelocity;
|
|
|
|
//boundary check our drags
|
|
if (*dragPosition < lowerLimit - padding)
|
|
*dragPosition = lowerLimit - padding;
|
|
if (*dragPosition > upperLimit + padding)
|
|
*dragPosition = upperLimit + padding;
|
|
|
|
if (*dragPosition < lowerLimit)
|
|
*dragVelocity = 2;
|
|
if (*dragPosition > upperLimit)
|
|
*dragVelocity = -2;
|
|
|
|
//retard the velocity
|
|
if (*dragVelocity > 0)
|
|
--*dragVelocity;
|
|
else if (*dragVelocity < 0)
|
|
++*dragVelocity;
|
|
|
|
|
|
// if (abs(*dragVelocity) < 5)
|
|
// *dragVelocity = 0;
|
|
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneScrollingEpisodeMenu
|
|
gsh
|
|
==================
|
|
*/
|
|
void iphoneScrollingEpisodeMenu() {
|
|
int e;
|
|
char str[64];
|
|
int doesUserMapsExist = 0;
|
|
|
|
//used for preventing accidental touches
|
|
//user must hold touch down for 10 frames in order to load episode
|
|
static int touchedFrameNum = 0;
|
|
static int lastTouchFrame = 0;
|
|
|
|
#ifdef LITE
|
|
int numE = 1;
|
|
#else
|
|
int numE = 11;//10;
|
|
|
|
//check for user maps
|
|
DIR *dp;
|
|
char mapBuffer[1024];
|
|
|
|
int length = strlen(iphoneDocDirectory);
|
|
strcpy(mapBuffer, iphoneDocDirectory);
|
|
strcpy(mapBuffer + length, "/usermaps/");
|
|
|
|
dp = opendir (mapBuffer);
|
|
|
|
|
|
if (dp) {
|
|
doesUserMapsExist = 1;
|
|
//numE = 11;
|
|
closedir(dp);
|
|
}
|
|
|
|
//Com_Printf("number of episodes: %i\n", numE);
|
|
//gsh
|
|
//if (g_version->value == SPEAROFDESTINY)
|
|
// numE = 9;
|
|
#endif
|
|
|
|
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
|
|
iphoneDrawPic( 0, 0, 480, 48, "iphone/header_episodes.tga");
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_SKILL;
|
|
}
|
|
|
|
static int dragPosition = 70;
|
|
static int dragVelocity = 0;
|
|
|
|
// Com_Printf("dragPosition: %i dragVelocity: %i\n", dragPosition, dragVelocity );
|
|
|
|
/* int height=(320-48)/2;
|
|
//iphoneDrawPic( 480-64, 60, 64, 64, "iphone/button_back.tga");
|
|
if (iphoneDrawPicWithTouch( 480-64, 48, 64, height, "iphone/button_back.tga"))//TouchDown(480-64, 60, 64, 64))
|
|
dragVelocity = -25;
|
|
//iphoneDrawPic( 480-64, 60+64, 64, 64, "iphone/button_back.tga");
|
|
if ( iphoneDrawPicWithTouch( 480-64, height+48, 64, height, "iphone/button_back.tga"))//TouchDown(480-64, 60+64, 64, 64))
|
|
dragVelocity = 25;
|
|
*/
|
|
int lowerLimit = -320;
|
|
lowerLimit = 70-(11-4)*(48+20);
|
|
iphoneUpdateScrollingDrags(&dragPosition, &dragVelocity, 55, lowerLimit, 0, RectMake(0, 48, 480-48, 320-64));
|
|
|
|
// 96 x 48 images
|
|
for ( e = 0 ; e < numE ; e++ ) {
|
|
|
|
my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 );
|
|
|
|
//light the episode we are currently on
|
|
if (currentMap.episode > 5 && currentMap.episode < 10)
|
|
{
|
|
//int tempEpisode = 6;
|
|
int levelNum = currentMap.episode*10 + currentMap.map;
|
|
|
|
//check for spear of destiny episodes
|
|
if (levelNum == 78 || (levelNum >= 60 && levelNum < 65))
|
|
{
|
|
if ( e != 6 )
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
else if (levelNum >= 65 && levelNum < 70)
|
|
{
|
|
if ( e != 7 )
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
else if ((levelNum >= 70 && levelNum < 76) || levelNum == 79)
|
|
{
|
|
if ( e != 8 )
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
else if (levelNum == 76 || levelNum == 77 || levelNum == 80)
|
|
{
|
|
if ( e != 9 )
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
|
|
}
|
|
else if ( e != (int)episode->value ) {
|
|
pfglColor3f( 0.5, 0.5, 0.5 );
|
|
}
|
|
|
|
//Com_Printf("isTouchMoving value: %i\n", isTouchMoving);
|
|
|
|
|
|
int height = 48;
|
|
int spacing = 20;//10;
|
|
//if ( iphoneDrawPicInBoxWithTouch( 48, dragPosition+(height+spacing)*e, 384, height, str ) && !dragVelocity ) {
|
|
/* if (iphoneDrawPicInBoxWithTouchSpecified(RectMake(0, dragPosition+(height+spacing)*e, 480, height),
|
|
RectMake(0, dragPosition+(height+spacing)*e, 480, height),
|
|
str,
|
|
RectMake(0, 48, 480, 320-48) )//RectMake(0, 42, 480, 238) )
|
|
&& !dragVelocity
|
|
&& !isTouchMoving )//touchedFrameNum >= NUM_TOUCHFRAME ) //must hold finger down for 10 frames
|
|
*/// iphoneDrawPicInBoxWithTouchAndVelocity
|
|
if (iphoneDrawPicInBoxWithTouchAndVelocity(RectMake(0, dragPosition+(height+spacing)*e, 480, height),
|
|
RectMake(0, dragPosition+(height+spacing)*e, 480, height),
|
|
str,
|
|
RectMake(0, 48, 480, 320-48), dragVelocity | isTouchMoving ) )//RectMake(0, 42, 480, 238) )
|
|
//&& !dragVelocity
|
|
//&& !isTouchMoving )
|
|
{
|
|
//if they haven't downloaded any custom maps, but choose custom maps, goto the more menu
|
|
if (e == 10 && !doesUserMapsExist)
|
|
{
|
|
wasDLInstructionsCalledFromEpisodeMenu = 1;
|
|
menuState = IPM_DOWNLOADINSTRUCTIONS;
|
|
pfglColor3f( 1, 1, 1 );
|
|
break;
|
|
}
|
|
Cvar_SetValue( episode->name, e );
|
|
menuState = IPM_MAPS;
|
|
}
|
|
pfglColor3f( 1, 1, 1 );
|
|
}
|
|
|
|
//update the number of frames the touch is down
|
|
if ( TouchDown(0, 0, 480, 320) ) {
|
|
int dframe = iphoneFrameNum - lastTouchFrame;
|
|
touchedFrameNum += dframe;
|
|
}
|
|
else {
|
|
touchedFrameNum = 0;
|
|
}
|
|
lastTouchFrame = iphoneFrameNum;
|
|
|
|
#ifdef LITE
|
|
// buy more episodes button
|
|
GetMoreLevels( 240 - 64, 200 );
|
|
#else
|
|
#ifdef SPEARSTOREKIT
|
|
if (g_version->value != SPEAROFDESTINY) //gsh
|
|
GetSpearOfDestiny( 240 - 64, 232 );
|
|
#endif
|
|
#endif
|
|
|
|
if ( MenuButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
}
|
|
//gsh
|
|
extern void iphoneDrawRewards(int m, int s, int x, int y);
|
|
//gsh
|
|
extern int returnButtonFrameNum;
|
|
/*
|
|
//gsh... this is for the map selections
|
|
colour4_t colorSecret = { 80, 0, 0, 100 };
|
|
//colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 0 };
|
|
colour4_t colorTried = { 120, 120, 0, 100 };
|
|
colour4_t colorCompleted = { 0, 0, 120, 80 };
|
|
*/
|
|
colour4_t colorSecret = { 120, 0, 60, 100 };
|
|
//colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 150 };
|
|
colour4_t colorTried = { 80, 80, 80, 40 };
|
|
colour4_t colorCompleted = { 0, 120, 0, 80 };
|
|
|
|
/*
|
|
========================
|
|
iphoneDrawWolf3dMaps
|
|
gsh
|
|
========================
|
|
*/
|
|
void iphoneDrawWolf3dMaps(int dragPosition, int dragVelocity, int e, int s, int height, int spacing, int touchedFrameNum)
|
|
{
|
|
char str[64];
|
|
/*
|
|
colour4_t colorSecret = { 64, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorTried = { 80, 80, 0, 100 };
|
|
colour4_t colorCompleted = { 0, 80, 0, 100 };
|
|
*/
|
|
|
|
|
|
|
|
// draw the individual maps
|
|
for ( int m = 0 ; m < 10; m++ ) {
|
|
int y;
|
|
|
|
switch(m) {
|
|
case 9: sprintf( str, "SECRET" ); break;
|
|
case 8: sprintf( str, "BOSS" ); break;
|
|
default: sprintf( str, "LEVEL %i", m+1 ); break;
|
|
}
|
|
|
|
y = m*(height + spacing) + dragPosition;
|
|
|
|
unsigned char *color = colorNoTry;
|
|
// decide on the background color
|
|
int levelNum = e*10+m;
|
|
int ch = currentMap.mapFlags[s][levelNum];
|
|
|
|
// bit1 = attempted
|
|
// bit2 = completed
|
|
// bit3 = 100% kills
|
|
// bit4 = 100% secrets
|
|
// bit5 = 100% treasure
|
|
if ( m == 9 && !( ch & MF_TRIED ) ) {
|
|
color = colorSecret;
|
|
} else if ( ch & MF_COMPLETED ) {
|
|
color = colorCompleted;
|
|
} else if ( ch & MF_TRIED ) {
|
|
color = colorTried;
|
|
} else {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
// blink the level you are currently on
|
|
if ( ( iphoneFrameNum & 8 ) && m == currentMap.map && e == currentMap.episode ) {
|
|
color = colorNoTry;
|
|
}
|
|
/*
|
|
//TODO: delete this switch statement
|
|
switch (m%4){
|
|
case 0: color = colorSecret; break;
|
|
case 1: color = colorTried; break;
|
|
case 2: color = colorCompleted; break;
|
|
case 3: color = colorNoTry; break;
|
|
}*/
|
|
|
|
rect_t box = RectMake(0, 48, 480, 320-48);
|
|
int borderWidth = 40;
|
|
/* if (iphoneDrawPicInBoxWithTouchSpecifiedAndColor(RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
"iphone/menu_bar.tga",
|
|
box,
|
|
color) && !dragVelocity
|
|
&& !isTouchMoving)//touchedFrameNum >= 10)
|
|
*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
"iphone/menu_bar.tga",
|
|
box,
|
|
color, dragVelocity | isTouchMoving) )// && !dragVelocity
|
|
//&& !isTouchMoving)
|
|
{
|
|
// don't let them go to the secret level unless they earned it
|
|
if ( m == 9 && !( ch & MF_TRIED ) )
|
|
continue;
|
|
|
|
PL_NewGame( &Player );
|
|
iphoneStartMap( e, m, s );
|
|
iphoneFrameNum = 0;
|
|
returnButtonFrameNum = 100;
|
|
iphonePreloadBeforePlay();
|
|
}
|
|
|
|
//draw the rewards
|
|
iphoneDrawRewards(e*10+m, s, 0, y);
|
|
|
|
//iphoneCenterText( x, y, str );
|
|
// iphoneDrawTextInBox(RectMake(100, y, 16, 16), 500, str, box);
|
|
// iphoneDrawText(100, y, 16, 16, str);
|
|
// pfglColor4ub(0xE1, 0xA6, 0x0, 0xFF);
|
|
// iphoneDrawText( 100, y , 16, 16, str );
|
|
// pfglColor4ub(0xFF, 0xFF, 0xFF, 0xFF);
|
|
iphoneDrawMapName( RectMake(100, y, 16, 16), str);
|
|
// iphoneDrawMapName( RectMake(100, y, 32, 32), str);
|
|
// iphoneFrameNum = 0;
|
|
// returnButtonFrameNum = 100;//60;
|
|
}
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawSpearMaps
|
|
gsh
|
|
==================
|
|
*/
|
|
|
|
void iphoneDrawSpearMaps(int dragPosition, int dragVelocity, int fakeEpisode, int s, int height, int spacing, int touchedFrameNum)
|
|
{
|
|
char str[64];
|
|
/*
|
|
colour4_t colorSecret = { 64, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorTried = { 80, 80, 0, 100 };
|
|
colour4_t colorCompleted = { 0, 80, 0, 100 };
|
|
*
|
|
//TODO: change these colors!!!!
|
|
colour4_t colorSecret = { 80, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorTried = { 120, 120, 0, 100 };
|
|
colour4_t colorCompleted = { 0, 0, 120, 80 };
|
|
*/
|
|
int numMaps = 0;
|
|
switch (fakeEpisode) {
|
|
case 6: numMaps = 6; break; //tunnels maps 1-5, 19
|
|
//case 7: numMaps = 6; break; //dungeon maps 6-10, 20
|
|
//case 8: numMaps = 6; break; //castle maps 11-16
|
|
case 7: numMaps = 5; break; //dungeon maps 6-10
|
|
case 8: numMaps = 7; break; //castle maps 11-16, 20
|
|
case 9: numMaps = 3; break; //final maps 17, 18 and 21
|
|
default: break;
|
|
}
|
|
|
|
//the real episode & map values
|
|
int e = 6;
|
|
int m = 0;
|
|
|
|
// draw the individual maps
|
|
for ( int fakeMap = 0; fakeMap < numMaps; fakeMap++ ) {
|
|
int y;
|
|
|
|
if (fakeEpisode == 9)
|
|
{
|
|
switch(fakeMap) {
|
|
case 0: sprintf( str, "Ramparts" ); break;
|
|
case 1: sprintf( str, "Death Knight" ); break;
|
|
case 2: sprintf( str, "Dungeon Dimension" ); break;
|
|
default: sprintf( str, "LEVEL %i", fakeMap+1 ); break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch(fakeMap) {
|
|
case 6: if (fakeEpisode == 8) sprintf(str, "SECRET"); break;
|
|
case 5: if (fakeEpisode == 8) sprintf( str, "BOSS" ); else sprintf( str, "SECRET" ); break;
|
|
case 4: if (fakeEpisode != 8){ sprintf( str, "BOSS" ); break; }
|
|
default: sprintf( str, "LEVEL %i", fakeMap+1 ); break;
|
|
}
|
|
}
|
|
|
|
//get the real episode and map and store in e, m
|
|
e = fakeEpisode;
|
|
m = fakeMap;
|
|
switch (fakeEpisode)
|
|
{
|
|
case 6:
|
|
if (fakeMap == 5) {
|
|
e = 7;
|
|
m = 8;
|
|
}
|
|
break;
|
|
case 7:
|
|
e = 6;
|
|
m += 5;
|
|
break;
|
|
case 8:
|
|
e = 7;
|
|
if (fakeMap == 6)
|
|
m = 9;
|
|
break;
|
|
case 9:
|
|
if ( fakeMap == 0) { e = 7; m = 6; }
|
|
if ( fakeMap == 1) { e = 7; m = 7; }
|
|
if ( fakeMap == 2) { e = 8; m = 0; }
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Com_Printf("fakeEpisode: %i fakeMap: %i\n", fakeEpisode, fakeMap);
|
|
Com_Printf("e: %i m: %i\n", e, m);
|
|
|
|
y = fakeMap*(height + spacing) + dragPosition;
|
|
|
|
// decide on the background color
|
|
unsigned char *color = colorNoTry;
|
|
int levelNum = e*10+m;
|
|
int ch = currentMap.mapFlags[s][levelNum];
|
|
|
|
// bit1 = attempted
|
|
// bit2 = completed
|
|
// bit3 = 100% kills
|
|
// bit4 = 100% secrets
|
|
// bit5 = 100% treasure
|
|
if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) ) {
|
|
color = colorSecret;
|
|
} else if ( ch & MF_COMPLETED ) {
|
|
color = colorCompleted;
|
|
} else if ( ch & MF_TRIED ) {
|
|
color = colorTried;
|
|
} else {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
//blink the level you are currently on
|
|
if ( ( iphoneFrameNum & 8 ) && m == currentMap.map && e == currentMap.episode ) {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
rect_t box = RectMake(0, 48, 480, 320-48);
|
|
int borderWidth = 40;
|
|
/* if (iphoneDrawPicInBoxWithTouchSpecifiedAndColor(RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
"iphone/menu_bar.tga",
|
|
box,
|
|
color) && !dragVelocity
|
|
&& !isTouchMoving)//touchedFrameNum >= NUM_TOUCHFRAME)
|
|
*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
"iphone/menu_bar.tga",
|
|
box,
|
|
color, dragVelocity | isTouchMoving ) )
|
|
//&& !isTouchMoving)
|
|
{
|
|
//diagnostic info
|
|
Com_Printf("fakeEpisode: %i fakeMap: %i\n", fakeEpisode, fakeMap);
|
|
Com_Printf("e: %i m: %i\n", e, m);
|
|
|
|
// don't let them go to the secret level unless they earned it
|
|
if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) )
|
|
continue;
|
|
|
|
PL_NewGame( &Player );
|
|
iphonePreloadBeforePlay();
|
|
iphoneStartMap(e, m, s);
|
|
iphoneFrameNum = 0;
|
|
returnButtonFrameNum = 100;
|
|
break; //break the loop... no need to keep looping
|
|
}
|
|
|
|
//draw the rewards
|
|
iphoneDrawRewards(levelNum, s, 0, y);
|
|
|
|
//draw map name
|
|
iphoneDrawMapName( RectMake(100, y, 16, 16), str);
|
|
}
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneDrawUserCreatedMaps
|
|
gsh
|
|
==================
|
|
*/
|
|
int iphoneDrawUserCreatedMaps(int dragPosition, int dragVelocity, /*int fakeEpisode,*/ int skillValue, int height, int spacing, int touchedFrameNum)
|
|
{
|
|
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)
|
|
{
|
|
/*
|
|
//colour4_t colorSecret = { 64, 0, 0, 100 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 100 };
|
|
colour4_t colorTried = { 80, 80, 0, 100 };
|
|
colour4_t colorCompleted = { 0, 80, 0, 100 };
|
|
*/
|
|
unsigned char *color = colorNoTry;
|
|
|
|
int y = dragPosition;//Yoffset;
|
|
|
|
//draw the custom map spacing
|
|
//y += height + spacing;
|
|
iphoneDrawPic( 0, 0, 480, 48, "iphone/header_ep10.tga");
|
|
|
|
Com_Printf("y: %i\n", y);
|
|
|
|
while (ep = readdir (dp))
|
|
{
|
|
//if you find a .DS_Store file... ignore it!
|
|
if ( strcmp(ep->d_name, ".DS_Store") == 0 )
|
|
continue;
|
|
|
|
++numMaps;
|
|
if (numMaps < 3) //skip the '.' and '..'
|
|
continue;
|
|
|
|
//Com_Printf("y: %i\n", y);
|
|
|
|
//draw the names!
|
|
if ( y >= 0 && y < 320 )
|
|
{
|
|
//grab map info
|
|
int levelNum = numMaps-3 + 100;
|
|
int ch = currentMap.mapFlags[skillValue][levelNum];
|
|
|
|
// bit1 = attempted
|
|
// bit2 = completed
|
|
// bit3 = 100% kills
|
|
// bit4 = 100% secrets
|
|
// bit5 = 100% treasure
|
|
if ( ch & MF_COMPLETED ) {
|
|
color = colorCompleted;
|
|
} else if ( ch & MF_TRIED ) {
|
|
color = colorTried;
|
|
} else {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
//comment to display completed user maps
|
|
color = colorNoTry;
|
|
|
|
//blink the level you are currently on
|
|
if ( ( iphoneFrameNum & 8 ) && (currentMap.map+10*currentMap.episode)==levelNum ) {
|
|
//color = colorNoTry;
|
|
color = colorTried;
|
|
}
|
|
|
|
int borderWidth = 40;
|
|
rect_t box = RectMake(0, 48, 480, 320-48);
|
|
if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
RectMake(borderWidth, y - 9, 480-2*borderWidth, height),
|
|
"iphone/menu_bar.tga",
|
|
box,
|
|
color, dragVelocity | isTouchMoving) )
|
|
{
|
|
//reset the player to new
|
|
PL_NewGame( &Player );
|
|
|
|
//set episode and map numbers and load map
|
|
int e = 10; //10 will be used to show a custom map
|
|
Cvar_SetValue( episode->name, e );
|
|
iphonePreloadBeforePlay(); //make sure all necessary textures are loaded
|
|
iphoneStartUserMap( e, numMaps - 3, skillValue, ep->d_name );
|
|
iphoneFrameNum = 0;
|
|
returnButtonFrameNum = 100;
|
|
break; //no point in continuing the loop
|
|
}
|
|
|
|
|
|
pfglColor4f(0, 0, 0, 1);
|
|
iphoneCenterArialText( 240+1, y +25+1, 0.9f, ep->d_name );
|
|
iphoneCenterArialText( 240+2, y +25+2, 0.9f, ep->d_name );
|
|
pfglColor4f(225.0f/255, 166.0f/255, 0, 1);
|
|
pfglColor4f(225.0f/255, 242.0f/255, 0, 1);
|
|
iphoneCenterArialText( 240, y +25, 0.9f, ep->d_name );
|
|
pfglColor4f(1, 1, 1, 1);
|
|
|
|
//draw the rewards
|
|
//uncomment to display rewards
|
|
//iphoneDrawRewards(numMaps-2+90, skillValue, 0, y);
|
|
}
|
|
|
|
y += height + spacing;
|
|
}
|
|
closedir (dp);
|
|
|
|
--numMaps;
|
|
--numMaps;
|
|
}
|
|
|
|
return numMaps;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneScrollingMapMenu
|
|
gsh
|
|
==================
|
|
*/
|
|
extern int forceDrawRewards;
|
|
void iphoneScrollingMapMenu()
|
|
{
|
|
#ifdef LITE
|
|
# define NUM_MAPS 3
|
|
#else
|
|
# define NUM_MAPS 10
|
|
#endif
|
|
|
|
|
|
//used for preventing accidental touches
|
|
//user must hold touch down for 10 frames in order to load map
|
|
static int touchedFrameNum = 0;
|
|
static int lastTouchFrame = 0;
|
|
|
|
int e, s;
|
|
char str[64];
|
|
|
|
int height = 48;
|
|
int spacing = 20;//10;
|
|
|
|
static int dragPosition = 70;
|
|
static int dragVelocity = 0;
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
/*
|
|
//static int forceDrawRewards = 0;
|
|
//This is only for debugging/testing out the look of the medals
|
|
//TODO: delete or comment out
|
|
if (iphoneDrawPicWithTouch(0, 320-40, 40, 40, "iphone/button_back.tga"))
|
|
{
|
|
if (forceDrawRewards == 0)
|
|
forceDrawRewards = 1;
|
|
else
|
|
forceDrawRewards = 0;
|
|
}
|
|
|
|
*/
|
|
// draw the level selection
|
|
e = episode->value;
|
|
if ( e < 0 ) {
|
|
e = 0;
|
|
}
|
|
|
|
if ( e > 10 ) //gsh
|
|
e = 10;
|
|
|
|
s = skill->value;
|
|
if ( s < 0 ) {
|
|
s = 0;
|
|
}
|
|
if ( s > 3 ) {
|
|
s = 3;
|
|
}
|
|
|
|
//gsh
|
|
int numlevels = 10;
|
|
if ( e == 8 )
|
|
numlevels = 1;
|
|
|
|
|
|
|
|
//----------------------------
|
|
//Update Drags
|
|
/* height=(320-48)/2;
|
|
if (iphoneDrawPicWithTouch( 480-64, 48, 64, height, "iphone/button_back.tga"))
|
|
dragVelocity = -25;
|
|
if ( iphoneDrawPicWithTouch( 480-64, 48+height, 64, height, "iphone/button_back.tga"))
|
|
dragVelocity = 25;
|
|
*/ height = 48;
|
|
|
|
static int lowerLimit = 65;
|
|
/*
|
|
if ( e < 6)
|
|
lowerLimit = -250;
|
|
else if ( e < 9)
|
|
lowerLimit = -20;
|
|
else if ( e < 10)
|
|
lowerLimit = 65;
|
|
*/
|
|
if ( e < 6) {
|
|
//lowerLimit = -250;
|
|
lowerLimit = 70 - (10-4)*(height+spacing); //startPosition - (numberMaps - numberOnScreen)*(height + spacing)
|
|
}
|
|
else {
|
|
switch (e) {
|
|
case 6: //tunnels
|
|
lowerLimit = -20;
|
|
lowerLimit = 70 - (6-4)*(height+spacing);
|
|
break;
|
|
case 7: //dungeons
|
|
lowerLimit = 20;
|
|
lowerLimit = 70 - (5-4)*(height+spacing);
|
|
break;
|
|
case 8: //castle
|
|
lowerLimit = -85;
|
|
lowerLimit = 70 - (7-4)*(height+spacing);
|
|
break;
|
|
case 9: //ramparts
|
|
lowerLimit = 65;
|
|
break;
|
|
}
|
|
}
|
|
/*
|
|
if ( e == 7 )
|
|
lowerLimit = 20;
|
|
|
|
if ( e == 8 )
|
|
lowerLimit = -85;
|
|
*/
|
|
iphoneUpdateScrollingDrags(&dragPosition, &dragVelocity, 65, lowerLimit, 0, RectMake(0, 48, 480-48, 320-64));
|
|
//----------------------------
|
|
|
|
if ( e < 6 )
|
|
iphoneDrawWolf3dMaps(dragPosition, dragVelocity, e, s, height, spacing, touchedFrameNum);
|
|
else if ( e < 10 )
|
|
iphoneDrawSpearMaps(dragPosition, dragVelocity, e, s, height, spacing, touchedFrameNum);
|
|
else {
|
|
int numMaps = iphoneDrawUserCreatedMaps(dragPosition, dragVelocity, s, height, spacing, touchedFrameNum);
|
|
|
|
lowerLimit = 65;
|
|
if (numMaps > 4) {
|
|
//lowerLimit = 269 - (numMaps-1)*(spacing + height);
|
|
//lowerLimit = 65 - (numMaps - 4)*(spacing + height) + 30;
|
|
lowerLimit = 70 - (numMaps-4)*(height+spacing);
|
|
}
|
|
}
|
|
|
|
|
|
//update the number of frames the touch is down
|
|
if ( TouchDown(0, 0, 480, 320) ) {
|
|
int dframe = iphoneFrameNum - lastTouchFrame;
|
|
touchedFrameNum += dframe;
|
|
}
|
|
else {
|
|
touchedFrameNum = 0;
|
|
}
|
|
lastTouchFrame = iphoneFrameNum;
|
|
|
|
|
|
// draw the header for the episode
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep%i.tga", e+1 );
|
|
iphoneDrawPic( 0, 0, 480, 48, str );
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_EPISODE;
|
|
}
|
|
if ( MenuButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
}
|
|
/*
|
|
==================
|
|
iphoneMapMenu
|
|
|
|
==================
|
|
*/
|
|
void iphoneMapMenu() {
|
|
#ifdef LITE
|
|
# define NUM_MAPS 3
|
|
#else
|
|
# define NUM_MAPS 10
|
|
#endif
|
|
int e, m, s;
|
|
char str[64];
|
|
|
|
if ( BackButton() ) {
|
|
menuState = IPM_EPISODE;
|
|
}
|
|
|
|
// draw the level selection
|
|
e = episode->value;
|
|
if ( e < 0 ) {
|
|
e = 0;
|
|
}/*gsh
|
|
if ( e > 5 ) {
|
|
e = 5;
|
|
}*/
|
|
if ( e > 8 ) //gsh
|
|
e = 8;
|
|
//if player chose SOD maps... draw all 21 SOD maps.. gsh
|
|
/* if ( e >= 6 ){
|
|
iphoneDrawSODMaps(); //this function didn't seem to be working out
|
|
return;
|
|
}
|
|
*/
|
|
s = skill->value;
|
|
if ( s < 0 ) {
|
|
s = 0;
|
|
}
|
|
if ( s > 3 ) {
|
|
s = 3;
|
|
}
|
|
|
|
//gsh
|
|
int numlevels = 10;
|
|
if ( e == 8 )
|
|
numlevels = 1;
|
|
|
|
// draw the episode selection
|
|
my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 );
|
|
iphoneDrawPicWithTouch( 96, 0, 384, 48, str );
|
|
|
|
// draw the individual maps
|
|
for ( m = 0 ; m < NUM_MAPS; m++ ) {
|
|
int x;
|
|
int y;
|
|
colour4_t colorSecret = { 64, 0, 0, 255 };
|
|
colour4_t colorNoTry = { 0, 0, 0, 255 };
|
|
colour4_t colorTried = { 80, 80, 0, 255 };
|
|
colour4_t colorCompleted = { 0, 80, 0, 255 };
|
|
|
|
if ( m == 9 ) {
|
|
sprintf( str, "SECRET" );
|
|
x = 120;
|
|
y = 90 + 160;
|
|
} else if ( m == 8 ) {
|
|
sprintf( str, "BOSS" );
|
|
x = 360;
|
|
y = 90 + 160;
|
|
} else {
|
|
sprintf( str, "LEVEL %i", m+1 );
|
|
x = 60 + 120 * ( m % 4 );
|
|
y = 90 + 80 * ( m / 4 );
|
|
}
|
|
|
|
unsigned char *color = colorNoTry;
|
|
// decide on the background color
|
|
int levelNum = e*10+m;
|
|
int ch = currentMap.mapFlags[s][levelNum];
|
|
|
|
Com_Printf("Map: %i ch: %i\n", levelNum, ch);
|
|
// bit1 = attempted
|
|
// bit2 = completed
|
|
// bit3 = 100% kills
|
|
// bit4 = 100% secrets
|
|
// bit5 = 100% treasure
|
|
if ( m == 9 && !( ch & MF_TRIED ) ) {
|
|
color = colorSecret;
|
|
} else if ( ch & MF_COMPLETED ) {
|
|
color = colorCompleted;
|
|
} else if ( ch & MF_TRIED ) {
|
|
color = colorTried;
|
|
} else {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
// blink the level you are currently on
|
|
if ( ( iphoneFrameNum & 8 ) && m == currentMap.map && e == currentMap.episode ) {
|
|
color = colorNoTry;
|
|
}
|
|
|
|
// draw the level text and check for button hit
|
|
if ( TouchDown( x-46, y-9, 88, 32 ) ) {
|
|
color = colorPressed;
|
|
}
|
|
R_Draw_Fill( x-46, y-9, 88, 32, color );
|
|
iphoneCenterText( x, y, str );
|
|
|
|
// draw awards
|
|
if ( ch & MF_KILLS ) {
|
|
iphoneDrawPic( x-46,y+23, 22, 22, "iphone/kills.tga" );
|
|
}
|
|
if ( ch & MF_SECRETS ) {
|
|
iphoneDrawPic( x-24,y+23, 22, 22, "iphone/secrets.tga" );
|
|
}
|
|
if ( ch & MF_TREASURE ) {
|
|
iphoneDrawPic( x-2,y+23, 22, 22, "iphone/treasure.tga" );
|
|
}
|
|
if ( ch & MF_TIME ) {
|
|
iphoneDrawPic( x+20,y+23, 22, 22, "iphone/partime.tga" );
|
|
}
|
|
|
|
// don't let them go to the secret level unless they earned it
|
|
if ( m == 9 && !( ch & MF_TRIED ) ) {
|
|
continue;
|
|
}
|
|
|
|
if ( TouchReleased( x - 46, y - 9, 88, 32 ) ) {
|
|
PL_NewGame( &Player );
|
|
iphoneStartMap( e, m, s );
|
|
iphonePreloadBeforePlay();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneStartIntermission
|
|
|
|
The framesFromNow value allow boss death animations to be triggered
|
|
==================
|
|
*/
|
|
void iphoneStartIntermission( int framesFromNow ) {
|
|
// this goes in the savegame if they save at the intermission point,
|
|
// which will cause it to come back up there on return
|
|
currentMap.levelCompleted = 1;
|
|
|
|
// mark this level as having been completed for the level selection menu
|
|
int mapNum = currentMap.episode * 10 + currentMap.map;
|
|
|
|
// note that this has been tried now
|
|
currentMap.mapFlags[currentMap.skill][mapNum] |= MF_COMPLETED;
|
|
|
|
// mark the awards
|
|
if ( levelstate.time / 60.0f <= levelstate.fpartime * 60 ) { // fpartime is in minutes, time is in tics
|
|
currentMap.mapFlags[currentMap.skill][mapNum] |= MF_TIME;
|
|
}
|
|
if( levelstate.killed_monsters == levelstate.total_monsters ) {
|
|
currentMap.mapFlags[currentMap.skill][mapNum] |= MF_KILLS;
|
|
}
|
|
if( levelstate.found_secrets == levelstate.total_secrets ) {
|
|
currentMap.mapFlags[currentMap.skill][mapNum] |= MF_SECRETS;
|
|
}
|
|
if( levelstate.found_treasure == levelstate.total_treasure ) {
|
|
currentMap.mapFlags[currentMap.skill][mapNum] |= MF_TREASURE;
|
|
}
|
|
|
|
intermissionStartFrameNum = iphoneFrameNum;
|
|
|
|
if ( framesFromNow ) {
|
|
intermissionTriggerFrame = iphoneFrameNum + framesFromNow;
|
|
return;
|
|
}
|
|
|
|
intermissionTriggerFrame = 0;
|
|
menuState = IPM_INTERMISSION;
|
|
hasReleased = 0; // ensure touch up before skipping intermission
|
|
}
|
|
|
|
/*
|
|
==================
|
|
DrawDigit
|
|
|
|
==================
|
|
*/
|
|
void DrawDigit( int x, int y, int digit ) {
|
|
R_Bind( numberPics[digit]->texnum );
|
|
pfglBegin( GL_QUADS );
|
|
|
|
pfglTexCoord2f( 0, 0 ); pfglVertex2i( x, y );
|
|
pfglTexCoord2f( 1, 0 ); pfglVertex2i( x+32, y );
|
|
pfglTexCoord2f( 1, 1 ); pfglVertex2i( x+32, y+32 );
|
|
pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+32 );
|
|
|
|
pfglEnd();
|
|
}
|
|
|
|
void DrawDoubleDigit( int x, int y, int number ) {
|
|
int step = 32;
|
|
if ( number >= 100 ) {
|
|
// cram three digits into the same space
|
|
DrawDigit( x-8, y, number / 100 );
|
|
number %= 100;
|
|
x += 16;
|
|
step = 24;
|
|
}
|
|
if ( number >= 10 ) {
|
|
DrawDigit( x, y, number / 10 );
|
|
number %= 10;
|
|
}
|
|
DrawDigit( x+step, y, number );
|
|
}
|
|
|
|
void DrawTime( int x, int y, int seconds ) {
|
|
int min = seconds / 60;
|
|
int sec = seconds % 60;
|
|
|
|
DrawDoubleDigit( x, y, min );
|
|
// DrawDoubleDigit( x+76, y, sec );
|
|
// always print both digits of seconds, so 2:00 prints correctly
|
|
DrawDigit( x+76, y, sec / 10 );
|
|
DrawDigit( x+76+32, y, sec % 10 );
|
|
}
|
|
|
|
void DrawRatio( int y, int got, int total, const char *bonusPic ) {
|
|
DrawDoubleDigit( 285, y, got );
|
|
DrawDoubleDigit( 361, y, total );
|
|
|
|
// draw the award icon
|
|
if ( got == total ) {
|
|
iphoneDrawPic( 480 - 40, y, 32, 32, bonusPic );
|
|
}
|
|
}
|
|
|
|
/*
|
|
==================
|
|
DrawIntermissionStats
|
|
|
|
Used for both the intermission and the stats view
|
|
==================
|
|
*/
|
|
void DrawIntermissionStats() {
|
|
char str[128];
|
|
|
|
//gsh
|
|
// iphoneDrawPic( 0, 0, 480, 320, "iphone/intermission_256.tga" );
|
|
iphoneDrawPic( 0, 0, 480, 320, "iphone/intermission.tga" );
|
|
|
|
// episode
|
|
//if (currentMap.episode < 10)//6) //gsh added the check for SOD
|
|
// my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", currentMap.episode+1 );
|
|
|
|
//display the correct episode header
|
|
if (currentMap.episode < 6)
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep%i.tga", currentMap.episode+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: case 78:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep7.tga" );
|
|
break;
|
|
case 65: case 66: case 67: case 68: case 69: case 79:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep8.tga" );
|
|
break;
|
|
case 70: case 71: case 72: case 73: case 74: case 75:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep9.tga" );
|
|
break;
|
|
case 76: case 77: case 80:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep10.tga" );
|
|
break;
|
|
/* case 77:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep10.tga" );
|
|
break;
|
|
case 80:
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep10.tga" );
|
|
break;
|
|
*/ default:
|
|
sprintf( str, " ");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
my_snprintf( str, sizeof( str ), "iphone/header_ep11.tga" );
|
|
//else
|
|
// my_snprintf( str, sizeof( str ), "iphone/button_epSOD.tga");
|
|
|
|
// iphoneDrawPic( 0, 0, 384, 48, str );
|
|
// iphoneDrawPic( -104, 0, 480, 48, str ); //gsh
|
|
iphoneDrawPic( 0, 0, 480, 48, str ); //gsh
|
|
|
|
// level
|
|
// iphoneDrawNumber( 430, 0, currentMap.map + 1, 48, 48 );
|
|
// iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 ); //gsh
|
|
|
|
//display the appropriate mission number
|
|
if (currentMap.episode < 6)
|
|
iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 );
|
|
else if (currentMap.episode < 10) {
|
|
int currentLevel = currentMap.episode * 10 + currentMap.map;
|
|
switch (currentLevel) {
|
|
case 60: case 61: case 62: case 63: case 64:
|
|
iphoneDrawNumber( 430-48, 50, currentLevel - 60 + 1, 48, 48 );
|
|
break;
|
|
case 78:
|
|
iphoneDrawNumber( 430-48, 50, 6, 48, 48 );
|
|
break;
|
|
case 65: case 66: case 67: case 68: case 69:
|
|
iphoneDrawNumber( 430-48, 50, currentLevel - 65 + 1, 48, 48 );
|
|
break;
|
|
case 79:
|
|
iphoneDrawNumber( 430-48, 50, 6, 48, 48 );
|
|
break;
|
|
case 70: case 71: case 72: case 73: case 74: case 75:
|
|
iphoneDrawNumber( 430-48, 50, currentLevel - 70 + 1, 48, 48 );
|
|
break;
|
|
case 76:
|
|
iphoneDrawNumber( 430-48, 50, 1, 48, 48 );
|
|
break;
|
|
case 77:
|
|
iphoneDrawNumber( 430-48, 50, 2, 48, 48 );
|
|
break;
|
|
case 80:
|
|
iphoneDrawNumber( 430-48, 50, 3, 48, 48 );
|
|
break;
|
|
default:
|
|
sprintf( str, " ");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 );
|
|
|
|
|
|
// par / time
|
|
int offset = 50;
|
|
DrawTime( 51, 63+offset, levelstate.fpartime * 60 ); // fpartime is in minutes
|
|
DrawTime( 285, 63+offset, levelstate.time / 60 ); // levelstate.time is in tics
|
|
if ( levelstate.time/60 <= levelstate.fpartime * 60 ) {
|
|
iphoneDrawPic( 480 - 40, 63+offset, 32, 32, "iphone/partime.tga" );
|
|
}
|
|
|
|
// ratios
|
|
int correction = 8;
|
|
DrawRatio( 124+offset-1*correction, levelstate.killed_monsters, levelstate.total_monsters, "iphone/kills.tga" );
|
|
DrawRatio( 189+offset-2*correction, levelstate.found_secrets, levelstate.total_secrets, "iphone/secrets.tga" );
|
|
DrawRatio( 255+offset-3*correction, levelstate.found_treasure, levelstate.total_treasure, "iphone/treasure.tga" );
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneIntermission
|
|
|
|
==================
|
|
*/
|
|
void iphoneIntermission() {
|
|
int nextLevel = 0;
|
|
|
|
DrawIntermissionStats();
|
|
|
|
// require all touches off before the intermission can exit
|
|
if ( numTouches == 0 && hasReleased == 0 ) {
|
|
hasReleased = 1;
|
|
return; // don't let the TouchReleased immediately fire
|
|
}
|
|
if ( !hasReleased ) {
|
|
return;
|
|
}
|
|
|
|
//----------------------
|
|
// tap for next level
|
|
//----------------------
|
|
if ( !TouchReleased( 0, 0, 480, 320 ) ) {
|
|
return;
|
|
}
|
|
|
|
menuState = IPM_GAME;
|
|
|
|
PL_NextLevel( &Player );
|
|
|
|
if( g_version->value == SPEAROFDESTINY && currentMap.episode >= 6 && currentMap.episode < 9)//added the episode check... gsh)
|
|
{
|
|
//added all this leveling stuff... gsh
|
|
int currentLevel = currentMap.episode * 10 + currentMap.map;
|
|
nextLevel = currentLevel + 1;
|
|
switch (currentLevel) {
|
|
case 78: nextLevel = 64; break; //if tunnels secret was defeated goto tunnels boss
|
|
// case 79: nextLevel = 69; break; //if dungeons secret was defeated goto dungeons boss
|
|
case 79: nextLevel = 72; break; //if castle secret was defeated goto next castle map
|
|
default: break;
|
|
}
|
|
if (Player.playstate == ex_secretlevel) {
|
|
switch (currentLevel) {
|
|
case 63: nextLevel = 78; break; //if tunnels secret was earned goto tunnels secret
|
|
//case 68: nextLevel = 79; break; //if dungeons secret was earned goto dungeons secret
|
|
case 71: nextLevel = 79; break; //if castle secret was earned goto castle secret
|
|
default: break;
|
|
}
|
|
}
|
|
if (nextLevel >= 60 + 21)
|
|
{
|
|
// show ultimate victory
|
|
menuState = IPM_VICTORY;
|
|
Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" );
|
|
return;
|
|
}
|
|
}
|
|
else if (currentMap.episode < 6) //gsh added the check if it's the original wolf3d episodes
|
|
{
|
|
int currentLevel = currentMap.episode * 10 + currentMap.map;
|
|
|
|
#ifdef LITE
|
|
switch ( currentLevel ) {
|
|
case 2:
|
|
// go back to the episode select screen
|
|
menuState = IPM_VICTORY;
|
|
Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" );
|
|
return;
|
|
default: nextLevel = currentLevel + 1; break;
|
|
}
|
|
#else
|
|
if( Player.playstate == ex_secretlevel ) {
|
|
switch( currentLevel ) {
|
|
case 0: nextLevel = 9; break;
|
|
case 10: nextLevel = 19; break;
|
|
case 26: nextLevel = 29; break;
|
|
case 32: nextLevel = 39; break;
|
|
case 44: nextLevel = 49; break;
|
|
case 52: nextLevel = 59; break;
|
|
}
|
|
} else {
|
|
switch ( currentLevel ) {
|
|
case 8:
|
|
case 18:
|
|
case 28:
|
|
case 38:
|
|
case 48:
|
|
case 58:
|
|
// go back to the episode select screen
|
|
menuState = IPM_VICTORY;
|
|
Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" );
|
|
return;
|
|
case 9: nextLevel = 1; break;
|
|
case 19: nextLevel = 11; break;
|
|
case 29: nextLevel = 27; break;
|
|
case 39: nextLevel = 33; break;
|
|
case 49: nextLevel = 44; break;
|
|
case 59: nextLevel = 53; break;
|
|
default: nextLevel = currentLevel + 1; break;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else //they just defeated a custom map... gsh
|
|
{
|
|
// go back to the episode select screen
|
|
//menuState = IPM_VICTORY;
|
|
menuState = IPM_MAPS;
|
|
Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" );
|
|
return;
|
|
}
|
|
|
|
iphoneStartMap( (nextLevel/10), (nextLevel%10), skill->value );
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneVictory
|
|
|
|
==================
|
|
*/
|
|
void iphoneVictory() {
|
|
iphoneDrawPic( 0, 0, 480, 320, "iphone/victory_256.tga" );
|
|
if ( !TouchReleased( 0, 0, 480, 320 ) ) {
|
|
return;
|
|
}
|
|
menuState = IPM_EPISODE;
|
|
//gsh menuState = IPM_MAPSELECTOR;
|
|
}
|
|
|
|
/*
|
|
==================
|
|
iphoneAutomap
|
|
|
|
==================
|
|
*/
|
|
float mapOrigin[2];
|
|
|
|
typedef struct {
|
|
W8 x, y;
|
|
short texnum;
|
|
} mapTile_t;
|
|
#define MAPTILE_SPRITE_FLAG 1024
|
|
#define MAX_MAP_TILES 5000 // 4096 tiles + sprites
|
|
mapTile_t mapTiles[MAX_MAP_TILES];
|
|
int numMapTiles;
|
|
|
|
int MapTileSort( const void *a, const void *b ) {
|
|
return ((mapTile_t *)a)->texnum - ((mapTile_t *)b)->texnum;
|
|
}
|
|
|
|
void iphoneOpenAutomap() {
|
|
mapTile_t *mt = mapTiles;
|
|
numMapTiles = 0;
|
|
int x, y;
|
|
int xx, yy;
|
|
W32 tx, ty, n;
|
|
sprite_t* sprt;
|
|
|
|
mapOrigin[0] = Player.position.origin[0] / (float)TILEGLOBAL;
|
|
mapOrigin[1] = Player.position.origin[1] / (float)TILEGLOBAL;
|
|
menuState = IPM_AUTOMAP;
|
|
|
|
// identify all the tiles to fill in
|
|
for( x = 0 ; x < 64; ++x ) {
|
|
for( y = 0 ; y < 64; ++y ) {
|
|
if ( r_world->tilemap[ x ][ y ] & ( WALL_TILE | PUSHWALL_TILE ) ) {
|
|
int visible = 0;
|
|
// check all 8 surrounding tiles for visibility
|
|
for ( xx = -1 ; xx <= 1 ; xx++ ) {
|
|
if ( x + xx < 0 ) {
|
|
continue;
|
|
}
|
|
if ( x + xx > 63 ) {
|
|
continue;
|
|
}
|
|
for ( yy = -1 ; yy <= 1 ; yy++ ) {
|
|
if ( y + yy < 0 ) {
|
|
continue;
|
|
}
|
|
if ( y + yy > 63 ) {
|
|
continue;
|
|
}
|
|
if ( r_world->tileEverVisible[x+xx][y+yy] ) {
|
|
visible = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( !visible ) {
|
|
continue;
|
|
}
|
|
int tex = r_world->wall_tex_y[ x ][ y ];
|
|
// special hack for the elevator switch tile, which is always
|
|
// facing east west for the switch, and north south for the railing
|
|
if ( tex == 40 && ( ( x>0 && r_world->tileEverVisible[x+1][y] )
|
|
|| ( x < 63 && r_world->tileEverVisible[x-1][y] ) ) ) {
|
|
tex = r_world->wall_tex_x[ x ][ y ];
|
|
}
|
|
if ( tex < 0x6a ) { // skip pushwall destinations
|
|
assert( tex >= 0 && tex < 1000 );
|
|
mt->x = x;
|
|
mt->y = y;
|
|
mt->texnum = tex;
|
|
if ( !wallTextures[mt->texnum] ) {
|
|
LoadWallTexture(mt->texnum);
|
|
}
|
|
mt++;
|
|
continue;
|
|
}
|
|
}
|
|
if ( !r_world->tileEverVisible[x][y] ) {
|
|
continue;
|
|
}
|
|
if( r_world->tilemap[ x ][ y ] & DOOR_TILE ) {
|
|
mt->x = x;
|
|
mt->y = y;
|
|
mt->texnum = r_world->Doors.DoorMap[ x ][ y ].texture;
|
|
LoadWallTexture(mt->texnum);
|
|
mt++;
|
|
continue;
|
|
}
|
|
// solid floor
|
|
mt->x = x;
|
|
mt->y = y;
|
|
mt->texnum = -1;
|
|
mt++;
|
|
}
|
|
}
|
|
|
|
// add solid sprite objects
|
|
for( n = 0, sprt = levelData.sprites; n < levelData.numSprites; ++n, ++sprt ) {
|
|
if( sprt->flags & SPRT_REMOVE ) {
|
|
continue;
|
|
}
|
|
if ( sprt->tex[0] >= SPR_GRD_S_1 ) {
|
|
// don't draw enemies, only static sprites
|
|
continue;
|
|
}
|
|
|
|
tx = sprt->tilex;
|
|
ty = sprt->tiley;
|
|
|
|
if( tx > 63 ) {
|
|
continue;
|
|
}
|
|
if( ty > 63 ) {
|
|
continue;
|
|
}
|
|
if ( !r_world->tileEverVisible[tx][ty] ) {
|
|
continue;
|
|
}
|
|
mt->x = tx;
|
|
mt->y = ty;
|
|
mt->texnum = MAPTILE_SPRITE_FLAG | sprt->tex[0];
|
|
mt++;
|
|
|
|
if ( !spriteTextures[ sprt->tex[0] ] ) {
|
|
char name[1024];
|
|
my_snprintf( name, sizeof( name ), "sprites/%.3d.tga", sprt->tex[0] );
|
|
spriteTextures[sprt->tex[0]] = TM_FindTexture( name, TT_Sprite );
|
|
}
|
|
|
|
if ( mt == &mapTiles[MAX_MAP_TILES] ) {
|
|
break; // list is full, some items won't show (shouldn't happen)
|
|
}
|
|
}
|
|
|
|
// sort the tiles to be drawn by texture
|
|
numMapTiles = mt - mapTiles;
|
|
|
|
qsort( mapTiles, numMapTiles, sizeof( mapTiles[0] ), MapTileSort );
|
|
}
|
|
|
|
void iphoneAutomap() {
|
|
|
|
//draw the new background... gsh
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/map_background.tga");
|
|
|
|
|
|
mapTile_t *mt;
|
|
float px, py;
|
|
float angle, c, s;
|
|
int texnum;
|
|
float scale;
|
|
|
|
// do touch ops before drawing for minimum latency
|
|
|
|
scale = mapScale->value;
|
|
if ( scale < 4 ) { // ensure we don't div by 0 from a console cvar change
|
|
scale = 4;
|
|
}
|
|
|
|
// drag for scrolling
|
|
if ( numTouches == 1 ) {
|
|
if ( numPrevTouches == 1 ) {
|
|
mapOrigin[0] -= ( touches[0][0] - prevTouches[0][0] ) / scale;
|
|
mapOrigin[1] += ( touches[0][1] - prevTouches[0][1] ) / scale;
|
|
}
|
|
}
|
|
|
|
// pinch for scaling
|
|
if ( numTouches == 2 ) {
|
|
if ( numPrevTouches == 2 ) {
|
|
float curDist = sqrt(
|
|
( touches[0][0] - touches[1][0] ) * ( touches[0][0] - touches[1][0] ) +
|
|
( touches[0][1] - touches[1][1] ) * ( touches[0][1] - touches[1][1] ) );
|
|
float prevDist = sqrt(
|
|
( prevTouches[0][0] - prevTouches[1][0] ) * ( prevTouches[0][0] - prevTouches[1][0] ) +
|
|
( prevTouches[0][1] - prevTouches[1][1] ) * ( prevTouches[0][1] - prevTouches[1][1] ) );
|
|
if ( prevDist == 0 ) {
|
|
prevDist = curDist;
|
|
}
|
|
scale *= curDist / prevDist;
|
|
if ( scale < 4 ) {
|
|
scale = 4;
|
|
}
|
|
if ( scale > 64 ) {
|
|
scale = 64;
|
|
}
|
|
Cvar_SetValue( mapScale->name, scale );
|
|
}
|
|
|
|
}
|
|
|
|
// gsh - double tap for center on player
|
|
static unsigned int timeTouchDown = 0;
|
|
static int numTaps = 0;
|
|
static unsigned int lastTapTime = 0;
|
|
static int tapX = 0;
|
|
static int tapY = 0;
|
|
static int zoom = 0;
|
|
static float TargetX = 0;
|
|
static float TargetY = 0;
|
|
static float TargetZoom = 0;
|
|
static int prevTapX = 0;
|
|
static int prevTapY = 0;
|
|
|
|
//touch down
|
|
if ( numTouches == 1 && numPrevTouches == 0) {
|
|
timeTouchDown = Sys_Milliseconds();
|
|
prevTapX = tapX;
|
|
prevTapY = tapY;
|
|
tapX = touches[0][0];
|
|
tapY = touches[0][1];
|
|
}
|
|
//touch up
|
|
if ( numTouches == 0 && numPrevTouches == 1 ) {
|
|
unsigned int currentTime = Sys_Milliseconds();
|
|
|
|
//check if time between last tap and current time is too long
|
|
if (Sys_Milliseconds() - lastTapTime > 500 || zoom)
|
|
numTaps = 0;
|
|
|
|
//detect tap
|
|
if ( currentTime - timeTouchDown < 200 ) {
|
|
|
|
//record tap time if first tap
|
|
if (numTaps < 1)
|
|
lastTapTime = Sys_Milliseconds();
|
|
|
|
++numTaps;
|
|
/*
|
|
//center map on player
|
|
if (numTaps >= 2) {
|
|
numTaps = 0;
|
|
zoom = 1;
|
|
TargetX = Player.position.origin[0] / (float)TILEGLOBAL;
|
|
TargetY = Player.position.origin[1] / (float)TILEGLOBAL;
|
|
TargetZoom = scale;
|
|
}*/
|
|
|
|
//the taps need to be near each other to qualify as a double tap event
|
|
int dx = abs(tapX - prevTapX);
|
|
int dy = abs(tapY - prevTapY);
|
|
int maxTapSeparation = 60;
|
|
|
|
//safari style double tap zoom on location!
|
|
if (numTaps >= 2 && dx < maxTapSeparation && dy < maxTapSeparation) {
|
|
numTaps = 0;
|
|
zoom = 1;
|
|
//need to translate tap/screen coordinate to map coordinate
|
|
|
|
int Xrelative2screenorigin = tapX - 240;
|
|
int Yrelative2screenorigin = 160 - tapY;
|
|
float scaledX = Xrelative2screenorigin / scale;
|
|
float scaledY = Yrelative2screenorigin / scale;
|
|
float camSpaceX = scaledX + mapOrigin[0];
|
|
float camSpaceY = scaledY + mapOrigin[1];
|
|
|
|
//mapOrigin[0] = camSpaceX;
|
|
//mapOrigin[1] = camSpaceY;
|
|
|
|
TargetX = camSpaceX;
|
|
TargetY = camSpaceY;
|
|
|
|
if (scale < 32) { //zoom half way in
|
|
//scale = 32;
|
|
TargetZoom = 32;
|
|
}
|
|
else {
|
|
//scale = 4; //zoom completely out
|
|
TargetZoom = 4;
|
|
}
|
|
|
|
Cvar_SetValue( mapScale->name, scale );
|
|
}
|
|
}
|
|
else {
|
|
//no tap... reset to 0
|
|
numTaps = 0;
|
|
}
|
|
}
|
|
|
|
if (zoom)
|
|
{
|
|
int invSpeed = 2;//3;
|
|
float dist = TargetX - mapOrigin[0];
|
|
mapOrigin[0] += dist/invSpeed;
|
|
dist = TargetY - mapOrigin[1];
|
|
mapOrigin[1] += dist/invSpeed;
|
|
|
|
dist = TargetZoom - scale;
|
|
scale += dist/(2*invSpeed); //let's zoom a litle slower than we pan
|
|
|
|
|
|
Com_Printf("current: %f\n", mapOrigin[0]);
|
|
Com_Printf("target: %f\n", TargetX);
|
|
//Com_Printf("dist: %f\n\n", dist);
|
|
|
|
float tolerance = 0.5f;//3;
|
|
if ( abs(mapOrigin[0] - TargetX) < tolerance && abs(mapOrigin[1] - TargetY) < tolerance && abs(scale - TargetZoom) < tolerance/2)
|
|
{
|
|
mapOrigin[0] = TargetX;
|
|
mapOrigin[1] = TargetY;
|
|
scale = TargetZoom;
|
|
zoom = 0;
|
|
}
|
|
|
|
Cvar_SetValue( mapScale->name, scale );
|
|
}
|
|
|
|
|
|
// set up matrix for drawing in tile units
|
|
pfglMatrixMode( GL_PROJECTION );
|
|
pfglLoadIdentity();
|
|
iphoneRotateForLandscape();
|
|
pfglOrtho( mapOrigin[0]-240.0 / scale, mapOrigin[0]+240.0 / scale,
|
|
mapOrigin[1]-160.0 / scale, mapOrigin[1]+160.0 / scale, -99999, 99999 );
|
|
|
|
mt = mapTiles;
|
|
texnum = 99999;
|
|
for ( int i = 0 ; i < numMapTiles ; i++, mt++ ) {
|
|
if ( texnum != mt->texnum ) {
|
|
texnum = mt->texnum;
|
|
if ( i != 0 ) {
|
|
pfglEnd();
|
|
}
|
|
if ( mt->texnum == -1 ) {
|
|
qglDisable( GL_TEXTURE_2D );
|
|
pfglColor3f( r_world->floorColour[0]/255.0, r_world->floorColour[1]/255.0, r_world->floorColour[2]/255.0 );
|
|
} else if ( mt->texnum & MAPTILE_SPRITE_FLAG ) {
|
|
qglEnable( GL_TEXTURE_2D );
|
|
pfglColor3f( 1, 1, 1 );
|
|
R_Bind( spriteTextures[mt->texnum&~MAPTILE_SPRITE_FLAG]->texnum );
|
|
} else {
|
|
qglEnable( GL_TEXTURE_2D );
|
|
pfglColor3f( 1, 1, 1 );
|
|
R_Bind( wallTextures[mt->texnum]->texnum );
|
|
}
|
|
pfglBegin( GL_QUADS );
|
|
}
|
|
pfglTexCoord2f( 0, 1 );
|
|
pfglVertex2i( mt->x, mt->y );
|
|
pfglTexCoord2f( 1, 1 );
|
|
pfglVertex2i( mt->x+1, mt->y );
|
|
pfglTexCoord2f( 1, 0 );
|
|
pfglVertex2i( mt->x+1, mt->y+1 );
|
|
pfglTexCoord2f( 0, 0 );
|
|
pfglVertex2i( mt->x, mt->y+1 );
|
|
}
|
|
pfglEnd();
|
|
|
|
// draw the yellow player triangle
|
|
qglDisable( GL_TEXTURE_2D );
|
|
if ( iphoneFrameNum & 8 ) { // blink it
|
|
pfglColor3f( 1, 1, 0 );
|
|
} else {
|
|
pfglColor3f( 0.5, 0.5, 0 );
|
|
}
|
|
angle = M_PI * Player.position.angle / (float)ANG_180;
|
|
c = cos( angle );
|
|
s = sin( angle );
|
|
px = Player.position.origin[0] / (float)TILEGLOBAL;
|
|
py = Player.position.origin[1] / (float)TILEGLOBAL;
|
|
pfglBegin( GL_TRIANGLES );
|
|
pfglVertex3f( px + c * 0.5, py + s * 0.5, 0 );
|
|
pfglVertex3f( px - c * 0.5 - s * 0.3, py - s * 0.5 + c * 0.3, 0 );
|
|
pfglVertex3f( px - c * 0.5 + s * 0.3, py - s * 0.5 - c * 0.3, 0 );
|
|
pfglEnd();
|
|
|
|
qglEnable( GL_TEXTURE_2D );
|
|
pfglColor3f( 1, 1, 1 );
|
|
|
|
// back button for returning to game
|
|
pfglMatrixMode( GL_PROJECTION );
|
|
pfglLoadIdentity();
|
|
iphoneRotateForLandscape();
|
|
pfglOrtho( 0, 480, 320, 0, -99999, 99999 );
|
|
if ( BackButton() ) {
|
|
menuState = IPM_GAME;
|
|
}
|
|
|
|
// stats button for stats display
|
|
//if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/stats.tga" ) ) {
|
|
if ( iphoneDrawPicWithTouch( 64, 0, 120, 36, "iphone/stats_large.tga" ) ) {
|
|
menuState = IPM_STATS;
|
|
}
|
|
//gsh
|
|
if ( MenuButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
}
|
|
|
|
void iphoneStats() {
|
|
DrawIntermissionStats();
|
|
|
|
//gsh
|
|
if ( BackButton() ) {
|
|
menuState = IPM_AUTOMAP;
|
|
}
|
|
if ( MenuButton() ) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
}
|
|
|
|
#if SPEARSTOREKIT
|
|
//==========================
|
|
// iphoneDownloadSpearProgressBar
|
|
//gsh
|
|
//==========================
|
|
void iphoneDownloadSpearProgressBar()
|
|
{
|
|
char str[80];
|
|
float scale = 40 / 32.0;
|
|
int barHeight = 30;
|
|
|
|
//calculate the percentage of data received
|
|
unsigned int percentDownloaded = totalDownloaded * 100 / DownloadFileSize;
|
|
|
|
int y = barHeight + 150 + 10;
|
|
my_snprintf( str, sizeof(str), "Downloading: %i", dataAmount);
|
|
iphoneDrawText( 100, y, 16, 16, str );
|
|
y += 17*scale;
|
|
my_snprintf( str, sizeof(str), "Percent Download: %i\%", percentDownloaded );
|
|
iphoneDrawText( 100, y, 16, 16, str );
|
|
y += 17*scale;
|
|
my_snprintf( str, sizeof(str), "Total Downloaded: %i", totalDownloaded );
|
|
iphoneDrawText( 100, y, 16, 16, str );
|
|
y += 17*scale;
|
|
my_snprintf(str, sizeof(str), "SOD will download and install itself.");
|
|
iphoneDrawText( 50, y, 16, 16, str );
|
|
y += 17*scale;
|
|
my_snprintf(str, sizeof(str), "You have not been charged at this time.");
|
|
iphoneDrawText( 50, y, 16, 16, str );
|
|
y += 17*scale;
|
|
|
|
//draw "Spear of Destiny" at the top
|
|
iphoneDrawPic(90, 20, 256, 128, "iphone/spear_logo.tga");
|
|
|
|
//draw the progress bar
|
|
iphoneDrawPic( 40, 150, 400, barHeight, "iphone/menu_bar.tga" );
|
|
|
|
//draw the progress
|
|
colour4_t color = { 255, 0, 0, 100 };
|
|
R_Draw_Blend( 40, 150, 4*percentDownloaded, barHeight, color );
|
|
}
|
|
#endif
|
|
|
|
//==========================
|
|
// iphoneDownloadMenu
|
|
//gsh
|
|
//==========================
|
|
char urlbuffer[1024];
|
|
void iphoneDownloadMenu()
|
|
{
|
|
char str[80];
|
|
float scale = 40 / 32.0;
|
|
int barHeight = 30;
|
|
|
|
//draw the background
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/download_background.tga");
|
|
|
|
//draw the url
|
|
iphoneCenterText(240, 120, urlbuffer);
|
|
//iphoneDrawTextInBox(RectMake(0, 120, 16, 16), 480, urlbuffer, RectMake(0, 120, 480, 32));
|
|
|
|
int y = barHeight + 150 + 10;
|
|
my_snprintf( str, sizeof(str), "Packet Size: %i", userDataAmount);
|
|
iphoneDrawText( 100, y, 16, 16, str );
|
|
y += 17*scale;
|
|
|
|
my_snprintf( str, sizeof(str), "Total Downloaded: %i", totalDownloaded );
|
|
iphoneDrawText( 100, y, 16, 16, str );
|
|
y += 17*scale;
|
|
|
|
static int iterator = 5;
|
|
static int pos = 230;
|
|
|
|
//int width = 60;
|
|
pos += iterator;
|
|
|
|
if (pos > 480)
|
|
pos = -60;
|
|
|
|
//draw the barrel
|
|
iphoneDrawPic(0, 150, 480, 34, "iphone/download_progress_bar.tga");
|
|
|
|
//draw the bullet!
|
|
iphoneDrawPic(pos, 150+34/2-22/2, 60, 22, "iphone/download_bullet.tga");
|
|
}
|
|
|
|
/*
|
|
//==========================================
|
|
// iphoneUpdateTriviaDrags()
|
|
// Updates the touches for the scrolling maps
|
|
// gsh
|
|
//==========================================
|
|
//TODO: delete this
|
|
void iphoneUpdateTriviaAndInstructionsDrags(int numEnteries, int x, int y, int w, int h, int spacing, int *dragPosition, int *dragVelocity)
|
|
{
|
|
//Update drag/touch info
|
|
// int x = 0;
|
|
// int w = 480;// - skillSides - 64;
|
|
/*
|
|
if (TouchDown(x, y, w, h))
|
|
{
|
|
if (!numPrevTouches)
|
|
prevTouches[0][0] = touches[0][0];
|
|
else if (numTouches == 1)
|
|
*dragVelocity = touches[0][0] - prevTouches[0][0];
|
|
}*
|
|
|
|
|
|
|
|
|
|
//update the drags
|
|
*dragPosition += *dragVelocity;
|
|
/*
|
|
//int rightBoundary = 240 - 2*width;//480/2 - (numPresets*width/2 + spacing);
|
|
if (*dragPosition < -(numTrivia-1)*480-10)//270-10)//(numPresets*(width+spacing))/2 )
|
|
*dragPosition = -(numTrivia-1)*480-10;//270-10;//(numPresets*(width+spacing))/2;
|
|
else if (*dragPosition > x+10)//rightBoundary)
|
|
*dragPosition = x+10;//rightBoundary;
|
|
|
|
if (*dragPosition < -(numTrivia-1)*480 + x)//270)
|
|
*dragVelocity = 2;
|
|
else if (*dragPosition > x)
|
|
*dragVelocity = -2;
|
|
*
|
|
|
|
//retard the velocity
|
|
if (*dragVelocity > 0)
|
|
--*dragVelocity;
|
|
else if (*dragVelocity < 0)
|
|
++*dragVelocity;
|
|
|
|
}*/
|
|
|
|
//----------------------------------
|
|
// DrawBlendInBox
|
|
// gsh
|
|
//-----------------------------------
|
|
void DrawBlendInBox(int x, int y, int w, int h, colour4_t color, int boxX, int boxW)
|
|
{
|
|
if ( x + w < boxX )
|
|
return;
|
|
else if ( x > boxX + boxW)
|
|
return;
|
|
|
|
if ( x < boxX ) {
|
|
w = x + w - boxX;
|
|
x = boxX;
|
|
}
|
|
if ( x + w > boxX + boxW )
|
|
w = boxX + boxW - x;
|
|
|
|
R_Draw_Blend( x, y, w, h, color );
|
|
}
|
|
|
|
//----------------------------------
|
|
// iphoneTriviaMenu
|
|
// gsh
|
|
//-----------------------------------
|
|
#if 0
|
|
// TODO: delete this implementation of iphoneTriviaMenu
|
|
void iphoneTriviaMenu()
|
|
{
|
|
//int numTrivia = 15;
|
|
|
|
static char triviaText[][1024] = {
|
|
" ORIGINAL WOLF:\n\nThe original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as \"The Nocturnal Missions\", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together.",
|
|
" BJ, THE MAN:\n\nWilliam Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor.",
|
|
" BOX ART:\n\nKen Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen.",
|
|
" THE REAL SPEAR:\n\nThe Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible.",
|
|
" THE SPEAR AND HITLER:\n\nHitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands.",
|
|
" DEATH DIMENSION:\n\nIt is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny.",
|
|
" GOD MODE:\n\nIn the game, if you can access god mode, BJ's eyes will glow with eerie golden light.",
|
|
" A PRINCE:\n\nRobert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom.",
|
|
" DELAYED DEVELOPMENT:\n\nIt is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II.",
|
|
" A MATTER OF DEGREES:\n\nJohn Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester.",
|
|
" THE CARMACK:\n\nJohn Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke.",
|
|
" DREAMING IN DIGITAL:\n\nDoom was reported to cause gamers to dream in pixels and lower productivity.",
|
|
" KEEPING IT IN THE FAMILY:\n\nBJ is Commander Keen's grandfather.",
|
|
" WHAT'S IN A NAME:\n\nThe original name for Doom was \"It's Green and Pissed\"",
|
|
" GIBS:\n\nGibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short.",
|
|
" WOLFENSTEIN 3D:\n\nThe game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed.",
|
|
" ORIGINAL WOLF:\n\nThe original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as \"The Nocturnal Missions\", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together.",
|
|
};
|
|
|
|
//get number of trivia
|
|
int numTrivia = sizeof(triviaText)/(sizeof(char) * 1024);
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_trivia.tga");
|
|
|
|
if (BackButton()) {
|
|
menuState = IPM_MORE;
|
|
return;
|
|
}
|
|
|
|
if (MenuButton()) {
|
|
menuState = IPM_MAIN;
|
|
return;
|
|
}
|
|
|
|
int startPosition = 85;
|
|
|
|
//update the drags
|
|
static int dragPosition = 85;
|
|
static int dragVelocity = 0;
|
|
//static int currentLocation = 0;
|
|
// int y = 30;
|
|
|
|
int y = 20;
|
|
int x = 0;
|
|
//if (revLand->value)
|
|
// y = -20;
|
|
|
|
if (iphoneDrawPicWithTouch(9, y+60+16, 64, 64, "iphone/button_left.tga") ){//&& !dragVelocity) {
|
|
dragVelocity += -25;//-18;
|
|
|
|
if (dragVelocity < -50)
|
|
dragVelocity = -50;
|
|
/* ++currentLocation;
|
|
if (currentLocation >= numTrivia)
|
|
currentLocation = 0;//numTrivia-1;
|
|
*/ }
|
|
if (iphoneDrawPicWithTouch(411, y+60+16, 64, 64, "iphone/button_right.tga") ){//&& !dragVelocity) {
|
|
dragVelocity += 25;//18;
|
|
if (dragVelocity > 50)
|
|
dragVelocity = 50;
|
|
/* --currentLocation;
|
|
if (currentLocation < 0)
|
|
currentLocation = numTrivia-1;//0;
|
|
*/ }
|
|
|
|
int width = 305;
|
|
int spacing = 100;//175;
|
|
int size = 160;//180;//110;
|
|
|
|
iphoneUpdateTriviaAndInstructionsDrags(numTrivia, startPosition, y+25, size*2, size - 53, 10, &dragPosition, &dragVelocity ); //might as well use the same drag functionality in controlmenu
|
|
|
|
int minSpeed = 20;
|
|
if ((dragVelocity < minSpeed && dragVelocity > 0) || (dragVelocity > -minSpeed && dragVelocity < 0))
|
|
{
|
|
//Com_Printf("(dragPosition-startPosition)\%480 = %i\n", (dragPosition-startPosition)%480);
|
|
|
|
if (abs((dragPosition-startPosition)%(width+spacing)) < 25)
|
|
{
|
|
dragVelocity = 0;
|
|
int tx = dragPosition - startPosition;
|
|
int n = tx/(width+spacing);
|
|
dragPosition = n*(width+spacing) + startPosition;
|
|
|
|
}
|
|
else
|
|
{
|
|
if (dragVelocity < 0)
|
|
dragVelocity = -minSpeed;
|
|
else
|
|
dragVelocity = minSpeed;
|
|
}
|
|
//if ((dragPosition-startPosition)%480 == 0)
|
|
// dragVelocity = 0;
|
|
}
|
|
/*
|
|
if (dragVelocity == 0 )
|
|
{
|
|
int diff = dragPosition - startPosition;
|
|
int n = diff/(width+spacing);
|
|
int nodePosition = n*(width+spacing);
|
|
|
|
if ( diff != nodePosition )
|
|
dragVelocity++;
|
|
}*/
|
|
|
|
//int upperLimit = startPosition + (numTrivia-1)*480;
|
|
int lowerLimit = startPosition - (numTrivia-1)*(width+spacing);
|
|
|
|
|
|
|
|
|
|
|
|
// int x = 0;
|
|
y = 50;
|
|
int w = 305;
|
|
int h = 250;
|
|
colour4_t color = { 0, 0, 0, 255 };
|
|
for (int i = 0; i < numTrivia; ++i)
|
|
{/*
|
|
if (i < currentLocation - 1)
|
|
continue;
|
|
if (i > currentLocation + 1)
|
|
continue;*/
|
|
// x = dragPosition + 480*i;
|
|
/*
|
|
if (i == 0 && currentLocation == 0 && dragPosition < -480)
|
|
x = dragPosition + numTrivia*480;
|
|
else if (i == (numTrivia - 1) && currentLocation == (numTrivia - 1) && dragPosition > -480)
|
|
x = dragPosition - 480;
|
|
*/
|
|
/*
|
|
if ( x > upperLimit )//startPosition + (numTrivia-1)*480 )
|
|
x -= numTrivia*480;
|
|
|
|
if ( x < lowerLimit )//startPosition - (numTrivia-1)*480 )
|
|
x += numTrivia*480;
|
|
*/
|
|
if (dragPosition > startPosition )//+480)//upperLimit )//startPosition + numTrivia*480)
|
|
dragPosition = lowerLimit;//startPosition;
|
|
|
|
if (dragPosition < lowerLimit )//startPosition - numTrivia*480)
|
|
dragPosition = startPosition;
|
|
|
|
x = dragPosition + (width+spacing)*i;
|
|
|
|
if (x > 480 || x + width < 0)
|
|
continue;
|
|
|
|
DrawBlendInBox( x, y, w, h, color, 71, 410-70);
|
|
//iphoneDrawTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70));
|
|
iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//This is a different implementation of the one above
|
|
//gsh
|
|
void iphoneTriviaMenu()
|
|
{
|
|
static int currentTrivia = 0; //this represents which trivia item we are currently supposed to be on
|
|
|
|
static char triviaText[][1024] = {
|
|
" ORIGINAL WOLF:\n\nThe original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as \"The Nocturnal Missions\", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together.",
|
|
" BJ, THE MAN:\n\nWilliam Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor.",
|
|
" BOX ART:\n\nKen Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen.",
|
|
" THE REAL SPEAR:\n\nThe Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible.",
|
|
" THE SPEAR AND HITLER:\n\nHitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands.",
|
|
" DEATH DIMENSION:\n\nIt is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny.",
|
|
" GOD MODE:\n\nIn the game, if you can access god mode, BJ's eyes will glow with eerie golden light.",
|
|
" A PRINCE:\n\nRobert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom.",
|
|
" DELAYED DEVELOPMENT:\n\nIt is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II.",
|
|
" A MATTER OF DEGREES:\n\nJohn Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester.",
|
|
" THE CARMACK:\n\nJohn Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke.",
|
|
" DREAMING IN DIGITAL:\n\nDoom was reported to cause gamers to dream in pixels and lower productivity.",
|
|
" KEEPING IT IN THE FAMILY:\n\nBJ is Commander Keen's grandfather.",
|
|
" WHAT'S IN A NAME:\n\nThe original name for Doom was \"It's Green and Pissed\"",
|
|
" GIBS:\n\nGibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short.",
|
|
" WOLFENSTEIN 3D:\n\nThe game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed.",
|
|
" ORIGINAL WOLF:\n\nThe original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as \"The Nocturnal Missions\", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together.",
|
|
};
|
|
//get number of trivia
|
|
int numTrivia = sizeof(triviaText)/(sizeof(char) * 1024);
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_trivia.tga");
|
|
|
|
if (BackButton()) {
|
|
menuState = IPM_MORE;
|
|
return;
|
|
}
|
|
|
|
if (MenuButton()) {
|
|
menuState = IPM_MAIN;
|
|
return;
|
|
}
|
|
|
|
int startPosition = 85;
|
|
|
|
//update the drags
|
|
static int Position = 85;
|
|
//static int Velocity = 0;
|
|
//static int currentLocation = 0;
|
|
// int y = 30;
|
|
|
|
int y = 20;
|
|
int x = 0;
|
|
|
|
static int moveRight = 0;
|
|
|
|
//move right or left, depending on button pushed
|
|
if (iphoneDrawPicWithTouch(9, y+60+16, 64, 64, "iphone/button_left.tga") ) {
|
|
moveRight = 0;
|
|
++currentTrivia;
|
|
if (currentTrivia > numTrivia-1) {
|
|
currentTrivia = 1;
|
|
|
|
}
|
|
}
|
|
if (iphoneDrawPicWithTouch(411, y+60+16, 64, 64, "iphone/button_right.tga") ) {
|
|
moveRight = 1;
|
|
--currentTrivia;
|
|
if (currentTrivia < 0) {
|
|
currentTrivia = numTrivia-2;
|
|
}
|
|
}
|
|
|
|
|
|
int width = 305;
|
|
int spacing = 215;//175;
|
|
|
|
int destinationPosition = startPosition - currentTrivia*(width+spacing);
|
|
int nearestTrivia = -(Position - startPosition)/(width+spacing);
|
|
|
|
//if we are not where we are supposed to be... get us there
|
|
if (Position != destinationPosition)
|
|
{
|
|
Com_Printf("\n\nPosition: %i\n", Position);
|
|
Com_Printf("nearestTrivia: %i\n", nearestTrivia);
|
|
Com_Printf("currentTrivia: %i\n", currentTrivia);
|
|
Com_Printf("destinationPosition: %i\n", destinationPosition);
|
|
|
|
|
|
//now we must check for looping situations (where it would be faster to go backwards
|
|
|
|
//this works great for traveling in a straight line without looping
|
|
|
|
int oldPosition = Position;
|
|
int deltaPos = destinationPosition - Position;
|
|
/*
|
|
if (deltaPos > 0)
|
|
Position += 50;
|
|
else
|
|
Position -= 50;
|
|
*/
|
|
int moveDistance = 50;
|
|
|
|
if ( moveRight )//!crossedOver )//currentTrivia - nearestTrivia >= 0)//abs(currentTrivia - nearestTrivia) > numTrivia/2)
|
|
{
|
|
//if (deltaPos < 0)
|
|
// moveDistance *= -1;
|
|
|
|
Position += moveDistance;
|
|
|
|
if (destinationPosition < Position && destinationPosition > oldPosition)
|
|
Position = destinationPosition;
|
|
}
|
|
else //if (currentTrivia - nearestTrivia < 0)
|
|
{
|
|
|
|
//if (deltaPos > 0)
|
|
// moveDistance *= -1;
|
|
|
|
Position -= moveDistance;
|
|
|
|
if (destinationPosition > Position && destinationPosition < oldPosition)
|
|
Position = destinationPosition;
|
|
|
|
}
|
|
|
|
/*
|
|
//check if the current position has crossed over the destination position
|
|
if (destinationPosition < Position && destinationPosition > oldPosition)
|
|
Position = destinationPosition;
|
|
*/
|
|
|
|
if ( abs(deltaPos) <= 100)
|
|
Position = destinationPosition;
|
|
}
|
|
|
|
//int upperLimit = startPosition + (numTrivia-1)*480;
|
|
int lowerLimit = startPosition - (numTrivia-1)*(width+spacing);
|
|
|
|
|
|
|
|
|
|
|
|
// int x = 0;
|
|
y = 50;
|
|
int w = 305;
|
|
int h = 250;
|
|
colour4_t color = { 0, 0, 0, 255 };
|
|
colour4_t colorWhite = { 255, 255, 255, 255 };
|
|
colour4_t colorGrey = { 100, 100, 100, 255 };
|
|
for (int i = 0; i < numTrivia; ++i)
|
|
{
|
|
if (Position > startPosition )//+480)//upperLimit )//startPosition + numTrivia*480)
|
|
Position = lowerLimit;//startPosition;
|
|
|
|
if (Position < lowerLimit )//startPosition - numTrivia*480)
|
|
Position = startPosition;// - (width+spacing);
|
|
|
|
x = Position + (width+spacing)*i;
|
|
|
|
if (x > 480 || x + width < 0)
|
|
continue;
|
|
|
|
DrawBlendInBox( x-2, y-2, w+4, h+4, colorWhite, 71, 410-70);
|
|
DrawBlendInBox( x-1, y-1, w+2, h+2, colorGrey, 71, 410-70);
|
|
DrawBlendInBox( x, y, w, h, color, 71, 410-70);
|
|
//iphoneDrawTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70));
|
|
iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70));
|
|
}
|
|
}
|
|
|
|
//----------------------------------
|
|
// iphoneMoreMenu
|
|
// gsh
|
|
//-----------------------------------
|
|
void iphoneMoreMenu()
|
|
{
|
|
wasDLInstructionsCalledFromEpisodeMenu = 0;
|
|
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_more.tga");
|
|
|
|
float scale = 40 / 32.0;
|
|
|
|
if (BackButton()) {
|
|
menuState = IPM_MAIN;
|
|
}
|
|
|
|
if (iphoneDrawPicWithTouch(240-64*scale, 120, 128*scale, 32*scale, "iphone/button_trivia.tga")) {
|
|
menuState = IPM_TRIVIA;
|
|
}
|
|
|
|
if (iphoneDrawPicWithTouch(240-64*scale, 170, 128*scale, 32*scale, "iphone/button_downloads.tga")) {
|
|
menuState = IPM_DOWNLOADINSTRUCTIONS;
|
|
}
|
|
}
|
|
|
|
//----------------------------------
|
|
// iphoneDownloadInstructionsMenu
|
|
// gsh
|
|
//-----------------------------------
|
|
void iphoneDownloadInstructionsMenu()
|
|
{
|
|
iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga");
|
|
iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_downloads.tga");
|
|
|
|
if (BackButton())
|
|
{
|
|
menuState = IPM_MORE;
|
|
if (wasDLInstructionsCalledFromEpisodeMenu)
|
|
menuState = IPM_EPISODE;
|
|
|
|
return;
|
|
}
|
|
|
|
if (MenuButton()) {
|
|
menuState = IPM_MAIN;
|
|
return;
|
|
}
|
|
/*
|
|
if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_web.tga" ) ) {
|
|
wasCalledFromDownloadInstructionsMenu = 1;
|
|
iphoneYesNoBox("Website", "This will navigate you to idsoftware.com/iphone/wolf3dInstructions.html. Continue?");
|
|
}*/
|
|
|
|
char instructions[] = "\nWolfenstein Platinum allows you to download additional game levels from the Internet."
|
|
//" For details, go to:\n\nhttp://www.idsoftware.com/iphone/\nwolf3dInstructions.html";
|
|
" For details, go to:\n\nhttp://www.idsoftware.com/wolfenstein\n"
|
|
"-3d-classic-platinum/mapinstructions/";
|
|
|
|
int x = 20;
|
|
int y = 100;
|
|
int w = 480-40;
|
|
int h = 150;
|
|
colour4_t color = { 0, 0, 0, 255 };
|
|
colour4_t colorGrey = { 100, 100, 100, 255 };
|
|
colour4_t colorWhite = { 255, 255, 255, 255 };
|
|
|
|
|
|
//draw a background, behind the text, with a white border
|
|
R_Draw_Blend( x-2, y-2, w+4, h+4, colorWhite);
|
|
R_Draw_Blend( x-1, y-1, w+2, h+2, colorGrey);
|
|
R_Draw_Blend( x, y, w, h, color);
|
|
|
|
//draw arial text
|
|
iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 400, instructions, RectMake(10, 0, 480-40, 320));
|
|
|
|
//check for touch events on the text itself
|
|
int r = TouchReleased( x, y, w, h );
|
|
if ( r ) {
|
|
wasCalledFromDownloadInstructionsMenu = 1;
|
|
iphoneYesNoBox("Website", "This will navigate you to idsoftware.com/wolfenstein-3d-classic-platinum/mapinstructions/ Continue?");
|
|
}
|
|
if ( TouchDown( x, y, w, h ) ) {
|
|
colour4_t colorLight = { 255, 255, 255, 64 };
|
|
R_Draw_Blend( x, y, w, h, colorLight );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//gsh
|
|
extern void iphoneSelectMapMenu();
|
|
#if SPEARSTOREKIT
|
|
extern void iphoneStoreKit();
|
|
#endif
|
|
|
|
void iphoneDrawMenus() {
|
|
// iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main_sepia.tga" );
|
|
iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main_hued.tga" ); //gsh
|
|
|
|
switch ( menuState ) {
|
|
case IPM_MAIN: iphoneMainMenu(); break;
|
|
case IPM_SKILL: iphoneSkillMenu(); break;
|
|
case IPM_EPISODE: iphoneScrollingEpisodeMenu(); break;//gsh //iphoneEpisodeMenu(); break;
|
|
case IPM_MAPS: iphoneScrollingMapMenu(); break; //gsh iphoneMapMenu(); break;
|
|
// case IPM_MAPSELECTOR: iphoneSelectMapMenu(); break; //gsh
|
|
case IPM_CONTROLS: iphoneControlMenu(); break;
|
|
case IPM_INTERMISSION: iphoneIntermission(); break;
|
|
case IPM_VICTORY: iphoneVictory(); break;
|
|
case IPM_AUTOMAP: iphoneAutomap(); break;
|
|
case IPM_STATS: iphoneStats(); break;
|
|
case IPM_HUDEDIT: iphoneHudEditFrame(); break;//gsh HudEditFrame(); break;
|
|
case IPM_DOWNLOADPROGRESS: iphoneDownloadMenu(); break; //gsh
|
|
#if SPEARSTOREKIT
|
|
case IPM_STOREKIT: iphoneStoreKit(); break; //gsh
|
|
#endif
|
|
// case IPM_LOADING: iphoneLoadingMenu(); //gsh
|
|
case IPM_TRIVIA: iphoneTriviaMenu(); break;//gsh
|
|
case IPM_MORE: iphoneMoreMenu(); break;//gsh
|
|
case IPM_DOWNLOADINSTRUCTIONS: iphoneDownloadInstructionsMenu(); break; //gsh
|
|
}
|
|
}
|
|
|
|
|