aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/dialogs.cpp4
-rw-r--r--scumm/gfx.cpp44
-rw-r--r--scumm/imuse.cpp22
-rw-r--r--scumm/imuse_digi.cpp67
-rw-r--r--scumm/resource.cpp8
-rw-r--r--scumm/saveload.cpp30
-rw-r--r--scumm/script.cpp2
-rw-r--r--scumm/script_v6.cpp8
-rw-r--r--scumm/scumm.h4
-rw-r--r--scumm/scummvm.cpp275
-rw-r--r--scumm/sound.cpp6
11 files changed, 422 insertions, 48 deletions
diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp
index fb5a1f90d8..7690017a5c 100644
--- a/scumm/dialogs.cpp
+++ b/scumm/dialogs.cpp
@@ -377,6 +377,9 @@ void SaveLoadDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
_scumm->optionsDialog();
break;
case kQuitCmd:
+#ifdef __PALM_OS__
+ close();
+#endif
_scumm->_system->quit();
break;
default:
@@ -398,6 +401,7 @@ void SaveLoadDialog::fillList() {
char name[32];
uint i = _saveMode ? 1 : 0;
bool avail_saves[81];
+
SaveFileManager *mgr = _scumm->_system->get_savefile_manager();
_scumm->listSavegames(avail_saves, ARRAYSIZE(avail_saves), mgr);
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index 2a5e0e71d0..cea2e593ff 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -82,7 +82,9 @@ struct TransitionEffect {
int8 deltaTable[16]; // four times l / t / r / b
byte stripTable[16]; // ditto
};
-
+#ifdef __PALM_OS__
+static const TransitionEffect *transitionEffects;
+#else
static const TransitionEffect transitionEffects[4] = {
// Iris effect (looks like an opening/closing camera iris)
{
@@ -153,7 +155,7 @@ static const TransitionEffect transitionEffects[4] = {
}
}
};
-
+#endif
/*
* Mouse cursor cycle colors (for the default crosshair).
@@ -162,7 +164,7 @@ static const byte default_cursor_colors[4] = {
15, 15, 7, 8
};
-static const uint16 default_cursor_images[4][16] = {
+static const uint16 default_cursor_images[5][16] = {
/* cross-hair */
{ 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0000, 0x7e3f,
0x0000, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0000 },
@@ -175,10 +177,18 @@ static const uint16 default_cursor_images[4][16] = {
/* hand */
{ 0x1e00, 0x1200, 0x1200, 0x1200, 0x1200, 0x13ff, 0x1249, 0x1249,
0xf249, 0x9001, 0x9001, 0x9001, 0x8001, 0x8001, 0x8001, 0xffff },
+ /* cross-hair zak256 - chrilith palmos */
+/*
+ { 0x0080, 0x0080, 0x02a0, 0x01c0, 0x0080, 0x1004, 0x0808, 0x7c1f,
+ 0x0808, 0x1004, 0x0080, 0x01c0, 0x02a0, 0x0080, 0x0080, 0x0000 },
+*/
+ { 0x0080, 0x02a0, 0x01c0, 0x0080, 0x0000, 0x2002, 0x1004, 0x780f,
+ 0x1004, 0x2002, 0x0000, 0x0080, 0x01c0, 0x02a0, 0x0080, 0x0000 },
};
-static const byte default_cursor_hotspots[8] = {
- 8, 7, 8, 7, 1, 1, 5, 0
+static const byte default_cursor_hotspots[10] = {
+ 8, 7, 8, 7, 1, 1, 5, 0,
+ 8, 7, //zak256
};
@@ -859,7 +869,7 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
else {
numzbuf = _numZBuffer;
assert(numzbuf <= (int)ARRAYSIZE(zplane_list));
-
+
if (_vm->_features & GF_OLD256) {
zplane_list[1] = smap_ptr + READ_LE_UINT32(smap_ptr);
if (0 == READ_LE_UINT32(zplane_list[1]))
@@ -3450,14 +3460,21 @@ void Scumm::decompressDefaultCursor(int idx) {
_grabbedCursor[i * 8 + j] = color;
}
} else {
+ byte currentCursor = _currentCursor;
+
+#ifdef __PALM_OS__
+ if (_gameId == GID_ZAK256 && currentCursor == 0)
+ currentCursor = 4;
+#endif
+
_cursor.width = 16;
_cursor.height = 16;
- _cursor.hotspotX = default_cursor_hotspots[2 * _currentCursor];
- _cursor.hotspotY = default_cursor_hotspots[2 * _currentCursor + 1];
+ _cursor.hotspotX = default_cursor_hotspots[2 * currentCursor];
+ _cursor.hotspotY = default_cursor_hotspots[2 * currentCursor + 1];
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
- if (default_cursor_images[_currentCursor][i] & (1 << j))
+ if (default_cursor_images[currentCursor][i] & (1 << j))
_grabbedCursor[16 * i + 15 - j] = color;
}
}
@@ -3804,3 +3821,12 @@ void Scumm::drawBomp(BompDrawData *bd, int decode_mode, int mask) {
break;
}
}
+
+
+#ifdef __PALM_OS__
+#include "scumm_globals.h" // init globals
+void Gfx_initGlobals() {
+ GSETPTR(transitionEffects, GBVARS_TRANSITIONEFFECTS_INDEX, TransitionEffect, GBVARS_SCUMM)
+}
+void Gfx_releaseGlobals() { GRELEASEPTR(GBVARS_TRANSITIONEFFECTS_INDEX, GBVARS_SCUMM)}
+#endif
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp
index 5d44d7c1e5..d320219b1c 100644
--- a/scumm/imuse.cpp
+++ b/scumm/imuse.cpp
@@ -154,6 +154,11 @@ struct Player {
int fade_vol(byte vol, int time);
bool is_fading_out();
void sequencer_timer();
+
+ Player() {
+ memset(this,0,sizeof(Player)); // palmos
+ }
+
};
struct VolumeFader {
@@ -171,6 +176,10 @@ struct VolumeFader {
}
void on_timer(bool probe);
byte fading_to();
+
+ VolumeFader() {
+ memset(this,0,sizeof(VolumeFader)); //palmos
+ }
};
struct SustainingNotes {
@@ -255,6 +264,10 @@ struct Part {
void update_pris();
void changed(uint16 what);
+
+ Part() {
+ memset(this,0,sizeof(Part));
+ }
};
struct ImTrigger {
@@ -433,6 +446,9 @@ private:
void unlock();
public:
+ IMuseInternal() {
+ memset(this,0,sizeof(IMuseInternal)); // palmos
+ }
~IMuseInternal();
Part *parts_ptr() {
@@ -2967,6 +2983,10 @@ int IMuseInternal::save_or_load(Serializer *ser, Scumm *scumm) {
#ifdef _WIN32_WCE // Don't break savegames made with andys' build
if (!ser->isSaving() && ser->checkEOFLoadStream())
return 0;
+#elif defined(__PALM_OS__) // previous PalmOS ver. without imuse implementation or not saved(Oopps...forgot it !), is this really working ? will we have sound with old saved game ?
+ if (!ser->isSaving() && ser->checkEOFLoadStream())
+ return 0; //palmfixme
+
#endif
ser->_ref_me = this;
@@ -3241,6 +3261,8 @@ void Part::set_instrument(uint b) {
IMuseDriver::IMuseDriver (MidiDriver *midi) {
int i;
+ memset(this,0,sizeof(IMuseDriver)); //palmos
+
// Initialize our "last" trackers with impossible
// values, so that they don't accidentally match
// any changes that are sent (which would cause
diff --git a/scumm/imuse_digi.cpp b/scumm/imuse_digi.cpp
index adcfbde678..fe228baba1 100644
--- a/scumm/imuse_digi.cpp
+++ b/scumm/imuse_digi.cpp
@@ -72,6 +72,15 @@ struct imuse_music_map {
int16 unk4;
};
+#ifdef __PALM_OS__
+// these games are currently not supported under PalmOS so we can save this space
+// to prevent full data segement
+static const imuse_music_map *_digStateMusicMap;
+static const imuse_music_table *_digStateMusicTable;
+static const imuse_music_table *_comiStateMusicTable;
+static const imuse_music_table *_comiSeqMusicTable;
+static const imuse_music_table *_digSeqMusicTable;
+#else
static const imuse_music_map _digStateMusicMap[] = {
{0, 0, 0, 0, 0, 0 },
{1, 0, 0, 0, 0, 0 },
@@ -516,6 +525,7 @@ static const imuse_music_table _digSeqMusicTable[] = {
{2450, "seqFinale9a", "Seq (finale 9a)", "SE313B~5.IMU", 4},
{-1, "", "", "", 0},
};
+#endif
struct imuse_ft_music_table {
int16 index;
@@ -525,6 +535,12 @@ struct imuse_ft_music_table {
char name[30];
};
+#ifdef __PALM_OS__
+// these games are currently not supported under PalmOS so we can save this space
+// to prevent full data segement
+static const imuse_ft_music_table *_ftStateMusicTable;
+static const imuse_ft_music_table *_ftSeqMusicTable;
+#else
static const imuse_ft_music_table _ftStateMusicTable[] = {
{0, "", 0, 0, "STATE_NULL" },
{1, "", 4, 127, "stateKstandOutside" },
@@ -634,6 +650,7 @@ static const imuse_ft_music_table _ftSeqMusicTable[] = {
{52, "", 0, 0, "seqCredits" },
{-1, "", 0, 0, "" },
};
+#endif
void IMuseDigital::handler() {
uint32 l = 0, i = 0;
@@ -813,16 +830,16 @@ void IMuseDigital::startSound(int sound) {
} else if (READ_UINT32_UNALIGNED(ptr) == MKID('iMUS')) {
ptr += 16;
for (;;) {
- tag = READ_BE_UINT32(ptr); ptr += 4;
+ tag = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
switch(tag) {
case MKID_BE('FRMT'):
ptr += 12;
- _channel[l]._bits = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._freq = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._channels = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l]._bits = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._freq = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._channels = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
break;
case MKID_BE('TEXT'):
- size = READ_BE_UINT32(ptr); ptr += size + 4;
+ size = READ_BE_UINT32_UNALIGNED(ptr); ptr += size + 4;
break;
case MKID_BE('REGN'):
ptr += 4;
@@ -831,13 +848,13 @@ void IMuseDigital::startSound(int sound) {
ptr += 8;
break;
}
- _channel[l]._region[_channel[l]._numRegions]._offset = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._region[_channel[l]._numRegions]._length = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l]._region[_channel[l]._numRegions]._offset = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._region[_channel[l]._numRegions]._length = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
_channel[l]._numRegions++;
break;
case MKID_BE('STOP'):
ptr += 4;
- _channel[l]._offsetStop = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l]._offsetStop = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
break;
case MKID_BE('JUMP'):
ptr += 4;
@@ -846,15 +863,15 @@ void IMuseDigital::startSound(int sound) {
ptr += 16;
break;
}
- _channel[l]._jump[_channel[l]._numJumps]._offset = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._jump[_channel[l]._numJumps]._dest = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._jump[_channel[l]._numJumps]._id = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._jump[_channel[l]._numJumps]._numLoops = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l]._jump[_channel[l]._numJumps]._offset = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._jump[_channel[l]._numJumps]._dest = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._jump[_channel[l]._numJumps]._id = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
+ _channel[l]._jump[_channel[l]._numJumps]._numLoops = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
_channel[l]._isJump = true;
_channel[l]._numJumps++;
break;
case MKID_BE('DATA'):
- size = READ_BE_UINT32(ptr); ptr += 4;
+ size = READ_BE_UINT32_UNALIGNED(ptr); ptr += 4;
break;
default:
error("IMuseDigital::startSound(%d) Unknown sfx header %c%c%c%c", tag>>24, tag>>16, tag>>8, tag);
@@ -1170,3 +1187,27 @@ int IMuseDigital::getSoundStatus(int sound) {
return 0;
}
+
+
+
+#ifdef __PALM_OS__
+#include "scumm_globals.h" // init globals
+void IMuseDigital_initGlobals() {
+ GSETPTR(_digStateMusicMap, GBVARS_DIGSTATEMUSICMAP_INDEX, imuse_music_map , GBVARS_SCUMM)
+ GSETPTR(_digStateMusicTable, GBVARS_DIGSTATEMUSICTABLE_INDEX, imuse_music_table , GBVARS_SCUMM)
+ GSETPTR(_comiStateMusicTable, GBVARS_COMISTATEMUSICTABLE_INDEX, imuse_music_table , GBVARS_SCUMM)
+ GSETPTR(_comiSeqMusicTable, GBVARS_COMISEQMUSICTABLE_INDEX, imuse_music_table , GBVARS_SCUMM)
+ GSETPTR(_digSeqMusicTable, GBVARS_DIGSEQMUSICTABLE_INDEX, imuse_music_table , GBVARS_SCUMM)
+ GSETPTR(_ftStateMusicTable, GBVARS_FTSTATEMUSICTABLE_INDEX, imuse_ft_music_table, GBVARS_SCUMM)
+ GSETPTR(_ftSeqMusicTable, GBVARS_FTSEQMUSICTABLE_INDEX, imuse_ft_music_table, GBVARS_SCUMM)
+}
+void IMuseDigital_releaseGlobals() {
+ GRELEASEPTR(GBVARS_DIGSTATEMUSICMAP_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_DIGSTATEMUSICTABLE_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_COMISTATEMUSICTABLE_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_COMISEQMUSICTABLE_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_DIGSEQMUSICTABLE_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_FTSTATEMUSICTABLE_INDEX , GBVARS_SCUMM)
+ GRELEASEPTR(GBVARS_FTSEQMUSICTABLE_INDEX , GBVARS_SCUMM)
+}
+#endif
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index 657b1cc34f..191b5b79df 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -550,7 +550,7 @@ void Scumm::nukeCharset(int i) {
}
void Scumm::ensureResourceLoaded(int type, int i) {
- void *addr;
+ void *addr = NULL;
debug(9, "ensureResourceLoaded(%s,%d)", resTypeFromId(type), i);
@@ -561,7 +561,9 @@ void Scumm::ensureResourceLoaded(int type, int i) {
if (i == 0)
return;
- addr = res.address[type][i];
+ if (i <= res.num[type])
+ addr = res.address[type][i];
+
if (addr)
return;
@@ -1001,7 +1003,7 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) {
ptr = createResource(type, idx, best_size);
_fileHandle.read(ptr, best_size);
- ticks = READ_BE_UINT16(ptr + 9);
+ ticks = READ_BE_UINT16_UNALIGNED(ptr + 9);
size = best_size;
if (size < 0x98) {
// FIXME: OLD256 music file w/o instruments
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index 2e964e888b..3454e02e85 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -73,6 +73,13 @@ bool Scumm::saveState(int slot, bool compat, SaveFileManager *mgr) {
Serializer ser(out, true, CURRENT_VER);
saveOrLoad(&ser, CURRENT_VER);
+#ifdef __PALM_OS__
+ if (_imuse) { // moved here to prevent stack overflow on palmos
+ _imuse->save_or_load(&ser, this);
+ _imuse->set_master_volume (_sound->_sound_volume_master);
+ _imuse->set_music_volume (_sound->_sound_volume_music);
+ }
+#endif
delete out;
debug(1, "State saved as '%s'", filename);
@@ -142,6 +149,13 @@ bool Scumm::loadState(int slot, bool compat, SaveFileManager *mgr) {
Serializer ser(out, false, hdr.ver);
saveOrLoad(&ser, hdr.ver);
+#ifdef __PALM_OS__
+ if (_imuse) { // moved here to prevent stack overflow on palmos
+ _imuse->save_or_load(&ser, this);
+ _imuse->set_master_volume (_sound->_sound_volume_master);
+ _imuse->set_music_volume (_sound->_sound_volume_music);
+ }
+#endif
delete out;
sb = _screenB;
@@ -179,7 +193,6 @@ bool Scumm::loadState(int slot, bool compat, SaveFileManager *mgr) {
CHECK_HEAP debug(1, "State loaded from '%s'", filename);
-
_sound->pauseSounds(false);
return true;
@@ -188,7 +201,11 @@ bool Scumm::loadState(int slot, bool compat, SaveFileManager *mgr) {
void Scumm::makeSavegameName(char *out, int slot, bool compatible) {
const char *dir = getSavePath();
+#ifndef __PALM_OS__
sprintf(out, "%s%s.%c%.2d", dir, _game_name, compatible ? 'c' : 's', slot);
+#else
+ sprintf(out, "%s%s.%s%.2d", dir, _game_name, compatible ? "c" : "s", slot);
+#endif
}
void Scumm::listSavegames(bool *marks, int num, SaveFileManager *mgr) {
@@ -667,12 +684,14 @@ void Scumm::saveOrLoad(Serializer *s, uint32 savegameVersion) {
res.flags[r][s->loadWord()] |= RF_LOCK;
}
}
-
+
+#ifndef __PALM_OS__// moved to ::loadState/saveState to prevent stack overflow on palmos
if (_imuse) {
_imuse->save_or_load(s, this);
_imuse->set_master_volume (_sound->_sound_volume_master);
_imuse->set_music_volume (_sound->_sound_volume_music);
}
+#endif
}
void Scumm::saveLoadResource(Serializer *ser, int type, int idx) {
@@ -730,7 +749,14 @@ bool Serializer::checkEOFLoadStream() {
_saveLoadStream->fseek(-1, SEEK_CUR);
return false;
}
+#elif defined(__PALM_OS__)
+bool Serializer::checkEOFLoadStream() {
+ if (_saveLoadStream->feof())
+ return true;
+
+ return false;
+}
#endif
diff --git a/scumm/script.cpp b/scumm/script.cpp
index cfe6efecf4..70fa45bd8c 100644
--- a/scumm/script.cpp
+++ b/scumm/script.cpp
@@ -289,7 +289,7 @@ void Scumm::executeScript() {
}
_opcode = fetchScriptByte();
vm.slot[_currentScript].didexec = 1;
- debug(7, " Script %d, offset 0x%x: [%X] %s()",
+ debug(7, "Script %d, offset 0x%x: [%X] %s()",
vm.slot[_currentScript].number,
_scriptPointer - _scriptOrgPointer,
_opcode,
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index 1a8d391109..307043b469 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -425,15 +425,14 @@ void Scumm::writeArray(int array, int idx, int base, int value) {
} else if (_features & GF_AFTER_V8) {
#if defined(SCUMM_NEED_ALIGNMENT)
uint32 tmp = TO_LE_32(value);
- memcpy(&((uint32*)ah->data)[base], &tmp, 4);
+ memcpy(&((uint32 *)ah->data)[base], &tmp, 4);
#else
((uint32 *)ah->data)[base] = TO_LE_32(value);
#endif
-
} else {
#if defined(SCUMM_NEED_ALIGNMENT)
uint16 tmp = TO_LE_16(value);
- memcpy(&((uint16*)ah->data)[base], &tmp, 2);
+ memcpy(&((uint16 *)ah->data)[base], &tmp, 2);
#else
((uint16 *)ah->data)[base] = TO_LE_16(value);
#endif
@@ -2281,7 +2280,8 @@ void Scumm_v6::o6_dim2() {
}
void Scumm_v6::o6_abs() {
- push(abs(pop()));
+ int a = pop(); // palmos: prevent multi pop if we use an abs function defined as : #define abs(a) ((a) < 0 ? -(a) : (a))
+ push(abs(a));
}
void Scumm_v6::o6_distObjectObject() {
diff --git a/scumm/scumm.h b/scumm/scumm.h
index a9a6fa1f59..1fe9340539 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -350,6 +350,9 @@ public:
void shutDown(int i);
void setOptions(void);
+#ifdef __PALM_OS__
+ bool _quit; // try to exit properly
+#endif
// GUI
NewGui *_newgui;
@@ -599,7 +602,6 @@ protected:
bool isResourceInUse(int type, int i);
void initRoomSubBlocks();
void clearRoomObjects();
-
void loadRoomObjects();
void loadRoomObjectsSmall();
void loadRoomObjectsOldBundle();
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index 33fb47eab0..117c4e89ed 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -49,7 +49,7 @@ extern void drawError(char*);
// Use g_scumm from error() ONLY
Scumm *g_scumm = 0;
-ScummDebugger g_debugger;
+ScummDebugger *g_debugger;
extern NewGui *g_gui;
extern uint16 _debugLevel;
@@ -182,9 +182,225 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst)
: Engine(detector, syst), _pauseDialog(0), _optionsDialog(0), _saveLoadDialog(0) {
OSystem::Property prop;
+ // Init all vars - maybe now we can get rid of our custom new/delete operators?
+ _imuse = NULL;
+ _imuseDigital = NULL;
+ _features = 0;
+ _verbs = NULL;
+ _objs = NULL;
+ _debugger = NULL;
+ _bundle = NULL;
+ _timer =NULL;
+ _sound= NULL;
+ memset(&res, 0, sizeof(res));
+ memset(&vm, 0, sizeof(vm));
+ memset(&mouse, 0, sizeof(mouse));
+ _smushFrameRate = 0;
+ _insaneState = 0;
+ _videoFinished = 0;
+ _smushPlay = 0;
+#ifdef __PALM_OS__
+ _quit = false;
+#endif
+ _newgui = NULL;
+ _pauseDialog = NULL;
+ _optionsDialog = NULL;
+ _saveLoadDialog = NULL;
+ _debuggerDialog = NULL;
+ _fastMode = 0;
+ memset(&_rnd, 0, sizeof(RandomSource));
+ _gameId = 0;
+ memset(&gdi,0,sizeof(Gdi));
+ _actors = NULL;
+ _inventory = NULL;
+ _arrays = NULL;
+ _newNames = NULL;
+ _vars = NULL;
+ _varwatch = 0;
+ _bitVars = NULL;
+ _numVariables = 0;
+ _numBitVariables = 0;
+ _numLocalObjects = 0;
+ _numGlobalObjects = 0;
+ _numArray = 0;
+ _numVerbs = 0;
+ _numFlObject = 0;
+ _numInventory = 0;
+ _numRooms = 0;
+ _numScripts = 0;
+ _numSounds = 0;
+ _numCharsets = 0;
+ _numNewNames = 0;
+ _numGlobalScripts = 0;
+ NUM_ACTORS = 0;
+ _numCostumes = 0;
+ _audioNames = NULL;
+ _numAudioNames = 0;
+ _curActor = 0;
+ _curVerb = 0;
+ _curVerbSlot = 0;
+ _curPalIndex = 0;
+ _currentRoom = 0;
+ _egoPositioned = false;
+ _keyPressed = 0;
+ _lastKeyHit = 0;
+ _mouseButStat = 0;
+ _leftBtnPressed = 0;
+ _rightBtnPressed = 0;
+ _virtual_mouse_x = 0;
+ _virtual_mouse_y = 0;
+ _bootParam = 0;
+ _dumpScripts = false;
+ _debugMode = 0;
+ _soundCardType = 0;
+ _language = 0;
+ _objectOwnerTable = NULL;
+ _objectRoomTable = NULL;
+ _objectStateTable = NULL;
+ memset(&_objectIDMap,0,sizeof(ObjectIDMap));
+ _numObjectsInRoom = 0;
+ _userPut = 0;
+ _resourceHeaderSize = 0;
+ _saveLoadFlag = 0;
+ _saveLoadSlot = 0;
+ _lastSaveTime = 0;
+ _saveLoadCompatible = false;
+ memset(_saveLoadName,0,sizeof(_saveLoadName));
+ _maxHeapThreshold = 0;
+ _minHeapThreshold = 0;
+ memset(_localScriptList,0,sizeof(_localScriptList));
+ _scriptPointer = NULL;
+ _scriptOrgPointer = NULL;
+ _opcode = 0;
+ _numNestedScripts = 0;
+ _currentScript = 0;
+ _curExecScript = 0;
+ _lastCodePtr = NULL;
+ _resultVarNumber = 0;
+ _scummStackPos = 0;
+ memset(_localParamList,0,sizeof(_localParamList));
+ memset(_scummStack,0,sizeof(_scummStack));
+ _keyScriptKey = 0;
+ _keyScriptNo = 0;
+ _encbyte = 0;
+ memset(&_fileHandle,0,sizeof(File));
+ _fileOffset = 0;
+ _exe_name = NULL;
+ _game_name = NULL;
+ _dynamicRoomOffsets = false;
+ memset(_resourceMapper,0,sizeof(_resourceMapper));
+ _allocatedSize = 0;
+ _expire_counter = 0;
+ _lastLoadedRoom = 0;
+ _roomResource = 0;
+ OF_OWNER_ROOM = 0;
+ _verbMouseOver = 0;
+ _inventoryOffset = 0;
+ _classData = NULL;
+ _actorToPrintStrFor = 0;
+ _sentenceNum = 0;
+ memset(_sentence,0,sizeof(_sentence));
+ memset(_string,0,sizeof(_string));
+ _screenB = 0;
+ _screenH = 0;
+ _scrHeight = 0;
+ _scrWidth = 0;
+ _realHeight = 0;
+ _realWidth = 0;
+ memset(virtscr,0,sizeof(virtscr));
+ memset(&camera,0,sizeof(CameraData));
+ memset(_colorCycle,0,sizeof(_colorCycle));
+ _ENCD_offs = 0;
+ _EXCD_offs = 0;
+ _CLUT_offs = 0;
+ _IM00_offs = 0;
+ _PALS_offs = 0;
+ _fullRedraw = false;
+ _BgNeedsRedraw = false;
+ _verbRedraw = false;
+ _screenEffectFlag = false;
+ _completeScreenRedraw = false;
+ memset(&_cursor,0,sizeof(_cursor));
+ memset(_grabbedCursor,0,sizeof(_grabbedCursor));
+ _currentCursor = 0;
+ _newEffect = 0;
+ _switchRoomEffect2 = 0;
+ _switchRoomEffect = 0;
+ _doEffect = false;
+ memset(&_flashlight,0,sizeof(_flashlight));
+ _flashlightXStrips = 0;
+ _flashlightYStrips = 0;
+ _flashlightIsDrawn = false;
+ _bompScaleRight = 0;
+ _bompScaleBottom = 0;
+ _bompScallingXPtr = NULL;
+ _bompScallingYPtr = NULL;
+ _bompMaskPtr = NULL;
+ _bompActorPalletePtr = NULL;
+ _shakeEnabled= false;
+ _shakeFrame = 0;
+ _screenStartStrip = 0;
+ _screenEndStrip = 0;
+ _screenLeft = 0;
+ _screenTop = 0;
+ _blastObjectQueuePos = 0;
+ memset(_blastObjectQueue,0,sizeof(_blastObjectQueue));
+ _blastTextQueuePos = 0;
+ memset(_blastTextQueue,0,sizeof(_blastTextQueue));
+ _drawObjectQueNr = 0;
+ memset(_drawObjectQue,0,sizeof(_drawObjectQue));
+ _palManipStart = 0;
+ _palManipEnd = 0;
+ _palManipCounter = 0;
+ _palManipPalette = NULL;
+ _palManipIntermediatePal = NULL;
+ memset(gfxUsageBits,0,sizeof(gfxUsageBits));
+ _shadowPalette = NULL;
+ _shadowPaletteSize = 0;
+ memset(_currentPalette,0,sizeof(_currentPalette));
+ memset(_proc_special_palette,0,sizeof(_proc_special_palette));
+ _palDirtyMin = 0;
+ _palDirtyMax = 0;
+ _haveMsg = 0;
+ _useTalkAnims = false;
+ _defaultTalkDelay = 0;
+ _use_adlib = false;
+ tempMusic = 0;
+ _silentDigitalImuse = 0;
+ _noDigitalSamples = 0;
+ _saveSound = 0;
+ current_cd_sound = 0;
+ _maxBoxVertexHeap = 0;
+ _boxPathVertexHeapIndex = 0;
+ _boxMatrixItem = 0;
+ _boxPathVertexHeap = NULL;
+ _boxMatrixPtr1 = NULL;
+ _boxMatrixPtr3 = NULL;
+ memset(_extraBoxFlags,0,sizeof(_extraBoxFlags));
+ memset(_scaleSlots,0,sizeof(_scaleSlots));
+ _charset = NULL;
+ _charsetColor = 0;
+ memset(_charsetColorMap,0,sizeof(_charsetColorMap));
+ memset(_charsetData,0,sizeof(_charsetData));
+ _charsetBufPos = 0;
+ memset(_charsetBuffer,0,sizeof(_charsetBuffer));
+ _noSubtitles = false;
+ _numInMsgStack = 0;
+ _msgPtrToAdd = NULL;
+ _messagePtr = NULL;
+ _talkDelay = 0;
+ _keepText = false;
+ _existLanguageFile = false;
+ _languageBuffer = NULL;
+ _languageIndex = NULL;
+ _languageStrCount = 0;
+ memset(_transText,0,sizeof(_transText));
+
// Use g_scumm from error() ONLY
g_scumm = this;
+ g_debugger = new ScummDebugger;
+
_debugMode = detector->_debugMode;
_debugLevel = detector->_debugLevel;
_dumpScripts = detector->_dumpScripts;
@@ -305,6 +521,13 @@ Scumm::~Scumm ()
delete _imuseDigital;
delete _languageBuffer;
delete _audioNames;
+
+ if (_shadowPalette)
+ free(_shadowPalette);
+
+ destroy();
+
+ delete g_debugger;
}
void Scumm::scummInit() {
@@ -468,7 +691,6 @@ void Scumm::initScummVars() {
_vars[VAR_SOUNDPARAM] = 0;
_vars[VAR_SOUNDPARAM2] = 0;
_vars[VAR_SOUNDPARAM3] = 0;
-
if (_features & GF_AFTER_V6)
_vars[VAR_V6_EMSSPACE] = 10000;
@@ -478,7 +700,7 @@ void Scumm::initScummVars() {
// Setup light
_vars[VAR_CURRENT_LIGHTS] = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen;
} else {
- _vars[VAR_V6_EMSSPACE] = 10000;
+ _vars[VAR_V6_EMSSPACE] = 10000;
}
if (_features & GF_AFTER_V8) { // Fixme: How do we deal with non-cd installs?
@@ -492,7 +714,11 @@ void Scumm::initScummVars() {
void Scumm::checkRange(int max, int min, int no, const char *str) {
if (no < min || no > max) {
+#ifdef __PALM_OS__
+ char buf[256]; // 1024 is too big overflow the stack
+#else
char buf[1024];
+#endif
sprintf(buf, str, no);
error("Value %d is out of bounds (%d,%d) in script %d (%s)", no, min,
max, vm.slot[_curExecScript].number, buf);
@@ -610,7 +836,11 @@ load_game:
displayError(false, errMsg, filename);
} else if (_saveLoadFlag == 1 && _saveLoadSlot != 0 && !_saveLoadCompatible) {
// Display "Save succesful" message, except for auto saves
+#ifdef __PALM_OS__
+ char buf[256]; // 1024 is too big overflow the stack
+#else
char buf[1024];
+#endif
sprintf(buf, errMsg, filename);
Dialog *dialog = new MessageDialog(_newgui, buf, 1500, false);
@@ -1331,7 +1561,11 @@ void Scumm::optionsDialog() {
}
char Scumm::displayError(bool showCancel, const char *message, ...) {
+#ifdef __PALM_OS__
+ char buf[256], result; // 1024 is too big overflow the stack
+#else
char buf[1024], result;
+#endif
va_list va;
va_start(va, message);
@@ -1446,7 +1680,7 @@ void Scumm::processKbd() {
_vars[VAR_CHARINC] = _defaultTalkDelay / 20;
} else if (_lastKeyHit == '~' || _lastKeyHit == '#') { // Debug console
- g_debugger.attach(this, NULL);
+ g_debugger->attach(this, NULL);
}
_mouseButStat = _lastKeyHit;
@@ -1638,14 +1872,13 @@ void Scumm::errorString(const char *buf1, char *buf2) {
strcpy(buf2, buf1);
}
- // Unless an error -originated- within the debugger, spawn the debugger. Otherwise
- // exit out normally.
- if (!_debugger) {
- printf("%s", buf2); // (Print it again in-case debugger segfaults)
- g_debugger.attach(this, buf2);
- g_debugger.on_frame();
- }
-
+ // Unless an error -originated- within the debugger, spawn the debugger. Otherwise
+ // exit out normally.
+ if (!_debugger) {
+ printf("%s", buf2); // (Print it again in-case debugger segfaults)
+ g_debugger->attach(this, buf2);
+ g_debugger->on_frame();
+ }
}
void Scumm::waitForTimer(int msec_delay) {
@@ -1693,7 +1926,7 @@ void Scumm::parseEvents() {
else if (event.kbd.keycode == 'g')
_fastMode ^= 2;
else if ((event.kbd.keycode == 'd') && (!_system->property(OSystem::PROP_GET_FULLSCREEN, 0)))
- g_debugger.attach(this, NULL);
+ g_debugger->attach(this, NULL);
else if (event.kbd.keycode == 's')
resourceStats();
else
@@ -1716,7 +1949,7 @@ void Scumm::parseEvents() {
case OSystem::EVENT_LBUTTONDOWN:
_leftBtnPressed |= msClicked|msDown;
-#ifdef _WIN32_WCE
+#if defined(_WIN32_WCE) || defined(__PALM_OS__)
mouse.x = event.mouse.x;
mouse.y = event.mouse.y;
#endif
@@ -1724,7 +1957,7 @@ void Scumm::parseEvents() {
case OSystem::EVENT_RBUTTONDOWN:
_rightBtnPressed |= msClicked|msDown;
-#ifdef _WIN32_WCE
+#if defined(_WIN32_WCE) || defined(__PALM_OS__)
mouse.x = event.mouse.x;
mouse.y = event.mouse.y;
#endif
@@ -1798,6 +2031,10 @@ void Scumm::mainRun() {
int new_time;
for(;;) {
+#ifdef __PALM_OS__
+ if (_quit) // palmfixme : need to check for autosave on exit
+ return;
+#endif
updatePalette();
_system->update_screen();
@@ -1813,12 +2050,20 @@ void Scumm::mainRun() {
void Scumm::launch() {
gdi._vm = this;
+#ifdef __PALM_OS__
+ // PALMOS : check if this value is correct with palm,
+ // old value 450000 doesn't work anymore (return _fntPtr = NULL in zak256, not tested with others)
+ // 1500000 is too big and make ScummVM crashes : MemMove to NULL or immediate exit if try to allocate
+ // memory with new operator
+ _maxHeapThreshold = 550000;
+#else
// Since the new costumes are very big, we increase the heap limit, to avoid having
// to constantly reload stuff from the data files.
if (_features & GF_NEW_COSTUMES)
_maxHeapThreshold = 1500000;
else
_maxHeapThreshold = 450000;
+#endif
_minHeapThreshold = 400000;
_verbRedraw = false;
diff --git a/scumm/sound.cpp b/scumm/sound.cpp
index 716decf6ea..7b7f6ed5f6 100644
--- a/scumm/sound.cpp
+++ b/scumm/sound.cpp
@@ -32,6 +32,8 @@
#include "common/util.h"
Sound::Sound(Scumm *parent) {
+ memset(this,0,sizeof(Sound)); // palmos
+
_scumm = parent;
_nameBundleMusic = NULL;
_musicBundleBufFinal = NULL;
@@ -41,6 +43,10 @@ Sound::Sound(Scumm *parent) {
}
Sound::~Sound() {
+ if (_sfxFile) {
+ _sfxFile->close();
+ delete _sfxFile;
+ }
}
void Sound::addSoundToQueue(int sound) {