doom-ios/code/iphone/iphone_main.c

512 lines
14 KiB
C

/*
Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company.
Copyright (C) 2004-2005 Michael Liebscher <johnnycanuck@users.sourceforge.net>
Copyright (C) 1997-2001 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.
*/
/*
doom
----
modifications to config.h
don't add the d_ipxgate.c file
don't add d_server.c file
don't add mmus2mid.[ch] files
don't add w_memcache.c, use w_mmap.c instead
added new SDL_opengl.h, changed code files from <SDL_opengl.h> to "SDL_opengl.h"
commented out #include <SDL.h>
Commented out the static on D_DoomMainSetup();
Add define HAVE_CONFIG_H to the target settings
Add define _DEBUG
#if around uses of GL_TEXTURE_RESIDENT in gl_texture.c
// JDC: not in GLES, not needed since it is the default condition glDisable(GL_POLYGON_SMOOTH);
// JDC #define USE_VERTEX_ARRAYS in gl_main.c
add the iphoneRotateForLandscape calls
static JDC removed short consistancy[MAXPLAYERS][BACKUPTICS];
// JDC glDisableClientState(GL_TEXTURE_COORD_ARRAY);
// JDC glDisableClientState(GL_VERTEX_ARRAY);
#ifdef IPHONE // JDC
#define MAX_SCREENWIDTH 480
#define MAX_SCREENHEIGHT 320
#else
code notes
----------
all the fixed point mess
goofy polar clipping
path traverse should have used a BSP tree
rename vldoor_e close and open enums to not conflict with unistd
opengl_error_break
WiFi internet play
---------
voip instead of key chat
extra asset work
----------------------
perfect weapon scales
demo of each level?
additive art separation -- attacks, buttons, etc
tuned option
------------
last kill / last secret / last item messages
more achievements in general
better item pickup sounds
scale blood spray with distance
easier item pickup
crosshair
better movement clipping to walls
better key pickup sound
textured automap
better low health warning
better feedback on where bullets hit
better bob cycle when going down stairs
map item should also show all monsters and items to make it cool
barrels explode easier
wave FOV when berzerk
pistol shots are useless in deathmatch
show opponent / enemy health when attacking them?
cpu optimizations
-------------
convert to 16 bit vertex data
void gld_BindPatch(GLTexture *gltexture, int cm) is expensive
fixedMul / fixedDiv in asm (negligable performance gain)
atlas all of the non-character items (and bodies?)
remove the pitch changes from sound?
gpu optimizations
------------------
use fog instead of full screen blend for damage/pickup flash (3 msec on IP3G)
pvrtc walls and floors
art needed
----------
new map / menu button
awards on medals
icon
thumbsticks
settings gears
must do
-------
pause music in menu
timelimit carry over to new levels
server going to demo causes client to crash
fixed 10/13/09
--------------
recover from sound interruption
caps for slider bar text
reset defaults doesn't reset reverse-landscape
pause music when going to the menu
reset timelimit each level on deathmatch
disable demos, new game, and web site during multiplayer
fixed
-----
automap / menu button actions with multi-thread
capitalized "game saved."
Added punctuation to "Ned a blue keycard", etc
added "defaults" button in options
todo
----
don't accept fire from an owned touch?
text scaling in buttons isn't perfect
better view angle transport
audio bugs
rotor control shouldn't be dimmed
volume button hack?
change background color for networking
tapping weapon change to cycle
is openal thread safe? we issue touch clicks from asynctic
disable multiplayer button if no ethernet addresses found
touch latching issues
add one tic latency to server?
select new game while in netgame
multiplayer arrow colors
remove players with stale joins
rocket explosion offset
texture preload status bar stuff and blood / impacts
stereo panning for headphones
directly build 16 bit textures instead of translating from 32 bit
texture wrap seam after end of e3m8
sliders should be touch-latch controls
respawn flash sounds sometimes not playing?
don't allow starting on secret levels
loaded savegame spot on different level didn't get view height on first frame
use graphic?
don't ever close doors with auto-use
separators in map select
rotor speed adjust
check all powerup effects
remove uses of prboom.wad?
check patch outlining code
flash all controls on initial level load
touch sounds when cancelling demo playback
play sound on respawn
catch memory warning, purge textures
use wad sound data
stop sound cleanly
entire gun doesn't get fullbright with muzzle flash
require four touches in line for console
restartable pwad interface
somewhat normal based lighting on walls
help menu
visual tilt indicator
tilt draw the turnstick when active
console
*/
#include "../doomiphone.h"
cvar_t *skill;
cvar_t *episode;
cvar_t *controlScheme;
cvar_t *stickTurn;
cvar_t *stickMove;
cvar_t *stickDeadBand;
cvar_t *rotorTurn;
cvar_t *tiltTurn;
cvar_t *tiltMove;
cvar_t *tiltDeadBand;
cvar_t *tiltAverages;
cvar_t *miniNet;
cvar_t *music;
cvar_t *showTilt;
cvar_t *showTime;
cvar_t *showNet;
cvar_t *showSound;
cvar_t *cropSprites;
cvar_t *revLand;
cvar_t *mapScale;
cvar_t *drawControls;
cvar_t *autoUse;
cvar_t *statusBar;
cvar_t *touchClick;
cvar_t *messages;
cvar_t *timeLimit;
cvar_t *fragLimit;
cvar_t *mpDeathmatch;
cvar_t *mpSkill;
cvar_t *mpDataset;
cvar_t *mpEpisode;
cvar_t *mpMap;
cvar_t *noBlend;
cvar_t *glfinish;
cvar_t *mapSelectY;
cvar_t *throttle;
cvar_t *centerSticks;
cvar_t *rampTurn;
cvar_t *netBuffer;
#define VERSION_BCONFIG ( 0x89490000 + sizeof( huds ) + sizeof( playState ) )
void Sys_Error( const char *format, ... )
{
va_list argptr;
char string[ 1024 ];
va_start( argptr, format );
(void)vsnprintf( string, sizeof( string ), format, argptr );
va_end( argptr );
fprintf( stderr, "Error: %s\n", string );
_exit( 1 );
}
#define plyr (players+consoleplayer) /* the console player */
void Give_f() {
plyr->armorpoints = idfa_armor; // Ty 03/09/98 - deh
plyr->armortype = idfa_armor_class; // Ty 03/09/98 - deh
// You can't own weapons that aren't in the game // phares 02/27/98
for (int i=0;i<NUMWEAPONS;i++)
if (!(((i == wp_plasma || i == wp_bfg) && gamemode == shareware) ||
(i == wp_supershotgun && gamemode != commercial)))
plyr->weaponowned[i] = true;
for (int i=0;i<NUMAMMO;i++)
if (i!=am_cell || gamemode!=shareware)
plyr->ammo[i] = plyr->maxammo[i];
plyr->message = s_STSTR_FAADDED;
for (int i=0;i<NUMCARDS;i++)
if (!plyr->cards[i]) // only print message if at least one key added
{ // however, caller may overwrite message anyway
plyr->cards[i] = true;
}
}
void God_f() {
plyr->cheats ^= CF_GODMODE;
if (plyr->cheats & CF_GODMODE)
{
if (plyr->mo)
plyr->mo->health = god_health; // Ty 03/09/98 - deh
plyr->health = god_health;
plyr->message = s_STSTR_DQDON; // Ty 03/27/98 - externalized
}
else
plyr->message = s_STSTR_DQDOFF; // Ty 03/27/98 - externalized
}
void ResetMaps_f() {
playState.numMapStats = 0;
memset( playState.mapStats, 0, sizeof( playState.mapStats ) );
}
/*
==================
iphoneStartup
==================
*/
struct addrinfo *addrinfoHead;
void D_DoomMainSetup();
void iphoneStartup() {
int start = SysIphoneMilliseconds();
// print networking information
ReportNetworkInterfaces();
// microseconds will be plenty random for playerID and localGameID
playerID = localGameID = SysIphoneMicroseconds();
InitImmediateModeGL();
// init OpenAL before pak file, so the pak file can
// make all the al static buffers
Sound_Init();
// get our new-style pak file
char pakFile[1024];
sprintf( pakFile, "%s/base/base.iPack", SysIphoneGetAppDir() );
PK_Init( pakFile );
// register console commands
Cmd_AddCommand( "listcvars", Cvar_List_f );
Cmd_AddCommand( "resetcvars", Cvar_Reset_f );
Cmd_AddCommand( "resetmaps", ResetMaps_f );
Cmd_AddCommand( "listcmds", Cmd_ListCommands_f );
Cmd_AddCommand( "give", Give_f );
Cmd_AddCommand( "god", God_f );
Cmd_AddCommand( "mail", EmailConsole ); //gsh, mails the console to id
// register console variables
Cvar_Get( "version", va( "%3.1f %s %s", DOOM_IPHONE_VERSION, __DATE__, __TIME__ ), 0 );
skill = Cvar_Get( "skill", "1", CVAR_ARCHIVE );
episode = Cvar_Get( "episode", "0", CVAR_ARCHIVE );
controlScheme = Cvar_Get( "controlScheme", "0", CVAR_ARCHIVE );
stickTurn = Cvar_Get( "stickTurn", "128", CVAR_ARCHIVE );
stickMove = Cvar_Get( "stickMove", "128", CVAR_ARCHIVE );
stickDeadBand = Cvar_Get( "stickDeadBand", "0.05", CVAR_ARCHIVE );
rotorTurn = Cvar_Get( "rotorTurn", "50000", CVAR_ARCHIVE );
tiltTurn = Cvar_Get( "tiltTurn", "0", CVAR_ARCHIVE );
tiltMove = Cvar_Get( "tiltMove", "0", CVAR_ARCHIVE );
tiltDeadBand = Cvar_Get( "tiltDeadBand", "0.08", CVAR_ARCHIVE );
tiltAverages = Cvar_Get( "tiltAverages", "3", CVAR_ARCHIVE );
centerSticks = Cvar_Get( "centerSticks", "1", CVAR_ARCHIVE );
rampTurn = Cvar_Get( "rampTurn", "1", CVAR_ARCHIVE );
music = Cvar_Get( "music", "1", CVAR_ARCHIVE );
cropSprites = Cvar_Get( "cropSprites", "1", 0 );
revLand = Cvar_Get( "revLand", "0", CVAR_ARCHIVE );
mapScale = Cvar_Get( "mapScale", "10", CVAR_ARCHIVE );
drawControls = Cvar_Get( "drawControls", "1", CVAR_ARCHIVE );
autoUse = Cvar_Get( "autoUse", "1", CVAR_ARCHIVE );
statusBar = Cvar_Get( "statusBar", "1", CVAR_ARCHIVE );
touchClick = Cvar_Get( "touchClick", "0.15", CVAR_ARCHIVE );
messages = Cvar_Get( "messages", "1", CVAR_ARCHIVE );
mapSelectY = Cvar_Get( "mapSelectY", "0", CVAR_ARCHIVE );
miniNet = Cvar_Get( "miniNet", "1", CVAR_ARCHIVE );
// multiplayer setup
timeLimit = Cvar_Get( "timeLimit", "0", CVAR_ARCHIVE );
fragLimit = Cvar_Get( "fragLimit", "5", CVAR_ARCHIVE );
mpDeathmatch = Cvar_Get( "mpDeathmatch", "0", CVAR_ARCHIVE );
mpDataset = Cvar_Get( "mpDataset", "0", CVAR_ARCHIVE );
mpEpisode = Cvar_Get( "mpEpisode", "1", CVAR_ARCHIVE );
mpSkill = Cvar_Get( "mpSkill", "1", CVAR_ARCHIVE );
mpMap = Cvar_Get( "mpMap", "1", CVAR_ARCHIVE );
// debug tools
showTilt = Cvar_Get( "showTilt", "-1", 0 );
showTime = Cvar_Get( "showTime", "0", 0 );
showNet = Cvar_Get( "showNet", "0", 0 );
showSound = Cvar_Get( "showSound", "0", 0 );
noBlend = Cvar_Get( "noBlend", "0", 0 ); // disable the damae blends for screenshots
glfinish = Cvar_Get( "glfinish", "0", 0 );
throttle = Cvar_Get( "throttle", "1", 0 ); // network packet throttle enable
netBuffer = Cvar_Get( "netBuffer", "4", 0 ); // max tics to buffer ahead
// load the archived cvars
Cmd_ExecuteFile( va( "%s/config.cfg", SysIphoneGetDocDir() ) );
// make sure volume changes and incoming calls draw the right orientation
SysIPhoneSetUIKitOrientation( revLand->value );
// start the intro music if it wasn't disabled with the music cvar
iphonePlayMusic( "intro" );
// iphonePlayMusic( "e1m1" );
// these should get overwritten by the config loading
memset( &playState, 0, sizeof( playState ) );
playState.map.skill = 1;
playState.map.episode = 1;
playState.map.map = 1;
HudSetForScheme( 0 );
// load the binary config file
FILE *f = fopen( va( "%s/binaryConfig.bin", SysIphoneGetDocDir() ), "rb" );
if ( f ) {
int version;
version = 0;
fread( &version, 1, sizeof( version ), f );
if ( version != VERSION_BCONFIG ) {
Com_Printf( "Binary config file bad version.\n" );
} else {
fread( &playState, 1, sizeof( playState ), f );
fread( &huds, 1, sizeof( huds ), f );
version = 0;
fread( &version, 1, sizeof( version ), f );
if ( version != VERSION_BCONFIG ) {
Com_Error( "Binary config file bad trailing version.\n" );
}
}
fclose( f );
}
Com_Printf( "startup time: %i msec\n", SysIphoneMilliseconds() - start );
start = SysIphoneMilliseconds();
// the texnums might have been different in the savegame
HudSetTexnums();
arialFontTexture = PK_FindTexture( "iphone/arialImageLAL.tga" );
Com_Printf( "preloadBeforePlay(): %i msec\n", SysIphoneMilliseconds() - start );
Com_Printf( "---------- D_DoomMain ----------\n" );
D_DoomMainSetup();
// put savegames here
strcpy( basesavegame, SysIphoneGetDocDir() );
// prBoom seems to draw the static pic screens without setting up 2D, causing
// a bad first frame
iphoneSet2D();
menuState = IPM_MAIN;
lastState = IPM_MAIN;
#if 0
// jump right to the save spot for debugging
ResumeGame();
#endif
}
/*
==================
iphoneShutdown
Write out configs and save the game at this position
==================
*/
void iphoneShutdown() {
FILE *fp;
char path[1024];
cvar_t *var;
char buffer[1024];
if( lastState == IPM_GAME ) {
G_DoSaveGame( false );
}
// write the ascii config file
snprintf( path, sizeof( path ), "%s/config.cfg", SysIphoneGetDocDir() );
fp = fopen( path, "w" );
if( ! fp ) {
Com_Printf( "Could not write config.cfg.\n" );
return;
}
// write out commands to set the archived cvars
for( var = cvar_vars ; var ; var = var->next ) {
if( var->flags & CVAR_ARCHIVE ) {
snprintf( buffer, sizeof( buffer ), "%s %s\n", var->name, var->string );
fprintf( fp, "%s", buffer );
Com_Printf( "%s", buffer );
}
}
fclose( fp );
// write the binary config file
FILE *f = fopen( va( "%s/binaryConfig.bin", SysIphoneGetDocDir() ), "wb" );
if ( !f ) {
Com_Printf( "Could not write binaryConfig.cfg.\n" );
return;
}
int version = VERSION_BCONFIG;
fwrite( &version, 1, sizeof( version ), f );
fwrite( &playState, 1, sizeof( playState ), f );
fwrite( &huds, 1, sizeof( huds ), f );
fwrite( &version, 1, sizeof( version ), f );
fclose( f );
}