mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-21 03:31:40 +00:00
don't open files all the time just to detect whether we use VOC/WAV/MP3 music: we have a concept of so called 'variables' which can be used to store data, make use of this cool technique <g>; load effects even if voice file is missing; cleanup
svn-id: r5354
This commit is contained in:
parent
8ac61bee6d
commit
3de70690b9
@ -39,9 +39,6 @@ struct Child2 : Child {
|
||||
int16 array[1];
|
||||
};
|
||||
|
||||
struct Child3 : Child {
|
||||
};
|
||||
|
||||
struct Child9 : Child {
|
||||
uint16 array[4];
|
||||
};
|
||||
|
@ -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];
|
||||
|
@ -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];
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user