Changelog
A summary of what changed and why. CHANGELOG.md in the package is the canonical record and carries every release in full.
2.0.0 — current
The authoring rebuild. 1.0.0 fixed who a speaker is; this fixes where every answer comes from.
Resolution was four levels deep — line, participant, conversation, node — and the node sat underneath every authored conversation deciding what it had not said. An Inspector field could look live and do nothing, and "where did Ren come from?" had no answer on any one screen.
- Two levels, and only two:
line override → conversation default. There is no node-wide fallback. - The node is a library.
speakersanddialogue_boxesare collections of what this NPC can use — what conversations and lines pick from. - The conversation carries the defaults:
default_speaker,default_dialogue_box,default_placement. A line stores only the exception. TalkLine.speaker_mode—INHERIT,NONE,SPEAKER. A narrator line inside Haru's conversation needsNONE; a null speaker cannot say both "I defer" and "nobody speaks this line".- Quick Say Defaults serve
say()and never reach a saved conversation. say()takes options:say(text, params, {"speaker": &"ren"}). The key is what counts —{"speaker": null}is a narrator.TalkParticipantis gone. What it expressed is a line override.- The box fits the screen: a forced size is a floor, text wraps at about 440 px within the screen, long names are trimmed, and overhangs stay on screen.
- Settings show what they say: no look carried over from the previous box, no flash on a line change, no jump when a line finishes.
- Your own presets: Save as Preset… puts a box in the project's preset folder, and + New lists it under Your presets.
- Removing a box lists where it is used and switches those uses to a replacement.
- Three templates, each a different kind of box:
classic_panel,speech_bubbleandterminal.visual_novel,soft_lightandcomic_bubblewere colour variants and are gone. - Speakers and Dialogue Boxes managers own their resources; conversations and lines only select from them.
- Dedicated TalkKit main-screen workspace: text-first lines, contextual detail, runtime preview, native Undo/Redo, validation recovery, resource managers, deep-link Back history, bulk editing and responsive navigation.
- The Inspector is a compact entry point, not a nested resource editor.
- Script-first preview: a clearly labelled
Coming soontab shows the planned writer workflow without introducing an unfinished source format. - The dialogue box's look, rebuilt around its parts.
- Panel Appearance: Flat Style, Nine-slice Texture with pixel-art scale, or any existing
StyleBox. - One padding.
- Visual Layers: name boxes, portrait frames, corner ornaments, edges and extra backgrounds, behind or above the content.
- Name on the top edge; a tail and an indicator that match a textured panel.
- A Theme that styles text without removing the frame.
- A Layers view and an interactive Anatomy Map.
- Panel Appearance: Flat Style, Nine-slice Texture with pixel-art scale, or any existing
- The demos ship in the package. Their artwork is all CC0, so it can travel with the addon.
- Schema
4.0.
Verified on Godot 4.6 stable and 4.7.2 stable.
1.0.0
The speaker rebuild. The largest breaking change the addon has had, and there are no compatibility shims: nothing has shipped to a customer yet, so the model is replaced outright.
A speaker used to be two things at once — a dialogue identity and a gameplay character. It carried talk_animation and idle_animation, and the node carried animation_player_path, so playing a line drove a sprite in your scene. A conversation with two speakers could not be expressed, and a narrator or a radio voice needed a character that does not exist.
TalkCharacterProfile→TalkSpeaker. Identity, dialogue visual and voice. No NodePath, no animation, no world reference.TalkDialogueVisualis new — a texture orSpriteFrameswith named variants, independent of world nodes but free to reuse the game's own assets.TalkParticipantis new — how one speaker takes part in one conversation: box, visual slot, placement. Optional; a speaker with no entry plays with the defaults.- Several speakers in one conversation. A line names who says it; no cast to declare and no mode to switch on. See Speakers.
- No speaker is a valid state — a sign, a narrator, a system message.
- TalkKit no longer animates anything. Every world-animation hook is gone; a game that wants one plays it itself.
- Rich text in authored lines and
say()alike, revealed by parsed character so no tag is ever shown. The body label is aRichTextLabel. say()takes aString, aTalkLine, aTalkConversation, or an array of them, through the same pipelineplay()uses. A node with zero saved conversations is a working node.- One resolution system on the node; the renderer consumes resolved state and invents no precedence.
TalkLine.speaker_name→display_name_override, which now changes the name only — the face and the voice stay whoever is speaking.TalkConversation.npc_id→default_speaker, which now outranks the node's.portrait_*→visual_*on the box;voice_enabledmoved to the speaker.- Schema
3.0. A2.0document is refused rather than half-read.
Verified on Godot 4.6 stable and 4.7.2 stable.
0.3.0
Node-first. Conversations are authored on the node, in the Inspector. A database is now an optional shared library.
NPCTalkKitreplacesTalkKitComponent.dialogues: Array[TalkConversation]on the node;databaserenamed tolibrary.play(name, params);start()kept as an alias.- Lookup order: node
dialoguesfirst, then the library. - Blocking events —
TalkLine.event_blocking, theBLOCKEDstate, theevent_blockedsignal, andresume()/is_blocked(). - Text parameters —
filled atplay(), merged overdefault_params. The source line is copied, never mutated. TalkLine.speaker_nameand per-linecharacters_per_second.TalkConversation.event_id/event_payload, fired on completion.- Speaker resolution: library → node profile →
speaker_name→ hide the name row. MISSING_NPC_REFERENCEis no longer emitted — an emptyspeaker_idis valid.TalkKitSceneCollector, plus Promote to Library and Validate scene in the Inspector.- Demo rebuilt on inline content: 20 dialogue
.tresfiles down to 10 shared assets.
Verified on Godot 4.7.2 stable.
0.2.0
The first public shape of the addon, database-first.
Runtime
NPCTalkKitwith the full conversation lifecycle and fourteen signals.- Presentation resolution per line: line override → conversation → profile →
bottom_box. - Animation hooks through
AnimationPlayerorAnimatedSprite, with graceful degradation. - Voice blips with pitch range, rate limiting, and punctuation skipping; optional per-line
voice_clip. TalkInteractionArea2Das an optional proximity trigger.
Presentations
- Bottom Box and Speech Bubble.
- A four-method custom presentation contract, plus
TalkPresentationBase. portrait_texture_filterandportrait_sizeonTalkPresentationProfilefor pixel-art portraits.
Content
TalkKitDatabase,TalkCharacterProfile,TalkConversation,TalkLine,TalkPresentationProfileas plain resources.- Deterministic validation with stable issue codes.
- JSON export and import at
schema_version"1.0", with safe / preview / overwrite modes.
Editor
- The TalkKit dock: CRUD, reorder, validation-on-save, text preview.
- An Inspector state preview that renders the real dialogue box onto the 2D workspace, frozen at
IDLE,OPENING,DISPLAYING,FINISHING, orCANCELLING, without saving anything into the scene.
Verified on Godot 4.6 stable and 4.7.2 stable. Compatibility →
Versioning
TalkKitConstants carries two separate versions:
| Constant | Meaning |
|---|---|
ADDON_VERSION | The addon release. |
SCHEMA_VERSION | The JSON document format. Currently "1.0", independent of the addon version. |