This is a tool written in Go that allows you to visualize the routes of your Ren'Py story
Routes of the Question, the classic Ren'Py example
Doki Doki Litterature Club will no longer have secrets for you!
An extract from my personal VN, Coalescence. You can't imagine handling a heavy VN like this one without graphic tools... The labels are blurred due to the preview image
You can test this tool in the browser. If you want to get .png
files, please download the software version. Note that this website will not be maintained and it is not guaranteed to represent the library fully.
https://ewenquim.github.io/renpy-graphviz
The command line version is more powerful as you can add flags and a path, see the documentation by typing renpy-graphviz -h
.
./renpy-graphviz
or by clicking on the icon in your file manager
chmod +x renpy-graphviz*
.renpy-graphviz.png
should appear, enjoy!go install pkg.amethysts.studio/renpy-graphviz@latest
If you are a Go user and want to integrate this in a Go lib/program, it is possible. The /parser
module is very powerful.
Since Ren'Py scripting isn't strict, therefore the script can't know what is going on in the .rpy
file in some cases. So, this program uses a tag system to enforce some behaviors. For example;
label chapter_1: #renpy-graphviz: TITLE
Before tags, you must write renpy-graphviz
in a comment to ensure there are no collisions with existing words in your VN. Here are the tags available:
Cancels any "guessed link".
Expected | with BREAK | script.rpy |
---|---|---|
![Example image of Break, Before](data/example-break-before.png) | ![Example image of Break, After](data/example-break-after.png) | ```renpy label one: "blah blah" label two: "bla bla" # renpy-graphviz: BREAK label three: "the end" ``` |
Ignores the current line. If this is a jump to a label that isn't ignored, the label will still appear on the graph but not the arrow that should go towards it. Similarly, if this is a jump from a label that isn't ignored but the jump destination is, the arrow will not appear on the graph.
Expected | IGNORE | script.rpy |
---|---|---|
![Example image of Ignore, Before](data/example-ignore-before.png) | ![Example image of Ignore, After](data/example-ignore-after.png) | ```renpy label one: label two: # renpy-graphviz: IGNORE label three: ``` |
Avoids long arrows by creating another label with the same name. Beware, the label can't have any children and is marked by an asterisk to show it is a copy. Jumps will not be directed to this label if there is an original label displayed, if not, the jump is ignored.
Expected | SKIPLINK | script.rpy |
---|---|---|
![Example image of Skiplink, Before](data/example-skiplink-before.png) | ![Example image of Skiplink, After](data/example-skiplink-after.png) | ```renpy label one: if condition: jump six # renpy-graphviz: SKIPLINK else: pass label two: label three: label four: label five: label six: ``` |
Creates a node or an arrow in the graph without having to create a label
in your Ren'Py script. It is disconnected from the normal flow, label
and jump
in your script.
FAKES | script.rpy |
---|---|
![Example image of Fakes](data/example-fakes.png) | ```renpy # You can mix different tags on the same line # renpy-graphviz: FAKE_LABEL(a) TITLE # If b/c does not exists, it creates it # renpy-graphviz: FAKE_JUMP(b, c) label real_1: # There will be no 'indirect link' from `real_1` to `d` # renpy-graphviz: FAKE_LABEL(d) # Implicit jump from `real_one` to `real_two` # (normal behaviour as `d` is ignored by the normal flow) label real_2: # No jump from `real_two` to `a` or `d` # renpy-graphviz: FAKE_JUMP(a, d) ``` |
Same as above but interacts with label
, call
and jump
in your normal flow in the Ren'Py script.
You need to specify an indentation level.
# renpy-graphviz: INGAME_JUMP(8, destination)
is the equivalent of:
jump destination
INGAMES | script.rpy |
---|---|
![Example image of Label & Jump](data/example-ingames.png) | ```renpy # renpy-graphviz: INGAME_LABEL(0, start) # renpy-graphviz: INGAME_JUMP(4, option_one) # Creates a link from `start` to `option_two` even # if there was a jump before -like normal jumps # renpy-graphviz: INGAME_JUMP(4, option_two) label option_one: "dialogue" # should follow the previous label (implicit jump) # renpy-graphviz: INGAME_LABEL(0, indirect_label) # jumps from `indirect_label` to `option_two` jump option_two ``` |
Sets styles.
TITLE / GAMEOVER | script.rpy |
---|---|
![Example image of Title](data/example-title-gameover.png) | ```renpy label routeone : # renpy-graphviz: TITlE d "Hello World!" if condition: jump bad_ending label routeAlternative: d "Normal bubble" jump good_ending label bad_ending: # renpy-graphviz: GAMEOVER d "Bad ending" return ``` |
You can set yourself a custom color or shape for a label.
SHAPE and/or COLOR | script.rpy |
---|---|
![Example image of Shape Color](data/example-shape-color.png) | ```renpy label first: # renpy-graphviz: SHAPE(rect) COLOR(red) jump second # renpy-graphviz: SHAPE(septagon) COLOR(#ffdd67) ``` |
Some examples of shapes and colors can be found here.
Shapes | Colors |
---|---|
Rectangle | Red |
Septagon | Blue |
Egg | Purple |
Diamond | White |
graph.go
file also supports line styling, font size and line thickness. Default values can also be changed inside the graph.go
file.
This requires your VN to be structured in a certain way, so this may not be perfect for you. Feel free to raise an issue here, or to change your VN structure, by adding tags manually.
Your contribution to the project is appreciated!
See the CONTRIBUTING.md file
This program is free and under the AGPLv3 license.
Beware, if you use this program, you must credit it somewhere on your game.
Used Renpy Graph Vizualiser from EwenQuim
Enjoy! β€οΈ