2003-11-03 16:14:58 +00:00
# include <PalmOS.h>
# include "StarterRsc.h"
2004-05-25 13:18:11 +00:00
2003-11-03 16:14:58 +00:00
# include "games.h"
# include "start.h"
2004-09-12 13:24:06 +00:00
# include "rumble.h"
2003-11-03 16:14:58 +00:00
# include "extend.h"
2004-05-25 13:18:11 +00:00
# include "globals.h"
2004-09-12 13:24:06 +00:00
# include "features.h"
2004-11-09 11:54:16 +00:00
# include "formUtil.h"
2004-05-25 13:18:11 +00:00
2004-11-09 11:54:16 +00:00
# include "modules.h"
# include "args.h"
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
/*
2003-11-03 16:14:58 +00:00
static Boolean checkPath ( const Char * pathP ) {
2004-09-12 13:24:06 +00:00
FILE * tmpRef ;
2003-11-03 16:14:58 +00:00
if ( ! ( tmpRef = fopen ( pathP , " r " ) ) ) {
return false ;
} else {
fclose ( tmpRef ) ;
return true ;
}
}
2004-11-09 11:54:16 +00:00
*/
# define BUILD_FILE(h,m) \
StrCopy ( filename , " /Palm/Programs/ScummVM/Mods/ " ) ; \
StrCat ( filename , h ) ; \
StrCat ( filename , m ) ;
# define CHECK_FILE() \
e = VFSFileOpen ( volRefNum , filename , vfsModeRead , & file ) ; \
if ( e ) \
goto onError ; \
else \
VFSFileClose ( file ) ;
# define DELET_FILE(f) \
del_dbID = DmFindDatabase ( 0 , f ) ; \
if ( del_dbID ) \
DmDeleteDatabase ( 0 , del_dbID ) ;
void ModDelete ( ) {
LocalID del_dbID ;
DELET_FILE ( " Glbs::Common " ) ;
DELET_FILE ( " Glbs::Scumm " ) ;
DELET_FILE ( " Glbs::Simon " ) ;
DELET_FILE ( " Glbs::Queen " ) ;
DELET_FILE ( " Glbs::Sword1 " ) ;
DELET_FILE ( " ScummVM-Engine " ) ;
}
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
static void ModSetStack ( UInt32 newSize , UInt16 cardNo , LocalID dbID ) {
DmOpenRef dbRef = DmOpenDatabase ( cardNo , dbID , dmModeReadWrite ) ;
if ( dbRef ) {
MemHandle pref = DmGetResource ( ' pref ' , 0 ) ;
UInt32 size = 0 ;
if ( pref ) {
SysAppPrefsType * data = ( SysAppPrefsType * ) MemHandleLock ( pref ) ;
size = data - > stackSize ;
if ( newSize ) {
SysAppPrefsType newData ;
MemMove ( & newData , data , sizeof ( SysAppPrefsType ) ) ;
newData . stackSize = newSize ;
DmWrite ( data , 0 , & newData , sizeof ( SysAppPrefsType ) ) ;
}
MemPtrUnlock ( data ) ;
DmReleaseResource ( pref ) ;
2003-11-03 16:14:58 +00:00
}
2004-11-09 11:54:16 +00:00
DmCloseDatabase ( dbRef ) ;
2003-11-03 16:14:58 +00:00
}
}
2004-11-09 11:54:16 +00:00
static Err ModImport ( UInt16 volRefNum , UInt8 engine ) {
const Char * files [ ] = {
{ " scumm " } ,
{ " simon " } ,
{ " queen " } ,
{ " sword1 " }
} ;
char filename [ 256 ] ;
UInt16 dum1 ;
UInt32 dum2 ;
FileRef file ;
Err e ;
FormPtr ofmP , frmP ;
ofmP = FrmGetActiveForm ( ) ;
frmP = FrmInitForm ( ImportForm ) ;
FrmSetActiveForm ( frmP ) ;
FrmDrawForm ( frmP ) ;
BUILD_FILE ( files [ engine ] , " .engine " ) ; // engine file ?
CHECK_FILE ( ) ;
BUILD_FILE ( files [ engine ] , " .data " ) ; // data file ?
CHECK_FILE ( ) ;
BUILD_FILE ( " common " , " .data " ) // common data ?
CHECK_FILE ( ) ;
BUILD_FILE ( " common " , " .data " ) ;
e = ( e ) ? e : VFSImportDatabaseFromFile ( volRefNum , filename , & dum1 , & dum2 ) ;
BUILD_FILE ( files [ engine ] , " .data " ) ;
e = ( e ) ? e : VFSImportDatabaseFromFile ( volRefNum , filename , & dum1 , & dum2 ) ;
BUILD_FILE ( files [ engine ] , " .engine " ) ;
e = ( e ) ? e : VFSImportDatabaseFromFile ( volRefNum , filename , & dum1 , & dum2 ) ;
// if error, cleanup
if ( e ) ModDelete ( ) ;
onError :
FrmEraseForm ( frmP ) ;
FrmDeleteForm ( frmP ) ;
if ( e & & ofmP ) FrmSetActiveForm ( ofmP ) ;
return e ;
}
# undef DELET_FILE
# undef CHECK_FILE
# undef BUILD_FILE
2003-11-03 16:14:58 +00:00
Boolean StartScummVM ( ) {
2004-11-09 11:54:16 +00:00
Char * * argvP ;
UInt8 lightspeed , argc = 0 ;
UInt32 stackSize ;
Boolean toLauncher ;
UInt8 engine ;
2003-11-03 16:14:58 +00:00
UInt16 musicDriver = sysInvalidRefNum ; // for launch call
UInt16 index = GamGetSelected ( ) ;
2004-11-09 11:54:16 +00:00
Char num [ 6 ] ;
argvP = ArgsInit ( ) ;
if ( index = = dmMaxRecordIndex ) {
UInt16 whichButton ;
FormPtr frmP = FrmInitForm ( EngineForm ) ;
whichButton = FrmDoDialog ( frmP ) ;
FrmDeleteForm ( frmP ) ;
if ( whichButton = = EngineCancelButton )
return false ;
engine = ( whichButton - Engine0Button ) ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
} else {
2003-11-03 16:14:58 +00:00
Char pathP [ 256 ] ;
MemHandle recordH ;
GameInfoType * gameInfoP ;
recordH = DmQueryRecord ( gameDB , index ) ;
gameInfoP = ( GameInfoType * ) MemHandleLock ( recordH ) ;
2004-11-09 11:54:16 +00:00
engine = gameInfoP - > engine ;
2003-11-03 16:14:58 +00:00
// build path
StrCopy ( pathP , " /Palm/Programs/ScummVM/Games/ " ) ;
if ( gameInfoP - > pathP [ 0 ] = = ' / ' )
StrCopy ( pathP , gameInfoP - > pathP ) ;
else
StrCat ( pathP , gameInfoP - > pathP ) ;
2004-01-20 14:10:23 +00:00
/* // path exists ?
2003-11-03 16:14:58 +00:00
if ( ! checkPath ( pathP ) ) {
MemHandleUnlock ( recordH ) ;
FrmCustomAlert ( FrmErrorAlert , " The specified path was not found ! " , 0 , 0 ) ;
2004-11-09 11:54:16 +00:00
ArgsFree ( argvP ) ;
2003-11-03 16:14:58 +00:00
return false ;
}
2004-01-20 14:10:23 +00:00
*/
2004-11-09 11:54:16 +00:00
2003-11-03 16:14:58 +00:00
// ScummVM
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " - " , NULL , & argc ) ;
2003-11-03 16:14:58 +00:00
// path
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -p " , pathP , & argc ) ;
2003-11-03 16:14:58 +00:00
// language
if ( gameInfoP - > language > 0 ) {
2004-12-10 15:28:41 +00:00
const Char * lang = " en \0 de \0 fr \0 it \0 pt \0 es \0 jp \0 zh \0 kr \0 hb \0 ru \0 cz \0 nl \0 " ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -q " , ( lang + ( gameInfoP - > language - 1 ) * 3 ) , & argc ) ;
2003-11-03 16:14:58 +00:00
}
// fullscreen ?
2004-09-12 13:24:06 +00:00
if ( gameInfoP - > fullscreen )
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -f " , NULL , & argc ) ;
2004-01-20 14:10:23 +00:00
// aspect-ratio ?
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , ( gameInfoP - > aspectRatio ? " --aspect-ratio " : " --no-aspect-ratio " ) , NULL , & argc ) ;
2003-11-03 16:14:58 +00:00
// gfx mode
2004-01-20 14:10:23 +00:00
gVars - > flipping . pageAddr1 = ( UInt8 * ) ( BmpGetBits ( WinGetBitmap ( WinGetDisplayWindow ( ) ) ) ) ;
gVars - > flipping . pageAddr2 = gVars - > flipping . pageAddr1 ; // default if not flipping mode
2004-09-12 13:24:06 +00:00
gVars - > filter = gameInfoP - > filter ;
2004-01-20 14:10:23 +00:00
switch ( gameInfoP - > gfxMode ) {
2003-11-03 16:14:58 +00:00
case 1 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -g " , " flipping " , & argc ) ;
2004-01-20 14:10:23 +00:00
gVars - > flipping . pageAddr1 = ( UInt8 * ) WinScreenLock ( winLockDontCare ) ;
WinScreenUnlock ( ) ;
2003-11-03 16:14:58 +00:00
break ;
case 2 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -g " , " buffered " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
case 3 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -g " , " wide " , & argc ) ;
2004-01-20 14:10:23 +00:00
gVars - > flipping . pageAddr1 = ( UInt8 * ) WinScreenLock ( winLockDontCare ) ;
WinScreenUnlock ( ) ;
2003-11-03 16:14:58 +00:00
break ;
default :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -g " , " normal " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
}
// load state
if ( gameInfoP - > autoLoad ) {
StrIToA ( num , gameInfoP - > loadSlot ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -x " , num , & argc ) ;
2003-11-03 16:14:58 +00:00
}
// boot script parameter
if ( gameInfoP - > bootParam ) {
StrIToA ( num , gameInfoP - > bootValue ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -b " , num , & argc ) ;
2003-11-03 16:14:58 +00:00
}
// not a PC version
if ( gameInfoP - > setPlatform ) {
2004-05-25 13:18:11 +00:00
switch ( gameInfoP - > platform ) {
2003-11-03 16:14:58 +00:00
case 0 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " amiga " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
case 1 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " atari " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
case 2 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " mac " , & argc ) ;
2003-11-28 09:25:52 +00:00
break ;
case 3 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " pc " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
2004-02-13 11:25:13 +00:00
case 4 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " fmtowns " , & argc ) ;
2004-02-13 11:25:13 +00:00
break ;
2004-09-12 13:24:06 +00:00
case 5 :
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --platform= " , " windows " , & argc ) ;
2004-09-12 13:24:06 +00:00
break ;
2003-11-03 16:14:58 +00:00
}
}
// subtitles
2004-10-11 14:01:38 +00:00
if ( gameInfoP - > subtitles )
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -n " , NULL , & argc ) ;
2004-09-12 13:24:06 +00:00
2003-11-03 16:14:58 +00:00
// multi midi ?
2004-09-12 13:24:06 +00:00
if ( gameInfoP - > musicInfo . sound . multiMidi )
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --multi-midi " , NULL , & argc ) ;
if ( engine = = ENGINE_SCUMM ) {
// music tempo
StrIToA ( num , gameInfoP - > musicInfo . sound . tempo ) ;
ArgsAdd ( & argvP [ argc ] , " --tempo= " , num , & argc ) ;
// talk speed
if ( gameInfoP - > talkSpeed ) {
StrIToA ( num , gameInfoP - > talkValue ) ;
ArgsAdd ( & argvP [ argc ] , " --talkspeed= " , num , & argc ) ;
}
}
2003-11-03 16:14:58 +00:00
// music driver
2004-09-12 13:24:06 +00:00
musicDriver = gameInfoP - > musicInfo . sound . music ;
2003-11-03 16:14:58 +00:00
if ( musicDriver ) {
2004-09-12 13:24:06 +00:00
switch ( gameInfoP - > musicInfo . sound . drvMusic ) {
2003-11-03 16:14:58 +00:00
case 0 : // NULL
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " null " , & argc ) ;
2003-11-03 16:14:58 +00:00
break ;
2004-09-12 13:24:06 +00:00
case 1 : // built-in MIDI
if ( OPTIONS_TST ( kOptDeviceZodiac ) )
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " zodiac " , & argc ) ; // Tapwave Zodiac
2004-09-12 13:24:06 +00:00
else if ( OPTIONS_TST ( kOptSonyPa1LibAPI ) )
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " ypa1 " , & argc ) ; // Pa1Lib devices
2004-09-12 13:24:06 +00:00
else
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " null " , & argc ) ; // error, no music driver
2004-02-05 13:56:39 +00:00
break ;
2004-09-12 13:24:06 +00:00
case 2 : // PC Speaker
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " pcspk " , & argc ) ;
2004-01-20 14:10:23 +00:00
break ;
2004-09-12 13:24:06 +00:00
case 3 : // IBM PCjr
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " pcjr " , & argc ) ;
2004-09-12 13:24:06 +00:00
case 4 : // FM Towns
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " towns " , & argc ) ;
case 5 : // AdLib
ArgsAdd ( & argvP [ argc ] , " -e " , " adlib " , & argc ) ;
2003-11-03 16:14:58 +00:00
}
}
else // NULL as default
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -e " , " null " , & argc ) ;
2003-11-03 16:14:58 +00:00
// volume control
2004-09-12 13:24:06 +00:00
StrIToA ( num , gameInfoP - > musicInfo . volume . master ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -o " , num , & argc ) ;
2004-09-12 13:24:06 +00:00
StrIToA ( num , gameInfoP - > musicInfo . volume . sfx ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -s " , num , & argc ) ;
2004-09-12 13:24:06 +00:00
StrIToA ( num , gameInfoP - > musicInfo . volume . music ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -m " , num , & argc ) ;
2004-09-12 13:24:06 +00:00
StrIToA ( num , gameInfoP - > musicInfo . volume . speech ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " -r " , num , & argc ) ;
2003-11-03 16:14:58 +00:00
2004-09-12 13:24:06 +00:00
// output rate
if ( gameInfoP - > musicInfo . sound . sfx ) {
UInt32 rates [ ] = { 8000 , 11025 , 22050 } ;
StrIToA ( num , rates [ gameInfoP - > musicInfo . sound . rate ] ) ;
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , " --output-rate= " , num , & argc ) ;
2004-09-12 13:24:06 +00:00
}
2003-11-03 16:14:58 +00:00
// game name
2004-11-09 11:54:16 +00:00
ArgsAdd ( & argvP [ argc ] , gameInfoP - > gameP , NULL , & argc ) ;
2003-11-03 16:14:58 +00:00
2004-09-12 13:24:06 +00:00
// use sound
if ( ! gameInfoP - > musicInfo . sound . sfx ) {
OPTIONS_RST ( kOptSonyPa1LibAPI ) ;
OPTIONS_RST ( kOptPalmSoundAPI ) ;
}
// others globals data
gVars - > CD . enable = gameInfoP - > musicInfo . sound . CD ;
gVars - > CD . driver = gameInfoP - > musicInfo . sound . drvCD ;
gVars - > CD . format = gameInfoP - > musicInfo . sound . frtCD ;
gVars - > CD . volume = gameInfoP - > musicInfo . volume . audiocd ;
gVars - > CD . defaultTrackLength = gameInfoP - > musicInfo . sound . defaultTrackLength ;
gVars - > CD . firstTrack = gameInfoP - > musicInfo . sound . firstTrack ;
2003-11-03 16:14:58 +00:00
MemHandleUnlock ( recordH ) ;
}
2004-11-09 11:54:16 +00:00
// debug level
if ( gPrefs - > debug ) {
StrIToA ( num , gPrefs - > debugLevel ) ;
ArgsAdd ( & argvP [ argc ] , " -d " , num , & argc ) ;
}
if ( engine = = ENGINE_QUEEN ) {
// alternative intro ?
if ( gPrefs - > altIntro )
ArgsAdd ( & argvP [ argc ] , " --alt-intro " , NULL , & argc ) ;
}
if ( engine = = ENGINE_SCUMM ) {
// copy protection ?
if ( gPrefs - > copyProtection )
ArgsAdd ( & argvP [ argc ] , " --copy-protection " , NULL , & argc ) ;
// demo mode ?
if ( gPrefs - > demoMode )
ArgsAdd ( & argvP [ argc ] , " --demo-mode " , NULL , & argc ) ;
}
// if (argc > MAX_ARG)
// FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0);
2004-01-20 14:10:23 +00:00
2004-11-09 11:54:16 +00:00
stackSize = ( gPrefs - > setStack ? STACK_LARGER : STACK_DEFAULT ) ;
lightspeed = ( gPrefs - > lightspeed . enable ? gPrefs - > lightspeed . mode : 255 ) ;
toLauncher = ( gPrefs - > exitLauncher ) ;
// gVars values
// (gVars->HRrefNum defined in checkHRmode on Cli<6C> )
gVars - > screenLocked = false ;
gVars - > volRefNum = gPrefs - > card . volRefNum ;
gVars - > vibrator = gPrefs - > vibrator ;
gVars - > stdPalette = gPrefs - > stdPalette ;
2003-11-03 16:14:58 +00:00
2004-05-25 13:18:11 +00:00
// user params
2004-11-09 11:54:16 +00:00
HWR_RSTALL ( ) ;
if ( ! gPrefs - > autoOff )
HWR_SET ( INIT_AUTOOFF ) ;
2004-05-25 13:18:11 +00:00
if ( ! gPrefs - > arm ) {
OPTIONS_RST ( kOptDeviceARM ) ;
OPTIONS_RST ( kOptDeviceProcX86 ) ;
2004-11-09 11:54:16 +00:00
} else {
HWR_SET ( INIT_ARM ) ;
2004-05-25 13:18:11 +00:00
}
2003-11-03 16:14:58 +00:00
if ( gVars - > vibrator )
2004-11-09 11:54:16 +00:00
HWR_SET ( INIT_VIBRATOR ) ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
if ( musicDriver = = 1 | |
musicDriver = = 3 | |
musicDriver = = 4 | |
musicDriver = = sysInvalidRefNum ) {
HWR_SET ( INIT_PA1LIB ) ;
}
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
if ( ModImport ( gVars - > volRefNum , engine ) ! = errNone ) {
FrmCustomAlert ( FrmErrorAlert , " Error importing files: \n please check that all required files are installed on the selected memory card, and you have enough free storage memory. " , 0 , 0 ) ;
ArgsFree ( argvP ) ;
return false ;
2003-11-03 16:14:58 +00:00
}
2004-11-09 11:54:16 +00:00
// free and save globals pref memory
GamCloseDatabase ( false ) ;
FrmCloseAllForms ( ) ;
SavePrefs ( ) ;
2004-09-12 13:24:06 +00:00
{
2004-11-09 11:54:16 +00:00
UInt16 cardNo ;
UInt32 dbID ;
2004-09-12 13:24:06 +00:00
2004-11-09 11:54:16 +00:00
LaunchParamType * cmdPBP = ( LaunchParamType * ) MemPtrNew ( sizeof ( LaunchParamType ) ) ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
MemPtrSetOwner ( cmdPBP , 0 ) ;
MemPtrSetOwner ( gVars , 0 ) ;
ArgsSetOwner ( argvP , 0 ) ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
cardNo = 0 ;
dbID = DmFindDatabase ( 0 , " ScummVM-Engine " ) ;
ModSetStack ( stackSize , cardNo , dbID ) ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
cmdPBP - > args . argc = argc ;
cmdPBP - > args . argv = argvP ;
cmdPBP - > gVars = gVars ;
cmdPBP - > lightspeed = lightspeed ;
cmdPBP - > exitLauncher = toLauncher ;
2003-11-03 16:14:58 +00:00
2004-11-09 11:54:16 +00:00
SysUIAppSwitch ( cardNo , dbID , sysAppLaunchCmdNormalLaunch , cmdPBP ) ;
bLaunched = true ;
2003-11-03 16:14:58 +00:00
}
2004-09-12 13:24:06 +00:00
2003-11-03 16:14:58 +00:00
return false ;
}