aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--simon/intern.h3
-rw-r--r--simon/items.cpp20
-rw-r--r--simon/simon.cpp95
-rw-r--r--simon/simon.h16
-rw-r--r--simon/verb.cpp2
5 files changed, 62 insertions, 74 deletions
diff --git a/simon/intern.h b/simon/intern.h
index 5628c948e6..a2603709ea 100644
--- a/simon/intern.h
+++ b/simon/intern.h
@@ -39,9 +39,6 @@ struct Child2 : Child {
int16 array[1];
};
-struct Child3 : Child {
-};
-
struct Child9 : Child {
uint16 array[4];
};
diff --git a/simon/items.cpp b/simon/items.cpp
index e6a1f4dd7f..d173032d85 100644
--- a/simon/items.cpp
+++ b/simon/items.cpp
@@ -166,7 +166,7 @@ int SimonState::runScript()
break;
case 28:{ /* item has prop */
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
byte num = getVarOrByte();
condition = child != NULL && (child->avail_props & (1 << num)) != 0;
} break;
@@ -304,7 +304,7 @@ int SimonState::runScript()
break;
case 56:{ /* set child2 fr bit */
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
int value = getVarOrByte();
if (child != NULL && value >= 0x10)
child->avail_props |= 1 << value;
@@ -312,7 +312,7 @@ int SimonState::runScript()
break;
case 57:{ /* clear child2 fr bit */
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
int value = getVarOrByte();
if (child != NULL && value >= 0x10)
child->avail_props &= ~(1 << value);
@@ -448,7 +448,7 @@ int SimonState::runScript()
break;
case 79:{ /* childstruct fr2 is */
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
uint string_id = getNextStringID();
condition = (child != NULL) && child->string_id == string_id;
}
@@ -826,7 +826,7 @@ int SimonState::runScript()
break;
case 143:{ /* start item sub */
- Child1 *child = findChildOfType1(getNextItemPtr());
+ Child1 *child = (Child1 *)findChildOfType(getNextItemPtr(), 1);
if (child != NULL) {
Subroutine *sub = getSubroutineByID(child->subroutine_id);
if (sub)
@@ -879,7 +879,7 @@ int SimonState::runScript()
case 157:{ /* get item int prop */
Item *item = getNextItemPtr();
- Child2 *child = findChildOfType2(item);
+ Child2 *child = (Child2 *)findChildOfType(item, 2);
uint prop = getVarOrByte();
if (child != NULL && child->avail_props & (1 << prop) && prop < 16) {
@@ -893,7 +893,7 @@ int SimonState::runScript()
case 158:{ /* set item prop */
Item *item = getNextItemPtr();
- Child2 *child = findChildOfType2(item);
+ Child2 *child = (Child2 *)findChildOfType(item, 2);
uint prop = getVarOrByte();
int value = getVarOrWord();
@@ -1281,7 +1281,7 @@ void SimonState::o_177()
uint a = getVarOrByte();
/*uint b = */ getVarOrByte();
uint offs;
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
if (child != NULL && child->avail_props & 0x200) {
offs = getOffsetOfChild2Param(child, 0x200);
talk_with_speech(child->array[offs], a);
@@ -1292,7 +1292,7 @@ void SimonState::o_177()
} else if ((_game == GAME_SIMON1DEMO) || (_game == GAME_SIMON1DOS)) {
uint a = getVarOrByte();
uint b = getVarOrByte();
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
if (child != NULL && child->avail_props & 1) {
const char *s = (const char *)getStringPtrByID(child->array[0]);
ThreeValues *tv;
@@ -1325,7 +1325,7 @@ void SimonState::o_177()
} else if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) {
uint a = getVarOrByte();
uint b = getVarOrByte();
- Child2 *child = findChildOfType2(getNextItemPtr());
+ Child2 *child = (Child2 *)findChildOfType(getNextItemPtr(), 2);
const char *s = NULL;
ThreeValues *tv = NULL;
char buf[256];
diff --git a/simon/simon.cpp b/simon/simon.cpp
index d038146990..a3ef4a535b 100644
--- a/simon/simon.cpp
+++ b/simon/simon.cpp
@@ -417,28 +417,14 @@ Child *SimonState::findChildOfType(Item *i, uint type)
bool SimonState::hasChildOfType1(Item *item)
{
- return findChildOfType1(item) != NULL;
+ return findChildOfType(item, 1) != NULL;
}
bool SimonState::hasChildOfType2(Item *item)
{
- return findChildOfType2(item) != NULL;
+ return findChildOfType(item, 2) != NULL;
}
-Child1 *SimonState::findChildOfType1(Item *item)
-{
- return (Child1 *)findChildOfType(item, 1);
-}
-
-Child2 *SimonState::findChildOfType2(Item *item)
-{
- return (Child2 *)findChildOfType(item, 2);
-}
-
-Child3 *SimonState::findChildOfType3(Item *item)
-{
- return (Child3 *) findChildOfType(item, 3);
-}
uint SimonState::getOffsetOfChild2Param(Child2 *child, uint prop)
{
@@ -1422,13 +1408,13 @@ void SimonState::setup_hit_areas(FillOrCopyStruct *fcs, uint fcs_index)
bool SimonState::has_item_childflag_0x10(Item *item)
{
- Child2 *child = findChildOfType2(item);
+ Child2 *child = (Child2 *)findChildOfType(item, 2);
return child && (child->avail_props & 0x10) != 0;
}
uint SimonState::item_get_icon_number(Item *item)
{
- Child2 *child = findChildOfType2(item);
+ Child2 *child = (Child2 *)findChildOfType(item, 2);
uint offs;
if (child == NULL || !(child->avail_props & 0x10))
@@ -4485,12 +4471,12 @@ bool SimonState::save_game(uint slot, const char *caption)
f.writeUint16BE(item->unk3);
f.writeUint16BE(item->unk4);
- Child1 *child1 = findChildOfType1(item);
+ Child1 *child1 = (Child1 *)findChildOfType(item, 1);
if (child1) {
f.writeUint16BE(child1->fr2);
}
- Child2 *child2 = findChildOfType2(item);
+ Child2 *child2 = (Child2 *)findChildOfType(item, 2);
if (child2) {
f.writeUint32BE(child2->avail_props);
i = child2->avail_props & 1;
@@ -4599,12 +4585,12 @@ bool SimonState::load_game(uint slot)
item->unk3 = f.readUint16BE();
item->unk4 = f.readUint16BE();
- Child1 *child1 = findChildOfType1(item);
+ Child1 *child1 = (Child1 *)findChildOfType(item, 1);
if (child1 != NULL) {
child1->fr2 = f.readUint16BE();
}
- Child2 *child2 = findChildOfType2(item);
+ Child2 *child2 = (Child2 *)findChildOfType(item, 2);
if (child2 != NULL) {
child2->avail_props = f.readUint32BE();
i = child2->avail_props & 1;
@@ -4664,8 +4650,9 @@ void SimonState::initSound()
const char *me = gss->mp3_effects_filename;
_voice_offsets = NULL;
-
_voice_file = new File();
+ _voice_type = FORMAT_NONE;
+
#ifdef USE_MAD
_voice_file->open(m, _gameDataPath);
if (_voice_file->isOpen() == false) {
@@ -4675,27 +4662,30 @@ void SimonState::initSound()
warning("Cannot open voice file %s, trying %s", s, s2);
if (s2) {
_voice_file->open(s2, _gameDataPath);
- if (_voice_file->isOpen() == false) {
+ if (_voice_file->isOpen() == false)
warning("Cannot open voice file %s", s2);
- return;
- }
- } else
-
- return;
- }
+ else
+ _voice_type = FORMAT_VOC;
+ }
+ } else
+ _voice_type = FORMAT_WAV;
#ifdef USE_MAD
- }
+ } else
+ _voice_type = FORMAT_MP3;
#endif
- _voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32));
- if (_voice_offsets == NULL)
- error("Out of memory for voice offsets");
-
- if (_voice_file->read(_voice_offsets, gss->NUM_VOICE_RESOURCES * sizeof(uint32)) != gss->NUM_VOICE_RESOURCES * sizeof(uint32))
- error("Cannot read voice offsets");
+ if (_voice_type != FORMAT_NONE) {
+ _voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32));
+ if (_voice_offsets == NULL)
+ error("Out of memory for voice offsets");
+
+ if (_voice_file->read(_voice_offsets, gss->NUM_VOICE_RESOURCES * sizeof(uint32)) != gss->NUM_VOICE_RESOURCES * sizeof(uint32))
+ error("Cannot read voice offsets");
+ }
_effects_offsets = NULL;
_effects_file = new File();
+ _effects_type = FORMAT_VOC;
#ifdef USE_MAD
_effects_file->open(me, _gameDataPath);
@@ -4703,6 +4693,8 @@ void SimonState::initSound()
#endif
_effects_file->open(e, _gameDataPath);
#ifdef USE_MAD
+ } else {
+ _effects_type = FORMAT_MP3;
}
#endif
if (_effects_file->isOpen() == true)
@@ -4713,16 +4705,21 @@ void SimonState::initSound()
if (_effects_file->read(_effects_offsets, gss->NUM_EFFECTS_RESOURCES * sizeof(uint32)) != gss->NUM_EFFECTS_RESOURCES * sizeof(uint32))
error("Cannot read effects offsets");
+ } else {
+ _effects_type = FORMAT_NONE;
}
#if defined(SCUMM_BIG_ENDIAN)
uint r;
- for (r = 0; r < gss->NUM_VOICE_RESOURCES; r++)
- _voice_offsets[r] = READ_LE_UINT32(&_voice_offsets[r]);
+ if (_voice_offsets) {
+ for (r = 0; r < gss->NUM_VOICE_RESOURCES; r++)
+ _voice_offsets[r] = READ_LE_UINT32(&_voice_offsets[r]);
+ }
- if (_effects_offsets)
+ if (_effects_offsets) {
for (r = 0; r < gss->NUM_EFFECTS_RESOURCES; r++)
_effects_offsets[r] = READ_LE_UINT32(&_effects_offsets[r]);
+ }
#endif
}
}
@@ -4777,10 +4774,7 @@ void SimonState::playVoice(uint voice)
_voice_file->seek(_voice_offsets[voice], SEEK_SET);
#ifdef USE_MAD
- const char *m = gss->mp3_filename;
- File music_file;
- music_file.open(m, _gameDataPath);
- if (music_file.isOpen() == true) {
+ if (_voice_type == FORMAT_MP3) {
uint32 size = _voice_offsets[voice+1] - _voice_offsets[voice];
@@ -4790,11 +4784,7 @@ void SimonState::playVoice(uint voice)
_mixer->playMP3(&_voice_sound, sound, size, SoundMixer::FLAG_AUTOFREE);
} else {
#endif
- const char *s2 = gss->voc_filename;
- File music_file;
- music_file.open(s2, _gameDataPath);
-
- if (music_file.isOpen() == false) { /* WAVE audio */
+ if (_voice_type == FORMAT_WAV) { /* WAVE audio */
WaveHeader wave_hdr;
uint32 data[2];
@@ -4822,7 +4812,7 @@ void SimonState::playVoice(uint voice)
_mixer->playRaw(&_voice_sound, buffer, data[1], READ_LE_UINT32(&wave_hdr.samples_per_sec),
SoundMixer::FLAG_UNSIGNED);
- } else { /* VOC audio */
+ } else if (_voice_type == FORMAT_WAV) { /* VOC audio */
VocHeader voc_hdr;
VocBlockHeader voc_block_hdr;
uint32 size;
@@ -4854,10 +4844,7 @@ void SimonState::playSound(uint sound)
if (_game & GAME_WIN) {
if (_effects_offsets) { /* VOC sound file */
#ifdef USE_MAD
- const char *m = gss->mp3_filename;
- File music_file;
- music_file.open(m, _gameDataPath);
- if (music_file.isOpen() == true) {
+ if (_effects_type == FORMAT_MP3) {
_effects_file->seek(_effects_offsets[sound], SEEK_SET);
uint32 size = _effects_offsets[sound+1] - _effects_offsets[sound];
diff --git a/simon/simon.h b/simon/simon.h
index a37993131c..9d6d367826 100644
--- a/simon/simon.h
+++ b/simon/simon.h
@@ -47,9 +47,7 @@ uint fileReadItemID(File *in);
#define NUM_PALETTE_FADEOUT 32
struct Child;
-struct Child1;
struct Child2;
-struct Child3;
struct Item;
struct FillOrCopyStruct;
@@ -124,11 +122,21 @@ public:
GAME_SIMON1DEMO = 4,
};
+ typedef enum {
+ FORMAT_NONE,
+ FORMAT_MP3,
+ FORMAT_WAV,
+ FORMAT_VOC
+ } SoundFormat;
+
File *_game_file;
+
File *_voice_file;
uint32 *_voice_offsets;
+ SoundFormat _voice_type;
File *_effects_file;
uint32 *_effects_offsets;
+ SoundFormat _effects_type;
byte *_stripped_txt_mem;
uint _text_size;
@@ -430,10 +438,6 @@ public:
bool hasChildOfType1(Item *item);
bool hasChildOfType2(Item *item);
- Child1 *findChildOfType1(Item *item);
- Child2 *findChildOfType2(Item *item);
- Child3 *findChildOfType3(Item *item);
-
void itemChildrenChanged(Item *item);
void unlinkItem(Item *item);
void linkItem(Item *item, Item *parent);
diff --git a/simon/verb.cpp b/simon/verb.cpp
index 01dff66359..91302881ce 100644
--- a/simon/verb.cpp
+++ b/simon/verb.cpp
@@ -434,7 +434,7 @@ bool SimonState::hitarea_proc_3(Item *item)
if (item == 0 || item == _dummy_item_2 || item == _dummy_item_3)
return false;
- child2 = findChildOfType2(item);
+ child2 = (Child2 *)findChildOfType(item, 2);
if (child2 == NULL)
return false;