ScummVM launcher in its own source file

svn-id: r11100
This commit is contained in:
Chris Apers 2003-11-03 16:14:58 +00:00
parent b988959380
commit 2045867796

View File

@ -0,0 +1,320 @@
#include <PalmOS.h>
#include <Sonyclie.h>
#include "StarterRsc.h"
#include "stdio.h"
#include "games.h"
#include "start.h"
#include "vibrate.h"
#include "pa1lib.h"
#include "extend.h"
// need to move this on a .h file
#define sonySysFileCSystem 'SsYs' /* Sony overall System */
#define sonySysFtrCreatorSystem sonySysFileCSystem
#define sonySysFtrNumSystemBase 10000
#define sonySysFtrNumSystemAOutSndStateOnHandlerP (sonySysFtrNumSystemBase + 4)
#define sonySysFtrNumSystemAOutSndStateOffHandlerP (sonySysFtrNumSystemBase + 5)
typedef void (*sndStateOnType)(UInt8 /* kind */, UInt8 /* L volume 0-31 */, UInt8 /* R volume 0-31 */);
typedef void (*sndStateOffType)(UInt8 /* kind */);
/* kind */
#define aOutSndKindSp (0) /* Speaker volume */
#define aOutSndKindHp (2) /* HeadPhone volume */
////////////////////////////////////////////////////////////
#define MAX_ARG 25
static Boolean checkPath(const Char *pathP) {
FileRef *tmpRef;
if (!(tmpRef = fopen(pathP, "r"))) {
return false;
} else {
fclose(tmpRef);
return true;
}
}
static void AddArg(Char **argvP, const Char *argP, const Char *parmP, UInt8 *countArgP)
{
if (argP)
{
UInt16 len2 = 0;
UInt16 len1 = StrLen(argP);
if (len1 > 0)
{
if (parmP)
len2 = StrLen(parmP);
(*countArgP)++;
*argvP = (Char *)MemPtrNew(len1 + len2 + 1);
StrCopy(*argvP, argP);
if (parmP)
StrCat(*argvP, parmP);
}
}
}
Boolean StartScummVM() {
Char *argvP[MAX_ARG];
UInt8 argc = 0;
UInt8 count;
Boolean autoOff;
UInt16 autoOffDelay;
Boolean debug;
UInt16 musicDriver = sysInvalidRefNum; // for launch call
UInt16 index = GamGetSelected();
for(count = 0; count < MAX_ARG; count++)
argvP[count] = NULL;
if (index != dmMaxRecordIndex) {
Char pathP[256];
Char num[4];
MemHandle recordH;
GameInfoType *gameInfoP;
recordH = DmQueryRecord(gameDB,index);
gameInfoP = (GameInfoType *)MemHandleLock(recordH);
// build path
StrCopy(pathP,"/Palm/Programs/ScummVM/Games/");
if (gameInfoP->pathP[0] == '/')
StrCopy(pathP,gameInfoP->pathP);
else
StrCat(pathP,gameInfoP->pathP);
// path exists ?
if (!checkPath(pathP)) {
MemHandleUnlock(recordH);
FrmCustomAlert(FrmErrorAlert,"The specified path was not found !",0,0);
return false;
}
// ScummVM
AddArg(&argvP[argc], "-", NULL, &argc);
// TODO : remove this ?
// save scummvm.ini ?
// if (gPrefs->saveConfig)
// AddArg(&argvP[argc], "-w", NULL, &argc);
// path
AddArg(&argvP[argc], "-p", pathP, &argc);
// language
if (gameInfoP->language > 0) {
const Char *lang = "en\0de\0fr\0it\0p\0es\0jp\0z\0kr\0hb\0ru\0";
AddArg(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc);
}
// fullscreen ?
if (gPrefs->fullscreen) {
AddArg(&argvP[argc], "-f", NULL, &argc);
}
// gfx mode
switch (gameInfoP->gfxMode)
{
case 1:
AddArg(&argvP[argc], "-g", "flipping", &argc);
break;
case 2:
AddArg(&argvP[argc], "-g", "dbuffer", &argc);
break;
case 3:
AddArg(&argvP[argc], "-g", "wide", &argc);
break;
default:
AddArg(&argvP[argc], "-g", "normal", &argc);
break;
}
// load state
if (gameInfoP->autoLoad) {
StrIToA(num, gameInfoP->loadSlot);
AddArg(&argvP[argc], "-x", num, &argc);
}
// boot script parameter
if (gameInfoP->bootParam) {
StrIToA(num, gameInfoP->bootValue);
AddArg(&argvP[argc], "-b", num, &argc);
}
// not a PC version
if (gameInfoP->setPlatform) {
switch (gPrefs->sound.driver) {
case 0:
AddArg(&argvP[argc], "--platform=", "amiga", &argc);
break;
case 1:
AddArg(&argvP[argc], "--platform=", "atari-st", &argc);
break;
case 2:
AddArg(&argvP[argc], "--platform=", "macintosh", &argc);
break;
}
}
// subtitles
if (!gameInfoP->subtitles) {
AddArg(&argvP[argc], "-n", NULL, &argc);
}
// talk speed
if (gameInfoP->talkSpeed) {
StrIToA(num, gameInfoP->talkValue);
AddArg(&argvP[argc], "--talkspeed=", num, &argc);
}
// debug level
debug = gPrefs->debug;
if (gPrefs->debug) {
StrIToA(num, gPrefs->debugLevel);
AddArg(&argvP[argc], "-d", num, &argc);
}
// demo mode ?
if (gPrefs->demoMode)
AddArg(&argvP[argc], "--demo-mode", NULL, &argc);
// multi midi ?
if (gPrefs->sound.multiMidi)
AddArg(&argvP[argc], "--multi-midi", NULL, &argc);
// music driver
musicDriver = gPrefs->sound.music;
if (musicDriver) {
switch (gPrefs->sound.driver) {
case 0: // NULL
AddArg(&argvP[argc], "-e", "null", &argc);
break;
case 1: // yamaha Pa1
AddArg(&argvP[argc], "-e", "ypa1", &argc);
break;
}
}
else // NULL as default
AddArg(&argvP[argc], "-e", "null", &argc);
// music tempo
StrIToA(num, gPrefs->sound.tempo);
AddArg(&argvP[argc], "--tempo=", num, &argc);
// volume control
StrIToA(num, gPrefs->volume.master);
AddArg(&argvP[argc], "-o", num, &argc);
StrIToA(num, gPrefs->volume.sfx);
AddArg(&argvP[argc], "-s", num, &argc);
StrIToA(num, gPrefs->volume.music);
AddArg(&argvP[argc], "-m", num, &argc);
// game name
AddArg(&argvP[argc], gameInfoP->gameP, NULL, &argc);
MemHandleUnlock(recordH);
}
gVars->skinSet = false;
GamCloseDatabase(false);
FrmCloseAllForms();
autoOff = gPrefs->autoOff;
if (!autoOff) {
autoOffDelay = SysSetAutoOffTime(0);
EvtResetAutoOffTimer();
}
// gVars values
//gVars->HRrefNum defined in checkHRmode on Clié OS4
//gVars->logFile defined bellow, must be defined only if debug option is checked
gVars->screenLocked = false;
gVars->volRefNum = gPrefs->card.volRefNum;
gVars->vibrator = gPrefs->vibrator;
gVars->stdPalette = gPrefs->stdPalette;
gVars->autoReset = gPrefs->autoReset;
gVars->music.MP3 = gPrefs->sound.MP3;
gVars->music.setDefaultTrackLength = gPrefs->sound.setDefaultTrackLength;
gVars->music.defaultTrackLength = gPrefs->sound.defaultTrackLength;
gVars->music.firstTrack = gPrefs->sound.firstTrack;
// TODO : support tapwave rumble
if (gVars->vibrator)
{
if (CheckVibratorExists()) {
UInt16 cycle = (SysTicksPerSecond())/2;
UInt32 pattern = 0xFF000000;
UInt16 delay = 1;
UInt16 repeat = 1;
HwrVibrateAttributes(1, kHwrVibrateRate, &cycle);
HwrVibrateAttributes(1, kHwrVibratePattern, &pattern);
HwrVibrateAttributes(1, kHwrVibrateDelay, &delay);
HwrVibrateAttributes(1, kHwrVibrateRepeatCount, &repeat);
} else {
gVars->vibrator = false;
}
}
if (debug) {
VFSFileDelete(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log");
VFSFileCreate(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log");
VFSFileOpen(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log",vfsModeWrite, &gVars->logFile);
}
void *sndStateOnFuncP = NULL,
*sndStateOffFuncP = NULL;
if (musicDriver == 1 || musicDriver == sysInvalidRefNum) {
Pa1Lib_Open();
// Don't work on T4xx and T6xx series ?
FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOnHandlerP, (UInt32*) &sndStateOnFuncP);
FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOffHandlerP, (UInt32*) &sndStateOffFuncP);
if (sndStateOnFuncP && sndStateOffFuncP) {
((sndStateOnType)(sndStateOnFuncP))(aOutSndKindSp, gPrefs->volume.headphone, gPrefs->volume.headphone);
((sndStateOnType)(sndStateOnFuncP))(aOutSndKindHp, gPrefs->volume.speaker, gPrefs->volume.speaker);
}
Pa1Lib_devHpVolume(gPrefs->volume.headphone, gPrefs->volume.headphone);
Pa1Lib_devSpVolume(gPrefs->volume.speaker);
}
SavePrefs(); // free globals pref memory
GlbOpen();
main(argc, argvP);
GlbClose();
if (musicDriver == 1 || musicDriver == sysInvalidRefNum) {
if (sndStateOnFuncP && sndStateOffFuncP) {
((sndStateOffType)(sndStateOffFuncP))(aOutSndKindSp);
((sndStateOffType)(sndStateOffFuncP))(aOutSndKindHp);
}
Pa1Lib_Close();
}
if (debug)
VFSFileClose(gVars->logFile);
for(count = 0; count < MAX_ARG; count++)
if (argvP[count])
MemPtrFree(argvP[count]);
if (gVars->vibrator) {
Boolean active = false;
HwrVibrateAttributes(1, kHwrVibrateActive, &active);
}
if (!autoOff) {
SysSetAutoOffTime(autoOffDelay);SystemPreferencesChoice
EvtResetAutoOffTimer();
}
return false;
}