mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-30 07:23:05 +00:00
ScummVM launcher in its own source file
svn-id: r11100
This commit is contained in:
parent
b988959380
commit
2045867796
320
backends/PalmOS/Src/launch.cpp
Normal file
320
backends/PalmOS/Src/launch.cpp
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user