aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();