aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Hamm2002-03-23 20:34:47 +0000
committerVincent Hamm2002-03-23 20:34:47 +0000
commitccf69ad76bb6a2c8b7d8889deb12cac16a7475c3 (patch)
tree0761aee166e662c373fb781c0b67970b21057507
parent7b1bbf81e0bfdd3d88ebb8603f4a11fb554126d3 (diff)
downloadscummvm-rg350-ccf69ad76bb6a2c8b7d8889deb12cac16a7475c3.tar.gz
scummvm-rg350-ccf69ad76bb6a2c8b7d8889deb12cac16a7475c3.tar.bz2
scummvm-rg350-ccf69ad76bb6a2c8b7d8889deb12cac16a7475c3.zip
Changed the way games are detected. Now the detection is done out of the scumm object. We can now create de good scumm object depending of the game detected. Warning: the implementation is not yet finalised and the in game gui is more broken than ever....
svn-id: r3802
-rw-r--r--Makefile2
-rw-r--r--akos.h1
-rw-r--r--gameDetecter.cpp266
-rw-r--r--gameDetecter.h24
-rw-r--r--object.cpp10
-rw-r--r--scumm.h91
-rw-r--r--scummvm.cpp388
-rw-r--r--sdl.cpp59
8 files changed, 455 insertions, 386 deletions
diff --git a/Makefile b/Makefile
index a2e5ae0100..b725a54a20 100644
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ OBJS = actor.o boxes.o costume.o gfx.o object.o resource.o \
saveload.o script.o scummvm.o sound.o string.o \
sys.o verbs.o sdl.o script_v1.o script_v2.o debug.o gui.o \
sound/imuse.o sound/fmopl.o sound/adlib.o sound/gmidi.o debugrl.o \
- akos.o vars.o insane.o
+ akos.o vars.o insane.o gameDetecter.o
DISTFILES=$(OBJS:.o=.cpp) Makefile scumm.h scummsys.h stdafx.h stdafx.cpp \
windows.cpp debugrl.h whatsnew.txt readme.txt copying.txt \
diff --git a/akos.h b/akos.h
index c90c71bcb5..79a0c8c2f5 100644
--- a/akos.h
+++ b/akos.h
@@ -91,6 +91,7 @@ struct AkosRenderer {
byte *akcd;
byte palette[256];
+
};
enum AkosOpcodes{
diff --git a/gameDetecter.cpp b/gameDetecter.cpp
new file mode 100644
index 0000000000..f1771ff629
--- /dev/null
+++ b/gameDetecter.cpp
@@ -0,0 +1,266 @@
+#include "stdafx.h"
+#include "scumm.h"
+#include "gameDetecter.h"
+
+
+#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 GameDetecter::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 GameDetecter::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 *GameDetecter::getGameName() {
+ if (_gameText==NULL) {
+ char buf[256];
+ sprintf(buf, "Unknown game: \"%s\"", _exe_name);
+ return strdup(buf);
+ }
+ return strdup(_gameText);
+}
+
+void GameDetecter::detectMain(int argc, char **argv)
+{
+ _debugMode = 0; // off by default...
+
+ _noSubtitles = 0; // use by default - should this depend on soundtrack?
+ _scale = 2; // double size by default
+
+ _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 */
+
+ 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, "");
+ }
+}
+
diff --git a/gameDetecter.h b/gameDetecter.h
new file mode 100644
index 0000000000..c66a39f443
--- /dev/null
+++ b/gameDetecter.h
@@ -0,0 +1,24 @@
+class GameDetecter {
+public:
+ void detectMain(int argc, char **argv);
+ void parseCommandLine(int argc, char **argv);
+ bool detectGame(void);
+ char *getGameName(void);
+
+ bool _fullScreen;
+ uint16 _debugMode;
+ uint16 _noSubtitles;
+ uint16 _bootParam;
+ unsigned int _scale;
+ char *_gameDataPath;
+ int _gameTempo;
+ void *_soundEngine;
+ int _midi_driver;
+ int _videoMode;
+ char *_exe_name;
+ byte _gameId;
+ const char *_gameText;
+ uint32 _features;
+ uint16 _soundCardType;
+
+};
diff --git a/object.cpp b/object.cpp
index 7c3ec7cd5c..e6e439db23 100644
--- a/object.cpp
+++ b/object.cpp
@@ -135,9 +135,9 @@ void Scumm::getObjectXYPos(int object) {
ImageHeader *imhd;
int x,y;
- if(!(_features & GF_SMALL_HEADER)) {
- if (_features&GF_AFTER_V6) {
- state = getState(object)-1;
+ if(!(_features & GF_SMALL_HEADER)) {
+ if (_features&GF_AFTER_V6) {
+ state = getState(object)-1;
if (state<0)
state = 0;
@@ -159,14 +159,14 @@ void Scumm::getObjectXYPos(int object) {
}
} else {
x = od->walk_x;
- y = od->walk_y;
+ y = od->walk_y;
}
_xPos = x;
_yPos = y;
_dir = oldDirToNewDir(od->actordir&3);
} else {
x = od->walk_x;
- y = od->walk_y;
+ y = od->walk_y;
_xPos = x;
_yPos = y;
_dir= oldDirToNewDir(od->actordir&3);
diff --git a/scumm.h b/scumm.h
index 3b4485ffe6..002359c29f 100644
--- a/scumm.h
+++ b/scumm.h
@@ -21,6 +21,7 @@
#include "scummsys.h"
#include "system.h"
+
#ifdef COMPRESSED_SOUND_FILE
#include <mad.h>
#endif
@@ -893,44 +894,6 @@ public:
byte *getOBCDFromObject(int obj);
int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f);
- /* Should be in akos class */
- bool akos_drawCostume(AkosRenderer *ar);
- void akos_setPalette(AkosRenderer *ar, byte *palette);
- void akos_setCostume(AkosRenderer *ar, int costume);
- void akos_setFacing(AkosRenderer *ar, Actor *a);
- bool akos_drawCostumeChannel(AkosRenderer *ar, int chan);
- void akos_codec1(AkosRenderer *ar);
- void akos_codec5(AkosRenderer *ar);
- void akos_codec16(AkosRenderer *ar);
- void akos_codec1_ignorePakCols(AkosRenderer *ar, int num);
- void akos_c1_spec2(AkosRenderer *ar);
- void akos_c1_spec3(AkosRenderer *ar);
-
- void akos_c1_0_decode(AkosRenderer *ar);
- void akos_c1_12_decode(AkosRenderer *ar);
- void akos_c1_12y_decode(AkosRenderer *ar);
- void akos_c1_3_decode(AkosRenderer *ar);
- void akos_c1_4_decode(AkosRenderer *ar);
- void akos_c1_4y_decode(AkosRenderer *ar);
- void akos_c1_56_decode(AkosRenderer *ar);
- void akos_c1_56y_decode(AkosRenderer *ar);
- void akos_c1_7_decode(AkosRenderer *ar);
-
- bool akos_increaseAnims(byte *akos, Actor *a);
- bool akos_increaseAnim(Actor *a, int i, byte *aksq, uint16 *akfo, int numakfo);
-
- int getAnimVar(Actor *a, byte var);
- void setAnimVar(Actor *a, byte var, int value);
-
- void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
- bool akos_compare(int a, int b, byte cmd);
- void akos_decodeData(Actor *a, int frame, uint usemask);
- int akos_frameToAnim(Actor *a, int frame);
- bool akos_hasManyDirections(Actor *a);
- int akos_findManyDirection(int16 ManyDirection, uint16 facing);
-
-
-
/* Should be in Costume class */
void loadCostume(LoadedCostume *lc, int costume);
void cost_setPalette(CostumeRenderer *cr, byte *palette);
@@ -1080,6 +1043,41 @@ public:
void actorTalk();
void stopTalk();
+ /* Akos Class */
+ bool akos_drawCostume(AkosRenderer *ar);
+ void akos_setPalette(AkosRenderer *ar, byte *palette);
+ void akos_setCostume(AkosRenderer *ar, int costume);
+ void akos_setFacing(AkosRenderer *ar, Actor *a);
+ bool akos_drawCostumeChannel(AkosRenderer *ar, int chan);
+ void akos_codec1(AkosRenderer *ar);
+ void akos_codec5(AkosRenderer *ar);
+ void akos_codec16(AkosRenderer *ar);
+ void akos_codec1_ignorePakCols(AkosRenderer *ar, int num);
+ void akos_c1_spec2(AkosRenderer *ar);
+ void akos_c1_spec3(AkosRenderer *ar);
+
+ void akos_c1_0_decode(AkosRenderer *ar);
+ void akos_c1_12_decode(AkosRenderer *ar);
+ void akos_c1_12y_decode(AkosRenderer *ar);
+ void akos_c1_3_decode(AkosRenderer *ar);
+ void akos_c1_4_decode(AkosRenderer *ar);
+ void akos_c1_4y_decode(AkosRenderer *ar);
+ void akos_c1_56_decode(AkosRenderer *ar);
+ void akos_c1_56y_decode(AkosRenderer *ar);
+ void akos_c1_7_decode(AkosRenderer *ar);
+
+ bool akos_increaseAnims(byte *akos, Actor *a);
+ bool akos_increaseAnim(Actor *a, int i, byte *aksq, uint16 *akfo, int numakfo);
+
+ int getAnimVar(Actor *a, byte var);
+ void setAnimVar(Actor *a, byte var, int value);
+
+ void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
+ bool akos_compare(int a, int b, byte cmd);
+ void akos_decodeData(Actor *a, int frame, uint usemask);
+ int akos_frameToAnim(Actor *a, int frame);
+ bool akos_hasManyDirections(Actor *a);
+ int akos_findManyDirection(int16 ManyDirection, uint16 facing);
@@ -1663,8 +1661,25 @@ public:
byte VAR_DEFAULT_TALK_DELAY;
byte VAR_CHARSET_MASK;
+
+ void launch();
+
+ virtual void test1() const { return; };
};
+class Scumm_v7 : public Scumm
+{
+public:
+ // Scumm_v7();
+// const static int test = 1;
+ void test1v7() const { printf("Test1"); }
+ void test1() const { test1v7(); }
+};
+
+class Scumm_v3 : public Scumm
+{
+public:
+};
struct ScummDebugger {
Scumm *_s;
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;
+
+
+}
diff --git a/sdl.cpp b/sdl.cpp
index 6e3c179569..39ad650219 100644
--- a/sdl.cpp
+++ b/sdl.cpp
@@ -26,15 +26,17 @@
#include "scumm.h"
#include "gui.h"
#include "SDL_thread.h"
+#include "gameDetecter.h"
#include "cdmusic.h"
static unsigned int scale;
-Scumm scumm;
+Scumm *scumm;
ScummDebugger debugger;
Gui gui;
OSystem _system;
+GameDetecter detecter;
SoundEngine sound;
SOUND_DRIVER_TYPE snd_driv;
@@ -664,7 +666,7 @@ void drawMouse(Scumm *s, int xdraw, int ydraw, int w, int h, byte *buf, bool vis
}
void fill_sound(void *userdata, Uint8 *stream, int len) {
- scumm.mixWaves((int16*)stream, len>>1);
+ scumm->mixWaves((int16*)stream, len>>1);
}
static int cd_track, cd_num_loops = 0, cd_start_frame, cd_end_frame;
@@ -678,7 +680,7 @@ void cd_play(int track, int num_loops, int start_frame, int end_frame) {
// warning("cd_play(%d,%d,%d,%d)", track, num_loops, start_frame, end_frame);
if (!cdrom) return;
- scumm._vars[14] = 0;
+ scumm->_vars[14] = 0;
cd_track = track;
cd_num_loops = num_loops;
cd_start_frame = start_frame;
@@ -787,7 +789,7 @@ void initGraphics(Scumm *s, bool fullScreen, unsigned int scaleFactor) {
char buf[512], *gameName;
- sprintf(buf, "ScummVM - %s", gameName = s->getGameName());
+ sprintf(buf, "ScummVM - %s", gameName = detecter.getGameName());
free(gameName);
desired.freq = SAMPLES_PER_SEC;
@@ -849,7 +851,7 @@ void initGraphics(Scumm *s, bool fullScreen, unsigned int scaleFactor) {
void setWindowName(Scumm *s) {
char buf[512], *gameName;
- sprintf(buf, "ScummVM - %s", gameName = s->getGameName());
+ sprintf(buf, "ScummVM - %s", gameName = detecter.getGameName());
free(gameName);
SDL_WM_SetCaption(buf,buf);
}
@@ -866,10 +868,10 @@ void launcherLoop() {
gui.launcher();
do {
- updateScreen(&scumm);
+ updateScreen(scumm);
new_time = SDL_GetTicks();
- waitForTimer(&scumm, delta * 15 + last_time - new_time);
+ waitForTimer(scumm, delta * 15 + last_time - new_time);
last_time = SDL_GetTicks();
if (gui._active) {
@@ -916,20 +918,41 @@ int main(int argc, char* argv[]) {
#endif
- scumm._gui = &gui;
- gui.init(&scumm);
- sound.initialize(&scumm, &snd_driv);
+ detecter.detectMain(argc, argv);
+
+ scumm = new Scumm;
+
+ scumm->_fullScreen = detecter._fullScreen;
+ scumm->_debugMode = detecter._debugMode;
+ scumm->_bootParam = detecter._bootParam;
+ scumm->_scale = detecter._scale;
+ scumm->_gameDataPath = detecter._gameDataPath;
+ scumm->_gameTempo = detecter._gameTempo;
+ scumm->_soundEngine = detecter._soundEngine;
+ scumm->_videoMode = detecter._videoMode;
+ scumm->_exe_name = detecter._exe_name;
+ scumm->_gameId = detecter._gameId;
+ scumm->_gameText = detecter._gameText;
+ scumm->_features = detecter._features;
+ scumm->_soundCardType = detecter._soundCardType;
+
+
+ scumm->_gui = &gui;
+// gui.init(scumm);
+ sound.initialize(scumm, &snd_driv);
- scumm.delta=0;
- scumm._system = &_system;
+ scumm->delta=0;
+ scumm->_system = &_system;
+
+ scumm->launch();
- scumm.scummMain(argc, argv); // Todo: need to change that as well
+// scumm->scummMain(argc, argv); // Todo: need to change that as well
- gui.init(&scumm); /* Reinit GUI after loading a game */
+ gui.init(scumm); /* Reinit GUI after loading a game */
_system.last_time = SDL_GetTicks();
- scumm.mainRun();
+ scumm->mainRun();
return 0;
}
@@ -1130,7 +1153,7 @@ void BoxTest(int num) {
BoxCoords box;
Sint16 rx1[4], ry1[4];
- scumm.getBoxCoordinates(num, &box);
+ scumm->getBoxCoordinates(num, &box);
rx1[0] = box.ul.x*2; ry1[0] = box.ul.y*2+32;
rx1[1] = box.ur.x*2; ry1[1] = box.ur.y*2+32;
rx1[2] = box.ll.x*2; ry1[2] = box.ll.y*2+32;
@@ -1953,9 +1976,9 @@ void Scale_2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 * /* deltaPtr */,
int OSystem::waitTick(int delta)
{
- updateScreen(&scumm);
+ updateScreen(scumm);
new_time = SDL_GetTicks();
- waitForTimer(&scumm, delta * 15 + last_time - new_time);
+ waitForTimer(scumm, delta * 15 + last_time - new_time);
last_time = SDL_GetTicks();
if (gui._active) {
gui.loop();