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:
Max Horn 2002-10-30 23:52:19 +00:00
parent 8ac61bee6d
commit 3de70690b9
5 changed files with 62 additions and 74 deletions

View File

@ -39,9 +39,6 @@ struct Child2 : Child {
int16 array[1];
};
struct Child3 : Child {
};
struct Child9 : Child {
uint16 array[4];
};

View File

@ -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];

View File

@ -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];

View File

@ -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);

View File

@ -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;