mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 22:28:10 +00:00
6b4484472b
svn-id: r18604
440 lines
11 KiB
C++
440 lines
11 KiB
C++
#include <PalmOS.h>
|
||
#include "StarterRsc.h"
|
||
|
||
#include "games.h"
|
||
#include "start.h"
|
||
#include "rumble.h"
|
||
#include "extend.h"
|
||
#include "globals.h"
|
||
#include "features.h"
|
||
#include "formUtil.h"
|
||
|
||
#include "modules.h"
|
||
#include "args.h"
|
||
|
||
/*
|
||
static Boolean checkPath(const Char *pathP) {
|
||
FILE *tmpRef;
|
||
|
||
if (!(tmpRef = fopen(pathP, "r"))) {
|
||
return false;
|
||
} else {
|
||
fclose(tmpRef);
|
||
return true;
|
||
}
|
||
}
|
||
*/
|
||
|
||
#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::Engine");
|
||
DELET_FILE("ScummVM-Engine");
|
||
}
|
||
|
||
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);
|
||
}
|
||
|
||
DmCloseDatabase(dbRef);
|
||
}
|
||
}
|
||
|
||
static Err ModImport(UInt16 volRefNum, UInt8 engine) {
|
||
const Char *files[] = {
|
||
{ "scumm" },
|
||
{ "simon" },
|
||
{ "queen" },
|
||
{ "sword1" },
|
||
{ "sky" }
|
||
};
|
||
|
||
char filename[256];
|
||
UInt16 dum1;
|
||
UInt32 dum2;
|
||
FileRef file;
|
||
FormPtr ofmP, frmP;
|
||
Err e = errNone;
|
||
|
||
ofmP = FrmGetActiveForm();
|
||
frmP = FrmInitForm(ImportForm);
|
||
FrmSetActiveForm(frmP);
|
||
FrmDrawForm(frmP);
|
||
|
||
#ifndef _DEBUG_ENGINE
|
||
// In debug mode, the engine files are directly uploaded to the simulator
|
||
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);
|
||
#endif
|
||
// 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
|
||
|
||
Boolean StartScummVM() {
|
||
Char **argvP;
|
||
UInt8 lightspeed, argc = 0;
|
||
UInt32 stackSize;
|
||
Boolean toLauncher;
|
||
UInt8 engine;
|
||
|
||
UInt16 musicDriver = sysInvalidRefNum; // for launch call
|
||
UInt16 index = GamGetSelected();
|
||
|
||
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);
|
||
|
||
} else {
|
||
Char pathP[256];
|
||
MemHandle recordH;
|
||
GameInfoType *gameInfoP;
|
||
|
||
recordH = DmQueryRecord(gameDB,index);
|
||
gameInfoP = (GameInfoType *)MemHandleLock(recordH);
|
||
engine = gameInfoP->engine;
|
||
|
||
// 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);
|
||
ArgsFree(argvP);
|
||
return false;
|
||
}
|
||
*/
|
||
|
||
// ScummVM
|
||
ArgsAdd(&argvP[argc], "-", NULL, &argc);
|
||
|
||
// path
|
||
ArgsAdd(&argvP[argc], "-p", pathP, &argc);
|
||
|
||
// language
|
||
if (gameInfoP->language > 0) {
|
||
const Char *lang = "en\0de\0fr\0it\0pt\0es\0jp\0zh\0kr\0hb\0ru\0cz\0nl\0";
|
||
ArgsAdd(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc);
|
||
}
|
||
|
||
// fullscreen ?
|
||
if (gameInfoP->fullscreen)
|
||
ArgsAdd(&argvP[argc], "-f", NULL, &argc);
|
||
|
||
// aspect-ratio ?
|
||
ArgsAdd(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc);
|
||
|
||
// gfx mode
|
||
gVars->flipping.pageAddr1 = (UInt8 *)(BmpGetBits(WinGetBitmap(WinGetDisplayWindow())));
|
||
gVars->flipping.pageAddr2 = gVars->flipping.pageAddr1; // default if not flipping mode
|
||
gVars->filter = gameInfoP->filter;
|
||
|
||
switch (gameInfoP->gfxMode) {
|
||
case 1:
|
||
ArgsAdd(&argvP[argc], "-g", "flipping", &argc);
|
||
gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare);
|
||
WinScreenUnlock();
|
||
break;
|
||
case 2:
|
||
ArgsAdd(&argvP[argc], "-g", "buffered", &argc);
|
||
break;
|
||
case 3:
|
||
ArgsAdd(&argvP[argc], "-g", "wide", &argc);
|
||
gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare);
|
||
WinScreenUnlock();
|
||
break;
|
||
default:
|
||
ArgsAdd(&argvP[argc], "-g", "normal", &argc);
|
||
break;
|
||
}
|
||
|
||
// load state
|
||
if (gameInfoP->autoLoad) {
|
||
StrIToA(num, gameInfoP->loadSlot);
|
||
ArgsAdd(&argvP[argc], "-x", num, &argc);
|
||
}
|
||
// boot script parameter
|
||
if (gameInfoP->bootParam) {
|
||
StrIToA(num, gameInfoP->bootValue);
|
||
ArgsAdd(&argvP[argc], "-b", num, &argc);
|
||
}
|
||
// not a PC version
|
||
if (gameInfoP->setPlatform) {
|
||
switch (gameInfoP->platform) {
|
||
case 0:
|
||
ArgsAdd(&argvP[argc], "--platform=", "amiga", &argc);
|
||
break;
|
||
case 1:
|
||
ArgsAdd(&argvP[argc], "--platform=", "atari", &argc);
|
||
break;
|
||
case 2:
|
||
ArgsAdd(&argvP[argc], "--platform=", "mac", &argc);
|
||
break;
|
||
case 3:
|
||
ArgsAdd(&argvP[argc], "--platform=", "pc", &argc);
|
||
break;
|
||
case 4:
|
||
ArgsAdd(&argvP[argc], "--platform=", "fmtowns", &argc);
|
||
break;
|
||
case 5:
|
||
ArgsAdd(&argvP[argc], "--platform=", "windows", &argc);
|
||
break;
|
||
}
|
||
}
|
||
|
||
// subtitles
|
||
if (gameInfoP->subtitles)
|
||
ArgsAdd(&argvP[argc], "-n", NULL, &argc);
|
||
|
||
// multi midi ?
|
||
if (gameInfoP->musicInfo.sound.multiMidi)
|
||
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);
|
||
}
|
||
}
|
||
|
||
// music driver
|
||
musicDriver =gameInfoP->musicInfo.sound.music;
|
||
if (musicDriver) {
|
||
switch (gameInfoP->musicInfo.sound.drvMusic) {
|
||
case 0: // NULL
|
||
ArgsAdd(&argvP[argc], "-e", "null", &argc);
|
||
break;
|
||
|
||
case 1: // built-in MIDI
|
||
if (OPTIONS_TST(kOptDeviceZodiac))
|
||
ArgsAdd(&argvP[argc], "-e", "zodiac", &argc); // Tapwave Zodiac
|
||
else if (OPTIONS_TST(kOptSonyPa1LibAPI))
|
||
ArgsAdd(&argvP[argc], "-e", "ypa1", &argc); // Pa1Lib devices
|
||
else
|
||
ArgsAdd(&argvP[argc], "-e", "null", &argc); // error, no music driver
|
||
break;
|
||
|
||
case 2: // PC Speaker
|
||
ArgsAdd(&argvP[argc], "-e", "pcspk", &argc);
|
||
break;
|
||
case 3: // IBM PCjr
|
||
ArgsAdd(&argvP[argc], "-e", "pcjr", &argc);
|
||
case 4: // FM Towns
|
||
ArgsAdd(&argvP[argc], "-e", "towns", &argc);
|
||
case 5: // AdLib
|
||
ArgsAdd(&argvP[argc], "-e", "adlib", &argc);
|
||
}
|
||
}
|
||
else // NULL as default
|
||
ArgsAdd(&argvP[argc], "-e", "null", &argc);
|
||
|
||
// volume control
|
||
StrIToA(num, gameInfoP->musicInfo.volume.master);
|
||
ArgsAdd(&argvP[argc], "-o", num, &argc);
|
||
StrIToA(num, gameInfoP->musicInfo.volume.sfx);
|
||
ArgsAdd(&argvP[argc], "-s", num, &argc);
|
||
StrIToA(num, gameInfoP->musicInfo.volume.music);
|
||
ArgsAdd(&argvP[argc], "-m", num, &argc);
|
||
StrIToA(num, gameInfoP->musicInfo.volume.speech);
|
||
ArgsAdd(&argvP[argc], "-r", num, &argc);
|
||
|
||
// output rate
|
||
if (gameInfoP->musicInfo.sound.sfx) {
|
||
UInt32 rates[] = {8000, 11025, 22050};
|
||
StrIToA(num, rates[gameInfoP->musicInfo.sound.rate]);
|
||
ArgsAdd(&argvP[argc], "--output-rate=", num, &argc);
|
||
}
|
||
|
||
// game name
|
||
ArgsAdd(&argvP[argc], gameInfoP->gameP, NULL, &argc);
|
||
|
||
// 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;
|
||
|
||
MemHandleUnlock(recordH);
|
||
}
|
||
|
||
// debug level
|
||
if (gPrefs->debug) {
|
||
StrIToA(num, gPrefs->debugLevel);
|
||
ArgsAdd(&argvP[argc], "-d", num, &argc);
|
||
}
|
||
|
||
if (engine == ENGINE_QUEEN || engine == ENGINE_SKY) {
|
||
// 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);
|
||
|
||
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;
|
||
|
||
// user params
|
||
HWR_RSTALL();
|
||
|
||
if (!gPrefs->autoOff)
|
||
HWR_SET(INIT_AUTOOFF);
|
||
|
||
if (!gPrefs->arm) {
|
||
OPTIONS_RST(kOptDeviceARM);
|
||
OPTIONS_RST(kOptDeviceProcX86);
|
||
} else {
|
||
HWR_SET(INIT_ARM);
|
||
}
|
||
|
||
if (gVars->vibrator)
|
||
HWR_SET(INIT_VIBRATOR);
|
||
|
||
if ( musicDriver == 1 ||
|
||
musicDriver == 3 ||
|
||
musicDriver == 4 ||
|
||
musicDriver == sysInvalidRefNum) {
|
||
HWR_SET(INIT_PA1LIB);
|
||
}
|
||
|
||
if (ModImport(gVars->volRefNum, engine) != errNone) {
|
||
FrmCustomAlert(FrmErrorAlert, "Error importing files:\nplease 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;
|
||
}
|
||
|
||
// free and save globals pref memory
|
||
GamCloseDatabase(false);
|
||
FrmCloseAllForms();
|
||
SavePrefs();
|
||
|
||
{
|
||
UInt16 cardNo;
|
||
UInt32 dbID;
|
||
|
||
LaunchParamType *cmdPBP = (LaunchParamType *)MemPtrNew(sizeof(LaunchParamType));
|
||
|
||
MemPtrSetOwner(cmdPBP, 0);
|
||
MemPtrSetOwner(gVars, 0);
|
||
ArgsSetOwner(argvP, 0);
|
||
|
||
cardNo = 0;
|
||
dbID = DmFindDatabase(0, "ScummVM-Engine");
|
||
ModSetStack(stackSize, cardNo, dbID);
|
||
|
||
cmdPBP->args.argc = argc;
|
||
cmdPBP->args.argv = argvP;
|
||
cmdPBP->gVars = gVars;
|
||
cmdPBP->lightspeed = lightspeed;
|
||
cmdPBP->exitLauncher = toLauncher;
|
||
|
||
SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch, cmdPBP);
|
||
bLaunched = true;
|
||
}
|
||
|
||
return false;
|
||
}
|