Giter Club home page Giter Club logo

arrow's Introduction

Arrow Arrow's logo

The Game Narrative Design Tool

Download | Contribution | Runtimes | Guides

Arrow is the free, open-source and feature-rich tool for game narrative design, text-adventure development, and creation of interactive nonlinear storytelling documents.

Arrow's Overall Look

Notable Features:

  • Free as in Freedom
  • 100% Visual Development
  • Extensible Node System
  • VCS-Friendly Save Files & JSON Export
  • One-Click Playable Export (HTML)
  • Support for Distributed Workflows
  • Continuum Safety

Arrow supports a rich palette of features, from scenes and macros, to variables and characters. It also comes with built-in common node types, providing logic, interactive navigation, random data generation, state management, and more.

Check out Guides for detailed information.

Download

Arrow prebuilt executables are available to download from the archive of releases.

Following links are to the latest stable versions:

Linux (X11) x86 (32-bit) | x86_64 (64-bit)

Windows 32-bit | 64-bit

MacOS builds are not available at this time.
Mac users can easily build Arrow from source.

Web App

Arrow Progressive Web App is also available.

This version provides full features as the latest downloadable releases.
It stores project data and configurations in your browser.
Convenience import/export options are available to ease working with file-system of devices as well.

The experience is optimized for desktop (mode/) screens.

PWA version requires your browser to have WebGl and Canvas element support, available Web-Storage, and Java-Script enabled (which any modern browser does by default).

Runtime Projects

Guides

Docs for Arrow are available in the repository's Wiki, including a Quick Start Guide as well as, detailed instructions, documentation of the built-in nodes, and more.

Contribution to Arrow

Contributions are welcome and appreciated.
Please browse Contribution wiki page, to find how you can help Arrow most.

Thanks in advance.

Licenses

Copyright (c) 2021-2022 Mor. H. Golkar and contributors

Unless otherwise specified, Arrow and files in this repository are available under MIT license. See license & copyright files for more information.

Have a Good Time

arrow's People

Contributors

mhgolkar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

arrow's Issues

Splitter (Iterator) Node

After writing a lot of my game logic, I want to be able to split logic from a single entry point.

For example, a little old lady arrives home, and I would like to be able to trigger multiple events from this entry point.

At the moment these events can also be triggered if she is already home when something else happens.

This can cause the logic to become quite twisted.

It would be better to have a splitter node (like an inverted hub).

setting variable with random value

adding an option on the [variable update node] to set the variable with a randomly generated value

  • number variables could have an input range (start,end)

  • string variables could have an input of pool of letters to which the string would be gotten and an input of range (how many letters to input)

location of newly created node

when adding a new node, there are times that the node is not located on where the mouse cursor is.
Even if the mouse is clicked beforehand, it still does the said issue.

The node would also sometimes be buried under another node.

This causes confusion especially when the node comes off screen.

Enhancement: Allow Frames to be put behind other nodes

Currently Frames serve the purpose of letting end-users organize nodes into categories in the same Scene. However, it suffers in terms of UX, as the user has to unnecessarily collapse the frame to access nodes behind it, instead of the frame being able to be placed behind the nodes instead. This is pretty common behavior in other node-based systems, and I think it'd be a valuable enhancement to have such a feature implemented. Frame Labels won't need much special consideration, as this only comes down to the Frame's placement on the canvas, and can be left up to the end-user.

Optionally, and something I'd prefer and appreciate to see, is to also have a toggle that lets Frames have color filled even when not selected. The wireframe is okay, but a color fill is pretty usual for node-based systems that implement groups (like Frames). See the picture below, if you need further clarification.

image
Image source: https://medium.com/@umarkhandev/node-based-coding-7433424fa4b0

e: I've rewritten the issue to better fit the issue, considering I didn't know the purpose of Frames at the time of making the issue.

It's easy to forget to click "Update" and lose work

I started making a simple story and it took me a bit to figure out why my work was disappearing each time I created a new node. I even tried Ctrl-s, but it was still gone.

Turns out I didn't see the Update button.

Would be nice to auto update or something to require fewer clicks.

PathDialog Access property causes current_path and current_dir inconsistencies

I am playing around with the project to learn stuff about it and about Godot.
I started by forking the repo, cloned it locally, opened it for edit in Godot 3.2.3.

Then I hit Play to start the project and played around with things a bit.
Importantly (for this issue) I set a different "Work Directory" from Arrow -> Preferences.

From git I noticed there were changes to main.tscn. The values of the properties of BlockingLayer.Container.PathDialog is now set to my custom value there.
Even after I went and reset it back to 'user://' from both the in-app preferences and directly in the Editor by changing the properties of PathDialog, the values in main.tscn remain to my "custom" values.

To push my changes "clean" of that, I have to edit main.tscn outside the Godot Editor. Then one I open it again and save any change, I'm back with my "custom" values.
Note that I tried reset my local code to what is here on the remote, to no avail: as soon as I start editing from the Godot Editor those values change again to my "custom" paths.

Am I doing something wrong somewhere? I guess I am missing something obvious that Godot is doing behind the scenes.

New feature: `Tag Match` node

Currently, one would need a lot of Tag Pass nodes to branch like in a switch statement (Godot calls it match):

image

That's why checking for multiple values would be highly beneficial.

Here's a mockup I thought up, which is basically a combination of Tag Pass + Interaction nodes:

image

image

Zooming In/Out with only WHEEL

Given that moving on the canvas is a really easy trick with WHEEL_BUTTON pressed, the shortcuts could be changed for more easy-to-use zooming.

I think that the use should be :

  • WHEEL_SCROLL to zoom in and out
  • CTRL + WHEEL_SCROLL to move vertically
  • MAJ + WHEEL_SCROLL to move horizontally

Moreover, currently, CTRL + WHEEL_SCROLL does not only zoom In/Out, but also scroll accordingly, which is even more annoying than the shortcuts.

Please tell me what you think about it, but as for me it would be game-changing for navigation use.
Thanks for considering it

Node dropping isn't very forgiving

This isn't close enough to connect nodes but there are no other nodes.

image

Makes it difficult to use for low dexterity people or to use quickly.

Multi-Language support

Hi again @mhgolkar

Do you plan to add multi-language support to arrow?

How would you implement multi-language currently?

I'm thinking multilpe options, create an .arrow file for each lenguage, chapter01_en / chapter01_es and so on, but the logic would need to be duplicated and lead to language specific bugs.
Another option could be create language scenes, scene_01_en, scene_01_fr, etc, but would have tha same issues as before.
Or extra languages could be handled by the game itself, that present some advantages in terms of logic, but extra implementation needs to be done.

How you would aproch it?

Thanks for yor time 🤗
Albert J.

P.S: Sorry to bother you again, please let me know if you prefer another way of communication.

sorting options on the items at the inspector

as of writing, items at the inspector bar such as the variables, character or scenes and projects are just arranged from the first declared item to the last declared item

it would make it easier to use if a sort function for each category could be implemented

alphabetical sorting would hugely be beneficial.

projects and scenes could also be arranged by date(may it be created or modified)

Render `{ Rich text with BBCode Content}`

Hey there! I just discovered this and it seems pretty cool!

So far the biggest thing throwing me off is that when I run the game in the console, it displays all the content nodes without showing the content:

image

I know I can export the game to the browser, but to test it quickly it would be nice to be able to render that in the console.

I see that you have a brief that you can show in the console, but maybe it could be a checkmark in the settings to "show full content"?

Not clear where arrow stores files

I'm on Windows, so possibly this is more of a problem there where users aren't intended to look in AppData.

When you save you get this dialog that doesn't hint at the storage location:
image

The quickstart says:

Arrow keeps all the projects in a single work directory.

This directory is by default user:// or the platform-specific directory for the user local data.

You can change work directory from Preferences panel.

But when I click Browse to change that location, it opens the Arrow.exe directory instead of where it's actually put the files.

So since I didn't change the location on first use, my projects are lost (to a nontechnical user). (The path is actually %userprofile%\AppData\Roaming\Godot\app_userdata\Arrow)

I'd suggest:

  • show the output directory (readonly) when saving.
  • Browse in preferences should start at the current project folder
  • add a "open projects location" button somewhere (preferences?)

Lots of clicks to make a new node

To create a new node you must:

  • right click
  • double click node type
  • drag pin to previous node
  • select new node

If you could drag off a pin to open a node, you could simplify to:

  • drag off pin and release
  • double click node type

Alternative Use / remote platform

I’ll take this down soon. Posting here since I don’t know how else to get in touch. I’m building a tool on Godot that includes narrative elements and data analysis. Your tool is quite cool especially your conversational take on a state machine. Are you interested in discussing collaborations?What I’m building, while not explicitly crypto oriented, might be of close interest to Ethereum fans.

Add better item sorting mechanisms to nodes with multiple choices such as Interaction & Dialog

Currently, the only way to sort Actions in an Interaction node, is to right-click them to edit, set that, and then do it for everything else when you want them in a certain order. This is quite cumbersome and pretty bad from a UX standpoint, and could be improved with drag-and-drop functionality for placement and instead removing the edit-and-set causing the Action to be set to the end of the list. New actions obviously should, however.

Spellcheck

Hey, dude, what you are doing is just great! Recently i started to write my own dialogue system, but your project already has almost everything to be perfect!

Is it possible to add spellcheck somehow? If you are not intending to add this feature, maybe you can give me an advice where to start, so i could fork this project? I did not saw GDScript language before, and i cannot find how to implement spellcheck in this language.

Thank you for this application!

dragging along the mini-map

as of writing, moving along the mini-map is limited to clicking.

It does work on surface level, but when seriously working on a project, clicking on the mini-map results to jumping and might get confusing, resulting on not using the mini-map altogether.

making the mini-map drag-to-move-along would help with this

Godot integration?

Hello,

I've been tinkering a bit with Arrow and find it very interesting! 🙂
I know there is the json file export function but do you plan to make a GDScript plugin to make it possible to import it in Godot projects? I mean, it could be very interesting to use Arrow's node Editor to make complex dialogs and include them in games where players could interact with NPCs.

A thing like 1 json file per discussion (including 1 or more NPCs) with the dialog's input variables 'fed' by the game would allow a smooth connection with RPG style games. 🤔

Better dialog handling.

There's some strange design choices when trying to design a dialog.

The most basic necessity of a dialog designer is to have a character say something and give answer choices to a player, so how do I do this with arrow?

The obvious would be to use the dialog node, but this only gives answers and a character, not the actual text. So I go to the content node, that has a title, no character, and a field for text. So who's saying this? The player, the narrator, the character that shows up in the answer? Who is giving the answer? The player, the character shown?
What's the use for the "Interaction" node? It's functionally identical to the dialog one.

We need to identify characters in the Content node or the ability to put text on the Dialog node.

Export to HTML seems broken

It seems like exporting to HTML shows the error message saying that Arrow does not have write access folder, even though exporting to JSON in that exact folder works just fine.
I can lead more tests if needed.

Feature: Node that displays an image

While text-based games are primarily, well, text-based. It's not the first time I've seen one implement something of that kind using SugarCube2, and I think it'd be nice to have the option to display images on the export along with text. It'd have to be a node that can be used together with other nodes, e.g. that is connected to a Content node, and displays the image along with the text. This may be a big change, as I presume you would have to add an image input on relevant nodes, but I think it'd still be really neat to have.

Feature: Node that plays audio

As mentioned in #52, I understand that this may be out of scope due to text-based games predominantly being just text. But like with images, I think it'd be nice to have the ability to play some arbitrary audio, be that some small notification sound, or some background music or the like. Not sure how you'd deal with playing music over the course of multiple nodes, without either compromising like simply letting it play until it ends, and/or fading it out when new audio is played. Regardless of the actual implementation, I'd certainly appreciate it.

Remember window size

Would be super nice if it remembered the size of the window when closed and restored it next time, also remembering if it's maximized or not

canvas zooming out further

would help moving along the canvas.

The mini-map helps, but it is still different from moving along the main canvas itself, specially when you have many nodes and have to segment them to different spots of the canvas

Read only dialogue nodes

EDIT: Read below for how to do this!

There's not really a good way (as far as I can tell) to create a dialogue where a character just says something and you continue. Currently, I've just been either creating a dialogue node with only one option as the content which means you have to click it, or just using a content node, but that doesn't have an option to mark a character. An option to add characters to content nodes or a way to use dialogue nodes without any options and some content instead.

Arrow icons

It seems like the project is missing some icons, as it shows the Godot icon most of the time
image
image

New feature: `Event Emitter` node

When actually using Arrow in a game, you want to read from the dialog data / react to events or dialog progress, to process sth., trigger animations, modify Arrow-data, etc.

The OptionButton has the values: Value, Variable, Character. And it sends the data wrapped as a Godot Dictionary (or json).
And you want it to be blocking in the cases mentioned above. I named it Auto-play, so it's consistent with e.g. Monolog, but it can also be named "delayed"/"await"/"block and wait"…

It might even be wise to have a new tab Events on the same level as Variables and Characters, where one can define Keys. These can be set in Mockup's Name field.

Mockup:
image

Add real world examples / include example .arrow files in the repo.

Hi @mhgolkar

Arrow documentation is great, specially the "Use" parts, where you can get an idea of what each option is there for, but I can't help to think that adding some "hands on" examples on how you use it would make it even better.

This is not an "issue" but just a suggestion, I think adding a few .arrow files with some real world examples, or expanding the documentation with some screenshots, like one in the home page, would help people to get a grasp on how to use the tool.

Thanks for all your effort, you 🪨

Feature: Scene-specific variables (or a better way to organize resources per scene)

This is mostly for organization purposes. Currently, as far as I understand it, variables seem to be global. And to make something like a text-based game, some will certainly need to be, but some don't need to be. Given how variables are visible to the end-user, they'll either need to prepend some sort of namespace to filter by or live with having a rather cluttered list of variables. Thus, I feel it'd be a very welcome feature to toggle a variable to "private" (or something to that effect), such that it is only available to a specific Scene at a time.

template/profile/localVariables for "character"

(not an issue but a feature suggestion or a query if it might be possible to implement)

as of writing, "characters" made on the characters tab are only constant strings that has no other functions other than the dialog node

maybe there would be merit to having a dedicated space where the user could type in information about the "character"?

ie,

Name:
sex:
age:
defining feature:
personality:
background story:

having those information are important on building a story.

there are also "statistics" values that could be added such as

HP:
MP:
str:

etc

i know they could easily be added as the current implementation of variables, but having variables like those is in the long run, messy

ie

char1_hp
char2_hp

These information are also highly dependent on what story would be written, so maybe leaving them as just "custom" info would suffice

you could look at them as local variables inside the characters themselves instead of having them as global variables

(big thanks about the Variable parsing ^_^)

Save window state in config.arrow

I think that saving the window preferences as fullscreen mode, maximised mode, should be saved in the config file so that on launch, the app restores as it was on last use.
I assume that it is not a complicated issue to solve, but could be a nice add !

Quick Export key

I'm using Arrow as the basis for dialog and interaction in my side scrolling VN.

Would be really useful to have a quick export button Cmd + e for example, as at the moment I have to use the following every time:

-> project 
-> export 
-> export json 
-> save 
-> confirm

It's a lot of steps.
Perhaps first time we can show the export screen but after that skip confirmation?

Export is very hidden

If I didn't read the quickstart guide, I'd never have found it.

Suggestion: rename the "More" button to "Export..."

Feature: Array variable type

Given that you've mentioned in #52 that you try to avoid adding gameplay- or runtime-specific functionality, I suspect this may be the same. However, I'd still like to ask if array variables could be added. It's mostly for more complex logic chains, because it'd significantly reduce the amount of nodes and variables I'd need to use, but I understand if you don't want to add such a thing.

Also, thank you for the help in the other issues.

e: Though, given that the description mentions that Arrow is also for "interactive nonlinear storytelling," I hope it's within scope enough, because that's what I'm testing around for. :)

Let floating panels (Inspector & Console) keep their user-defined size and position between runs

I tend to resize the Inspector window, so that I see all the tabs at once, instead of having to page through them. However, currently, it resets to its default size after having restarted the application. I think it'd be quite nice to be able to have it remember its size, or at least let users set a new personalized default after resizing it.

(Also, sorry for all the new issue prompts. Hope it isn't too much of a bother.)

Enhancement: Support parsing Variables and Character-tag-values

Using a left {{ and right delimiter }}, the user could be able to insert Variables and Character-tag-values, allowing more dynamic content. Character-tags are identified with a different delimiter inside (e.g. .). If that delimiter is not there, then it's a Variable.

image

A box like container box to place the nodes inside

mainly for organizational purposes.
When there are many nodes already, it is helpful to place them on a box like container.

I am not familiar with other tools, but an example of this could be found on the nodes editor of unreal engine

Jump node clicking

I'm thinking about an enhancement that would be pretty useful for me. The idea is that when having a Jump node, you would be able to go where it's heading from the editor, to make keeping track of the scenes easier. I started trying with coding it, but I don't get the Mind system right now, but I was thinking about something looking like :
image
The button would be disabled when there is no destination set, and otherwise, when clicking on the button, it would focus the destination node, by changing scene if needed

using variables, setting and getting, on nodes like content or dialog nodes

There are so many use cases where the variables need to be accessed on the script/story

ie

if a character's name could be set and get

"hey XXX! We heard you are leaving the town"

or numbers and other strings

"yes. I am leaving within YY days to go to AA town and try to find BB and help out for CC"

its a simple problem that most users would probably be thankful for. instead of using multiple nodes that would eventually turn into spaghetti, why not just expose the variables on the nodes themeselves.

other similar tools has this functionality, and the said feature is the only reason i can't fully commit on using arrow

i really like your stand about JSON exports as its more versatile than what other tools are using.

thankyou in advance.
and youre doing a really good job.

Enhancement: Dialog with Monolog option

When a NPC asks the player sth. or gives them the chance to respond to a statement, they usually say something beforehand.
Adding Monolog into Dialog would reduce the need for another node.

Mockup:

image

Enhancement: Optionally reset/unset key after checking the value in `Tag Pass`

This concept might need more refinement, but I have the following use case (this setup will repeat itself countless times),
where the player should be able to branch off somewhere, but they must have handled, in some way or another, a specific topic. If it failed, they may need to repeat some part.
And after each Tag Pass for said Character-tag-key, I want to reset the key, i.e. integrate purpose of Node 1y into Tag Pass. (I know that in case of 1w being False, it is not reset in the image below).

image

So something like this:

image

Dialog character

In the screenshot, there are various dialogs with different characters. How do I create a new character other than "Anonymous"?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.