Logo Search packages:      
Sourcecode: scummvm version File versions

launch.cpp

#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) {
            // 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é)
      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;
}

Generated by  Doxygen 1.6.0   Back to index