Skip to content

nndda/Theatre

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

573 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Theatre logo  Theatre

Theatre logo

Godot 4.4 or above Build status Documentation build

Yet another (linear) dialogue system/addon/plugin for Godot. With features such as:

  • ✍️ Text-based, human-readable syntax.
  • ⚡ Simple setup. Get started in just 7 lines of codes!
  • 😐 ....
  • 📝 And 100% written in GDScript!
Rendered Written
Theatre in action Theatre Dialogue script
# Load your epic dialogue!
var epic_dialogue := Dialogue.load('res://epic_dialogue.dlg')
# Set up the stage
@export var my_stage: TheatreStage

func _ready():
    # Start your dialogue
    my_stage.start(epic_dialogue)

func _input(event):
    # When the space/enter key is pressed,
    if event.is_action_pressed('ui_accept'):
        # Progress your dialogue
        my_stage.progress()

Important

This project is still in development and is subject to frequent breaking changes, and bugs. Check out the Issues page for known bugs & issues, and Common Troubleshooting documentation page if you encounter any issues.


Installation

Run the command below in your Godot project directory. Or download and install it manually.

curl -L 'https://nnda.dev/theatre/latest' | tar zxv --strip-components=1

The URL above is just a redirect to the main branch tarball :p


Features

Variables & Expressions

Insert static...

Dia:
    "Let's meet {player}. Don't keep {player_pronoun} waiting."

...or dynamic variables.

Execute, evaluate, and insert any valid GDScript expressions to the dialogue.

Ritsu:
    "HEY {( Player.name.to_upper() )}!!"
Dia:
    "Your operating system is {( OS.get_name() )}.
    It is currently {( Time.get_time_string_from_system(false) )}."

Dialogue Tags

Fine-tune your dialogue flow with {delay} and {speed}.

Godette:
    "Hello!{delay = 0.7} Nice to meet you."
Ritsu:
    "{speed = 1.5} AAAAAAAAAAAAAAAAA!!!!"

Manipulate Properties

Manipulate in-game object properties & variables.

Ritsu:
    UI.portrait = "ritsu_smile.png"
    "Cheers!"
Ritsu:
    Global.friendship_lv += 1
    "Yay!"

Call Functions

Connect your story to the game with function calls.

{player}:
    Player.heal(20)
    "Thanks! That feels so much better."

Call functions or set properties/variables at specific points in the Dialogue.

Dia:
    "Let's brighten up the room a little...{d = 1.1}
        Background.set_brightness(1.0)
# or
        Background.brightness = 1.0
    there we go."

📚 More comprehensive Dialogue features documented here.

(Very) Quick Start

Write your epic Dialogue!

# Write it in a *.dlg file, and load it.
var epic_dialogue := Dialogue.load("res://epic_dialogue.dlg")

# Write it directly with triple quotation marks.
var epic_dialogue := Dialogue.new("""

Dia:
    "Loading the Dialogue written in a *.dlg file
    is much better for performance."
:
    "It'll keep things clean and efficient."
:
    "Plus, you’ll have syntax highlighting
    for better readability."

""")
A scene tree, with Stage and PanelContainer

Set the Stage! Add TheatreStage and DialogueLabel node to your scene. Structure your scene like the following image:

And adjust the position and size of the PanelContainer to your liking.

Select the TheatreStage node, and reference the Label & DialogueLabel node to display your Dialogue. Adjust and configure your TheatreStage via the inspector. Alternatively, you can also set them in script:


Inspector GDScript
Inspector dock's representation of Stage's properties.
@onready var my_stage: TheatreStage = $TheatreStage

func _ready():
    my_stage.actor_label =\
        $PanelContainer/VBoxContainer/Label
    my_stage.dialogue_label =\
        $PanelContainer/VBoxContainer/DialogueLabel

Reference the TheatreStage node in the script, and set up a way to progress your Dialogue with TheatreStage.progress().

func _input(event):
    if event.is_action_pressed('ui_accept'):
        my_stage.progress()

And finally, start the TheatreStage with your epic_dialogue.

func _ready():
    my_stage.start(epic_dialogue)

📚 More detailed quick start tutorial here.

License

About

Yet another (linear) dialogue system/addon/plugin for Godot. Written in human-readable plain text.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Sponsor this project

  •  

Contributors