{"id":16786356,"url":"https://github.com/willnationsdev/godot-journey","last_synced_at":"2026-01-03T10:32:53.157Z","repository":{"id":132646507,"uuid":"106617185","full_name":"willnationsdev/godot-journey","owner":"willnationsdev","description":"A visual graph-based quest editor tool for the Godot Engine.","archived":false,"fork":false,"pushed_at":"2019-03-21T05:00:41.000Z","size":25,"stargazers_count":79,"open_issues_count":10,"forks_count":2,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-01-23T09:32:54.962Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"GDScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willnationsdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-11T22:45:19.000Z","updated_at":"2024-12-19T16:11:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"4d23b06d-b096-4a45-a738-c2f2524833e8","html_url":"https://github.com/willnationsdev/godot-journey","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnationsdev%2Fgodot-journey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnationsdev%2Fgodot-journey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnationsdev%2Fgodot-journey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnationsdev%2Fgodot-journey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willnationsdev","download_url":"https://codeload.github.com/willnationsdev/godot-journey/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243945698,"owners_count":20372917,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T08:12:01.976Z","updated_at":"2026-01-03T10:32:53.117Z","avatar_url":"https://github.com/willnationsdev.png","language":"GDScript","readme":"# godot-journey\n\nThis project is my attempt to create an Articy: Draft / Twine / YarnSpinner-like experience for Godot Engine 3.x.\n\nFor an updated list of the proposed features, see the [Core API Overview](https://github.com/willnationsdev/godot-journey/issues/1).\n\nThe features these systems provide include a narrative database, a level planner, an interactive dialog system that has access to both of the previous elements, and a nestable graph-based overview of the scenes in your narrative.\n\nThe intended roadmap for THIS plugin involves the consolidation of 3 or 4 independent plugins:\n\nThe first plugin is for a backend, generic, narrative database...\n- Initially provided templates might include:\n    - Character\n    - Life (plants, wildlife)\n    - Place (things where concepts can BE)\n    - Object (non-living thing)\n    - Idea (abstract thing: Lore, History, Philosophy, Knowledge, etc.)\n- Users could define templates in the form of script files with exported properties.\n- Setting a script onto a Resource object which stores the data allows you to easily define new templates / edit existing templates for a given concept.\n- These Resource objects could then be serialized in one of two ways, depending on the version of the plugin installed:\n    - Users could opt for a `.res`/`.tres`-based local storage. Simplest, fastest, most intuitive.\n    - Users could opt for Neo4j Graph Database storage. The plugin would ideally come with some standalone version of the database so that C# drivers could access it. In this scenario (if it's doable), Resource objects would be serialized into Neo4j nodes.\n        - The advantage of this option is that you get MUCH more sophisticated querying capability with the Cypher query language, essential for large projects.\n        - I even have thoughts about composing Cypher queries using a scene file since GraphNodes and their connections can be used to represent an actual Cypher query.\n- Regardless of which method is used, the plugin would include a graph-based editor for this content that mirrors Neo4j systems:\n    - Every created concept appears as a node (GraphNode). Every concept has a script attached detailing its available properties.\n    - Users could click on any GraphNode to see the properties associated with the type in the Inspector.\n        - We could also (POSSIBLY) implement functionality to expand/collapse the GraphNode with the properties in-lined rather than having to view them in the Inspector, but that'd be a lower priority.\n    - Relationships can be created between nodes. Every relationship must have one and only one label. They may also have any number of properties.\n        - Neo4j natively supports Relationships, but in the .res version, you'd probably have to store each relationship type as its own dictionary in a singular .res file for all relationships, e.g. one dictionary for lives_with relationships mapping one node to another node, etc..\n\nWith this database accessible, you could then have another plugin for a graph-based story editor.\n- users could then do screenwriting using an interface akin to Twine or Yarn.\n    - The user is presented with a graph in which they can create Passage nodes.\n    - Every Passage includes a TextEdit for a narrative scripting language (similar to Harlowe or SugarCube in Twine).\n        - I'd want to add word-wrap support to the TextEdit node for this.\n        - I'd want the scripting language to...\n            - Have lines starting with `@character_name: dialogue text`\n            - Lines without a speaker-identifier (`: dialogue text`) would be judged as simply having no speaker.\n            - Programmers could define accompanying visual/audio data references based on the speaker.\n            - Allow `@character_name(...): dialogue text` to let users provide parameters for manners of speech, directed speech, etc., trigger voice cues, animations, etc. (user-defined).\n            - Allow users to inline GDScript code to be called before/during/after the dialogue is triggered.\n            - Allow users to inline logic testing, variable assignment, and flow control (perhaps via macros?) to modify which text is displayed.\n            - Allow users to define their own custom macros bound to custom GDScript functions.\n            - (Example at the bottom):\n    - Groups of Passages are organized into Sequences (`GraphEdit`s) which can be figuratively nested into each other\n        - A project will have one StoryScript singleton.\n        - A StoryScript will have 0 or more Stories which establish a shared source of information about a story.\n        - A StoryScript will have 0 or more Sequences which each rely on one Story (often the same).\n        - Sequences are broken down into sub-Sequences (they can figuratively be instanced within each other).\n        - ^ note that GraphEdits cannot be nested within each other which is why we ultimately keep all Sequences / sub-Sequences as unique children of the Story under the StoryScript singleton. No ACTUAL instancing within each other occurs.\n        - Sequences ultimately break down into Passages, the GraphNodes for story content.\n        - Users will be able to refer to Sequences in the Scene dock.\n        - A dedicated node for Passage and another dedicated node for PackedSequence will exist where the Sequence simply simulates a singular GraphNode with all the inputs and outputs of an entire Sequence GraphEdit.\n        - If you \"open\" a PackedSequence node, it switches you over to the appropriate Sequence GraphEdit (similar to how nested scenes work).\n    - A StoryScript singleton could be used to manage data for the story and interact with Sequences.\n        - Discrete pieces of StoryScript are executed in their entirety by calls to an `advance()` function in the StoryScript singleton.\n        - Sequences of pieces can therefore be animated by the AnimationPlayer when animating calls to the function.\n    - I'm THINKING I might be able to try and retrofit the gdscript module to create some sort of StoryScript module similarly. That way you can still in-line GDScript in some way.\n    - StoryScript would ultimately need to be able to compile into a data format, possibly a variation of .twee or use JSON, so that people can use a text editor to view the entirety of a story.\n\nSince all of this gives us a database of content (1 of 2 plugins) and a micro-level story editor (another plugin), we therefore need a macro-level quest editor to connect it all to data-based objectives.\n\n- Content in the game is defined by `Task` objects. You can make user-defined `Task`s.\n- Users can add `Task`s as prerequisites or as objectives for a Quest.\n    - users could then tie in task\\_completed or quest\\_completed signals into StoryScript Sequence activations.\n- Quests of this sort would be developed within VisualScript probably, and there'd need to be a GDScript variant for text-based development (if it is desired).\n\nThese 4 plugins in total form the consolidated Quest editing tool\n\nStoryScript example:\n\n                                                    # Note that any set of 4 consecutive spaces are replaced with tabs and all tabs are removed prior to interpretation \n    # Bob and Sam are sitting on a couch at home.   # a one-line comment\n    @Bob:                                           # a persona identifier. It refers to a node that is the child of the StoryScript singleton\n        I really wish I had a cheeseburger.         # visible text dialogue.\n    \u003c% #inlined GDScript                            # non-visible GDScript code to execute\n        Story.wants_cheeseburger = true             # variable setting\n        Story.drink = \"Dr. Pepper\"                  # ^\n    %\u003e                                              # ending tag\n                                                    # an empty line indicates termination of a discrete unit of dialogue. The text as it will appear on screen in a dialogue box is now: \"I really wish I had a cheeseburger.\"\n    Honestly, if I couldn't eat                     # another visible line\n    \u003c\u003cif Story.wants_cheeseburger\u003e\u003e                 # flow control via macros\n        cheeseburgers                               # text to appear if true\n    \u003c\u003celse\u003e\u003e                                        # \n        hot dogs                                    # text to appear if false\n    \u003c\u003cendif\u003e\u003e,                                      # termination of for loop and a visible comma\n    \u003c\u003cbr\u003e\u003e                                          # a marker indicating a visible line break in the text box\n    I don't know what I'd do with myself.           # this text shows up on a second line\n\n    At the very least, I'd need some\n    \u003c\u003c echo Story.drink \u003e\u003e.                         # this text inserts \"Dr. Pepper\" into the text\n\n    @Sam(expr=\"confused\"):                          # can define options (key/value pairs) to customize how a line is delivered.\n        Seriously? That's all you can think about right now?\n\n        What about the\n        \u003c\u003clist Story.fridge.foot \u003c{delay 0.5}\u003e\u003e\u003e    # a custom macro written by users. It executes the same output as the below, commented code\n        \u003c#                                          # a start comment tag for macros\n        \u003c\u003cfor a_food in Story.fridge.food\u003e\u003e         # for loop\n            \u003c\u003cdelay 0.5\u003e\u003e                           # delays the displaying of the following text output. Directly inserted parameter for macro-powered macros\n            \u003c\u003cif a_food == Story.fridge.food.back()\u003e\u003e\n                , and\n            \u003c\u003celif a_food != Story.fridge.food.front()\u003e\u003e\n                ,\n            \u003c\u003cendif\u003e\u003e\n            \u003c\u003cecho a_food\u003e\u003e\n        \u003c\u003cendfor\u003e\u003e\n        #\u003e                                          # an end comment tag for macros\n        that we already have...\n\n    @Sam(expr=\"serious\"):                           # these lines happen at the same time because there is no newline separating them\n        in the FRIDGE?\n    @Bob(expr=\"annoyed\", voice=\"mocking\"):\n        in the FRIDGE.\n\n    @Bob(voice=\"default\"):                          # expression is still \"annoyed\", carries over.\n        Yeah, I know.\u003c\u003cbr\u003e\u003eI just don't like that stuff.\n\n        There's just too much [green stuff](green_stuff). # Creates a link from this Passage to the Passage with the title \"green_stuff\".\n                                                            # ^ The text shows up as a hyperlink to click, at which point the Passage is triggered.\n                                                            # ^ Multiple Passages can be triggered at the same time (allowing for simultaneous conversations).\n    # It should also be possible to attach Passages to signals so that emitting the signal triggers the Passage.\n    # StoryScript should be able to query and reference the narrative database, ideally with auto-completion provided.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnationsdev%2Fgodot-journey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillnationsdev%2Fgodot-journey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnationsdev%2Fgodot-journey/lists"}