diff options
-rw-r--r-- | simon/intern.h | 3 | ||||
-rw-r--r-- | simon/items.cpp | 20 | ||||
-rw-r--r-- | simon/simon.cpp | 95 | ||||
-rw-r--r-- | simon/simon.h | 16 | ||||
-rw-r--r-- | simon/verb.cpp | 2 |
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; |