Skip to content

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. speakers and dialogue_boxes are 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 needs NONE; 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.
  • TalkParticipant is 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_bubble and terminal. visual_novel, soft_light and comic_bubble were 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 soon tab 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.
  • 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.
  • TalkDialogueVisual is new — a texture or SpriteFrames with named variants, independent of world nodes but free to reuse the game's own assets.
  • TalkParticipant is 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 a RichTextLabel.
  • say() takes a String, a TalkLine, a TalkConversation, or an array of them, through the same pipeline play() 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_enabled moved to the speaker.
  • Schema 3.0. A 2.0 document 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.

  • NPCTalkKit replaces TalkKitComponent.
  • dialogues: Array[TalkConversation] on the node; database renamed to library.
  • play(name, params); start() kept as an alias.
  • Lookup order: node dialogues first, then the library.
  • Blocking events — TalkLine.event_blocking, the BLOCKED state, the event_blocked signal, and resume() / is_blocked().
  • Text parameters — filled at play(), merged over default_params. The source line is copied, never mutated.
  • TalkLine.speaker_name and per-line characters_per_second.
  • TalkConversation.event_id / event_payload, fired on completion.
  • Speaker resolution: library → node profile → speaker_name → hide the name row.
  • MISSING_NPC_REFERENCE is no longer emitted — an empty speaker_id is valid.
  • TalkKitSceneCollector, plus Promote to Library and Validate scene in the Inspector.
  • Demo rebuilt on inline content: 20 dialogue .tres files 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

  • NPCTalkKit with the full conversation lifecycle and fourteen signals.
  • Presentation resolution per line: line override → conversation → profile → bottom_box.
  • Animation hooks through AnimationPlayer or AnimatedSprite, with graceful degradation.
  • Voice blips with pitch range, rate limiting, and punctuation skipping; optional per-line voice_clip.
  • TalkInteractionArea2D as an optional proximity trigger.

Presentations

  • Bottom Box and Speech Bubble.
  • A four-method custom presentation contract, plus TalkPresentationBase.
  • portrait_texture_filter and portrait_size on TalkPresentationProfile for pixel-art portraits.

Content

  • TalkKitDatabase, TalkCharacterProfile, TalkConversation, TalkLine, TalkPresentationProfile as 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, or CANCELLING, without saving anything into the scene.

Verified on Godot 4.6 stable and 4.7.2 stable. Compatibility →

Versioning ​

TalkKitConstants carries two separate versions:

ConstantMeaning
ADDON_VERSIONThe addon release.
SCHEMA_VERSIONThe JSON document format. Currently "1.0", independent of the addon version.

GDScript-first. No telemetry, no network requests, no AI service dependency in the shipped addon.