diff --git a/Makefile b/Makefile index d6d290e..ada286c 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,9 @@ OBJS = \ src/renpy/interpreter.o \ src/renpy/interact.o \ src/audio.o \ - src/poem1.o + src/poem/birdsong.o \ + src/poem/eleanorthehero.o \ + src/poem/kiristella.o ZLIB = ../zlib-1.3.2 CFLAGS += -I$(ZLIB) @@ -117,8 +119,8 @@ all: main #%.dds: %.png # WINEDEBUG=-all wine $(HOME)/Texconv.exe -y -nogpu -nowic -dx10 --format BC7_UNORM_SRGB -m 1 $< -o $(dir $@) -%.pcm: %.wav - ffmpeg -loglevel quiet -y -i $< -c:a pcm_s16le -ar 48000 -ac 2 -f s16le $@ +#%.pcm: %.wav +# ffmpeg -loglevel quiet -y -i $< -c:a pcm_s16le -ar 48000 -ac 2 -f s16le $@ #%.pcm: %.ogg # ffmpeg -loglevel quiet -y -i $< -c:a pcm_s16le -ar 48000 -ac 2 -f s16le $@ @@ -126,8 +128,8 @@ all: main #%.pcm: %.mp3 # ffmpeg -loglevel quiet -y -i $< -c:a pcm_s16le -ar 48000 -ac 2 -f s16le $@ -%.opus.bin: %.pcm - ./tools/opus_encode $< $@ +#%.opus.bin: %.pcm +# ./tools/opus_encode $< $@ main: $(OBJS) $(LIBS) $(CC) $(ARCH) $(LDFLAGS) $(FLAGS) $(OPT) $(DEBUG) $^ -o $@ diff --git a/audio/leona/c23.opus.bin b/audio/leona/c23.opus.bin index d374762..ea60864 100644 Binary files a/audio/leona/c23.opus.bin and b/audio/leona/c23.opus.bin differ diff --git a/audio/leona/c23.wav b/audio/leona/c23.wav index 114fd5b..e8e68b6 100644 Binary files a/audio/leona/c23.wav and b/audio/leona/c23.wav differ diff --git a/audio/poem/BirdSong.opus.bin b/audio/poem/BirdSong.opus.bin new file mode 100644 index 0000000..8e5bcbc Binary files /dev/null and b/audio/poem/BirdSong.opus.bin differ diff --git a/audio/poem/EleanorTheHero.opus.bin b/audio/poem/EleanorTheHero.opus.bin new file mode 100644 index 0000000..3e212d7 Binary files /dev/null and b/audio/poem/EleanorTheHero.opus.bin differ diff --git a/audio/poem/KiriStella.opus.bin b/audio/poem/KiriStella.opus.bin new file mode 100644 index 0000000..898a792 Binary files /dev/null and b/audio/poem/KiriStella.opus.bin differ diff --git a/data/renpy/script.rpy b/data/renpy/script.rpy index 79b1be7..0b95d97 100644 --- a/data/renpy/script.rpy +++ b/data/renpy/script.rpy @@ -699,15 +699,15 @@ label start: voice "leona/c53.ogg" c "Sing me a song little minstrels!" - menu: - Estevie Kiri Stella - The Hero of Eleanor (again) + #menu: + # Estevie Kiri Stella + # The Hero of Eleanor (again) #stop WheatFields fadeout 3.0 #voice "mousegirls/mg2.ogg" e "..." play music "poem/KiriStella.ogg" noloop - pause 64 + pause 67 diff --git a/filenames.txt b/filenames.txt index d5cc87c..e581b3e 100644 --- a/filenames.txt +++ b/filenames.txt @@ -40,9 +40,9 @@ audio/eily/e13.opus.bin audio/eily/e14.opus.bin audio/alice/a11.opus.bin audio/eily/e15.opus.bin -audio/poem/BirdSong.wav -audio/poem/EleanorTheHero.wav -audio/poem/KiriStella.wav +audio/poem/BirdSong.opus.bin +audio/poem/EleanorTheHero.opus.bin +audio/poem/KiriStella.opus.bin audio/eily/e16.opus.bin audio/alice/a12.opus.bin audio/leona/c1.opus.bin diff --git a/include/audio.h b/include/audio.h index 5caa61e..0035f21 100644 --- a/include/audio.h +++ b/include/audio.h @@ -1,12 +1,13 @@ #pragma once #include "renpy/language.h" +#include "poem.h" namespace audio { extern int poem_timestamp_index; extern int poem_line_index; - extern bool poem1_playing; + extern poem::poem const * poem_playing; void init(); void load(renpy::language::audio const * const audio, int count); diff --git a/include/poem.h b/include/poem.h new file mode 100644 index 0000000..b49d604 --- /dev/null +++ b/include/poem.h @@ -0,0 +1,26 @@ +#pragma once + +namespace poem { + struct line { + int start; + int length; + }; + + struct timestamp { + double time; + int wordIndex; + }; + + struct poem { + char const * const * const words; + int const words_length; + line const * const lines; + int const lines_length; + timestamp const * const timestamps; + int const timestamps_length; + }; + + extern poem const eleanorthehero; + extern poem const kiristella; + extern poem const birdsong; +} diff --git a/include/poem1.h b/include/poem1.h deleted file mode 100644 index 3087ee8..0000000 --- a/include/poem1.h +++ /dev/null @@ -1,18 +0,0 @@ -namespace poem1 { - struct line { - int start; - int length; - }; - - struct timestamp { - double time; - int wordIndex; - }; - - extern char const * const words[]; - extern int const words_length; - extern line const lines[]; - extern int const lines_length; - extern timestamp const timestamps[]; - extern int const timestamps_length; -} diff --git a/src/audio.cpp b/src/audio.cpp index 6a1110c..35e9439 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -10,7 +10,7 @@ #include "new.h" #include "minmax.h" #include "renpy/language.h" -#include "poem1.h" +#include "poem.h" namespace audio { @@ -38,7 +38,7 @@ namespace audio { uint32_t tail_index; uint32_t fadeout_end; uint32_t fadeout_index; - bool is_poem1; + poem::poem const * poem; }; // @@ -151,8 +151,16 @@ namespace audio { instance.tail_index = audio_buffers[audio_index].sample_count; instance.fadeout_end = 0; instance.fadeout_index = 0; - instance.is_poem1 = (strcmp(instance.audio_buffer->audio->path, "audio/poem/Poem1.opus.bin") == 0); - if (instance.is_poem1) { + if (strcmp(instance.audio_buffer->audio->path, "audio/poem/BirdSong.opus.bin") == 0) { + instance.poem = &poem::birdsong; + } else if (strcmp(instance.audio_buffer->audio->path, "audio/poem/EleanorTheHero.opus.bin") == 0) { + instance.poem = &poem::eleanorthehero; + } else if (strcmp(instance.audio_buffer->audio->path, "audio/poem/KiriStella.opus.bin") == 0) { + instance.poem = &poem::kiristella; + } else { + instance.poem = nullptr; + } + if (instance.poem != nullptr) { poem_timestamp_index = 0; poem_line_index = 0; } @@ -276,25 +284,27 @@ namespace audio { int poem_timestamp_index = 0; int poem_line_index = 0; - bool poem1_playing = false; + poem::poem const * poem_playing = nullptr; void update_poem(AudioInstance & instance) { - if (!instance.is_poem1) { + if (instance.poem == nullptr) { return; } - poem1_playing = true; + poem::poem const * const poem = instance.poem; + assert(poem_playing == nullptr); + poem_playing = poem; - if (poem_timestamp_index < (poem1::timestamps_length - 1)) { + if (poem_timestamp_index < (poem->timestamps_length - 1)) { double time = (double)instance.sample_index / (double)sample_rate; - while (poem1::timestamps[poem_timestamp_index + 1].time <= time) { + while (poem->timestamps[poem_timestamp_index + 1].time <= time) { poem_timestamp_index += 1; } } - if (poem_line_index < (poem1::lines_length - 1)) { - while (poem1::timestamps[poem_timestamp_index].wordIndex >= poem1::lines[poem_line_index].start + poem1::lines[poem_line_index].length) { + if (poem_line_index < (poem->lines_length - 1)) { + while (poem->timestamps[poem_timestamp_index].wordIndex >= poem->lines[poem_line_index].start + poem->lines[poem_line_index].length) { poem_line_index += 1; } } @@ -308,7 +318,7 @@ namespace audio { int16_t mix_buffer[half_period_samples * channels]; memset(mix_buffer, 0, (sizeof (mix_buffer))); - poem1_playing = false; + poem_playing = nullptr; for (int i = 0; i < audio_instances_count; i++) { update_instance(mix_buffer, audio_instances[i]); diff --git a/src/font/outline.cpp b/src/font/outline.cpp index 692290c..cd1c1cc 100644 --- a/src/font/outline.cpp +++ b/src/font/outline.cpp @@ -21,7 +21,7 @@ #include "renpy/script.h" #include "audio.h" -#include "poem1.h" +#include "poem.h" namespace font::outline { static const _Float16 vertexData[] = { @@ -745,11 +745,12 @@ namespace font::outline { } } else { bool say_poem = state.say.stringIndex == (uint32_t)renpy::script::strings_say_poem_index; - if (audio::poem1_playing && say_poem) { - int word_index = poem1::timestamps[audio::poem_timestamp_index].wordIndex; - char const * const string = combine_words(poem1::words, - poem1::lines[audio::poem_line_index].start, - poem1::lines[audio::poem_line_index].length, + if ((audio::poem_playing != nullptr) && say_poem) { + poem::poem const * const poem = audio::poem_playing; + int word_index = poem->timestamps[audio::poem_timestamp_index].wordIndex; + char const * const string = combine_words(poem->words, + poem->lines[audio::poem_line_index].start, + poem->lines[audio::poem_line_index].length, word_index); uint32_t x = textboxLeft << 6; uint32_t y = (600 + 20) << 6; @@ -759,10 +760,10 @@ namespace font::outline { outputIndex, 0x000000); - if ((audio::poem_line_index + 1) < poem1::lines_length) { - char const * const string = combine_words(poem1::words, - poem1::lines[audio::poem_line_index + 1].start, - poem1::lines[audio::poem_line_index + 1].length, + if ((audio::poem_line_index + 1) < poem->lines_length) { + char const * const string = combine_words(poem->words, + poem->lines[audio::poem_line_index + 1].start, + poem->lines[audio::poem_line_index + 1].length, -1); uint32_t x = textboxLeft << 6; //uint32_t y = (600 + 20) << 6; diff --git a/src/main.cpp b/src/main.cpp index 794ce57..209b18d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -965,8 +965,8 @@ int main() renpy::interpreter interpreter_state; //interpreter_state.reset(88); - interpreter_state.reset(59); - while (interpreter_state.pc < 88) { + interpreter_state.reset(427); + while (interpreter_state.pc < 533) { if (interpreter_state.pause.menu) { renpy::jumpToMenuItem(interpreter_state, 0); } @@ -1319,7 +1319,7 @@ int main() offscreenRender(commandBuffer, frameIndex, mx, my, 2, true, renpy_state, interpreter_state, font_state, surfaceCapabilities); } else { offscreenRender(commandBuffer, frameIndex, mx, my, 0, true, renpy_state, interpreter_state, font_state, surfaceCapabilities); - offscreenRender(commandBuffer, frameIndex, mx, my, 1, false, renpy_state, interpreter_state, font_state, surfaceCapabilities); + offscreenRender(commandBuffer, frameIndex, mx, my, 1, drawText, renpy_state, interpreter_state, font_state, surfaceCapabilities); } ////////////////////////////////////////////////////////////////////// diff --git a/src/poem/birdsong.cpp b/src/poem/birdsong.cpp new file mode 100644 index 0000000..831f8fe --- /dev/null +++ b/src/poem/birdsong.cpp @@ -0,0 +1,94 @@ +#include "poem.h" + +namespace poem { + static char const * const words[] = { + "La", "drevo", "se", "la", // 4 + "la", "se", "esmiral", // 3 + "as", "dra", "verisal", // 3 + "very", "fior", // 2 + + "La", "dro", // 2 + "Se", "la", "Tagi", "de", "sma", "ve", "la", // 7 + "ve", "la", "lu", "de", // 4 + + "Varose", // 1 + "Eleison", // 1 + "Eleison", // 1 + + "La", "la", "lu", "ser", "per", "dio", // 6 + }; + static int const words_length = (sizeof (words)) / (sizeof (words[0])); + + static line const lines[] = { + { 0, 4 }, + { 4, 3 }, + { 7, 3 }, + { 10, 2 }, + { 12, 2 }, + { 14, 7 }, + { 21, 4 }, + { 25, 1 }, + { 26, 1 }, + { 27, 1 }, + { 28, 6 }, + }; + static int const lines_length = (sizeof (lines)) / (sizeof (lines[0])); + + static timestamp const timestamps[] = { + { 0.0, -1 }, // [instrumental] + + { 9.65, 0 }, // La + { 10.59, 1 }, // drevo + { 11.675, 2 }, // se + { 12.475, 3 }, // la + { 12.82, 4 }, // la + { 13.125, 5 }, // se + { 13.955, 6 }, // esmiral + { 14.795, 7 }, // as + { 15.28, 8 }, // dra + { 16.015, 9 }, // verisal + { 17.025, 10 }, // very + { 17.46, 11 }, // fior + + { 18.99, 12 }, // La + { 20.03, 13 }, // dro + { 21.18, 14 }, // Se + { 21.86, 15 }, // la + { 22.15, 16 }, // Tagi + { 22.94, 17 }, // de + { 23.31, 18 }, // sma + { 24.075, 19 }, // ve + { 24.20, 20 }, // la + { 25.12, 21 }, // ve + { 25.63, 22 }, // la + { 26.175, 23 }, // lu + { 27.755, 24 }, // de + + { 27.975, -1 }, // [instrumental] + + { 46.155, 25 }, // Varose + { 48.41, 26 }, // Eleison + { 50.88, 27 }, // Eleison + + { 58.50, -1 }, // [instrumental] + + { 59.63, 28 }, // La + { 61.87, 29 }, // la + { 62.82, 30 }, // lu + { 62.94, 31 }, // ser + { 63.76, 32 }, // per + { 64.24, 33 }, // dio + + { 72.92, -1 }, // [instrumental] + }; + static int const timestamps_length = (sizeof (timestamps)) / (sizeof (timestamps[0])); + + poem const birdsong = { + .words = words, + .words_length = words_length, + .lines = lines, + .lines_length = lines_length, + .timestamps = timestamps, + .timestamps_length = timestamps_length, + }; +} diff --git a/src/poem1.cpp b/src/poem/eleanorthehero.cpp similarity index 69% rename from src/poem1.cpp rename to src/poem/eleanorthehero.cpp index e4ac6b6..6e3b24c 100644 --- a/src/poem1.cpp +++ b/src/poem/eleanorthehero.cpp @@ -1,7 +1,7 @@ -#include "poem1.h" +#include "poem.h" -namespace poem1 { - char const * const words[] = { +namespace poem { + static char const * const words[] = { "Windless", "misty", "nights", "I've", "seen", "along", "my", "way", "Long", "ago", @@ -10,9 +10,9 @@ namespace poem1 { "Clad", "in", "cloud", "and", "rain", "Through", "the", "night", "and", "the", "day", }; - int const words_length = (sizeof (words)) / (sizeof (words[0])); + static int const words_length = (sizeof (words)) / (sizeof (words[0])); - line const lines[] = { + static line const lines[] = { { 0, 3 }, { 3, 5 }, { 8, 2 }, @@ -21,9 +21,9 @@ namespace poem1 { { 20, 5 }, { 25, 6 } }; - int const lines_length = (sizeof (lines)) / (sizeof (lines[0])); + static int const lines_length = (sizeof (lines)) / (sizeof (lines[0])); - timestamp const timestamps[] = { + static timestamp const timestamps[] = { { 0.0, -1 }, // [instrumental] { 4.985, 0 }, // windless @@ -68,5 +68,14 @@ namespace poem1 { { 33.00, -1 }, // [instrumental] }; - int const timestamps_length = (sizeof (timestamps)) / (sizeof (timestamps[0])); + static int const timestamps_length = (sizeof (timestamps)) / (sizeof (timestamps[0])); + + poem const eleanorthehero = { + .words = words, + .words_length = words_length, + .lines = lines, + .lines_length = lines_length, + .timestamps = timestamps, + .timestamps_length = timestamps_length, + }; } diff --git a/src/poem/kiristella.cpp b/src/poem/kiristella.cpp new file mode 100644 index 0000000..1ed8a2a --- /dev/null +++ b/src/poem/kiristella.cpp @@ -0,0 +1,74 @@ +#include "poem.h" + +namespace poem { + static char const * const words[] = { + "La", "lu", "te", "diri", "va", + "Ki", "estevi", "sa", + "veri", "son", + "la", "ser", "vi", "ih", "ta", + "nu", + "veri", "eh", "sta", + "Kiri", "stella", + "Kiri", "stella", + "nu", + }; + static int const words_length = (sizeof (words)) / (sizeof (words[0])); + + static line const lines[] = { + { 0, 5 }, + { 5, 3 }, + { 8, 2 }, + { 10, 5 }, + { 15, 1 }, + { 16, 3 }, + { 19, 2 }, + { 21, 2 }, + { 23, 1 }, + }; + static int const lines_length = (sizeof (lines)) / (sizeof (lines[0])); + + static timestamp const timestamps[] = { + { 0.00 , -1 }, // [instrumental] + + { 18.52 , 0 }, // La + { 19.62 , 1 }, // lu + { 20.60 , 2 }, // te + { 21.25 , 3 }, // diri + { 21.52 , 4 }, // va + + { 22.58 , 5 }, // Ki + { 23.87 , 6 }, // estevi + { 25.33 , 7 }, // sa + { 26.125 , 8 }, // veri + { 26.38 , 9 }, // son + + { 27.81 , 10 }, // La + { 28.35 , 11 }, // ser + { 28.86 , 12 }, // vi + { 29.02 , 13 }, // ih + { 29.175 , 14 }, // ta + { 30.22 , 15 }, // nu + + { 31.65 , 16 }, // veri + { 31.82 , 17 }, // eh + { 32.40 , 18 }, // sta + + { 34.22 , 19 }, // Kiri + { 35.91 , 20 }, // stella + { 38.16 , 21 }, // Kiri + { 40.10 , 22 }, // stella + { 42.26 , 23 }, // nu + + { 51.94 , -1 }, // [instrumental] + }; + static int const timestamps_length = (sizeof (timestamps)) / (sizeof (timestamps[0])); + + poem const kiristella = { + .words = words, + .words_length = words_length, + .lines = lines, + .lines_length = lines_length, + .timestamps = timestamps, + .timestamps_length = timestamps_length, + }; +} diff --git a/src/renpy/script.cpp b/src/renpy/script.cpp index 35b7411..9d2b98a 100644 --- a/src/renpy/script.cpp +++ b/src/renpy/script.cpp @@ -568,15 +568,15 @@ const language::dissolve dissolves[] = { { .duration = 1.3, .first_statement = 337, .count = 3 }, { .duration = 3.0, .first_statement = 418, .count = 1 }, { .duration = 2.0, .first_statement = 427, .count = 2 }, - { .duration = 7.0, .first_statement = 537, .count = 1 }, - { .duration = 7.0, .first_statement = 539, .count = 1 }, - { .duration = 7.0, .first_statement = 541, .count = 1 }, - { .duration = 7.0, .first_statement = 543, .count = 1 }, - { .duration = 7.0, .first_statement = 545, .count = 1 }, - { .duration = 7.0, .first_statement = 547, .count = 1 }, - { .duration = 7.0, .first_statement = 549, .count = 1 }, - { .duration = 10.0, .first_statement = 551, .count = 1 }, - { .duration = 13.0, .first_statement = 553, .count = 1 }, + { .duration = 7.0, .first_statement = 538, .count = 2 }, + { .duration = 7.0, .first_statement = 541, .count = 2 }, + { .duration = 7.0, .first_statement = 544, .count = 2 }, + { .duration = 7.0, .first_statement = 547, .count = 2 }, + { .duration = 7.0, .first_statement = 550, .count = 2 }, + { .duration = 7.0, .first_statement = 553, .count = 2 }, + { .duration = 7.0, .first_statement = 556, .count = 2 }, + { .duration = 10.0, .first_statement = 559, .count = 2 }, + { .duration = 13.0, .first_statement = 563, .count = 2 }, }; const int dissolves_length = (sizeof (dissolves)) / (sizeof (dissolves[0])); @@ -987,7 +987,7 @@ const language::statement statements[] = { { .type = type::say, .say = { .characterIndex = 2, .stringIndex = 162 } }, // 402 c "Sing me a song little minstrels!" { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 403 e "..." { .type = type::play, .play = { .audioIndex = 170 } }, // 404 poem/KiriStella.ogg - { .type = type::pause, .pause = { .duration = 64 } }, // 405 + { .type = type::pause, .pause = { .duration = 67 } }, // 405 { .type = type::voice, .voice = { .audioIndex = 171 } }, // 406 leona/c54.ogg { .type = type::say, .say = { .characterIndex = 2, .stringIndex = 163 } }, // 407 c "Very Nyice!" { .type = type::voice, .voice = { .audioIndex = 172 } }, // 408 leona/c55.ogg @@ -1119,31 +1119,42 @@ const language::statement statements[] = { { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 534 e "..." { .type = type::play, .play = { .audioIndex = 231 } }, // 535 poem/BirdSong.ogg { .type = type::scene, .scene = { .imageIndex = 6 } }, // 536 bgcastle2 - { .type = type::scene, .scene = { .imageIndex = 6 } }, // 537 bgcastle2 - { .type = type::pause, .pause = { .duration = 0.0 } }, // 538 - { .type = type::scene, .scene = { .imageIndex = 7 } }, // 539 bgcastle3 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 537 e "..." + { .type = type::scene, .scene = { .imageIndex = 6 } }, // 538 bgcastle2 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 539 e "..." { .type = type::pause, .pause = { .duration = 0.0 } }, // 540 - { .type = type::scene, .scene = { .imageIndex = 8 } }, // 541 bgcastle4 - { .type = type::pause, .pause = { .duration = 0.0 } }, // 542 - { .type = type::scene, .scene = { .imageIndex = 7 } }, // 543 bgcastle3 - { .type = type::pause, .pause = { .duration = 0.0 } }, // 544 - { .type = type::scene, .scene = { .imageIndex = 6 } }, // 545 bgcastle2 + { .type = type::scene, .scene = { .imageIndex = 7 } }, // 541 bgcastle3 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 542 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 543 + { .type = type::scene, .scene = { .imageIndex = 8 } }, // 544 bgcastle4 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 545 e "..." { .type = type::pause, .pause = { .duration = 0.0 } }, // 546 { .type = type::scene, .scene = { .imageIndex = 7 } }, // 547 bgcastle3 - { .type = type::pause, .pause = { .duration = 0.0 } }, // 548 - { .type = type::scene, .scene = { .imageIndex = 6 } }, // 549 bgcastle2 - { .type = type::pause, .pause = { .duration = 0.0 } }, // 550 - { .type = type::scene, .scene = { .imageIndex = 5 } }, // 551 bgcastle1 - { .type = type::pause, .pause = { .duration = 3 } }, // 552 - { .type = type::scene_color, .scene_color = { .color = 0xffffff } }, // 553 bgwhite - { .type = type::pause, .pause = { .duration = 33 } }, // 554 - { .type = type::voice, .voice = { .audioIndex = 232 } }, // 555 nara/n11.ogg - { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 217 } }, // 556 n "In the end, Leona managed to stay out of the dungeon" - { .type = type::voice, .voice = { .audioIndex = 233 } }, // 557 nara/n12.ogg - { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 218 } }, // 558 n "Eily and Alice both stayed in service of the queen for 7 harvests" - { .type = type::voice, .voice = { .audioIndex = 234 } }, // 559 nara/n13.ogg - { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 219 } }, // 560 n "before returning to their small nameless town, near the Keep of Musia" - { .type = type::_return }, // 561 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 548 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 549 + { .type = type::scene, .scene = { .imageIndex = 6 } }, // 550 bgcastle2 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 551 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 552 + { .type = type::scene, .scene = { .imageIndex = 7 } }, // 553 bgcastle3 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 554 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 555 + { .type = type::scene, .scene = { .imageIndex = 6 } }, // 556 bgcastle2 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 557 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 558 + { .type = type::scene, .scene = { .imageIndex = 5 } }, // 559 bgcastle1 + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 560 e "..." + { .type = type::pause, .pause = { .duration = 0.0 } }, // 561 + { .type = type::pause, .pause = { .duration = 3 } }, // 562 + { .type = type::scene_color, .scene_color = { .color = 0xffffff } }, // 563 bgwhite + { .type = type::say, .say = { .characterIndex = 3, .stringIndex = 31 } }, // 564 e "..." + { .type = type::pause, .pause = { .duration = 33 } }, // 565 + { .type = type::voice, .voice = { .audioIndex = 232 } }, // 566 nara/n11.ogg + { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 217 } }, // 567 n "In the end, Leona managed to stay out of the dungeon" + { .type = type::voice, .voice = { .audioIndex = 233 } }, // 568 nara/n12.ogg + { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 218 } }, // 569 n "Eily and Alice both stayed in service of the queen for 7 harvests" + { .type = type::voice, .voice = { .audioIndex = 234 } }, // 570 nara/n13.ogg + { .type = type::say, .say = { .characterIndex = 5, .stringIndex = 219 } }, // 571 n "before returning to their small nameless town, near the Keep of Musia" + { .type = type::_return }, // 572 }; const int statements_length = (sizeof (statements)) / (sizeof (statements[0]));