diff options
Diffstat (limited to 'scummvm.cpp')
-rw-r--r-- | scummvm.cpp | 388 |
1 files changed, 64 insertions, 324 deletions
diff --git a/scummvm.cpp b/scummvm.cpp index 4217e99f5c..1d2d47e458 100644 --- a/scummvm.cpp +++ b/scummvm.cpp @@ -186,115 +186,6 @@ void Scumm::checkRange(int max, int min, int no, const char *str) { } } -void Scumm::scummMain(int argc, char **argv) { - charset._vm = this; - gdi._vm = this; - - _fileHandle = NULL; - - _debugMode = 0; // off by default... - _noSubtitles = 0; // use by default - should this depend on soundtrack? - _scale = 2; // double size by default - - _maxHeapThreshold = 450000; - _minHeapThreshold = 400000; - - _gameDataPath = NULL; - _gameTempo = 0; - _videoMode = 0; - _soundCardType = 3; - - #ifdef WIN32 - _midi_driver = MIDI_WINDOWS; - #else - _midi_driver = MIDI_NULL; - #endif - parseCommandLine(argc, argv); - - if (_exe_name != NULL) { - /* No game selection menu */ - if (!detectGame()) { - warning("Game detection failed. Using default settings"); - _features = GF_DEFAULT; - } - } else { - _gameText = "Please choose a game"; - } - - /* Init graphics and create a primary virtual screen */ - initGraphics(this, _fullScreen, _scale); - allocResTypeData(rtBuffer, MKID('NONE'),10,"buffer", 0); - initVirtScreen(0, 0, 200, false, false); - - if (_exe_name==NULL) { - launcherLoop(); - setWindowName(this); - } - - if (!detectGame()) { - warning("Game detection failed. Using default settings"); - _features = GF_DEFAULT; - } - - if (!_gameDataPath) { - warning("No path was provided. Assuming that data file are in the current directory"); - _gameDataPath = (char *)malloc(sizeof(char) * 2); - strcpy(_gameDataPath, ""); - } - - if(_features & GF_AFTER_V7) - setupScummVarsNew(); - else - setupScummVarsOld(); - - - if ((_features & GF_AFTER_V7) || (_gameId == GID_SAMNMAX)) - NUM_ACTORS = 30; - else - NUM_ACTORS = 13; - - if(_features & GF_AFTER_V7) - OF_OWNER_ROOM = 0xFF; - else - OF_OWNER_ROOM = 0x0F; - - - if (_gameId==GID_INDY4 && _bootParam==0) { - _bootParam = -7873; - } - -// if (_gameId==GID_MONKEY2 && _bootParam==0) { -// _bootParam = 10001; -// } - - if (_features & GF_SMALL_HEADER) - readIndexFileSmall(); - else - readIndexFile(); - - initRandSeeds(); - - if (_features & GF_NEW_OPCODES) - setupOpcodes2(); - else - setupOpcodes(); - - scummInit(); - - if(!(_features & GF_AFTER_V7)) - _vars[VAR_VERSION] = 21; - _vars[VAR_DEBUGMODE] = _debugMode; - - if (_gameId==GID_MONKEY) { - _vars[74] = 1225; - } - - setupSound(); - - runScript(1,0,0,&_bootParam); -// _scummTimer = 0; -} - int Scumm::scummLoop(int delta) { @@ -438,221 +329,6 @@ int Scumm::scummLoop(int delta) { } - -#define USAGE_STRING "ScummVM - Scumm Interpreter\n" \ - "Syntax:\n" \ - "\tscummvm [-v] [-d] [-n] [-b<num>] [-t<num>] [-s<num>] [-p<path>] [-m<num>] [-f] game\n" \ - "Flags:\n" \ - "\tv - show version info and exit\n" \ - "\td - enable debug output\n" \ - "\tn - no subtitles for speech\n" \ - "\tb<num> - start in room <num>\n" \ - "\tt<num> - set music tempo. Suggested: 1F0000\n" \ - "\ts<num> - set scale factor to <num> (1, 2, or 3 - 2 by default)\n" \ - "\tp<path> - look for game in <path>\n" \ - "\tm<num> - set music volume to <num> (0-100)\n" \ - "\te<num> - set music engine. see readme.txt for details\n" \ - "\tr - emulate roland mt32 instruments\n" \ - "\tf - fullscreen mode\n" \ - "\tg - graphics mode. 1 for 2xSai anti-aliasing\n" - -void Scumm::parseCommandLine(int argc, char **argv) { - #if !defined(__APPLE__CW) - int i; - char *s; - - // check for arguments - if (argc < 2) - { - printf( USAGE_STRING ); - //exit(1); - } - - /* Parse the arguments */ - for (i=1; i < argc; i++) { - s = argv[i]; - - if (s && s[0]=='-') { - s++; - while (*s) { - switch(tolower(*s)) { - case 'b': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _bootParam = atoi(s+1); - goto NextArg; - case 'f': - _fullScreen = true; - break; - case 'd': - _debugMode = true; - break; - case 'n': - _noSubtitles = true; - break; - case 's': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _scale = atoi(s+1); - if (_scale == 0 || _scale > 3) - { - // bad scale - only 1, 2, 3 work for now - printf("Invalid scale '%s' - valid values are 1, 2, 3\n", s+1); - exit(1); - } - goto NextArg; - case 'v': - printf("ScummVM " SCUMMVM_VERSION "\nBuilt on " __DATE__ " " __TIME__ "\n"); - #ifdef SCUMMVM_PLATFORM_VERSION - printf(" " SCUMMVM_PLATFORM_VERSION "\n"); - #endif - exit(1); - case 'p': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _gameDataPath = s+1; - goto NextArg; - case 't': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _gameTempo = atoi(s+1); - goto NextArg; - case 'm': { - if (*(s+1) == '\0') - goto ShowHelpAndExit; - SoundEngine *se = (SoundEngine*)_soundEngine; - - if (se) - se->set_music_volume(atoi(s+1)); - goto NextArg; - } - case 'r': { - SoundEngine *se = (SoundEngine*)_soundEngine; - - if (se) - se->_mt32emulate = true; - break; - } - case 'e': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _midi_driver = atoi(s+1); - goto NextArg; - case 'g': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _videoMode = atoi(s+1); - goto NextArg; - - default: -ShowHelpAndExit:; - printf( USAGE_STRING ); - exit(1); - } - s++; - } -NextArg:; - } else { - if (_exe_name) goto ShowHelpAndExit; - _exe_name = s; - } - } - - #else - _midi_driver = 4; - _exe_name = *argv; - _gameDataPath = (char*)malloc(strlen(_exe_name) + 3); - sprintf(_gameDataPath, ":%s:", _exe_name); - #endif - -} - - -struct VersionSettings { - const char *filename; - const char *gamename; - byte id,major,middle,minor; - uint32 features; -}; - -/* - This is a list of all known SCUMM games. Commented games are not - supported at this time */ - -static const VersionSettings version_settings[] = { - /* Scumm Version 1 */ -// {"maniac", "Maniac Mansion (C64)", GID_MANIAC64, 1, 0, 0,}, -// {"zak", "Zak McKracken and the Alien Mindbenders (C64)", GID_ZAK64, 1, 0, 0,}, - - /* Scumm Version 2 */ -// {"maniac", "Maniac Mansion", GID_MANIAC, 2, 0, 0,}, -// {"zak", "Zak McKracken and the Alien Mindbenders", GID_ZAK, 2, 0, 0,}, -// {"indy3", "Indiana Jones and the Last Crusade", GID_INDY3, 2, 0, 0,}, - - /* Scumm Version 3 */ - {"indy3", "Indiana Jones and the Last Crusade (256)", GID_INDY3_256, 3, 0, 22, GF_SMALL_HEADER|GF_USE_KEY|GF_SMALL_NAMES|GF_OLD256|GF_NO_SCALLING}, - {"zak256", "Zak McKracken and the Alien Mindbenders (256)",GID_ZAK256, 3, 0, 0, GF_SMALL_HEADER|GF_USE_KEY|GF_SMALL_NAMES|GF_OLD256|GF_AUDIOTRACKS|GF_NO_SCALLING}, - {"loom", "Loom", GID_LOOM, 3, 5, 40, GF_SMALL_HEADER|GF_USE_KEY|GF_SMALL_NAMES|GF_OLD_BUNDLE|GF_16COLOR|GF_NO_SCALLING}, - - /* Scumm Version 4 */ - {"monkeyEGA", "Monkey Island 1 (EGA)", GID_MONKEY_EGA, 4, 0, 67, GF_SMALL_HEADER|GF_USE_KEY|GF_16COLOR}, // EGA version - - /* Scumm version 5 */ - {"loomcd", "Loom (256 color CD version)", GID_LOOM256, 5, 1, 42, GF_SMALL_HEADER|GF_USE_KEY|GF_AUDIOTRACKS}, - {"monkey", "Monkey Island 1", GID_MONKEY, 5, 2, 2, GF_USE_KEY|GF_AUDIOTRACKS}, - {"monkey1", "Monkey Island 1 (alt)", GID_MONKEY, 5, 2, 2, GF_USE_KEY|GF_AUDIOTRACKS}, - {"monkey2", "Monkey Island 2: LeChuck's revenge", GID_MONKEY2, 5, 2, 2, GF_USE_KEY}, - {"atlantis", "Indiana Jones 4 and the Fate of Atlantis", GID_INDY4, 5, 5, 0, GF_USE_KEY}, - {"playfate", "Indiana Jones 4 and the Fate of Atlantis (Demo)", GID_INDY4, 5, 5, 0, GF_USE_KEY}, - - /* Scumm Version 6 */ - {"tentacle", "Day Of The Tentacle", GID_TENTACLE, 6, 4, 2, GF_NEW_OPCODES|GF_AFTER_V6|GF_USE_KEY}, - {"dottdemo", "Day Of The Tentacle (Demo)", GID_TENTACLE, 6, 3, 2, GF_NEW_OPCODES|GF_AFTER_V6|GF_USE_KEY}, - {"samnmax", "Sam & Max", GID_SAMNMAX, 6, 4, 2, GF_NEW_OPCODES|GF_AFTER_V6|GF_USE_KEY|GF_DRAWOBJ_OTHER_ORDER}, - {"snmdemo", "Sam & Max (Demo)", GID_SAMNMAX, 6, 3, 0, GF_NEW_OPCODES|GF_AFTER_V6|GF_USE_KEY}, - - /* Scumm Version 7 */ - {"ft", "Full Throttle", GID_FT, 7, 3, 0, GF_NEW_OPCODES|GF_AFTER_V6|GF_AFTER_V7}, - {"dig", "The Dig", GID_DIG, 7, 5, 0, GF_NEW_OPCODES|GF_AFTER_V6|GF_AFTER_V7}, - - /* Scumm Version 8 */ -// {"curse", "The Curse of Monkey Island", GID_CMI, 8, 1, 0,}, - {NULL,NULL} -}; - -bool Scumm::detectGame() { - const VersionSettings *gnl = version_settings; - - _gameId = 0; - _gameText = NULL; - do { - if (!scumm_stricmp(_exe_name, gnl->filename)) { - _gameId = gnl->id; -// _majorScummVersion = gnl->major; -// _middleScummVersion = gnl->middle; -// _minorScummVersion = gnl->minor; - _features = gnl->features; - _gameText = gnl->gamename; - debug(1, "Detected game '%s', version %d.%d.%d", - gnl->gamename, gnl->major, gnl->middle, gnl->minor); - return true; - } - } while ((++gnl)->filename); - - debug(1, "Failed game detection"); - - return true; -} - -char *Scumm::getGameName() { - if (_gameText==NULL) { - char buf[256]; - sprintf(buf, "Unknown game: \"%s\"", _exe_name); - return strdup(buf); - } - return strdup(_gameText); -} - void Scumm::startScene(int room, Actor *a, int objectNr) { int i,where; Actor *at; @@ -1341,3 +1017,67 @@ void Scumm::mainRun() { delta = scummLoop(delta); }while(1); } + +void Scumm::launch() +{ + charset._vm = this; + gdi._vm = this; + _fileHandle = NULL; + + _maxHeapThreshold = 450000; + _minHeapThreshold = 400000; + + /* Init graphics and create a primary virtual screen */ + + initGraphics(this, _fullScreen, _scale); + allocResTypeData(rtBuffer, MKID('NONE'),10,"buffer",0); + initVirtScreen(0, 0, 200, false, false); + + if (_features & GF_AFTER_V7) + setupScummVarsNew(); + else + setupScummVarsOld(); + + if ((_features & GF_AFTER_V7) || (_gameId == GID_SAMNMAX)) + NUM_ACTORS = 30; + else + NUM_ACTORS = 13; + + if(_features & GF_AFTER_V7) + OF_OWNER_ROOM = 0xFF; + else + OF_OWNER_ROOM = 0x0F; + + if (_gameId==GID_MONKEY2 && _bootParam == 0) + _bootParam = 10001; + + if (_features & GF_SMALL_HEADER) + readIndexFileSmall(); + else + readIndexFile(); + + initRandSeeds(); + + if (_features & GF_NEW_OPCODES) + setupOpcodes2(); + else + setupOpcodes(); + + scummInit(); + + if(!(_features & GF_AFTER_V7)) + _vars[VAR_VERSION] = 21; + + _vars[VAR_DEBUGMODE] = _debugMode; + + if (_gameId == GID_MONKEY) + _vars[74] = 1225; + + setupSound(); + + runScript(1,0,0,&_bootParam); + +// _scummTimer = 0; + + +} |