Skip to content

Commit 4843a2e

Browse files
committed
Only push backlog entry at the end of InstMesMain
1 parent 84d0454 commit 4843a2e

15 files changed

Lines changed: 82 additions & 68 deletions

src/audio/audiosystem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ void PlayInGroup(AudioChannelGroup group, std::string const& mountpoint,
209209
void AudioUpdate(float dt) {
210210
// Set voice modifier for each voice channel
211211
for (int i = AC_VOICE0; i <= AC_VOICE2; i++) {
212-
const int charId = DialoguePages[i - AC_VOICE0].AnimationId;
212+
const int charId = DialoguePages[i - AC_VOICE0].CurrentVoiceCharacterId;
213213
const int mappedCharId = ScrWork[SW_CHARACTERIDMAPPING + charId];
214214
const float voiceVolumeModifier =
215215
Profile::ConfigSystem::VoiceMuted[mappedCharId]

src/character2d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ void Character2D::UpdateState(const int chaId) {
379379
}
380380

381381
LipFrame = GetSoundLevel(static_cast<AudioChannelId>(AC_VOICE0 + i));
382-
if (DialoguePages[i].Voice != nullptr) {
382+
if (DialoguePages[i].AudioId.has_value()) {
383383
const AudioChannelState voiceState =
384384
Channels[AC_VOICE0 + i]->GetState();
385385
const bool voicePlaying =

src/games/cc/backlogmenu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ using namespace Impacto::Profile::ScriptVars;
2020
void BacklogMenu::MenuButtonOnClick(Widgets::BacklogEntry* target) {
2121
UI::BacklogMenu::MenuButtonOnClick(target);
2222

23-
if (target->AudioId == -1)
23+
if (!target->AudioId.has_value())
2424
Audio::PlayInGroup(Audio::ACG_SE, "sysse", 4, false, 0.0f);
2525
}
2626

src/games/cc/backlogmenu.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class BacklogMenu : public UI::BacklogMenu {
1515
void Render() override;
1616

1717
Widgets::BacklogEntry* CreateBacklogEntry(
18-
int id, Vm::BufferOffsetContext scrCtx, int audioId, int characterId,
19-
glm::vec2 pos, const RectF& hoverBounds) const override {
18+
int id, Vm::BufferOffsetContext scrCtx, std::optional<int> audioId,
19+
int characterId, glm::vec2 pos, const RectF& hoverBounds) const override {
2020
return new Widgets::CC::BacklogEntry(id, scrCtx, audioId, characterId, pos,
2121
hoverBounds);
2222
}

src/games/chlcc/backlogmenu.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ class BacklogMenu : public UI::BacklogMenu, public CommonMenu {
1818
void Render() override;
1919

2020
Widgets::BacklogEntry* CreateBacklogEntry(
21-
int id, Vm::BufferOffsetContext scrCtx, int audioId, int characterId,
22-
glm::vec2 pos, const RectF& hoverBounds) const override {
21+
int id, Vm::BufferOffsetContext scrCtx, std::optional<int> audioId,
22+
int characterId, glm::vec2 pos, const RectF& hoverBounds) const override {
2323
return new Widgets::CHLCC::BacklogEntry(id, scrCtx, audioId, characterId,
2424
pos, hoverBounds);
2525
}

src/text/dialoguepage.cpp

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "../profile/dialogue.h"
77
#include "../profile/games/chlcc/dialoguebox.h"
88

9+
#include "../ui/ui.h"
910
#include "../data/tipssystem.h"
1011

1112
#include "../hud/waiticondisplay.h"
@@ -53,7 +54,7 @@ void DialoguePage::Init() {
5354
for (int i = 0; i < std::ssize(DialoguePages); i++) {
5455
DialoguePages[i].Clear();
5556
DialoguePages[i].Id = i;
56-
DialoguePages[i].AnimationId = 0;
57+
DialoguePages[i].CurrentVoiceCharacterId = 0;
5758
DialoguePages[i].FadeAnimation.DurationIn = FadeInDuration;
5859
DialoguePages[i].FadeAnimation.DurationOut = FadeOutDuration;
5960
DialoguePages[i].FadeAnimation.SkipOnSkipMode = true;
@@ -69,7 +70,8 @@ void DialoguePage::Clear() {
6970
TextPage::Clear();
7071

7172
Name.clear();
72-
Voice = nullptr;
73+
AudioId.reset();
74+
CurrentStringAddress.reset();
7375

7476
CurrentLineTop = [this]() {
7577
switch (this->GetMode()) {
@@ -89,7 +91,7 @@ void DialoguePage::Clear() {
8991
AdvanceMethod = AdvanceMethodType::Skip;
9092
}
9193

92-
void DialoguePage::AddString(Vm::Sc3VmThread* ctx, Audio::AudioStream* voice,
94+
void DialoguePage::AddString(Vm::Sc3VmThread* ctx, std::optional<int> voiceId,
9395
bool acted, int animId, int charId,
9496
bool shouldUpdateCharId) {
9597
const DialoguePageMode mode = GetMode();
@@ -99,17 +101,24 @@ void DialoguePage::AddString(Vm::Sc3VmThread* ctx, Audio::AudioStream* voice,
99101
}
100102
TextFadeAnimation.Reset(AnimationDirection::Out);
101103

102-
Voice = voice;
104+
CurrentStringAddress = {ctx->ScriptBufferId, ctx->IpOffset};
105+
AudioId = voiceId;
106+
107+
Audio::AudioStream* audioStream = nullptr;
108+
if (voiceId.has_value()) {
109+
Io::Stream* stream;
110+
IoError err = Io::VfsOpen("voice", *voiceId, &stream);
111+
112+
const bool playAudio = (err == IoError_OK && !GetFlag(SF_MESALLSKIP));
113+
if (playAudio) audioStream = Audio::AudioStream::Create(stream);
114+
}
103115

104116
if (shouldUpdateCharId) {
105117
CharacterId = charId;
106-
ScrWork[Id + SW_ANIME0CHANO] = CharacterId;
118+
ScrWork[Id + SW_ANIME0CHANO] = charId;
107119
}
108120

109-
const int nextAnimId = acted ? animId : charId;
110-
111-
// Hold last voiced animation id
112-
if (Voice != nullptr) NextAnimationId = std::max(nextAnimId, 31);
121+
AnimationId = std::max(acted ? animId : charId, 31);
113122

114123
const size_t typeWriterStart = Glyphs.size();
115124

@@ -128,12 +137,14 @@ void DialoguePage::AddString(Vm::Sc3VmThread* ctx, Audio::AudioStream* voice,
128137
Typewriter.SetFirstGlyph(typeWriterStart);
129138
Typewriter.SetGlyphCount(Glyphs.size() - typeWriterStart);
130139
Typewriter.SetParallelStartGlyphs(DialogueTextParserInst.ParallelStartGlyphs);
131-
Typewriter.Start(Voice != nullptr);
140+
Typewriter.Start(AudioId.has_value());
132141

133-
if (Voice != nullptr) {
134-
AnimationId = NextAnimationId;
135-
Audio::Channels[Audio::AC_VOICE0]->Play(
136-
std::unique_ptr<Audio::AudioStream>(Voice), false, 0.0f);
142+
if (AudioId.has_value()) {
143+
CurrentVoiceCharacterId = AnimationId;
144+
if (audioStream) {
145+
Audio::Channels[Audio::AC_VOICE0]->Play(
146+
std::unique_ptr<Audio::AudioStream>(audioStream), false, 0.0f);
147+
}
137148
}
138149

139150
AutoWaitTime = static_cast<float>(Typewriter.GetGlyphCount());
@@ -248,4 +259,13 @@ void DialoguePage::Show() {
248259
TextFadeAnimation.Progress = 1.0f;
249260
}
250261

262+
void DialoguePage::PushBacklogEntry() {
263+
if (!CurrentStringAddress.has_value() || GetFlag(SF_REVADDDISABLE) ||
264+
(ScrWork[SW_MESWIN0TYPE + 10 * Id] & 0b10)) {
265+
return;
266+
}
267+
268+
UI::BacklogMenuPtr->AddMessage(*CurrentStringAddress, AudioId, AnimationId);
269+
}
270+
251271
} // namespace Impacto

src/text/dialoguepage.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ struct DialoguePage : public TextPage {
2323
DialoguePage(int id) : Id(id) {}
2424

2525
int Id;
26+
int CurrentVoiceCharacterId = 0;
2627
int AnimationId = 0;
27-
int NextAnimationId = 0;
28-
int CharacterId = -1;
28+
int CharacterId = 0;
29+
std::optional<int> AudioId;
2930

3031
TypewriterEffect Typewriter;
3132
Animation FadeAnimation;
@@ -34,8 +35,6 @@ struct DialoguePage : public TextPage {
3435
std::vector<ProcessedTextGlyph> Name;
3536
bool RenderName = false;
3637

37-
Audio::AudioStream* Voice;
38-
3938
enum class AdvanceMethodType : uint8_t {
4039
Skip,
4140
Present,
@@ -60,8 +59,9 @@ struct DialoguePage : public TextPage {
6059

6160
bool TextIsFullyOpaque();
6261
void Clear() override;
63-
void AddString(Vm::Sc3VmThread* ctx, Audio::AudioStream* voice = 0,
64-
bool acted = true, int animId = 0, int charId = -1,
62+
void AddString(Vm::Sc3VmThread* ctx,
63+
std::optional<int> voiceId = std::nullopt, bool acted = true,
64+
int animId = 0, int charId = 0,
6565
bool shouldUpdateCharId = false);
6666
void Update(float dt);
6767

@@ -72,11 +72,15 @@ struct DialoguePage : public TextPage {
7272
void Hide();
7373
void Show();
7474

75+
void PushBacklogEntry();
76+
7577
private:
7678
void FinishLine(Vm::Sc3VmThread* ctx, size_t nextLineStart,
7779
const RectF& boxBounds, TextAlignment alignment);
7880

7981
std::unique_ptr<DialogueBox> DialogueBoxInst = DialogueBox::Create();
82+
83+
std::optional<Vm::BufferOffsetContext> CurrentStringAddress;
8084
};
8185

8286
inline std::vector<DialoguePage> DialoguePages;

src/ui/backlogmenu.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ using namespace Impacto::Vm::Interface;
3232
using namespace Impacto::UI::Widgets;
3333

3434
void BacklogMenu::MenuButtonOnClick(Widgets::BacklogEntry* target) {
35-
if (target->AudioId != -1) {
35+
if (target->AudioId.has_value()) {
3636
const float volume =
3737
Profile::ConfigSystem::VoiceMuted[target->CharacterId]
3838
? 0.0f
3939
: Profile::ConfigSystem::VoiceVolume[target->CharacterId];
4040
Audio::Channels[Audio::AC_REV]->SetVolume(volume);
41-
Audio::Channels[Audio::AC_REV]->Play("voice", target->AudioId, false, 0.0f);
41+
Audio::Channels[Audio::AC_REV]->Play("voice", *target->AudioId, false,
42+
0.0f);
4243
}
4344
}
4445

@@ -307,8 +308,8 @@ void BacklogMenu::RenderHighlight(const glm::vec2 offset) const {
307308

308309
void BacklogMenu::Render() {}
309310

310-
void BacklogMenu::AddMessage(Vm::BufferOffsetContext scrCtx, int audioId,
311-
int characterId) {
311+
void BacklogMenu::AddMessage(Vm::BufferOffsetContext scrCtx,
312+
std::optional<int> audioId, int characterId) {
312313
if (!GetFlag(SF_REVADDDISABLE) || ScrWork[SW_MESWIN0TYPE] == 0) {
313314
auto onClick = [this](auto* btn) { return MenuButtonOnClick(btn); };
314315

src/ui/backlogmenu.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ class BacklogMenu : public Menu {
1919
virtual void Render() override;
2020

2121
virtual Widgets::BacklogEntry* CreateBacklogEntry(
22-
int id, Vm::BufferOffsetContext scrCtx, int audioId, int characterId,
23-
glm::vec2 pos, const RectF& hoverBounds) const {
22+
int id, Vm::BufferOffsetContext scrCtx, std::optional<int> audioId,
23+
int characterId, glm::vec2 pos, const RectF& hoverBounds) const {
2424
return new Widgets::BacklogEntry(id, scrCtx, audioId, characterId, pos,
2525
hoverBounds);
2626
}
2727

28-
virtual void AddMessage(Vm::BufferOffsetContext scrCtx, int audioId = -1,
28+
virtual void AddMessage(Vm::BufferOffsetContext scrCtx,
29+
std::optional<int> audioId = std::nullopt,
2930
int characterId = 0);
3031
virtual void MenuButtonOnClick(Widgets::BacklogEntry* target);
3132
void Clear();

src/ui/widgets/backlogentry.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ namespace Widgets {
1515
using namespace Impacto::Profile::BacklogMenu;
1616
using namespace Impacto::Profile::ScriptVars;
1717

18-
BacklogEntry::BacklogEntry(int id, Vm::BufferOffsetContext scrCtx, int audioId,
19-
int characterId, glm::vec2 pos,
20-
const RectF& hoverBounds)
18+
BacklogEntry::BacklogEntry(int id, Vm::BufferOffsetContext scrCtx,
19+
std::optional<int> audioId, int characterId,
20+
glm::vec2 pos, const RectF& hoverBounds)
2121
: Id(id),
2222
AudioId(audioId),
2323
CharacterId(characterId),
@@ -91,7 +91,7 @@ void BacklogEntry::Move(glm::vec2 relativePosition) {
9191
}
9292

9393
void BacklogEntry::Render() {
94-
if (AudioId != -1) {
94+
if (AudioId.has_value()) {
9595
Renderer->DrawSprite(
9696
VoiceIcon,
9797
glm::vec2(Bounds.X - VoiceIcon.ScaledWidth(), Bounds.Y) +

0 commit comments

Comments
 (0)