diff options
author | Willem Jan Palenstijn | 2013-04-18 23:34:29 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:39:44 +0200 |
commit | 01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6 (patch) | |
tree | 544b07f3aa41abe7907bcd2040cdad11ebc324bb /engines/tinsel | |
parent | 9cf2c83e5e5a35816ab153bf8443dac691829ea8 (diff) | |
parent | a41d72a44a660c72fdadbc3a8ef580e5e03cb890 (diff) | |
download | scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.tar.gz scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.tar.bz2 scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.zip |
Merge branch 'master'
Diffstat (limited to 'engines/tinsel')
-rw-r--r-- | engines/tinsel/actors.cpp | 13 | ||||
-rw-r--r-- | engines/tinsel/actors.h | 2 | ||||
-rw-r--r-- | engines/tinsel/adpcm.cpp | 2 | ||||
-rw-r--r-- | engines/tinsel/config.cpp | 6 | ||||
-rw-r--r-- | engines/tinsel/coroutine.cpp | 1 | ||||
-rw-r--r-- | engines/tinsel/detection.cpp | 16 | ||||
-rw-r--r-- | engines/tinsel/detection_tables.h | 91 | ||||
-rw-r--r-- | engines/tinsel/pcode.h | 2 | ||||
-rw-r--r-- | engines/tinsel/saveload.cpp | 16 | ||||
-rw-r--r-- | engines/tinsel/savescn.cpp | 4 | ||||
-rw-r--r-- | engines/tinsel/sound.cpp | 9 | ||||
-rw-r--r-- | engines/tinsel/strres.h | 1 | ||||
-rw-r--r-- | engines/tinsel/tinsel.cpp | 6 | ||||
-rw-r--r-- | engines/tinsel/tinsel.h | 10 |
14 files changed, 107 insertions, 72 deletions
diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp index 4e9847f8b4..acacd89667 100644 --- a/engines/tinsel/actors.cpp +++ b/engines/tinsel/actors.cpp @@ -314,10 +314,19 @@ static void ActorRestoredProcess(CORO_PARAM, const void *param) { // get the stuff copied to process when it was created const RATP_INIT *r = (const RATP_INIT *)param; + bool isSavegame = r->pic->resumeState == RES_SAVEGAME; CORO_BEGIN_CODE(_ctx); _ctx->pic = RestoreInterpretContext(r->pic); + + // The newly added check here specially sets the process to RES_NOT when loading a savegame. + // This is needed particularly for the Psychiatrist scene in Discworld 1 - otherwise Rincewind + // can't go upstairs without leaving the building and returning. If this patch causes problems + // in other scenes, an added check for the hCode == 1174490602 could be added. + if (isSavegame && TinselV1) + _ctx->pic->resumeState = RES_NOT; + CORO_INVOKE_1(Interpret, _ctx->pic); // If it gets here, actor's code has run to completion @@ -326,8 +335,10 @@ static void ActorRestoredProcess(CORO_PARAM, const void *param) { CORO_END_CODE; } -void RestoreActorProcess(int id, INT_CONTEXT *pic) { +void RestoreActorProcess(int id, INT_CONTEXT *pic, bool savegameFlag) { RATP_INIT r = { pic, id }; + if (savegameFlag) + pic->resumeState = RES_SAVEGAME; g_scheduler->createProcess(PID_TCODE, ActorRestoredProcess, &r, sizeof(r)); } diff --git a/engines/tinsel/actors.h b/engines/tinsel/actors.h index e707db77ba..6ebe32505a 100644 --- a/engines/tinsel/actors.h +++ b/engines/tinsel/actors.h @@ -156,7 +156,7 @@ struct Z_POSITIONS { int z; }; -void RestoreActorProcess(int id, INT_CONTEXT *pic); +void RestoreActorProcess(int id, INT_CONTEXT *pic, bool savegameFlag); int SaveActors(PSAVED_ACTOR sActorInfo); void RestoreActors(int numActors, PSAVED_ACTOR sActorInfo); diff --git a/engines/tinsel/adpcm.cpp b/engines/tinsel/adpcm.cpp index 4ea835586b..ca3150ca3d 100644 --- a/engines/tinsel/adpcm.cpp +++ b/engines/tinsel/adpcm.cpp @@ -61,7 +61,7 @@ void Tinsel_ADPCMStream::readBufferTinselHeader() { int16 Tinsel_ADPCMStream::decodeTinsel(int16 code, double eVal) { double sample; - sample = (double) code; + sample = (double)code; sample *= eVal * _status.predictor; sample += (_status.d0 * _status.K0) + (_status.d1 * _status.K1); diff --git a/engines/tinsel/config.cpp b/engines/tinsel/config.cpp index fd278db972..050573028a 100644 --- a/engines/tinsel/config.cpp +++ b/engines/tinsel/config.cpp @@ -76,6 +76,9 @@ void Config::writeToDisk() { case TXT_ITALIAN: lang = Common::IT_ITA; break; + case TXT_US: + lang = Common::EN_USA; + break; default: lang = Common::EN_ANY; } @@ -132,6 +135,9 @@ void Config::readFromDisk() { case Common::IT_ITA: _language = TXT_ITALIAN; break; + case Common::EN_USA: + _language = TXT_US; + break; default: _language = TXT_ENGLISH; } diff --git a/engines/tinsel/coroutine.cpp b/engines/tinsel/coroutine.cpp index 998d98b52a..ef0097f043 100644 --- a/engines/tinsel/coroutine.cpp +++ b/engines/tinsel/coroutine.cpp @@ -80,4 +80,3 @@ CoroBaseContext::~CoroBaseContext() { } } // End of namespace Tinsel - diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 9c52305a1c..1fce032633 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -322,9 +322,21 @@ int TinselMetaEngine::getMaximumSaveSlot() const { return 99; } void TinselMetaEngine::removeSaveState(const char *target, int slot) const { Tinsel::setNeedLoad(); - Tinsel::getList(g_system->getSavefileManager(), target); + // Same issue here as with loadGameState(): we need the physical savegame + // slot. Refer to bug #3387551. + int listSlot = -1; + const int numStates = Tinsel::getList(g_system->getSavefileManager(), target); + for (int i = 0; i < numStates; ++i) { + const char *fileName = Tinsel::ListEntry(i, Tinsel::LE_NAME); + const int saveSlot = atoi(fileName + strlen(fileName) - 3); + + if (saveSlot == slot) { + listSlot = i; + break; + } + } - g_system->getSavefileManager()->removeSavefile(Tinsel::ListEntry(slot, Tinsel::LE_NAME)); + g_system->getSavefileManager()->removeSavefile(Tinsel::ListEntry(listSlot, Tinsel::LE_NAME)); Tinsel::setNeedLoad(); Tinsel::getList(g_system->getSavefileManager(), target); } diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index 116322aa89..64a0af8404 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -22,11 +22,6 @@ namespace Tinsel { -using Common::GUIO_NONE; -using Common::GUIO_NOSPEECH; -using Common::GUIO_NOSFX; -using Common::GUIO_NOMUSIC; - static const TinselGameDescription gameDescriptions[] = { // Note: The following is the (hopefully) definitive list of version details: @@ -48,7 +43,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - GUIO_NOSPEECH | GUIO_NOSFX | GUIO_NOMUSIC + GUIO3(GUIO_NOSPEECH, GUIO_NOSFX, GUIO_NOMUSIC) }, GID_DW1, 0, @@ -67,7 +62,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -87,7 +82,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEMO, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -111,7 +106,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE, - GUIO_NOSPEECH + GUIO1(GUIO_NOSPEECH) }, GID_DW1, 0, @@ -134,7 +129,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE, - GUIO_NOSPEECH + GUIO1(GUIO_NOSPEECH) }, GID_DW1, 0, @@ -157,7 +152,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_DROPLANGUAGE, - GUIO_NOSPEECH + GUIO1(GUIO_NOSPEECH) }, GID_DW1, 0, @@ -180,7 +175,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::ES_ESP, Common::kPlatformPC, ADGF_DROPLANGUAGE, - GUIO_NOSPEECH + GUIO1(GUIO_NOSPEECH) }, GID_DW1, 0, @@ -196,7 +191,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NOSPEECH + GUIO1(GUIO_NOSPEECH) }, GID_DW1, 0, @@ -214,8 +209,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -236,8 +231,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE + ADGF_DROPLANGUAGE | ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -261,8 +256,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE + ADGF_DROPLANGUAGE | ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -285,8 +280,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE + ADGF_DROPLANGUAGE | ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -308,8 +303,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE + ADGF_DROPLANGUAGE | ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -331,8 +326,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE + ADGF_DROPLANGUAGE | ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -351,8 +346,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -371,8 +366,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::HE_ISR, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -390,8 +385,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPSX, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -414,7 +409,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPSX, ADGF_DEMO, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -434,8 +429,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -456,8 +451,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -475,8 +470,8 @@ static const TinselGameDescription gameDescriptions[] = { AD_ENTRY1s("dw.scn", "6182c7986eaec893c62fb6ea13a9f225", 774556), Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -496,8 +491,8 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::RU_RUS, Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE + ADGF_CD, + GUIO1(GUIO_NONE) }, GID_DW1, 0, @@ -517,7 +512,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -537,7 +532,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_GRB, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -557,7 +552,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::EN_USA, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -577,7 +572,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -597,7 +592,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -618,7 +613,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -638,7 +633,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, @@ -659,7 +654,7 @@ static const TinselGameDescription gameDescriptions[] = { Common::RU_RUS, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO_NONE + GUIO1(GUIO_NONE) }, GID_DW2, 0, diff --git a/engines/tinsel/pcode.h b/engines/tinsel/pcode.h index 971a42d7bd..5d16dae432 100644 --- a/engines/tinsel/pcode.h +++ b/engines/tinsel/pcode.h @@ -37,7 +37,7 @@ namespace Tinsel { struct INV_OBJECT; enum RESUME_STATE { - RES_NOT, RES_1, RES_2 + RES_NOT, RES_1, RES_2, RES_SAVEGAME }; enum { diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index 7a973ba4be..a0801d8247 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -84,6 +84,8 @@ extern void syncPolyInfo(Common::Serializer &s); extern int sceneCtr; +extern bool ASceneIsSaved; + //----------------- LOCAL DEFINES -------------------- struct SaveGameHeader { @@ -154,8 +156,15 @@ static bool syncSaveGameHeader(Common::Serializer &s, SaveGameHeader &hdr) { syncTime(s, hdr.dateTime); int tmp = hdr.size - s.bytesSynced(); + + // NOTE: We can't use SAVEGAME_ID here when attempting to remove a saved game from the launcher, + // as there is no TinselEngine initialized then. This means that we can't check if this is a DW1 + // or DW2 savegame in this case, but it doesn't really matter, as the saved game is about to be + // deleted anyway. Refer to bug #3387551. + bool correctID = _vm ? (hdr.id == SAVEGAME_ID) : (hdr.id == DW1_SAVEGAME_ID || hdr.id == DW2_SAVEGAME_ID); + // Perform sanity check - if (tmp < 0 || hdr.id != SAVEGAME_ID || hdr.ver > CURRENT_VER || hdr.size > 1024) + if (tmp < 0 || !correctID || hdr.ver > CURRENT_VER || hdr.size > 1024) return false; // Skip over any extra bytes s.skip(tmp); @@ -431,6 +440,11 @@ static void DoSync(Common::Serializer &s) { SAVED_DATA *sdPtr = SaveSceneSsData; for (int i = 0; i < *SaveSceneSsCount; ++i, ++sdPtr) syncSavedData(s, *sdPtr); + + // Flag that there is a saved scene to return to. Note that in this context 'saved scene' + // is a stored scene to return to from another scene, such as from the Summoning Book close-up + // in Discworld 1 to whatever scene Rincewind was in prior to that + ASceneIsSaved = true; } if (!TinselV2) diff --git a/engines/tinsel/savescn.cpp b/engines/tinsel/savescn.cpp index 89d68a611e..39a8033d45 100644 --- a/engines/tinsel/savescn.cpp +++ b/engines/tinsel/savescn.cpp @@ -83,7 +83,7 @@ extern SRSTATE SRstate; // FIXME: Avoid non-const global vars -static bool ASceneIsSaved = false; +bool ASceneIsSaved = false; static int savedSceneCount = 0; @@ -281,7 +281,7 @@ void ResumeInterprets() { if (TinselV2) RestoreProcess(&rsd->SavedICInfo[i]); else - RestoreActorProcess(rsd->SavedICInfo[i].idActor, &rsd->SavedICInfo[i]); + RestoreActorProcess(rsd->SavedICInfo[i].idActor, &rsd->SavedICInfo[i], rsd == &sgData); break; case GS_POLYGON: diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp index bf48dd1511..130928d885 100644 --- a/engines/tinsel/sound.cpp +++ b/engines/tinsel/sound.cpp @@ -41,8 +41,9 @@ #include "audio/decoders/flac.h" #include "audio/decoders/mp3.h" #include "audio/decoders/raw.h" -#include "audio/decoders/vag.h" #include "audio/decoders/vorbis.h" +#include "audio/decoders/xa.h" + #include "gui/message.h" @@ -106,8 +107,8 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound error(FILE_IS_CORRUPT, _vm->getSampleFile(sampleLanguage)); if (TinselV1PSX) { - // Read the stream and create a VAG Audio stream - Audio::AudioStream *vagStream = Audio::makeVagStream(_sampleStream.readStream(sampleLen), 44100); + // Read the stream and create a XA ADPCM audio stream + Audio::AudioStream *xaStream = Audio::makeXAStream(_sampleStream.readStream(sampleLen), 44100); // FIXME: Should set this in a different place ;) _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, _vm->_config->_soundVolume); @@ -115,7 +116,7 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, _vm->_config->_voiceVolume); // Play the audio stream - _vm->_mixer->playStream(type, &curChan.handle, vagStream); + _vm->_mixer->playStream(type, &curChan.handle, xaStream); } else { // allocate a buffer byte *sampleBuf = (byte *)malloc(sampleLen); diff --git a/engines/tinsel/strres.h b/engines/tinsel/strres.h index a63824a863..f6e86951b6 100644 --- a/engines/tinsel/strres.h +++ b/engines/tinsel/strres.h @@ -96,4 +96,3 @@ SCNHANDLE LanguageFlag(LANGUAGE thisOne); } // End of namespace Tinsel #endif - diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 80f02ff8d1..635845ab26 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -778,7 +778,7 @@ static const GameSettings tinselSettings[] = { // For the languages, refer to the LANGUAGE enum in dw.h -const char *TinselEngine::_sampleIndices[][3] = { +const char *const TinselEngine::_sampleIndices[][3] = { { "english.idx", "english1.idx", "english2.idx" }, // English { "french.idx", "french1.idx", "french2.idx" }, // French { "german.idx", "german1.idx", "german2.idx" }, // German @@ -789,7 +789,7 @@ const char *TinselEngine::_sampleIndices[][3] = { { "english.idx", "english1.idx", "english2.idx" }, // Japanese (FIXME: not sure if this is correct) { "us.idx", "us1.idx", "us2.idx" } // US English }; -const char *TinselEngine::_sampleFiles[][3] = { +const char *const TinselEngine::_sampleFiles[][3] = { { "english.smp", "english1.smp", "english2.smp" }, // English { "french.smp", "french1.smp", "french2.smp" }, // French { "german.smp", "german1.smp", "german2.smp" }, // German @@ -800,7 +800,7 @@ const char *TinselEngine::_sampleFiles[][3] = { { "english.smp", "english1.smp", "english2.smp" }, // Japanese (FIXME: not sure if this is correct) { "us.smp", "us1.smp", "us2.smp" }, // US English }; -const char *TinselEngine::_textFiles[][3] = { +const char *const TinselEngine::_textFiles[][3] = { { "english.txt", "english1.txt", "english2.txt" }, // English { "french.txt", "french1.txt", "french2.txt" }, // French { "german.txt", "german1.txt", "german2.txt" }, // German diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index 30b060766e..59344c44f4 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -31,9 +31,6 @@ #include "common/random.h" #include "common/util.h" -#include "audio/mididrv.h" -#include "audio/mixer.h" - #include "engines/engine.h" #include "tinsel/debugger.h" #include "tinsel/graphics.h" @@ -53,6 +50,7 @@ namespace Tinsel { class BMVPlayer; class Config; +class MidiDriver; class MidiMusicPlayer; class PCMMusicPlayer; class Scheduler; @@ -158,9 +156,9 @@ class TinselEngine : public Engine { Console *_console; Scheduler *_scheduler; - static const char *_sampleIndices[][3]; - static const char *_sampleFiles[][3]; - static const char *_textFiles[][3]; + static const char *const _sampleIndices[][3]; + static const char *const _sampleFiles[][3]; + static const char *const _textFiles[][3]; protected: |