aboutsummaryrefslogtreecommitdiff
path: root/scummvm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scummvm.cpp')
-rw-r--r--scummvm.cpp388
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;
+
+
+}