mitiru::vn
Visual-novel view helpers: message-window drawing, choice buttons, texture management, and vertical-text layout.
Visual-novel view helpers: message-window drawing, choice buttons, texture management, and vertical-text layout.
enum ColorBlindMode : std::uint8_t 4
NoneProtanopiaDeuteranopiaTritanopiaclass ColorTransform 4
using Matrix3x3 = std::array<float, 9>;[[nodiscard]] static Matrix3x3 getMatrix(ColorBlindMode mode) noexcept[[nodiscard]] static sgc::Colorf apply(const sgc::Colorf& color, const Matrix3x3& matrix) noexcept[[nodiscard]] static sgc::Colorf applyMode(const sgc::Colorf& color, ColorBlindMode mode) noexceptstruct ColorOverrides 8
std::optional<sgc::Colorf> textColorstd::optional<sgc::Colorf> backgroundColorstd::optional<sgc::Colorf> windowColorstd::optional<sgc::Colorf> choiceNormalColorstd::optional<sgc::Colorf> choiceHighlightColorstd::optional<sgc::Colorf> choiceTextColorstd::optional<sgc::Colorf> nameTagColorstd::optional<sgc::Colorf> nameTagTextColorstruct AccessibilityConfig 12
bool highContrast = falsebool dyslexiaFont = falsebool screenReaderText = falsefloat textSizeMultiplier = 1.0fbool reducedMotion = falseColorBlindMode colorBlindMode = ColorBlindMode::NoneColorOverrides customColorsfloat autoAdvanceMinDelay = 3.0fbool voiceDescriptions = falsefloat letterSpacingMultiplier = 1.0ffloat lineSpacingMultiplier = 1.0fvoid setTextSizeMultiplier(float multiplier) noexceptstruct ScreenReaderOutput 8
std::string sceneDescriptionstd::string speakerNamestd::string dialogueTextstd::string backgroundDescriptionstd::vector<std::string> visibleCharactersstd::vector<std::string> choiceTextsstd::string effectDescription[[nodiscard]] std::string toPlainText() conststruct AccessibilitySceneState 10
std::string sceneIdstd::string backgroundFilestd::string speakerNamestd::string dialogueTextstd::vector<std::string> visibleCharacterNamesstd::vector<std::string> choiceTextsbool hasShakeEffect = falsebool hasFlashEffect = falsebool hasParticleEffect = falsestd::string particleTypeclass AccessibilityManager 28
AccessibilityManager() = defaultexplicit AccessibilityManager(AccessibilityConfig config) noexcept[[nodiscard]] const AccessibilityConfig& config() const noexceptvoid setConfig(AccessibilityConfig config) noexceptvoid setHighContrast(bool enabled) noexceptvoid setDyslexiaFont(bool enabled) noexceptvoid setTextSizeMultiplier(float multiplier) noexceptvoid setReducedMotion(bool enabled) noexceptvoid setColorBlindMode(ColorBlindMode mode) noexceptvoid setScreenReaderText(bool enabled) noexceptvoid setVoiceDescriptions(bool enabled) noexcept[[nodiscard]] bool shouldApplyShake() const noexcept[[nodiscard]] bool shouldApplyFlash() const noexcept[[nodiscard]] bool shouldApplyParticles() const noexcept[[nodiscard]] bool shouldApplyTextWave() const noexcept[[nodiscard]] bool shouldApplyTextShake() const noexcept[[nodiscard]] bool shouldUseInstantReveal() const noexcept[[nodiscard]] float adjustFontSize(float baseFontSize) const noexcept[[nodiscard]] float adjustLetterSpacing(float baseSpacing) const noexcept[[nodiscard]] float adjustLineSpacing(float baseSpacing) const noexcept[[nodiscard]] float choiceButtonScale() const noexcept[[nodiscard]] float adjustAutoAdvanceDelay(float baseDelay) const noexcept[[nodiscard]] sgc::Colorf applyColorBlindTransform(const sgc::Colorf& color) const noexcept[[nodiscard]] sgc::Colorf adjustColor(const sgc::Colorf& color, std::string_view role = "") const noexcept[[nodiscard]] ScreenReaderOutput getScreenReaderText( const AccessibilitySceneState& state) constvoid registerBackgroundDescription(const std::string& filename, const std::string& description)[[nodiscard]] const HighContrastPalette& highContrastPalette() const noexceptvoid setHighContrastPalette(const HighContrastPalette& palette) noexceptenum ToastPhase : std::uint8_t 4
SlideInDisplayFadeOutDonestruct Achievement 8
std::string idstd::string titlestd::string descriptionstd::string iconIdbool isUnlocked = falsestd::string unlockDatebool isSecret = falsestd::string unlockConditionstruct AchievementToastAppearance 11
float positionX = -1.0ffloat positionY = 20.0ffloat width = 300.0ffloat height = 60.0ffloat slideInDuration = 0.4ffloat displayDuration = 3.0ffloat fadeOutDuration = 0.5ffloat titleFontSize = 12.0ffloat descFontSize = 10.0ffloat iconSize = 40.0ffloat padding = 10.0fstruct AchievementToast 21
std::string achievementIdstd::string titlestd::string descriptionstd::string iconIdToastPhase phase = ToastPhase::SlideInfloat elapsed = 0.0ffloat slideInDuration = 0.4ffloat displayDuration = 3.0ffloat fadeOutDuration = 0.5ffloat positionX = -1.0ffloat positionY = 20.0ffloat width = 300.0ffloat height = 60.0ffloat titleFontSize = 12.0ffloat descFontSize = 10.0ffloat iconSize = 40.0ffloat padding = 10.0f[[nodiscard]] bool isDone() const noexcept[[nodiscard]] float alpha() const noexcept[[nodiscard]] float slideOffset() const noexceptvoid update(float dt) noexceptclass AchievementSystem 20
void registerAchievement(Achievement achievement)void registerAchievements(std::vector<Achievement> achievements)bool unlock(const std::string& id)void evaluateAll(const FlagManager& flags)[[nodiscard]] const std::vector<Achievement>& achievements() const noexcept[[nodiscard]] std::optional<Achievement> getAchievement(const std::string& id) const[[nodiscard]] std::vector<Achievement> displayList() const[[nodiscard]] bool isUnlocked(const std::string& id) const[[nodiscard]] std::size_t totalCount() const noexcept[[nodiscard]] std::size_t unlockedCount() const noexcept[[nodiscard]] float completionPercentage() const noexceptvoid update(float dt)[[nodiscard]] std::optional<AchievementToast> currentToast() const[[nodiscard]] bool isToastQueueEmpty() const noexceptvoid setOnUnlockCallback(std::function<void(const Achievement&)> callback)[[nodiscard]] const AchievementToastAppearance& toastAppearance() const noexceptvoid setToastAppearance(const AchievementToastAppearance& appearance) noexceptvoid setCurrentDate(const std::string& date)[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)class AutoSkipBinding 9
AutoSkipBinding(AutoSkipController& controller, MessageWindow& window) noexceptAdvanceAction tick(float deltaTime) noexceptvoid setText(const std::string& speaker, const std::string& text, const std::string& label = {}, int lineIndex = -1)void notifyChoiceAppeared() noexceptvoid notifyChoiceDismissed() noexceptvoid cancelByUserInput() noexcept[[nodiscard]] MessageWindowState lastObservedState() const noexcept[[nodiscard]] AutoSkipController& controller() noexcept[[nodiscard]] MessageWindow& window() noexceptenum AutoSkipMode : std::uint8_t 4
Idle = 0Auto = 1SkipRead = 2SkipAll = 3enum AdvanceAction : std::uint8_t 5
None = 0Advance = 1Skip = 2using ReadCheckFn = std::function<bool(std::string_view label, int lineIndex)>;using VoicePlayingFn = std::function<bool()>;struct AutoSkipConfig 6
float autoBaseDelay = 3.0ffloat autoSpeedScale = 0.5ffloat textLengthFactor = 0.02ffloat skipAdvanceInterval = 0.05fbool stopAtChoices = truebool waitForVoice = trueclass AutoSkipController 22
AutoSkipController() noexcept = defaultexplicit AutoSkipController(AutoSkipConfig config) noexcept[[nodiscard]] AutoSkipMode mode() const noexceptvoid setMode(AutoSkipMode mode) noexceptvoid toggleAuto() noexceptvoid toggleSkip(bool skipAll = false) noexceptvoid cancelByUserInput() noexceptvoid notifyTextComplete() noexceptvoid notifyNewLine(std::size_t textLength, std::string_view scriptLabel, int lineIndex) noexceptvoid notifyChoiceAppeared() noexceptvoid notifyChoiceDismissed() noexceptvoid setReadChecker(ReadCheckFn fn)void setVoicePlayingChecker(VoicePlayingFn fn)void setAutoSpeed(int speed) noexcept[[nodiscard]] int autoSpeed() const noexceptvoid setSkipInterval(float interval) noexcept[[nodiscard]] const AutoSkipConfig& config() const noexceptvoid setConfig(AutoSkipConfig config) noexcept[[nodiscard]] AdvanceAction update(float deltaTime) noexcept[[nodiscard]] bool isActive() const noexcept[[nodiscard]] bool isAutoMode() const noexcept[[nodiscard]] bool isSkipMode() const noexceptenum BackgroundLayerType 4
FarMainOverlayForegroundstruct BackgroundColor 2
[[nodiscard]] static constexpr BackgroundColor black() noexcept[[nodiscard]] static constexpr BackgroundColor white() noexceptstruct KenBurnsAnimation 6
CameraKeyframe fromCameraKeyframe tovoid update(float dt) noexcept[[nodiscard]] float getProgress() const noexcept[[nodiscard]] CameraKeyframe getCurrent() const noexcept[[nodiscard]] bool isComplete() const noexceptstruct BackgroundRenderInfo 2
std::vector<LayerInfo> layersBackgroundColor fallbackColorclass BackgroundManager 16
void setBackground(std::uint32_t textureId) noexceptvoid transitionTo(std::uint32_t textureId, TransitionEffect effect)void clearBackground() noexceptvoid setFallbackColor(BackgroundColor color) noexceptvoid addLayer(BackgroundLayer layer)void removeLayer(int zOrder) noexceptvoid clearLayers() noexcept[[nodiscard]] std::size_t layerCount() const noexceptvoid startKenBurns(KenBurnsAnimation animation) noexceptvoid stopKenBurns() noexcept[[nodiscard]] bool isKenBurnsActive() const noexceptvoid setCamera(float x, float y, float zoom = 1.0f) noexceptvoid scrollParallax(float dx, float dy) noexceptvoid update(float dt) noexcept[[nodiscard]] BackgroundRenderInfo getRenderInfo() const noexcept[[nodiscard]] std::string toJson() constenum BacklogState : std::uint8_t 7
HiddenScrollingInActiveScrollingOutusing VoiceReplayCallback = std::function<void(const std::string& voiceId)>;using JumpToCallback = std::function<void(std::size_t entryIndex)>;`using BacklogTextRenderer = std::function< void(render::SpriteBatch& batch, const std::string& text, const sgc::Rectf& area, const sgc::Colorf& color, float fontSize)>;`struct BacklogEntry 7
std::string speakerstd::string textstd::string voiceIdfloat timestamp = 0.0fbool isChoice = falsestd::string choiceTextbool isRead = truestruct BacklogStyle 10
float speakerFontSize = 16.0ffloat textFontSize = 18.0ffloat entryPadding = 12.0ffloat entrySpacing = 4.0ffloat speakerHeight = 24.0ffloat textLineHeight = 22.0ffloat voiceButtonSize = 20.0ffloat unreadDotSize = 6.0ffloat marginLeft = 60.0ffloat marginRight = 30.0fstruct BacklogUIConfig 4
std::size_t maxEntries = 500float animDurationSec = 0.3fBacklogStyle styleScrollConfig scrollConfigclass BacklogUI 27
explicit BacklogUI(BacklogUIConfig config = {})[[nodiscard]] BacklogState state() const noexcept[[nodiscard]] bool isVisible() const noexcept[[nodiscard]] std::size_t entryCount() const noexcept[[nodiscard]] const std::vector<BacklogEntry>& entries() const noexcept[[nodiscard]] const BacklogEntry* entryAt(std::size_t index) const noexcept[[nodiscard]] const BacklogUIConfig& config() const noexcept[[nodiscard]] const ScrollContainer& scrollContainer() const noexceptvoid setConfig(BacklogUIConfig config)void onVoiceReplay(VoiceReplayCallback cb)void onJumpTo(JumpToCallback cb)void setTextRenderer(BacklogTextRenderer cb)void addEntry(BacklogEntry entry)void clearEntries()void markAllRead()void show()void hide()void toggle()void onMouseWheel(float delta)void onKeyScroll(float deltaPixels)void onMouseMove(float screenX, float screenY)void onMouseClick(float screenX, float screenY)void onDragBegin(float x, float y)void onDragMove(float x, float y)void onDragEnd(float velX = 0.0f, float velY = 0.0f)void update(float dt)void draw(render::SpriteBatch& batch) conststruct CGGalleryLayout 8
int columnsPerRow = 4int rowsPerPage = 3float thumbnailWidth = 160.0ffloat thumbnailHeight = 100.0ffloat thumbnailSpacing = 12.0ffloat categoryTabHeight = 32.0ffloat lockIconSize = 32.0f[[nodiscard]] int itemsPerPage() const noexceptstruct CGEntry 7
std::string idstd::string textureIdstd::string unlockConditionbool isUnlocked = falsestd::string categorystd::string thumbnailIdstd::vector<std::string> variantsstruct CGViewerState 10
std::string currentCgIdstd::uint32_t variantIndex = 0float zoomLevel = 1.0ffloat panX = 0.0ffloat panY = 0.0fbool isOpen = falsevoid open(const std::string& cgId) noexceptvoid close() noexceptvoid applyZoom(float delta) noexceptvoid applyPan(float dx, float dy) noexceptclass CGGallery 25
void addEntry(CGEntry entry)void addEntries(std::vector<CGEntry> entries)bool markSeen(const std::string& id)[[nodiscard]] bool isUnlocked(const std::string& id) const[[nodiscard]] const std::vector<CGEntry>& entries() const noexcept[[nodiscard]] std::optional<CGEntry> getEntry(const std::string& id) const[[nodiscard]] std::vector<std::string> categories() const[[nodiscard]] std::vector<const CGEntry*> entriesByCategory(const std::string& category) const[[nodiscard]] std::size_t totalCount() const noexcept[[nodiscard]] std::size_t unlockedCount() const noexcept[[nodiscard]] float completionPercentage() const noexcept[[nodiscard]] float completionPercentage(const std::string& category) const[[nodiscard]] CGViewerState& viewer() noexcept[[nodiscard]] const CGViewerState& viewer() const noexceptvoid setLayout(CGGalleryLayout layout) noexcept[[nodiscard]] CGGalleryLayout& layout() noexcept[[nodiscard]] const CGGalleryLayout& layout() const noexcept[[nodiscard]] std::vector<const CGEntry*> entriesForPage(std::size_t page) const[[nodiscard]] std::size_t pageCount() const noexceptbool openViewer(const std::string& id)bool nextVariant()bool prevVariant()[[nodiscard]] std::string currentViewerTexture() const[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)struct SceneReplayEntry 6
std::string idstd::string titlestd::string chapterNamestd::string scriptPositionstd::string unlockConditionbool isUnlocked = falseclass SceneReplayManager 10
void addEntry(SceneReplayEntry entry)bool markSeen(const std::string& id)[[nodiscard]] bool isUnlocked(const std::string& id) const[[nodiscard]] std::string getScriptPosition(const std::string& id) const[[nodiscard]] const std::vector<SceneReplayEntry>& entries() const noexcept[[nodiscard]] std::vector<const SceneReplayEntry*> entriesByChapter(const std::string& chapter) const[[nodiscard]] std::size_t unlockedCount() const noexcept[[nodiscard]] float completionPercentage() const noexcept[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)enum ChapterStatus 4
LockedUnlockedInProgressCompletedstruct ChapterDef 7
std::string idstd::string titlestd::string descriptionstd::string arcIdint sortOrder = 0std::string unlockConditionbool unlockedByDefault = falsestruct EndingDef 5
std::string idstd::string titlestd::string descriptionstd::string chapterIdbool isTrue = falsestruct ChapterSelectInfo 7
std::string idstd::string titlestd::string descriptionChapterStatus status = ChapterStatus::Lockedfloat readPercentage = 0.0fstd::vector<std::string> seenEndingIdsint totalEndings = 0class ChapterManager 23
using ConditionEvaluator = std::function<bool(const std::string& expression)>;void defineChapter(ChapterDef def)void defineEnding(EndingDef def)bool startChapter(const std::string& chapterId)void completeChapter(const std::string& chapterId)[[nodiscard]] const std::string& currentChapterId() const noexcept[[nodiscard]] ChapterStatus getStatus(const std::string& chapterId) const[[nodiscard]] bool isUnlocked(const std::string& chapterId) const[[nodiscard]] bool isCompleted(const std::string& chapterId) constvoid refreshUnlockStatus(const ConditionEvaluator& evaluator)void unlock(const std::string& chapterId)void markEndingSeen(const std::string& endingId)[[nodiscard]] bool isEndingSeen(const std::string& endingId) const[[nodiscard]] std::size_t seenEndingCount() const noexcept[[nodiscard]] std::size_t totalEndingCount() const noexcept[[nodiscard]] float endingCompletionRate() const[[nodiscard]] std::pair<std::size_t, std::size_t> chapterEndingProgress(const std::string& chapterId) const[[nodiscard]] std::vector<ChapterSelectInfo> getChapterSelectList() const[[nodiscard]] std::optional<ChapterDef> getChapter(const std::string& chapterId) const[[nodiscard]] std::size_t chapterCount() const noexcept[[nodiscard]] std::size_t completedChapterCount() const[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)enum CharacterPosition 6
LeftCenterLeftCenterCenterRightRightCustomenum ShowAnimation 3
InstantFadeInSlideInenum HideAnimation 3
InstantFadeOutSlideOutenum CharacterSlideDirection 4
LeftRightUpDownenum CharAnimType 5
ShowHideMoveExpressionChangeShakestruct CharacterPositionConfig 8
float leftX = 0.15ffloat centerLeftX = 0.30ffloat centerX = 0.50ffloat centerRightX = 0.70ffloat rightX = 0.85ffloat defaultY = 0.8ffloat slideOffscreenLeft = -0.3ffloat slideOffscreenRight = 1.3fstruct CharacterDefinition 3
std::string idstd::string namestd::unordered_map<std::string, std::uint32_t> expressionsstruct CharacterState 2
std::string idstd::string expressionstruct CharacterAnimation 5
std::string characterIdCharAnimType typestd::string newExpression[[nodiscard]] float getProgress() const noexcept[[nodiscard]] bool isComplete() const noexceptstruct CharacterRenderInfo 1
std::string idclass CharacterManager 28
void registerCharacter(CharacterDefinition definition)void unregisterCharacter(const std::string& id)[[nodiscard]] bool isRegistered(const std::string& id) const noexceptvoid setPositionConfig(const CharacterPositionConfig& config) noexcept[[nodiscard]] const CharacterPositionConfig& positionConfig() const noexceptvoid show(const std::string& id, const std::string& expression, CharacterPosition position = CharacterPosition::Center, ShowAnimation animation = ShowAnimation::FadeIn, float duration = 0.3f, CharacterSlideDirection slideDir = CharacterSlideDirection::Left)void showAt(const std::string& id, const std::string& expression, float x, float y, ShowAnimation animation = ShowAnimation::FadeIn, float duration = 0.3f)void hide(const std::string& id, HideAnimation animation = HideAnimation::FadeOut, float duration = 0.3f, CharacterSlideDirection slideDir = CharacterSlideDirection::Left)void hideAll(HideAnimation animation = HideAnimation::FadeOut, float duration = 0.3f)void changeExpression(const std::string& id, const std::string& expression, float crossDissolveDuration = 0.0f)void moveTo(const std::string& id, CharacterPosition position, float duration = 0.5f, EasingType easing = EasingType::EaseInOutCubic)void moveToPosition(const std::string& id, float x, float y, float duration = 0.5f, EasingType easing = EasingType::EaseInOutCubic)void dimInactive(const std::string& activeSpeakerId, float dimBrightness = 0.6f) noexceptvoid clearDimming() noexceptvoid bringToFront(const std::string& id) noexceptvoid sendToBack(const std::string& id) noexceptvoid setFlipped(const std::string& id, bool flipped) noexceptvoid setScale(const std::string& id, float scale) noexceptvoid shake(const std::string& id, float duration = 0.3f, float intensity = 5.0f, float frequency = 30.0f)void update(float dt)[[nodiscard]] std::vector<CharacterRenderInfo> getRenderList() const[[nodiscard]] bool isVisible(const std::string& id) const noexcept[[nodiscard]] const CharacterState* getState(const std::string& id) const noexcept[[nodiscard]] std::size_t visibleCount() const noexcept[[nodiscard]] bool isAnimating() const noexcept[[nodiscard]] bool isAnimating(const std::string& id) const noexcept[[nodiscard]] std::size_t registeredCount() const noexcept[[nodiscard]] std::string toJson() constenum ChoiceState : std::uint8_t 5
HiddenAppearingActiveSelectedDisappearingenum ChoiceLayout : std::uint8_t 3
VerticalHorizontalGridenum ChoiceAlignment : std::uint8_t 3
LeftCenterRightenum ChoiceAnimation : std::uint8_t 6
NoneFadeInSlideInusing ChoiceSelectedCallback = std::function<void(std::size_t index)>;using ChoiceTimeoutCallback = std::function<void(std::size_t defaultIndex)>;`using ChoiceTextRenderer = std::function< void(render::SpriteBatch& batch, const std::string& text, const sgc::Rectf& area, const sgc::Colorf& color, float fontSize)>;`struct ChoiceButtonStyle 4
float borderWidth = 1.0ffloat fontSize = 20.0ffloat paddingH = 16.0ffloat paddingV = 10.0fstruct ChoiceEntry 4
std::string textbool enabled = truestd::function<bool()> condition[[nodiscard]] bool isEnabled() conststruct ChoiceUIConfig 15
ChoiceLayout layout = ChoiceLayout::VerticalChoiceAlignment alignment = ChoiceAlignment::Centerfloat buttonWidth = 600.0ffloat buttonHeight = 48.0ffloat spacing = 8.0fint gridColumns = 2ChoiceAnimation entryAnimation = ChoiceAnimation::FadeInfloat animDurationSec = 0.3ffloat perItemDelaySec = 0.08ffloat exitDurationSec = 0.2fbool timedChoice = falsefloat timeoutSec = 10.0fstd::size_t defaultChoice = 0float timerBarHeight = 4.0fChoiceButtonStyle buttonStyleclass ChoiceUI 22
explicit ChoiceUI(ChoiceUIConfig config = {})[[nodiscard]] ChoiceState state() const noexcept[[nodiscard]] bool isActive() const noexcept[[nodiscard]] int selectedIndex() const noexcept[[nodiscard]] int focusedIndex() const noexcept[[nodiscard]] float remainingTime() const noexcept[[nodiscard]] const ChoiceUIConfig& config() const noexcept[[nodiscard]] const std::vector<ChoiceEntry>& choices() const noexceptvoid setConfig(ChoiceUIConfig config)void setChoices(std::vector<ChoiceEntry> choices)void onSelected(ChoiceSelectedCallback cb)void onTimeout(ChoiceTimeoutCallback cb)void setTextRenderer(ChoiceTextRenderer cb)void show()void dismiss()void focusUp()void focusDown()void confirm()void onMouseMove(float screenX, float screenY)void onMouseClick(float screenX, float screenY)void update(float dt)void draw(render::SpriteBatch& batch) constenum ConfigAction : std::uint8_t 4
None = 0Apply = 1Cancel = 2Reset = 3struct VNConfig 16
float textSpeed = 0.5ffloat autoSpeed = 0.5ffloat bgmVolume = 0.8ffloat seVolume = 0.8ffloat voiceVolume = 1.0ffloat masterVolume = 1.0ffloat windowAlpha = 0.8fbool fullscreen = falsebool skipUnread = falseint textSize = 24std::string language = "ja"[[nodiscard]] float textCharsPerSecond() const noexcept[[nodiscard]] float autoDelayScale() const noexcept[[nodiscard]] static VNConfig defaults() noexcept[[nodiscard]] std::string toJson() const[[nodiscard]] static VNConfig fromJson(std::string_view json)struct ConfigScreenLayout 13
float startY = 80.0ffloat itemSpacing = 50.0ffloat labelX = 50.0ffloat sliderX = 250.0ffloat sliderWidth = 300.0ffloat sliderHeight = 8.0ffloat handleWidth = 8.0ffloat handleHeight = 16.0ffloat buttonSpacing = 20.0ffloat buttonWidth = 120.0ffloat buttonHeight = 36.0ffloat fontSize = 16.0ffloat valueFontSize = 14.0fstruct SliderWidget 15
std::string labelfloat minValue = 0.0ffloat maxValue = 1.0ffloat current = 0.5ffloat step = 0.05fbool dragging = falsebool focused = false[[nodiscard]] float normalized() const noexceptvoid setFromNormalized(float norm) noexceptvoid increment() noexceptvoid decrement() noexceptvoid beginDrag() noexceptvoid endDrag() noexceptvoid dragTo(float normalizedPos) noexcept[[nodiscard]] std::string displayText() conststruct ToggleWidget 5
std::string labelbool value = falsebool focused = falsevoid toggle() noexcept[[nodiscard]] std::string displayText() constclass ConfigScreen 26
ConfigScreen() noexcept = defaultexplicit ConfigScreen(const ui::UITheme& theme) noexceptvoid open(const VNConfig& config)void close() noexcept[[nodiscard]] bool isVisible() const noexceptvoid onFocusUp() noexceptvoid onFocusDown() noexceptvoid onLeft() noexceptvoid onRight() noexcept[[nodiscard]] ConfigAction onConfirm() noexceptvoid onSliderDrag(int sliderIndex, float normalizedPos)[[nodiscard]] ConfigAction applyAction() noexcept[[nodiscard]] ConfigAction cancelAction() noexcept[[nodiscard]] ConfigAction resetAction()[[nodiscard]] ConfigAction update([[maybe_unused]] float deltaTime) noexceptvoid setAudioMixer(audio::AudioMixer* mixer) noexcept[[nodiscard]] const VNConfig& editingConfig() const noexcept[[nodiscard]] const VNConfig& originalConfig() const noexcept[[nodiscard]] const std::vector<SliderWidget>& sliders() const noexcept[[nodiscard]] const std::vector<ToggleWidget>& toggles() const noexcept[[nodiscard]] int focusIndex() const noexcept[[nodiscard]] const ui::UITheme& theme() const noexceptvoid setTheme(const ui::UITheme& theme) noexcept[[nodiscard]] const ConfigScreenLayout& layout() const noexceptvoid setLayout(const ConfigScreenLayout& layout) noexcept[[nodiscard]] bool isDirty() const noexceptenum DialogResult : std::uint8_t 4
None = 0Ok = 1Cancel = 2Third = 3enum DialogButtons : std::uint8_t 3
OkCancel = 0YesNo = 1YesNoCancel = 2enum DialogState : std::uint8_t 4
Hidden = 0FadingIn = 1Visible = 2FadingOut = 3struct DialogParams 5
std::string titlestd::string messageDialogButtons buttons = DialogButtons::OkCancelfloat fadeInDuration = 0.15ffloat fadeOutDuration = 0.1fstruct DialogButton 3
std::string labelDialogResult resultbool focused = falseclass ConfirmDialog 24
ConfirmDialog() noexcept = defaultexplicit ConfirmDialog(const ui::UITheme& theme) noexceptvoid show(DialogParams params)void dismiss(DialogResult result) noexceptvoid hide() noexceptvoid onConfirmPressed() noexceptvoid onCancelPressed() noexceptvoid onFocusLeft() noexceptvoid onFocusRight() noexceptvoid onButtonClicked(int index) noexceptvoid update(float deltaTime) noexceptvoid setOnResult(std::function<void(DialogResult)> fn)void setTheme(const ui::UITheme& theme) noexcept[[nodiscard]] const ui::UITheme& theme() const noexcept[[nodiscard]] DialogState state() const noexcept[[nodiscard]] bool isVisible() const noexcept[[nodiscard]] bool isModal() const noexcept[[nodiscard]] DialogResult result() const noexcept[[nodiscard]] float animProgress() const noexcept[[nodiscard]] float displayScale() const noexcept[[nodiscard]] float displayAlpha() const noexcept[[nodiscard]] const DialogParams& params() const noexcept[[nodiscard]] const std::vector<DialogButton>& buttons() const noexcept[[nodiscard]] int focusIndex() const noexceptenum MoodType : std::uint8_t 8
CalmHappySadTenseRomanticMysteriousActionComedyenum BGMTransitionType : std::uint8_t 3
CrossfadeDuckAndSwapLayerBlendstruct MoodTypeHash 1
std::size_t operator()(MoodType m) const noexceptstruct BGMTrack 3
MoodType mood = MoodType::Calmstd::string audioIdfloat baseVolume = 1.0fstruct BGMLayer 4
MoodType mood = MoodType::Calmstd::string audioIdfloat volumeCurve = 1.0ffloat maxVolume = 1.0fstruct TrackPlayState 4
std::string audioIdfloat volume = 0.0ffloat targetVolume = 0.0fbool active = falsestruct BGMState 5
MoodType currentMood = MoodType::CalmMoodType previousMood = MoodType::Calmfloat transitionProgress = 1.0fstd::vector<TrackPlayState> tracksbool transitioning = falsestruct MoodDetection 2
MoodType mood = MoodType::Calmfloat confidence = 0.0fclass MoodDetector 6
MoodDetector()void addKeyword(const std::string& keyword, MoodType mood, float weight = 1.0f)void removeKeyword(const std::string& keyword)[[nodiscard]] MoodDetection detect(std::string_view text) constvoid clearKeywords()void resetToDefaults()class DynamicBGMController 22
using PlayCallback = std::function<void(const std::string& audioId, float volume, float fadeDuration)>;using StopCallback = std::function<void(const std::string& audioId, float fadeDuration)>;using VolumeCallback = std::function<void(const std::string& audioId, float volume)>;DynamicBGMController() = defaultvoid registerTrack(MoodType mood, const std::string& audioId, float baseVolume = 1.0f)void registerLayer(MoodType mood, const std::string& audioId, float volumeCurve = 1.0f, float maxVolume = 1.0f)void clearRegistrations()void setPlayCallback(PlayCallback cb)void setStopCallback(StopCallback cb)void setVolumeCallback(VolumeCallback cb)void setMood(MoodType mood, float transitionDuration = 1.0f, BGMTransitionType transitionType = BGMTransitionType::Crossfade)[[nodiscard]] MoodType currentMood() const noexcept[[nodiscard]] bool isTransitioning() const noexcept[[nodiscard]] float transitionProgress() const noexcept[[nodiscard]] MoodDetection detectAndSetMood( std::string_view dialogueText, float transitionDuration = 2.0f, float minConfidence = 0.5f)[[nodiscard]] MoodDetector& moodDetector() noexcept[[nodiscard]] const MoodDetector& moodDetector() const noexceptbool parseMoodCommand(std::string_view commandArgs)void update(float deltaTime)[[nodiscard]] BGMState currentState() constvoid setMasterVolume(float volume) noexcept[[nodiscard]] float masterVolume() const noexceptenum EasingType 65
LinearEaseInQuadEaseOutQuadEaseInOutQuadEaseInCubicEaseOutCubicEaseInOutCubicEaseInQuartEaseOutQuartEaseInOutQuartEaseInQuintEaseOutQuintEaseInOutQuintEaseInSineEaseOutSineEaseInOutSineEaseInExpoEaseOutExpoEaseInOutExpoEaseInCircEaseOutCircEaseInOutCircEaseInElasticEaseOutElasticEaseInOutElasticEaseInBackEaseOutBackEaseInOutBackEaseInBounceEaseOutBounceEaseInOutBounce[[nodiscard]] constexpr float linear(float t) noexcept[[nodiscard]] constexpr float easeInQuad(float t) noexcept[[nodiscard]] constexpr float easeOutQuad(float t) noexcept[[nodiscard]] constexpr float easeInOutQuad(float t) noexcept[[nodiscard]] constexpr float easeInCubic(float t) noexcept[[nodiscard]] constexpr float easeOutCubic(float t) noexcept[[nodiscard]] constexpr float easeInOutCubic(float t) noexcept[[nodiscard]] constexpr float easeInQuart(float t) noexcept[[nodiscard]] constexpr float easeOutQuart(float t) noexcept[[nodiscard]] constexpr float easeInOutQuart(float t) noexcept[[nodiscard]] constexpr float easeInQuint(float t) noexcept[[nodiscard]] constexpr float easeOutQuint(float t) noexcept[[nodiscard]] constexpr float easeInOutQuint(float t) noexcept[[nodiscard]] inline float easeInSine(float t) noexcept[[nodiscard]] inline float easeOutSine(float t) noexcept[[nodiscard]] inline float easeInOutSine(float t) noexcept[[nodiscard]] inline float easeInExpo(float t) noexcept[[nodiscard]] inline float easeOutExpo(float t) noexcept[[nodiscard]] inline float easeInOutExpo(float t) noexcept[[nodiscard]] inline float easeInCirc(float t) noexcept[[nodiscard]] inline float easeOutCirc(float t) noexcept[[nodiscard]] inline float easeInOutCirc(float t) noexcept[[nodiscard]] inline float easeInElastic(float t) noexcept[[nodiscard]] inline float easeOutElastic(float t) noexcept[[nodiscard]] inline float easeInOutElastic(float t) noexcept[[nodiscard]] constexpr float easeInBack(float t) noexcept[[nodiscard]] constexpr float easeOutBack(float t) noexcept[[nodiscard]] constexpr float easeInOutBack(float t) noexcept[[nodiscard]] constexpr float easeOutBounce(float t) noexcept[[nodiscard]] constexpr float easeInBounce(float t) noexcept[[nodiscard]] constexpr float easeInOutBounce(float t) noexcept[[nodiscard]] inline float cubicBezier(float x1, float y1, float x2, float y2, float t) noexcept[[nodiscard]] inline float spring(float damping, float frequency, float t) noexcept[[nodiscard]] inline float apply(EasingType type, float t) noexceptenum ExprTokenKind 27
IntLiteralFloatLiteralStringLiteralBoolLiteralVariableIdentifierPlusMinusStarSlashPercentEqEqNotEqLessLessEqGreaterGreaterEqAndOrNotLParenRParenCommaEofusing ExpressionResult = std::variant<bool, int, float, std::string>;[[nodiscard]] inline ExpressionResult evaluateExpression( std::string_view expression, const FlagManager& flags)[[nodiscard]] inline bool evaluateCondition( std::string_view expression, const FlagManager& flags)struct ExprToken 3
ExprTokenKind kind = ExprTokenKind::Eofstd::string textdouble numValue = 0.0class ExpressionLexer 1
[[nodiscard]] static std::vector<ExprToken> tokenize(std::string_view source)class ExpressionEvaluator 11
[[nodiscard]] ExpressionResult evaluate(std::string_view expression, const FlagManager& flags) const[[nodiscard]] bool evaluateBool(std::string_view expression, const FlagManager& flags) const[[nodiscard]] int evaluateInt(std::string_view expression, const FlagManager& flags) const[[nodiscard]] float evaluateFloat(std::string_view expression, const FlagManager& flags) const[[nodiscard]] std::string evaluateString(std::string_view expression, const FlagManager& flags) const[[nodiscard]] static bool resultToBool(const ExpressionResult& val)[[nodiscard]] static int resultToInt(const ExpressionResult& val)[[nodiscard]] static float resultToFloat(const ExpressionResult& val)[[nodiscard]] static std::string resultToString(const ExpressionResult& val)[[nodiscard]] static FlagValue resultToFlagValue(const ExpressionResult& val)[[nodiscard]] static ExpressionResult flagValueToResult(const FlagValue& val)enum FlagScope 4
GlobalChapterusing FlagValue = std::variant<bool, int, float, std::string>;using FlagChangeCallback = std::function<void(const std::string& key, const FlagValue& oldValue, const FlagValue& newValue)>;class FlagManager 18
void set(const std::string& key, FlagValue value, FlagScope scope = FlagScope::Global)[[nodiscard]] std::optional<FlagValue> get(const std::string& key) const[[nodiscard]] bool getBool(const std::string& key, bool defaultValue = false) const[[nodiscard]] int getInt(const std::string& key, int defaultValue = 0) const[[nodiscard]] float getFloat(const std::string& key, float defaultValue = 0.0f) const[[nodiscard]] std::string getString(const std::string& key, const std::string& defaultValue = "") const[[nodiscard]] bool has(const std::string& key) const noexceptvoid remove(const std::string& key)void setMultiple(const std::vector<std::pair<std::string, FlagValue>>& flags, FlagScope scope = FlagScope::Global)[[nodiscard]] std::unordered_map<std::string, FlagValue> getAll() constvoid clear(std::optional<FlagScope> scope = std::nullopt)void clearChapterFlags()[[nodiscard]] std::size_t size() const noexcept[[nodiscard]] bool evaluate(std::string_view expression) conststd::size_t onChange(FlagChangeCallback callback)void removeCallback(std::size_t id)[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)enum FlowNodeType : std::uint8_t 3
SceneChoiceEndingstruct FlowChartNodeStyle 3
float width = 120.0ffloat height = 40.0ffloat cornerRadius = 4.0fstruct FlowChartAppearance 8
FlowChartNodeStyle sceneNodeFlowChartNodeStyle choiceNodeFlowChartNodeStyle endingNodefloat connectionLineWidth = 2.0ffloat autoLayoutPaddingX = 160.0ffloat autoLayoutPaddingY = 80.0ffloat hitTestMargin = 4.0f[[nodiscard]] const FlowChartNodeStyle& styleFor(FlowNodeType type) const noexceptstruct ChoiceRecord 3
std::string labelstd::string targetNodeIdstd::uint32_t timesChosen = 0struct FlowConnection 4
std::string fromNodeIdstd::string toNodeIdstd::string labelbool isTaken = falsestruct FlowNode 6
std::string idstd::string titleFlowNodeType type = FlowNodeType::Scenebool isVisited = falsebool isCurrent = falsestd::vector<ChoiceRecord> choicesstruct EndingInfo 4
std::string nodeIdstd::string titlestd::string descriptionbool isAchieved = falsestruct FlowChartViewState 9
float zoom = 1.0ffloat panX = 0.0ffloat panY = 0.0ffloat minZoom = 0.3ffloat maxZoom = 3.0fvoid applyZoom(float delta) noexceptvoid applyPan(float dx, float dy) noexcept[[nodiscard]] sgc::Vec2f worldToScreen(const sgc::Vec2f& worldPos) const noexcept[[nodiscard]] sgc::Vec2f screenToWorld(const sgc::Vec2f& screenPos) const noexceptclass FlowChart 29
void addNode(FlowNode node)[[nodiscard]] std::optional<FlowNode> getNode(const std::string& id) const[[nodiscard]] const std::vector<FlowNode>& nodes() const noexcept[[nodiscard]] const std::vector<FlowConnection>& connections() const noexceptvoid addConnection(const std::string& fromId, const std::string& toId, const std::string& label = "")[[nodiscard]] std::vector<const FlowConnection*> connectionsFrom(const std::string& nodeId) const[[nodiscard]] std::vector<const FlowConnection*> connectionsTo(const std::string& nodeId) constvoid markVisited(const std::string& id)void setCurrentNode(const std::string& id)void markConnectionTaken(const std::string& fromId, const std::string& toId)void recordChoice(const std::string& choiceNodeId, std::size_t optionIndex)[[nodiscard]] const std::string& currentNodeId() const noexceptvoid addEnding(EndingInfo ending)void markEndingAchieved(const std::string& nodeId)[[nodiscard]] const std::vector<EndingInfo>& endings() const noexcept[[nodiscard]] std::size_t achievedEndingCount() const noexcept[[nodiscard]] float endingCompletionPercentage() const noexcept[[nodiscard]] std::size_t visitedCount() const noexcept[[nodiscard]] float routeCompletionPercentage() const noexcept[[nodiscard]] std::size_t takenConnectionCount() const noexcept[[nodiscard]] FlowChartViewState& viewState() noexcept[[nodiscard]] const FlowChartViewState& viewState() const noexceptvoid setAppearance(FlowChartAppearance appearance) noexcept[[nodiscard]] FlowChartAppearance& appearance() noexcept[[nodiscard]] const FlowChartAppearance& appearance() const noexceptvoid autoLayout(float width, float height)[[nodiscard]] std::string hitTest(const sgc::Vec2f& pos) const[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)class FlowChartBuilder 1
[[nodiscard]] FlowChart build(std::string_view script) constenum LineDiffType : std::uint8_t 4
UnchangedAddedRemovedModifiedstruct LineDiff 5
LineDiffType type = LineDiffType::Unchangedint oldLineNumber = -1int newLineNumber = -1std::string oldTextstd::string newTextstruct LabelDiff 6
std::string labelNamebool isNew = falsebool isRemoved = falsebool isMoved = falseint oldLine = -1int newLine = -1struct ReloadResult 10
bool success = falsestd::string filePathstd::vector<std::string> errorsstd::vector<std::string> warningsstd::vector<LineDiff> changedLinesstd::vector<LabelDiff> labelChangesstd::string suggestedLabelint suggestedLine = 0int totalLinesOld = 0int totalLinesNew = 0class ScenarioDiffTracker 1
[[nodiscard]] static ReloadResult computeDiff( const std::vector<std::string>& oldScript, const std::vector<std::string>& newScript, const std::string& currentLabel, int currentLine)struct WatchedFile 4
std::string pathstd::int64_t lastModifiedTime = 0std::vector<std::string> lastLinesbool valid = falseclass ScenarioHotReloader 13
using ReloadCallback = std::function<void(const ReloadResult&)>;using ErrorCallback = std::function<void(const std::string& path, const std::string& error)>;explicit ScenarioHotReloader(int checkIntervalMs = 500) noexceptbool watchFile(const std::string& path)void unwatchFile(const std::string& path)void unwatchAll()void setOnReloaded(ReloadCallback callback)void setOnError(ErrorCallback callback)void setCurrentPosition(const std::string& label, int line) noexceptvoid update()[[nodiscard]] std::size_t watchedFileCount() const noexceptvoid setCheckInterval(int intervalMs) noexcept[[nodiscard]] ReloadResult forceReload(const std::string& path)struct WatchEntry 2
std::string namestd::string valuestruct OverlayRenderData 8
bool visible = falsefloat opacity = 0.7fstd::string currentLabelint currentLine = 0float fps = 0.0ffloat frameTimeMs = 0.0fstd::vector<WatchEntry> watchesstd::string lastReloadStatusclass DeveloperOverlay 13
DeveloperOverlay() noexcept = defaultvoid toggle() noexceptvoid setVisible(bool visible) noexcept[[nodiscard]] bool isVisible() const noexceptvoid setOpacity(float opacity) noexceptvoid updateScriptPosition(const std::string& label, int line)void updateFrameTiming(float deltaTime) noexceptvoid setWatch(const std::string& name, const std::string& value)void removeWatch(const std::string& name)void clearWatches()void setReloadStatus(const std::string& status)[[nodiscard]] OverlayRenderData getRenderData() const[[nodiscard]] std::string toText() conststruct AnimatedCharacterParam 4
std::string namefloat minValue = 0.0ffloat maxValue = 1.0ffloat defaultValue = 0.0fstruct HitTestResult 2
bool hit = falsestd::string areaNamestruct LipSyncConfig 4
bool enabled = falsestd::string parameterName = "ParamMouthOpenY"float sensitivity = 1.0ffloat smoothing = 0.1fstruct EyeTrackingConfig 5
bool enabled = truestd::string paramXName = "ParamEyeBallX"std::string paramYName = "ParamEyeBallY"float maxAngle = 30.0ffloat speed = 5.0fstruct IdleMotionConfig 5
bool enabled = truestd::string breathingParam = "ParamBreath"float breathingSpeed = 0.5ffloat breathingAmplitude = 0.5fstd::string idleMotionName = "idle"class IAnimatedCharacter 13
virtual ~IAnimatedCharacter() = default[[nodiscard]] virtual bool loadModel(const std::string& path) = 0virtual void setExpression(const std::string& name) = 0virtual void setMotion(const std::string& name, bool loop = false) = 0virtual void setParameter(const std::string& name, float value) = 0[[nodiscard]] virtual std::optional<float> getParameter(const std::string& name) const = 0[[nodiscard]] virtual std::vector<AnimatedCharacterParam> parameters() const = 0virtual void update(float dt) = 0[[nodiscard]] virtual render::Texture render(float x, float y, float scale) = 0[[nodiscard]] virtual HitTestResult hitTest(float x, float y) const = 0[[nodiscard]] virtual bool isLoaded() const = 0[[nodiscard]] virtual std::vector<std::string> availableExpressions() const = 0[[nodiscard]] virtual std::vector<std::string> availableMotions() const = 0class IAnimatedCharacterFactory 3
virtual ~IAnimatedCharacterFactory() = default[[nodiscard]] virtual std::unique_ptr<IAnimatedCharacter> create( const std::string& modelPath) = 0[[nodiscard]] virtual bool canLoad(const std::string& modelPath) const = 0class NullAnimatedCharacter : public IAnimatedCharacter 13
explicit NullAnimatedCharacter(int width = 256, int height = 512, std::uint8_t r = 180, std::uint8_t g = 160, std::uint8_t b = 200) noexcept[[nodiscard]] bool loadModel([[maybe_unused]] const std::string& path) overridevoid setExpression(const std::string& name) overridevoid setMotion(const std::string& name, bool loop) overridevoid setParameter(const std::string& name, float value) override[[nodiscard]] std::optional<float> getParameter(const std::string& name) const override[[nodiscard]] std::vector<AnimatedCharacterParam> parameters() const overridevoid update([[maybe_unused]] float dt) override[[nodiscard]] render::Texture render( [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float scale) override[[nodiscard]] HitTestResult hitTest(float x, float y) const override[[nodiscard]] bool isLoaded() const override[[nodiscard]] std::vector<std::string> availableExpressions() const override[[nodiscard]] std::vector<std::string> availableMotions() const overrideclass NullAnimatedCharacterFactory : public IAnimatedCharacterFactory 2
[[nodiscard]] std::unique_ptr<IAnimatedCharacter> create( [[maybe_unused]] const std::string& modelPath) override[[nodiscard]] bool canLoad( [[maybe_unused]] const std::string& modelPath) const overrideclass AnimatedCharacterManager 20
using LipSyncAmplitudeCallback = std::function<float()>;explicit AnimatedCharacterManager( std::unique_ptr<IAnimatedCharacterFactory> factory = nullptr)void registerModel(const std::string& characterId, const std::string& modelPath)void registerFallbackSprite(const std::string& characterId, const std::string& expression, std::uint32_t textureId)bool show(const std::string& characterId, CharacterPosition position = CharacterPosition::Center)void hide(const std::string& characterId)void hideAll()void setExpression(const std::string& characterId, const std::string& expression)void setMotion(const std::string& characterId, const std::string& motion, bool loop = false)void setParameter(const std::string& characterId, const std::string& paramName, float value)void setEyeTrackingConfig(const EyeTrackingConfig& config) noexceptvoid setLipSyncConfig(const LipSyncConfig& config) noexceptvoid setIdleMotionConfig(const IdleMotionConfig& config) noexceptvoid setLipSyncCallback(LipSyncAmplitudeCallback callback)void update(float dt, float mouseX = 0.5f, float mouseY = 0.5f)[[nodiscard]] render::Texture renderCharacter(const std::string& characterId) const[[nodiscard]] HitTestResult hitTest(const std::string& characterId, float x, float y) const[[nodiscard]] bool isAnimated(const std::string& characterId) const[[nodiscard]] std::vector<std::string> visibleCharacters() const[[nodiscard]] std::size_t size() const noexceptenum MessageWindowState : std::uint8_t 6
HiddenAppearingIdleDisplayingWaitingClickDisappearingenum MessageMode : std::uint8_t 2
ADVNVLenum WindowAnimation : std::uint8_t 3
NoneFadeSlideUpenum WindowSkinType : std::uint8_t 6
SolidColorImage9SliceCustom`using CustomSkinRenderer = std::function< void(render::SpriteBatch& batch, const sgc::Rectf& rect, float alpha)>;``using TextRenderCallback = std::function< void(render::SpriteBatch& batch, const std::string& text, std::size_t visibleChars, const sgc::Rectf& area, const sgc::Colorf& color, float fontSize)>;``using NameRenderCallback = std::function< void(render::SpriteBatch& batch, const std::string& name, const sgc::Rectf& area, const sgc::Colorf& color, float fontSize)>;`struct SolidColorSkin 2
float borderWidth = 2.0ffloat cornerRadius = 0.0fstruct WindowSkin 4
WindowSkinType type = WindowSkinType::SolidColorSolidColorSkin solidColorNineSliceConfig nineSliceCustomSkinRenderer customRendererstruct ClickWaitIndicator 5
bool enabled = truefloat size = 12.0ffloat offsetX = -20.0ffloat offsetY = -20.0ffloat blinkSpeed = 3.0fstruct MessageWindowConfig 15
float paddingLeft = 24.0ffloat paddingRight = 24.0ffloat paddingTop = 20.0ffloat paddingBottom = 20.0fbool showNamePlate = truefloat nameFontSize = 18.0ffloat fontSize = 22.0ffloat charsPerSecond = 30.0fMessageMode mode = MessageMode::ADVfloat nvlMaxLines = 20WindowSkin skinWindowAnimation showAnimation = WindowAnimation::FadeWindowAnimation hideAnimation = WindowAnimation::Fadefloat animationDurationSec = 0.25fClickWaitIndicator clickWaitstruct NvlLine 2
std::string speakerstd::string textclass MessageWindow 25
explicit MessageWindow(MessageWindowConfig config = {})[[nodiscard]] MessageWindowState state() const noexcept[[nodiscard]] MessageMode mode() const noexcept[[nodiscard]] float alpha() const noexcept[[nodiscard]] bool isTextComplete() const noexcept[[nodiscard]] bool isVisible() const noexcept[[nodiscard]] const std::string& speaker() const noexcept[[nodiscard]] const std::string& text() const noexcept[[nodiscard]] std::size_t visibleChars() const noexcept[[nodiscard]] const MessageWindowConfig& config() const noexcept[[nodiscard]] const sgc::Rectf& activeBounds() const noexceptvoid setConfig(MessageWindowConfig config)void setMode(MessageMode mode) noexceptvoid setTextRenderer(TextRenderCallback cb)void setNameRenderer(NameRenderCallback cb)void show()void hide()void setText(const std::string& speaker, const std::string& text)void revealAll() noexceptvoid advance()void clearNvl()[[nodiscard]] bool scrollHistoryUp()[[nodiscard]] bool scrollHistoryDown()void update(float dt)void draw(render::SpriteBatch& batch) constenum MovieState : std::uint8_t 5
IdleLoadingPlayingPausedFinishedstruct MovieFrame 4
int width = 0int height = 0std::vector<std::uint8_t> pixelsdouble timestamp = 0.0struct MovieAudioBuffer 3
std::vector<float> samplesint sampleRate = 44100int channels = 2struct MovieFadeConfig 3
float fadeInDuration = 0.5ffloat fadeOutDuration = 0.5fbool enabled = trueclass IMovieDecoder 9
virtual ~IMovieDecoder() = default[[nodiscard]] virtual bool open(const std::string& path) = 0[[nodiscard]] virtual std::optional<MovieFrame> readFrame() = 0virtual void seek(double seconds) = 0[[nodiscard]] virtual double duration() const = 0[[nodiscard]] virtual double currentTime() const = 0[[nodiscard]] virtual bool isFinished() const = 0[[nodiscard]] virtual std::optional<MovieAudioBuffer> audioSamples() = 0virtual void close() = 0class NullMovieDecoder : public IMovieDecoder 9
explicit NullMovieDecoder(double fakeDuration = 5.0, int frameWidth = 320, int frameHeight = 240, double fps = 30.0) noexcept[[nodiscard]] bool open([[maybe_unused]] const std::string& path) override[[nodiscard]] std::optional<MovieFrame> readFrame() overridevoid seek(double seconds) override[[nodiscard]] double duration() const override[[nodiscard]] double currentTime() const override[[nodiscard]] bool isFinished() const override[[nodiscard]] std::optional<MovieAudioBuffer> audioSamples() overridevoid close() overrideclass MoviePlayer 22
using FrameReadyCallback = std::function<void(const render::Texture&)>;using FinishedCallback = std::function<void()>;explicit MoviePlayer(std::unique_ptr<IMovieDecoder> decoder = nullptr)void setDecoder(std::unique_ptr<IMovieDecoder> decoder)void setFadeConfig(const MovieFadeConfig& config) noexcept[[nodiscard]] const MovieFadeConfig& fadeConfig() const noexceptbool play(const std::string& path)void pause()void resume()void stop()void seek(double seconds)void skip()void update(float dt)[[nodiscard]] MovieState state() const noexcept[[nodiscard]] const render::Texture& currentFrame() const noexcept[[nodiscard]] float fadeAlpha() const noexcept[[nodiscard]] const std::string& currentPath() const noexcept[[nodiscard]] double duration() const[[nodiscard]] double currentTime() const noexcept[[nodiscard]] bool isFinished() const noexceptvoid onFrameReady(FrameReadyCallback callback)void onFinished(FinishedCallback callback)struct NineSliceConfig 10
std::uint32_t textureId = 0float cornerW = 16.0ffloat cornerH = 16.0ffloat edgeInsetLeft = 16.0ffloat edgeInsetRight = 16.0ffloat edgeInsetTop = 16.0ffloat edgeInsetBottom = 16.0ffloat textureW = 64.0ffloat textureH = 64.0f[[nodiscard]] static NineSliceConfig uniform( std::uint32_t texId, float corner, float texW, float texH) noexceptclass NineSlice 5
explicit NineSlice(NineSliceConfig config) noexcept[[nodiscard]] const NineSliceConfig& config() const noexceptvoid setConfig(NineSliceConfig config) noexceptvoid draw(render::SpriteBatch& batch, const sgc::Rectf& dest, const sgc::Colorf& tint) const[[nodiscard]] sgc::Rectf minimumSize() const noexceptenum AnalyticsEventType : std::uint8_t 9
ChoiceLineReadSceneEnterSceneExitRouteCompleteSkipUsedAutoUsedSessionStartSessionEndstruct AnalyticsEvent 9
AnalyticsEventType type = AnalyticsEventType::LineReadstd::int64_t timestampMs = 0std::string sceneIdstd::string routeIdstd::string endingIdint choiceIndex = -1int totalChoices = 0int lineIndex = -1int readTimeMs = 0struct ChoiceStatEntry 3
int choiceIndex = 0int selectionCount = 0float percentage = 0.0fstruct SceneChoiceStats 3
std::string sceneIdint totalSelections = 0std::vector<ChoiceStatEntry> entriesstruct DropOffPoint 4
std::string sceneIdint exitCount = 0int enterCount = 0float exitRate = 0.0fclass RingBuffer 9
explicit RingBuffer(std::size_t capacity = 10000)void push(const T& item)void push(T&& item)[[nodiscard]] std::size_t size() const noexcept[[nodiscard]] std::size_t capacity() const noexcept[[nodiscard]] bool empty() const noexcept[[nodiscard]] const T& at(std::size_t index) const[[nodiscard]] std::vector<T> toVector() constvoid clear() noexceptclass PlayerAnalytics 27
explicit PlayerAnalytics(std::size_t maxEvents = 10000)void recordChoice(const std::string& sceneId, int choiceIndex, int totalChoices)void recordLineRead(const std::string& sceneId, int lineIndex, int readTimeMs)void recordSceneEnter(const std::string& sceneId)void recordSceneExit(const std::string& sceneId)void recordRouteComplete(const std::string& routeId, const std::string& endingId)void recordSkipUsed()void recordAutoUsed()void recordSessionStart()void recordSessionEnd()[[nodiscard]] SceneChoiceStats getChoiceStats(const std::string& sceneId) const[[nodiscard]] std::map<std::string, SceneChoiceStats> getAllChoiceStats() const[[nodiscard]] float getAverageReadTimeMs() const noexcept[[nodiscard]] float getAverageReadSpeed(float avgCharsPerLine = 30.0f) const noexcept[[nodiscard]] std::vector<DropOffPoint> getDropOffPoints(std::size_t maxResults = 10) const[[nodiscard]] std::map<std::string, int> getRouteCompletionCounts() const[[nodiscard]] std::map<std::string, float> getRouteCompletionRates() const[[nodiscard]] int skipCount() const noexcept[[nodiscard]] int autoCount() const noexcept[[nodiscard]] std::int64_t totalPlayTimeMs() const noexcept[[nodiscard]] std::int64_t lastSessionDurationMs() const noexcept[[nodiscard]] int totalSessions() const noexcept[[nodiscard]] std::int64_t totalLinesRead() const noexcept[[nodiscard]] std::vector<ChoiceStatEntry> getMostPopularChoices(std::size_t maxResults = 10) const[[nodiscard]] const RingBuffer<AnalyticsEvent>& events() const noexcept[[nodiscard]] std::string toJson() constvoid reset()class ReadTracker 12
void markAsRead(const std::string& sceneId, std::size_t lineIndex)[[nodiscard]] bool isRead(const std::string& sceneId, std::size_t lineIndex) const noexceptvoid registerSceneLineCount(const std::string& sceneId, std::size_t lineCount)[[nodiscard]] float getReadPercentage(const std::string& sceneId) const[[nodiscard]] float getTotalReadPercentage() const[[nodiscard]] std::size_t getReadCount(const std::string& sceneId) const[[nodiscard]] std::size_t getTotalReadCount() const noexcept[[nodiscard]] std::size_t sceneCount() const noexceptvoid clear()void reset()[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)enum SegmentType : std::uint8_t 5
TextRubyWaitSpeed[[nodiscard]] static bool isLineEndProhibited(std::uint32_t cp) noexceptstruct TextColor 5
std::uint8_t r = 255std::uint8_t g = 255std::uint8_t b = 255std::uint8_t a = 255[[nodiscard]] bool operator==(const TextColor& other) const noexceptstruct TextStyle 3
float fontSize = 24.0fbool bold = falsebool italic = falsestruct RichTextSegment 7
SegmentType type = SegmentType::Textstd::string textTextStyle styleTextEffect effect = TextEffect::Nonestd::string rubyTextfloat waitMs = 0.0ffloat speed = 0.0fstruct LayoutChar 9
std::uint32_t codepoint = 0float x = 0.0ffloat y = 0.0ffloat advanceX = 0.0fTextStyle styleTextEffect effect = TextEffect::Nonebool isRuby = falsestd::size_t segmentIndex = 0std::size_t charIndex = 0struct TextLayout 6
std::vector<LayoutChar> charsfloat totalWidth = 0.0ffloat totalHeight = 0.0fstd::size_t lineCount = 0float cursorX = 0.0ffloat cursorY = 0.0fclass RichTextParser 1
[[nodiscard]] static std::vector<RichTextSegment> parse( std::string_view input, const TextStyle& defaultStyle = {})class KinsokuRules 1
[[nodiscard]] static bool isLineStartProhibited(std::uint32_t cp) noexceptclass RichTextEngine 15
RichTextEngine() = defaultvoid setDefaultStyle(const TextStyle& style) noexceptvoid setText(std::string_view input)void setSegments(std::vector<RichTextSegment> segments)void layout(TrueTypeFont& font, float maxWidth = 0.0f)void update(float dt) noexcept[[nodiscard]] const TextLayout& layoutResult() const noexcept[[nodiscard]] std::vector<CharTransform> getTransforms() const[[nodiscard]] std::size_t revealedCount() const noexcept[[nodiscard]] bool isComplete() const noexceptvoid skipToEnd() noexcept[[nodiscard]] TextAnimator& animator() noexcept[[nodiscard]] const TextAnimator& animator() const noexcept[[nodiscard]] const std::vector<RichTextSegment>& segments() const noexceptvoid cursorPosition(float& outX, float& outY) const noexceptstruct RubySegment 6
std::string baseTextstd::string rubyTextfloat baseWidth = 0.0ffloat rubyWidth = 0.0ffloat baseStartX = 0.0ffloat rubyStartX = 0.0fstruct PositionedRubyGlyph 5
std::uint32_t codepoint = 0float x = 0.0ffloat y = 0.0ffloat advanceX = 0.0fbool isRuby = falsestruct RubyLayoutResult 5
std::vector<PositionedRubyGlyph> glyphsfloat totalWidth = 0.0ffloat baselineY = 0.0ffloat rubyBaselineY = 0.0ffloat totalHeight = 0.0fstruct RubyLayoutParams 5
float baseFontSize = 24.0ffloat rubyFontSize = 12.0ffloat rubyGap = 1.0ffloat rubyOverhangMax = 0.5fbool distributeRuby = trueclass RubyTextLayout 5
RubyTextLayout() = defaultstatic void measureSegment( TrueTypeFont& font, RubySegment& segment, const RubyLayoutParams& params)[[nodiscard]] RubyLayoutResult calculate( TrueTypeFont& font, const std::vector<RubySegment>& segments, const RubyLayoutParams& params, float startX, float startY) const[[nodiscard]] float measureWidth( TrueTypeFont& font, const std::vector<RubySegment>& segments, const RubyLayoutParams& params) const[[nodiscard]] float measureHeight( TrueTypeFont& font, const RubyLayoutParams& params) const noexceptenum SaveLoadMode : std::uint8_t 2
Save = 0Load = 1enum SaveLoadAction : std::uint8_t 5
None = 0Saved = 1Loaded = 2Deleted = 3Closed = 4struct ThumbnailData 6
std::vector<std::uint8_t> pixelsint width = 0int height = 0[[nodiscard]] bool isValid() const noexcept[[nodiscard]] std::string toBase64() const[[nodiscard]] static ThumbnailData fromBase64(std::string_view encoded, int w, int h)struct ThumbnailCapture 1
[[nodiscard]] static ThumbnailData capture( const std::uint8_t* srcPixels, int srcWidth, int srcHeight, int dstWidth = DEFAULT_WIDTH, int dstHeight = DEFAULT_HEIGHT)struct SaveSlotInfo 8
int slotNumber = 0std::string titlestd::string dateTimefloat playTime = 0.0fstd::string chapterNameThumbnailData thumbnailbool isEmpty = true[[nodiscard]] std::string playTimeFormatted() conststruct SaveDataSerializer 3
[[nodiscard]] static std::string serialize( std::string_view scriptLabel, int lineIndex, std::string_view chapterName, float playTime, const std::vector<std::pair<std::string, std::string>>& flags, std::string_view bgmId, std::string_view backgroundId, const ThumbnailData& thumbnail, int readProgress)[[nodiscard]] static SaveSlotInfo deserializeSlotInfo( std::string_view json, int slotNumber)[[nodiscard]] static int parseVersion(std::string_view json)struct SaveLoadGridConfig 8
int slotsPerRow = 4int rowsPerPage = 5int totalSlots = 100int quickSaveSlot = 0int thumbnailWidth = 160int thumbnailHeight = 90float slotSpacing = 8.0f[[nodiscard]] int slotsPerPage() const noexceptclass SaveLoadScreen 33
SaveLoadScreen() noexcept = defaultexplicit SaveLoadScreen(const ui::UITheme& theme) noexceptvoid setGridConfig(const SaveLoadGridConfig& config) noexcept[[nodiscard]] const SaveLoadGridConfig& gridConfig() const noexceptvoid open(SaveLoadMode mode)void close() noexcept[[nodiscard]] bool isVisible() const noexcept[[nodiscard]] SaveLoadMode mode() const noexceptvoid setSaveBridge(bridge::SaveBridge* bridge) noexceptvoid refreshSlots()[[nodiscard]] int currentPage() const noexcept[[nodiscard]] int totalPages() const noexceptvoid nextPage() noexceptvoid prevPage() noexcept[[nodiscard]] std::vector<const SaveSlotInfo*> currentPageSlots() constvoid selectSlot(int slotNumber) noexcept[[nodiscard]] int selectedSlot() const noexceptvoid executeAction()void deleteSelectedSlot()void quickSave()[[nodiscard]] bool quickLoad()void setOnSaveRequested(std::function<void(int)> fn)void setOnLoadRequested(std::function<void(int)> fn)void setOnDeleteCompleted(std::function<void(int)> fn)[[nodiscard]] SaveLoadAction update(float deltaTime)[[nodiscard]] ConfirmDialog& confirmDialog() noexcept[[nodiscard]] const ConfirmDialog& confirmDialog() const noexcept[[nodiscard]] bool isDialogActive() const noexcept[[nodiscard]] const std::vector<SaveSlotInfo>& slots() const noexcept[[nodiscard]] const ui::UITheme& theme() const noexceptvoid setTheme(const ui::UITheme& theme) noexcept[[nodiscard]] inline std::vector<ScenarioNode> parseScenarioWithMacros(std::string_view source)[[nodiscard]] inline std::vector<ScenarioNode> parseScenarioWithMacros( std::string_view source, MacroRegistry& registry)struct MacroDefinition 3
std::string namestd::vector<std::string> paramsstd::vector<ScenarioToken> bodyclass MacroRegistry 7
void registerMacro(MacroDefinition definition)[[nodiscard]] const MacroDefinition* find(const std::string& name) const[[nodiscard]] bool has(const std::string& name) constvoid remove(const std::string& name)void clear()[[nodiscard]] std::size_t size() const noexcept[[nodiscard]] std::vector<std::string> names() constclass MacroPreprocessor 3
[[nodiscard]] static std::vector<ScenarioToken> process( const std::vector<ScenarioToken>& tokens, MacroRegistry& registry, std::size_t maxDepth = 32)[[nodiscard]] static std::vector<ScenarioToken> extractMacros( const std::vector<ScenarioToken>& tokens, MacroRegistry& registry)[[nodiscard]] static std::vector<ScenarioToken> expandMacros( const std::vector<ScenarioToken>& tokens, const MacroRegistry& registry, std::size_t maxDepth = 32)enum ScenarioTokenType 8
CommandStringNumberIdentifierArrowNewlineScriptBodyEofenum ScenarioCommandType 23
SceneBackgroundBgmSeVoiceCharacterDialogueChoiceLabelJumpSetIfElseEndIfWaitTransitionScriptusing ConditionEvaluator = std::function<bool(const std::string& expression)>;using ScriptExecutor = std::function<void(const std::string& code)>;[[nodiscard]] inline std::pair<std::string, std::vector<InlineTag>> parseInlineTags(std::string_view text)[[nodiscard]] inline std::vector<ScenarioNode> parseScenario(std::string_view source)[[nodiscard]] inline std::pair<std::string, std::vector<InlineTag>> parseInlineTags(std::string_view text)inline void ScenarioExecutor::applySetToFlagManager(const std::string& variable, const std::string& value)struct ScenarioToken 4
ScenarioTokenType type = ScenarioTokenType::Eofstd::string textdouble numValue = 0.0std::size_t line = 0struct ScenarioChoiceEntry 2
std::string textstd::string labelstruct CharacterParams 5
std::string namestd::string positionstd::string expressionbool show = truestd::string transitionstruct BackgroundParams 3
std::string filestd::string transitionfloat duration = 0.0fstruct AudioParams 2
std::string filestd::string typestruct IfParams 3
std::string conditionstd::vector<std::size_t> thenCommandsstd::vector<std::size_t> elseCommandsstruct SetParams 2
std::string variablestd::string valuestruct TransitionParams 2
std::string typefloat duration = 0.0fstruct DialogueParams 2
std::string speakerstd::string textstruct ScenarioNode 14
ScenarioCommandType typestd::size_t sourceLine = 0std::string sceneNameBackgroundParams backgroundAudioParams audioCharacterParams characterDialogueParams dialoguestd::vector<ScenarioChoiceEntry> choicesstd::string labelNameSetParams setParamsIfParams ifParamsfloat waitDuration = 0.0fTransitionParams transitionstd::string scriptBodyclass ScenarioLexer 1
[[nodiscard]] static std::vector<ScenarioToken> tokenize(std::string_view source)class ScenarioParser 1
[[nodiscard]] static std::vector<ScenarioNode> parse(const std::vector<ScenarioToken>& tokens)struct InlineTag 2
std::string namestd::string valuestruct ScenarioCallback 13
virtual ~ScenarioCallback() = defaultvirtual void onScene(const std::string& )virtual void onDialogue(const std::string& , const std::string& )virtual void onDialogueParsed(const std::string& , const std::string& , const std::vector<InlineTag>& )virtual void onBackground(const BackgroundParams& )virtual void onCharacter(const CharacterParams& )virtual int onChoice(const std::vector<ScenarioChoiceEntry>& )virtual void onAudio(const AudioParams& )virtual void onTransition(const TransitionParams& )virtual void onWait(float )virtual void onSetVariable(const std::string& , const std::string& )virtual void onLabel(const std::string& )virtual void onJump(const std::string& )class ScenarioExecutor 22
void load(std::vector<ScenarioNode> nodes)void loadFromSource(std::string_view source)void setCallback(ScenarioCallback* callback) noexceptvoid setConditionEvaluator(ConditionEvaluator evaluator)void setScriptExecutor(ScriptExecutor executor)void setFlagManager(FlagManager* manager) noexceptstd::optional<ScenarioCommandType> step()void selectChoice(std::size_t index)bool jumpToLabel(const std::string& label)[[nodiscard]] bool isFinished() const noexcept[[nodiscard]] bool isWaitingForChoice() const noexcept[[nodiscard]] std::size_t pc() const noexcept[[nodiscard]] std::size_t commandCount() const noexcept[[nodiscard]] const std::string& currentScene() const noexcept[[nodiscard]] std::size_t dialogueLineCount() const[[nodiscard]] int currentDialogueIndex() const noexcept[[nodiscard]] const std::vector<ScenarioNode>& nodes() const noexcept[[nodiscard]] const std::vector<ScenarioChoiceEntry>& pendingChoices() const noexceptvoid reset()[[nodiscard]] inline ScenarioSaveState captureState(const ScenarioExecutor& executor)inline void restoreState(ScenarioExecutor& executor, const ScenarioSaveState& state)[[nodiscard]] inline bool saveStatesEqual(const ScenarioSaveState& a, const ScenarioSaveState& b)struct CallStackFrame 2
std::size_t returnAddress = 0std::string macroNamestruct ChoiceDisplayState 3
bool active = falsestd::vector<ScenarioChoiceEntry> choicesint selectedIndex = -1struct ScenarioSaveState 12
std::size_t programCounter = 0std::vector<CallStackFrame> callStackstd::unordered_map<std::string, std::string> localVariablesfloat waitTimer = 0.0fChoiceDisplayState choiceStatestd::string currentSpeakerstd::string currentTextstd::size_t textRevealProgress = 0std::string currentSceneint dialogueIndex = -1[[nodiscard]] std::string toJson() constbool fromJson(std::string_view json)enum ColorFilterType : std::uint8_t 3
NoneSepiaGrayscaleenum ShakeAxis : std::uint8_t 3
BothHorizontalVerticalenum FadeDirection : std::uint8_t 2
InOutstruct EffectParticle 4
float x = 0.0ffloat y = 0.0ffloat width = 1.0ffloat height = 4.0fstruct ScreenEffectResult 13
float offsetX = 0.0ffloat offsetY = 0.0ffloat overlayAlpha = 0.0fColorFilterType colorFilter = ColorFilterType::Nonefloat filterIntensity = 0.0ffloat vignetteIntensity = 0.0ffloat vignetteRadius = 0.5ffloat letterboxRatio = 0.0ffloat zoomFactor = 1.0ffloat zoomCenterX = 0.5ffloat zoomCenterY = 0.5ffloat blurIntensity = 0.0fstd::vector<EffectParticle> particlesclass ScreenEffect 4
virtual ~ScreenEffect() = defaultvirtual void update(float dt) = 0[[nodiscard]] virtual bool isComplete() const noexcept = 0virtual void apply(ScreenEffectResult& result, float screenW, float screenH) const = 0class ShakeEffect : public ScreenEffect 4
ShakeEffect(float intensity, float duration, float frequency = 30.0f, bool decaying = true, ShakeAxis axis = ShakeAxis::Both) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass FlashEffect : public ScreenEffect 4
FlashEffect(const sgc::Colorf& color = {1.0f, 1.0f, 1.0f, 1.0f}, float duration = 0.3f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass FadeEffect : public ScreenEffect 4
FadeEffect(FadeDirection direction, const sgc::Colorf& color = {0.0f, 0.0f, 0.0f, 1.0f}, float duration = 1.0f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass RainEffect : public ScreenEffect 4
RainEffect(std::uint32_t density = 200, float speed = 800.0f, float angle = -10.0f, bool splashOnBottom = true, float duration = 0.0f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float screenW, float screenH) const overrideclass SnowEffect : public ScreenEffect 4
SnowEffect(std::uint32_t density = 150, float speed = 60.0f, float wind = 20.0f, float sizeVariation = 0.5f, float duration = 0.0f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float screenW, float screenH) const overrideclass BlurEffect : public ScreenEffect 4
BlurEffect(float intensity = 0.5f, float duration = 0.5f, bool fadeIn = true) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass VignetteEffect : public ScreenEffect 4
VignetteEffect(float intensity = 0.7f, float radius = 0.6f, float duration = 0.0f, float fadeInTime = 0.3f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass ColorFilterEffect : public ScreenEffect 4
ColorFilterEffect(ColorFilterType filter, float intensity = 1.0f, float duration = 0.0f, float fadeInTime = 0.5f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass LetterboxEffect : public ScreenEffect 4
LetterboxEffect(float barRatio = 0.1f, float duration = 0.5f, bool opening = true) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass ZoomEffect : public ScreenEffect 4
ZoomEffect(float targetZoom = 1.5f, float centerX = 0.5f, float centerY = 0.5f, float duration = 1.0f, float startZoom = 1.0f) noexceptvoid update(float dt) override[[nodiscard]] bool isComplete() const noexcept overridevoid apply(ScreenEffectResult& result, float , float ) const overrideclass ScreenEffectManager 19
void update(float dt)[[nodiscard]] ScreenEffectResult composite(float screenW, float screenH) const[[nodiscard]] std::size_t activeCount() const noexceptvoid clear() noexceptvoid addEffect(std::unique_ptr<ScreenEffect> effect)void shake(float intensity = 10.0f, float duration = 0.4f, float frequency = 30.0f, bool decaying = true, ShakeAxis axis = ShakeAxis::Both)void flash(const sgc::Colorf& color = {1.0f, 1.0f, 1.0f, 1.0f}, float duration = 0.3f)void fade(FadeDirection direction, const sgc::Colorf& color = {0.0f, 0.0f, 0.0f, 1.0f}, float duration = 1.0f)void rain(std::uint32_t density = 200, float speed = 800.0f, float angle = -10.0f, bool splashOnBottom = true, float duration = 0.0f)void snow(std::uint32_t density = 150, float speed = 60.0f, float wind = 20.0f, float sizeVariation = 0.5f, float duration = 0.0f)void blur(float intensity = 0.5f, float duration = 0.5f, bool fadeIn = true)void vignette(float intensity = 0.7f, float radius = 0.6f, float duration = 0.0f, float fadeInTime = 0.3f)void sepia(float intensity = 1.0f, float duration = 0.0f)void grayscale(float intensity = 1.0f, float duration = 0.0f)void showLetterbox(float barRatio = 0.1f, float duration = 0.5f)void hideLetterbox(float barRatio = 0.1f, float duration = 0.5f)void zoom(float targetZoom = 1.5f, float centerX = 0.5f, float centerY = 0.5f, float duration = 1.0f)using ScriptValue = std::variant<bool, int, float, std::string, std::nullptr_t>;using NativeFunction = std::function<ScriptResult(const std::vector<ScriptValue>& args)>;struct ScriptResult 9
bool success = falseScriptValue value = nullptrstd::string error[[nodiscard]] static ScriptResult ok(ScriptValue val = nullptr)[[nodiscard]] static ScriptResult fail(const std::string& msg)[[nodiscard]] bool asBool(bool defaultValue = false) const[[nodiscard]] int asInt(int defaultValue = 0) const[[nodiscard]] float asFloat(float defaultValue = 0.0f) const[[nodiscard]] std::string asString(const std::string& defaultValue = "") constclass IScriptingEngine 8
virtual ~IScriptingEngine() = default[[nodiscard]] virtual ScriptResult execute(const std::string& code) = 0[[nodiscard]] virtual bool evaluateCondition(const std::string& expression) = 0[[nodiscard]] virtual ScriptResult callFunction(const std::string& name, const std::vector<ScriptValue>& args) = 0virtual void registerNativeFunction(const std::string& name, NativeFunction callback) = 0virtual void setGlobal(const std::string& name, ScriptValue value) = 0[[nodiscard]] virtual std::optional<ScriptValue> getGlobal(const std::string& name) const = 0virtual void reset() = 0class NullScriptingEngine : public IScriptingEngine 10
[[nodiscard]] ScriptResult execute(const std::string& code) override[[nodiscard]] bool evaluateCondition(const std::string& expression) override[[nodiscard]] ScriptResult callFunction(const std::string& name, const std::vector<ScriptValue>& args) overridevoid registerNativeFunction(const std::string& name, NativeFunction callback) overridevoid setGlobal(const std::string& name, ScriptValue value) override[[nodiscard]] std::optional<ScriptValue> getGlobal(const std::string& name) const overridevoid reset() override[[nodiscard]] const std::vector<std::string>& executionLog() const noexceptvoid clearLog() noexcept[[nodiscard]] std::vector<std::string> registeredFunctions() constclass VNScriptBridge 28
using ShowCharacterCallback = std::function<void(const std::string& name, const std::string& pos)>;using HideCharacterCallback = std::function<void(const std::string& name)>;using SetExpressionCallback = std::function<void(const std::string& name, const std::string& expr)>;using PlayBgmCallback = std::function<void(const std::string& file)>;using PlaySeCallback = std::function<void(const std::string& file)>;using StopBgmCallback = std::function<void()>;using ShowTextCallback = std::function<void(const std::string& speaker, const std::string& text)>;using ChangeBackgroundCallback = std::function<void(const std::string& file)>;explicit VNScriptBridge(std::unique_ptr<IScriptingEngine> engine, FlagManager& flags)[[nodiscard]] IScriptingEngine* engine() const noexcept[[nodiscard]] FlagManager& flags() noexceptvoid registerVNFunctions()void onShowCharacter(ShowCharacterCallback cb)void onHideCharacter(HideCharacterCallback cb)void onSetExpression(SetExpressionCallback cb)void onPlayBgm(PlayBgmCallback cb)void onPlaySe(PlaySeCallback cb)void onStopBgm(StopBgmCallback cb)void onShowText(ShowTextCallback cb)void onChangeBackground(ChangeBackgroundCallback cb)[[nodiscard]] ScriptResult executeBlock(const std::string& code)[[nodiscard]] bool evaluateCondition(const std::string& expression)[[nodiscard]] ScriptResult callFunction(const std::string& name, const std::vector<ScriptValue>& args = {})void syncFlagsToEngine()void syncFlagsFromEngine()void addSyncKey(const std::string& key)void setSyncKeys(std::vector<std::string> keys)[[nodiscard]] const std::vector<std::string>& syncKeys() const noexceptstruct ScrollBarStyle 4
float width = 6.0ffloat minThumbLen = 20.0fbool autoHide = truefloat fadeDelaySec = 1.5fstruct ScrollConfig 11
bool verticalScroll = truebool horizontalScroll = falsebool showScrollBar = truebool showHScrollBar = falsebool bounceEffect = truebool snapToItem = falsefloat snapItemHeight = 0.0ffloat inertiaDamping = 0.92ffloat bounceDamping = 0.6ffloat wheelMultiplier = 40.0fScrollBarStyle scrollBarclass ScrollContainer 29
explicit ScrollContainer( const sgc::Rectf& viewport = {}, float contentW = 0.0f, float contentH = 0.0f, ScrollConfig config = {}) noexcept[[nodiscard]] const sgc::Rectf& viewport() const noexceptvoid setViewport(const sgc::Rectf& vp) noexcept[[nodiscard]] float scrollY() const noexcept[[nodiscard]] float scrollX() const noexcept[[nodiscard]] float contentHeight() const noexcept[[nodiscard]] float contentWidth() const noexceptvoid setContentHeight(float h) noexceptvoid setContentWidth(float w) noexcept[[nodiscard]] const ScrollConfig& config() const noexceptvoid setConfig(const ScrollConfig& cfg) noexcept[[nodiscard]] float maxScrollY() const noexcept[[nodiscard]] float maxScrollX() const noexcept[[nodiscard]] bool canScrollVertically() const noexcept[[nodiscard]] bool canScrollHorizontally() const noexcept[[nodiscard]] float normalizedScrollY() const noexcept[[nodiscard]] bool containsPoint(float x, float y) const noexceptvoid setScrollY(float y) noexceptvoid setScrollX(float x) noexceptvoid scrollToTop() noexceptvoid scrollToBottom() noexceptvoid ensureVisible(float itemTop, float itemHeight) noexceptvoid onMouseWheel(float delta)void onMouseWheelH(float delta)void onDragBegin(float screenX, float screenY)void onDragMove(float screenX, float screenY)void onDragEnd(float velocityX = 0.0f, float velocityY = 0.0f)void update(float dt)void drawScrollBar(render::SpriteBatch& batch) constenum TextEffect : std::uint8_t 6
NoneTypewriterInstantShakeWaveFadestruct EffectParams 7
float shakeAmplitude = 2.0ffloat shakeFrequency = 30.0ffloat waveAmplitude = 3.0ffloat waveFrequency = 2.0ffloat wavePhaseOffset = 0.3ffloat fadeDuration = 0.2ffloat revealSpeed = 20.0fstruct CharTransform 5
float offsetX = 0.0ffloat offsetY = 0.0ffloat alpha = 1.0ffloat scale = 1.0fbool visible = truestruct CharAnimState 3
TextEffect effect = TextEffect::Nonefloat revealTime = 0.0fbool revealed = falseclass TextAnimator 18
TextAnimator() = defaultvoid reset(std::size_t charCount)void setParams(const EffectParams& params) noexcept[[nodiscard]] const EffectParams& params() const noexceptvoid setRevealMode(TextEffect mode) noexceptvoid setPersistentEffect(TextEffect effect) noexceptvoid setCharEffect(std::size_t index, TextEffect effect)void setCharWaitTime(std::size_t index, float waitSeconds)void setRevealSpeed(float charsPerSecond) noexceptvoid update(float dt) noexcept[[nodiscard]] CharTransform getTransform(std::size_t index) const noexcept[[nodiscard]] std::vector<CharTransform> getAllTransforms() const[[nodiscard]] std::size_t revealedCount() const noexcept[[nodiscard]] std::size_t totalChars() const noexcept[[nodiscard]] bool isComplete() const noexceptvoid revealAll() noexceptvoid skipToEnd() noexcept[[nodiscard]] float elapsed() const noexceptenum TransitionType 14
FadeDissolveWipeLeftWipeRightWipeUpWipeDownWipeDiagonalSlideInSlideOutCurtainOpenCurtainCloseRuleImagePixelateRippleenum TransitionState 3
IdleTransitioningCompleteenum WipeDirection 8
LeftRightUpDownDiagonalTopLeftDiagonalTopRightDiagonalBottomLeftDiagonalBottomRightenum SlideDirection 4
LeftRightUpDownenum RulePattern 6
CircleDiamondBlindsMosaicClockRandomstruct FadeColor 2
[[nodiscard]] static constexpr FadeColor black() noexcept[[nodiscard]] static constexpr FadeColor white() noexceptclass RuleImageGenerator 1
[[nodiscard]] static std::vector<std::uint8_t> generate( RulePattern pattern, int width, int height) noexceptstruct TransitionEffect 8
std::vector<std::uint8_t> ruleDatavoid update(float dt) noexcept[[nodiscard]] float getOverallProgress() const noexcept[[nodiscard]] bool isComplete() const noexcept[[nodiscard]] float getBlendFactor(float x, float y) const noexcept[[nodiscard]] std::pair<float, float> getSlideOffset( float screenWidth, float screenHeight) const noexcept[[nodiscard]] int getPixelateBlockSize() const noexcept[[nodiscard]] std::pair<float, float> getRippleOffset( float x, float y) const noexceptclass TransitionBuilder 11
[[nodiscard]] static TransitionEffect fade( float duration, FadeColor color = FadeColor::black()) noexcept[[nodiscard]] static TransitionEffect dissolve(float duration) noexcept[[nodiscard]] static TransitionEffect wipe( float duration, WipeDirection direction = WipeDirection::Left) noexcept[[nodiscard]] static TransitionEffect slideIn( float duration, SlideDirection direction = SlideDirection::Left) noexcept[[nodiscard]] static TransitionEffect slideOut( float duration, SlideDirection direction = SlideDirection::Left) noexcept[[nodiscard]] static TransitionEffect curtainOpen(float duration) noexcept[[nodiscard]] static TransitionEffect curtainClose(float duration) noexcept[[nodiscard]] static TransitionEffect ruleImage( float duration, RulePattern pattern, int width = 256, int height = 256, float softness = 0.05f) noexcept[[nodiscard]] static TransitionEffect ruleImageCustom( float duration, std::vector<std::uint8_t> data, int width, int height, float softness = 0.05f)[[nodiscard]] static TransitionEffect pixelate( float duration, int maxBlockSize = 32) noexcept[[nodiscard]] static TransitionEffect ripple( float duration, float frequency = 3.0f, float amplitude = 20.0f) noexceptclass TransitionManager 14
using Callback = std::function<void()>;void startTransition(TransitionEffect effect)void update(float dt) noexcept[[nodiscard]] TransitionState state() const noexcept[[nodiscard]] bool isTransitioning() const noexcept[[nodiscard]] bool isComplete() const noexcept[[nodiscard]] const TransitionEffect& currentEffect() const noexcept[[nodiscard]] float progress() const noexceptvoid reset() noexceptvoid onTransitionStart(Callback callback)void onTransitionComplete(Callback callback)[[nodiscard]] std::string toJson() const[[nodiscard]] inline std::size_t utf8Length(std::string_view sv) noexcept[[nodiscard]] inline std::vector<std::uint32_t> utf8ToCodepoints(std::string_view sv)class Utf8Iterator 4
Utf8Iterator(const char* str, std::size_t len) noexceptexplicit Utf8Iterator(std::string_view sv) noexcept[[nodiscard]] bool hasNext() const noexcept[[nodiscard]] std::uint32_t next() noexceptstruct GlyphInfo 9
std::uint32_t codepoint = 0int width = 0int height = 0int offsetX = 0int offsetY = 0float advanceX = 0.0fint atlasX = 0int atlasY = 0std::vector<std::uint8_t> bitmapstruct FontMetrics 5
float ascent = 0.0ffloat descent = 0.0ffloat lineGap = 0.0ffloat lineHeight = 0.0ffloat pixelSize = 0.0fclass GlyphCache 5
explicit GlyphCache(std::size_t maxSize = 4096)[[nodiscard]] const GlyphInfo* find(std::uint32_t codepoint, float pixelSize)void insert(const GlyphInfo& glyph, float pixelSize)void clear()[[nodiscard]] std::size_t size() const noexceptclass TrueTypeFont 17
TrueTypeFont() = defaultexplicit TrueTypeFont(std::vector<std::uint8_t> fontData, std::size_t cacheSize = 4096)TrueTypeFont(TrueTypeFont&& other) noexceptTrueTypeFont& operator=(TrueTypeFont&& other) noexceptTrueTypeFont(const TrueTypeFont&) = deleteTrueTypeFont& operator=(const TrueTypeFont&) = delete[[nodiscard]] bool valid() const noexceptvoid setUserData(void* data) noexcepttemplate <typename T> [[nodiscard]] T* userData() const noexcept[[nodiscard]] FontMetrics metrics(float pixelSize) const noexcept[[nodiscard]] float advanceWidth(std::uint32_t codepoint, float pixelSize) const noexcept[[nodiscard]] float kerning(std::uint32_t cp1, std::uint32_t cp2, float pixelSize) const noexcept[[nodiscard]] float measureText(std::string_view text, float pixelSize) const noexcept[[nodiscard]] const GlyphInfo* getGlyph(std::uint32_t codepoint, float pixelSize)[[nodiscard]] AtlasResult generateAtlas( float pixelSize, const std::vector<std::uint32_t>& codepoints, int padding = 1)[[nodiscard]] AtlasResult generateAtlas( float pixelSize, std::string_view text, int padding = 1)void clearCache()enum WindowBackgroundType : std::uint8_t 4
SolidNineSliceImage[[nodiscard]] inline sgc::Colorf colorFromHex(std::string_view hex) noexceptstruct Padding 4
float top = 20.0ffloat bottom = 20.0ffloat left = 30.0ffloat right = 30.0fstruct MessageWindowSkin 7
WindowBackgroundType backgroundType = WindowBackgroundType::Solidstd::string backgroundImagefloat cornerSize = 16.0ffloat alpha = 0.85fPadding paddingnamePlatewaitIconstruct ElementState 2
float borderWidth = 1.0fstd::string backgroundImagestruct ChoiceButtonSkin 3
ElementState normalfloat height = 48.0ffloat spacing = 8.0fstruct SaveSlotSkin 4
float thumbnailWidth = 160.0ffloat thumbnailHeight = 90.0ffloat slotHeight = 120.0ffloat spacing = 4.0fstruct ConfigSliderSkin 5
std::string trackImagestd::string fillImagestd::string handleImagefloat trackHeight = 6.0ffloat handleSize = 20.0fstruct ScrollBarSkin 4
std::string trackImagestd::string thumbImagefloat width = 12.0ffloat thumbMinHeight = 24.0fstruct FontConfig 8
std::string mainFontstd::string nameFontstd::string choiceFontstd::string systemFontfloat mainSize = 24.0ffloat nameSize = 20.0ffloat choiceSize = 22.0ffloat systemSize = 18.0fstruct UISkin 9
std::string name = "Default"MessageWindowSkin messageWindowChoiceButtonSkin choiceButtonSaveSlotSkin saveSlotConfigSliderSkin configSliderScrollBarSkin scrollBarFontConfig fontsTextColorConfig textColors[[nodiscard]] static UISkin defaultSkin() noexceptstruct SkinValidationResult 3
bool isValid = truestd::vector<std::string> warningsstd::vector<std::string> errorsclass UISkinLoader 10
UISkinLoader() noexcept[[nodiscard]] const UISkin& skin() const noexcept[[nodiscard]] UISkin loadFromJson(std::string_view json)[[nodiscard]] UISkin loadFromJson(std::string_view json, const UISkin& baseSkin)[[nodiscard]] static SkinValidationResult validate(const UISkin& skin)void setReloadCallback(std::function<void(const UISkin&)> callback)void setLoadedPath(const std::string& path)[[nodiscard]] const std::string& lastLoadedPath() const noexceptvoid reload(std::string_view json)[[nodiscard]] static std::string toJson(const UISkin& skin)struct NineSliceRegion 2
sgc::Rectf srcRectsgc::Rectf dstRectclass VNRenderer 6
static void drawNineSliceImage(Screen& screen, const render::Texture& texture, const NineSliceConfig& config, const sgc::Rectf& dest, float alpha = 1.0f)static void drawNineSliceImage(Screen& screen, const render::Texture& texture, float cornerSize, const sgc::Rectf& dest, float alpha = 1.0f)static void drawMessageWindow(Screen& screen, const MessageWindowConfig& config, const VNTextureManager& texMgr, std::string_view text, std::string_view speaker, std::size_t visibleChars = 0, float indicatorTimer = 0.0f)static void drawChoiceButton(Screen& screen, const sgc::Rectf& rect, std::string_view text, bool isSelected, const VNTextureManager& texMgr, const ChoiceButtonSkin& skin = {})static void drawCharacterSprite(Screen& screen, const render::Texture& texture, const sgc::Vec2f& position, float alpha = 1.0f, float scale = 1.0f)static void drawBacklogEntry(Screen& screen, const sgc::Rectf& rect, std::string_view text, std::string_view speaker, [[maybe_unused]] const VNTextureManager& texMgr, bool hasVoice = false, const sgc::Colorf& textColor = {1.0f, 1.0f, 1.0f, 1.0f}, const sgc::Colorf& speakerColor = {0.6f, 0.8f, 1.0f, 1.0f})enum ChoiceButtonState : std::uint8_t 4
NormalHoverSelectedDisabledstruct TextureLoadResult 4
int loaded = 0int cached = 0int failed = 0std::vector<std::string> failedPathsclass VNTextureManager 21
explicit VNTextureManager(std::string basePath = "")[[nodiscard]] const std::string& basePath() const noexceptvoid setBasePath(std::string path)TextureLoadResult loadFromSkin(const UISkin& skin)bool loadTexture(const std::string& path)[[nodiscard]] bool hasTexture(const std::string& path) const[[nodiscard]] const render::Texture& getTexture(const std::string& path) const[[nodiscard]] const render::Texture* tryGetTexture(const std::string& path) constbool unload(const std::string& path)void clearAll()[[nodiscard]] std::size_t cacheSize() const noexcept[[nodiscard]] const render::Texture* messageWindowTexture() const[[nodiscard]] const render::Texture* namePlateTexture() const[[nodiscard]] const render::Texture* waitIconTexture() const[[nodiscard]] const render::Texture* choiceButtonTexture(ChoiceButtonState state) const[[nodiscard]] std::vector<std::string> loadedPaths() constvoid registerTexture(const std::string& path, render::Texture texture)[[nodiscard]] inline bool isFullwidthCodepoint(std::uint32_t cp) noexcept[[nodiscard]] inline bool isVerticalPunctuation(std::uint32_t cp) noexcept[[nodiscard]] inline bool isSmallKana(std::uint32_t cp) noexceptinline void getVerticalOffset( std::uint32_t cp, float fontSize, float& outDx, float& outDy, float& outRotation) noexceptstruct VerticalTextConfig 5
float columnSpacing = 40.0ffloat lineHeight = 1.5fbool startFromRight = truefloat rubyOffset = 2.0fbool rotateHalfwidth = truestruct PositionedGlyph 6
std::uint32_t codepoint = 0float x = 0.0ffloat y = 0.0fstd::size_t columnIndex = 0float rotation = 0.0fbool isRuby = falsestruct VerticalRubySpan 3
std::size_t startIndex = 0std::size_t length = 0std::string rubyTextclass VerticalTextLayout 4
VerticalTextLayout() = default[[nodiscard]] std::vector<PositionedGlyph> layout( std::string_view text, TrueTypeFont& font, float areaWidth, float areaHeight, float fontSize, const VerticalTextConfig& config = {}) const[[nodiscard]] std::vector<PositionedGlyph> layoutWithRuby( std::string_view text, TrueTypeFont& font, float areaWidth, float areaHeight, float fontSize, const std::vector<VerticalRubySpan>& rubySpans, const VerticalTextConfig& config = {}) const[[nodiscard]] std::size_t estimateColumnCount( std::string_view text, float areaHeight, float fontSize, const VerticalTextConfig& config = {}) const noexceptSourced from docs/API_CATALOG.md, auto-generated by tools/generate_api_catalog.py.