Ruza
Not enough ratings
Modding guide thing for Ruza
By Some Imbecile
General modding guide with the information that lets you modify dialogue, character models, add new characters, gear and consumable items and so on.
Some of the aspects might not be examined individually but the information provided should be enough to achieve that.

This guide and its examples are not associated with Stroj in any way. Only pester, point and or laugh at the creator of this guide and no one else.
2
   
Award
Favorite
Favorited
Unfavorite
Requirements
  • Mod support mod installed unless it is implemented by Stroj already in which case this requirement will cease to exist;
  • Text editor;
  • Godot 3.4.x (3.4.5) for new characters, portraits, gear icons, retextures, zones, maps. Not needed for dialogue change;
  • Will to follow through with the idea of yours.
Modded game client
Yours truly have concocted an abomination that lets you append stuff on top of existing things. Namely, those are zone files, values file, events file and assets file, as well as loading extra resource packs for your content.
You can get it here[mega.nz] (chapter 3 release).

Mod support has been updated for chapter 2.

Installation is simple:
  1. Locate Ruza installation folder and backup Ruza.pck file;
  2. Replace current Ruza.pck with the one from the archive;
That's it. If you want proof of concept mods that are explained in the readme of the archive do the following:
  1. Go to the following folder, depending on your OS;
    • Windows: %APPDATA%\Ruza\
    • macOS: ~/Library/Application Support/Ruza/
    • Linux: ~/.local/share/Ruza/
  2. Drop the mods folder from the archive in there.
Events.stroj file: part 1
Notes:
  • Indentation in events matters, so try checking events.stroj[mega.nz] file before adding new events.
  • Some ids are only implicitly mentioned. Colliders for example follow this naming convention: id_name. Example: 1_Camila. Same goes for maps, lights, particles, sprites and other godot nodes. These can only be seen in the project files which I'm not sure if I can openly share without Stroj's permission.

Below are keywords that are used in the events.stroj file.

  1. global:
    Sets a global variable in events
    Example:
    • global {"id":0, "v":0, "n":"skip intro warning"}
    Where:
    • "id" - global variable identifier;
    • "v" - value of a variable;
    • "n" - variable description (not used in code)

  2. zone:
    Denotes a zone to which events below it are assigned to
    Example:
    • zone {"id":0, "n":"intro"}
    Where:
    • "id" - zone id;
    • "n" - zone name (unused)

  3. map:
    Denotes a map to which events below it are assigned to. Maps are a subdivision of zones. They are backgrounds where players interact with stuff. Changes when player runs into a border.
    Example:
    • map {"id":0, "n":"tv screen"}
    Where:
    • "id" - map id;
    • "n" - map name (unused)

  4. var:
    Creates a variable that can be assigned values and then compared to in events.
    It's usually used to store quest states, choices and interaction stages.
    Variables are map specific, meaning they cannot be used outside of a map.
    Example:
    • var {"id":0, "v":0, "n":"screen tv selection"}
    Where:
    • id - variable id;
    • v - variable value;
    • n - variable description (unused)

  5. e:
    Denotes the event. Below it are the event's interactions.
    Examples:
    • e {"id":0, "a":true, "n":"start game autorun"}
    Where:
    • "id" - event id;
    • "a" - I believe it does nothing and I'm not sure what it's supposed to be;
    • "n" - event description


    Below are event interactions that describe the event:

  6. ch:
    Changes something. Can be chained by separating each change with ";". Could be one of the following:
    • au:
      • ambient:
        ambience start/pause/mute/unmute. Currently never used
        Examples:
        • ch {"v":"au_ambient_unpause};
        • ch {"v":"au_ambient_pause};
        • ch {"v":"au_ambient_mute};
        • ch {"v":"au_ambient_unmute}

      • music:
        music start/pause/mute/unmute.
        Examples:
        • ch {"v":"au_music_unpause};
        • ch {"v":"au_music_pause};
        • ch {"v":"au_music_mute};
        • ch {"v":"au_music_unmute};
        • ch {"v":"au_music_2_[0,1,2]"} (plays song with id 2, queues songs with ids 0, 1 and 2 to play at random after that)

      • sfx:
        sound effect plays;
        Examples:
        • ch {"v":"au_sfx_9} (plays sound effect with id 9)

      • az:
        audio zone change aka running sounds
        • Examples: ch {"v":"au_az_0"}

    • ca:
      camera switch
      Examples:
      • ch {"v":"ca_-1_0"} (changes camera to player);
      • ch {"v":"ca_0_1.5"} (changes camera to camera with id 0 with speed 1.5 (smooth transition, but it's always 0 everywhere but debug zone))

    • co:
      collider control (on/off)
      Examples:
      • ch {"v":"co_0_1_true"} (on the map with id 0, disables collider with id 1 (to disable replace true with false))

    • ec:
      event control (on/off)
      Examples:
      • ch {"v":"ec_8_2_false;"} (disables event on map with id 8. To enable it replace false with true)

    • global:
      add, subtract, multiply, divide or assign global variables
      Examples:
      • ch {"v":"global_1_=_1"} (assignment);
      • ch {"v":"global_2_+_1"} (sum);
      • ch {"v":"global_3_-_1"} (subtraction);
      • ch {"v":"global_4_*_1"} (multiplication);
      • ch {"v":"global_5_/_1"} (division)

    • l (L):
      light control
      Examples:
      • ch {"v":"l_local_30_1_true"} (enables light with id 1 on the map with id 30);
      • ch {"v":"l_global_3"} (changes global light color to light with id 3);
      • ch {"v":"l_player_false"} (disables player light);
      • ch {"v":"l_player_2"} (changes player light color to color with id 3)

    • p:
      particle control (only used in debug zone)
      Examples:
      • (ch {"v":"p_0_1_true"} (enables particle with id 1 on the map 0)

    • pa:
      change party composition
      Examples:
      • ch {"v":"pa_0_1_2_3"} (0 is Jeremy, 1 is Ada, 2 is Gin, 3 is Moxy. Jeremy should be first in order since it's the player's spot, the game might work incorrectly otherwise)

    • pai:
      Modded command, inserts a character into a party
      Examples:
      • ch {"v":"pai_1"} (adds Ada to party if she's not in it already)

    • par:
      Modded command, removes a character from party
      Examples:
      • ch {"v":"pai_3"} (removes Moxy from party if she's present)

    • pl:
      teleports party, disables interaction and ui, restores party, or hides party
      Examples:
      • ch {"v":"pl_teleport_0"} (teleports party to map with id 0);
      • ch {"v":"pl_hide_false"} (shows party (true to hide it));
      • ch {"v":"pl_restore"} (restores party);
      • ch {"v":"l_global_3"} (disables party (false to enable, all forms are unused));
      • ch {"v":"pl_stop_true"}

    • sp:
      change sprite's visibility or play animations
      Examples:
      • ch {"v":"sp_0_4_false"} (hides sprite with id 4 on map 0 (true to show instead));
      • ch {"v":"sp_20_4_1"} (makes sprite with id 4 on the map with id 20 play the animation with name "1")

    • var:
      add, subtract, multiply, divide or assign local variables
      Examples:
      • ch {"v":"var_0_1_10000_-_1"} (subtracts 1 from the value of a variable with id 10000 with zone id 0, map id 1)
  7. w:
    Process world effect
    Examples:
    • w {"v":"fade_in"};
    • w {"v":"fade_out"};
    • w {"v":"fade_on"};
    • w {"v":"fade_off"};
    • w {"v":"shake", "a":30.0, "t":0.5}
    Where:
    • a - shake amplitude;
    • t - duration in seconds

  8. b:
    Process battle
    Example:
    • b {"u":[155], "bb":2, "m":[155], "g":10, "xp":10, "i":[155], "e":false, "r":[true,10], "vile":true}
    • b {"u":[250], "bb":4, "m":[150], "xp":30, "i":[250], "e":false, "r":[true,10], "tmp":[5]}
    • b {"u":[155], "bb":2, "m":[155], "g":10, "xp":10, "i":[155], "e":false, "r":[true,10,"Defeat (git gud)"]}
    Where:
    • u - enemy party composition with enemy ids;
    • bb - battle background id; m - music id;
    • g - gold reward;
    • xp - xp reward;
    • e - is false when something cinematic or dialogue happens after the fight or true when player is immediately let go with music resumed (after explore site battles);
    • tmp - add temprorary allies from actor list (refernced by id);
    • vile - adds a broken screen visual like in final boss fight;
    • r - if first value is true, player gets a game over upon defeat. If false - the game continues;
    • second value sets variable with id 10 to 1 (one) if you won the battle or 0 (zero) if you lost it;
    • third value is modded in, it allows you to modify defeat message (optional value)

  9. c:
    process cinematic with certain id
    Example:
    • c {"v":9} (cinematic with id 9)
Events.stroj file: part 2
  1. ce:
    Give player a choice (like dialogue or teleport stone ones)
    Examples:
    • ce {"var":"1_19_1", "skip":true, "choices":[{"t":"River path", "v":0, "if":"var_1_2_0_=_1"}, {"t":"Floral junction", "v":1, "if":"var_1_6_0_=_1"}, {"t":"Tunnel entrance", "v":2, "if":"var_1_16_0_=_1"}, {"t":"Pixie camp", "v":3, "if":"var_1_19_0_=_1"}]}
    • ce {"var":"0", "skip":false, "choices":[{"t":"Don't hurt them", "v":0, "if":""}, {"t":"Mild pain", "v":1, "if":""}, {"t":"Nuclear", "v":2, "if":""}]}
    Where:
    • var - variable id that stores the choice value;
    • skip - whether you can leave the choice (Example where you want that is warp stones that heal or teleport party);
    • choices - choice objects Where:
      • t - text shown as a choice;
      • v - value that is stored;
      • if - condition that must be met for the choice to be seen
  2. d:
    Dialogue stuff
    Example:
    • d {"ts":"pxb_n_0", "t":"Hey, Hibiska told me about your quest. Take my arcane ID.", "a":true}
    Where:
    • ts - portrait name to be shown in the dialogue box (optional);
    • t - displayed text;
    • a - mute dialogue (voice) sound (value doesn't matter, voice will be muted if it's present with either true or false), do not add if you want to keep voice.
  3. i:
    inventory and shop management
    Examples:
    • i {"m":"unlock", "i":[100,101,102,103,104,105,106,120,121,122,123,124,125,126,127], "n":false}
      Where:
      • m - operation (unlocks in the store);
      • i - consumable items' ids that are unlocked;
      • n - true if notification should play that an item is added, otherwise false;
    • i {"m":"unlock", "a":[100,101,102,103,104,105,106,107,120,121,122,123,124,125], "n":false}
      Where:
      • m - operation (unlocks in the store);
      • a - gear items' ids that are unlocked;
      • n - true if notification should play that an item is added, otherwise false;

    • i {"m":"add", "i":[194], "n":true}
    • Where:
      • m - operation (adds to the inventory);
      • i - consumable items' ids that are added;
      • n - true if notification should play that an item is added, otherwise false;
    • i {"m":"add", "a":[100,102,103], "n":true}
    • Where:
      • m - operation (adds to the inventory);
      • i - gear items' ids that are added;
      • n - true if notification should play that an item is added, otherwise false;

    • i {"m":"add", "g":1, "n":true}
      Where:
      • m - operation (adds to the inventory);
      • g - amount of gold to be added;
      • n - true if notification should play that an item is added, otherwise false;

    • i {"m":"remove", "i":[0], "n":true }
      Where:
      • m - operation (removes item from inventory);
      • i - consumable items' ids that are removed;
      • n - true if notification should play that an item is removed, otherwise false;

    • i {"m":"remove", "g":10, "n":true }
    • Where:
      • m - operation (removes item from inventory);
      • i - gold amount to remove;
      • n - true if notification should play that an item is removed, otherwise false

    • i {"m":"clear", "n":false}
    • Where:
      • m - operation (clears your entire inventory);
      • n - true if notification should play that an item is removed, otherwise false

  4. if:
    Conditional statement that needs to be met to run the indented interactions below it. Can be chained (several conditions must be met) by using a delimiter ";"
    Examples:
    • if {"v":"var_1_0_2_=_3;global_1_0_2_=_3"}
    • if {"v":"var_1_0_2_=_3"}
    Where:
    • v - condition, Where:
      • var - local variable denotion;
      • 1 - zone id;
      • 0 - map id;
      • 2 - variable id;
      • = - check to be run (possible values: = (equals), != (not equals), > (bigger than), < (smaller than));
      • 3 - value it is compared to

  5. j:
    Quest tracking in the journal (quest ids and journal entries at different stages are in the journal category in the assets.txt file)
    Examples:
    • j {"id":103, "v":0, "n":true}
    Where:
    • id - journal parameter id (usually tracks quests);
    • v - value journal parameter is being set to;
    • n - whether to play a notification

  6. load:
    Loads a zone
    Examples:
    • load {"zone_id":1}
    • load {"zone_id":0}

  7. loop:
    Denotes that events below are in a loop, until action is cancelled (x by default). Used in warp stone menus and options.
    No examples for this one since steam removes indentation

  8. mc:
    Changes the map
    Examples:
    • mc {"v":"3_1"}
    Where:
    • 3 - new map id;
    • 1 - entrance to be teleported to

  9. o:
    Sets objective visually
    Examples:
    • o {"v":"Travel to Mushroom Cliffs and find a Gloomshroom", "n":true}
    Where:
    • v - text value of an objective;
    • n - to show a notification or not

  10. pass:
    Used when event is empty

  11. system:
    The only valid use for this is triggering autosave. Otherwise stuff might break
    Examples:
    • system {"v":"autosave"}

  12. tutorial:
    Shows a tutorial with certain id. Unlikely to be needed in modding.
    Examples:
    • tutorial {"v":2}

  13. wa:
    Waits x seconds before triggering next interaction
    Examples:
    • wa {"v":1.0}
    Where:
    • v - seconds to wait

  14. nu:
    Shows a number input UI and writes the input into the variable
    Examples:
    • nu {"var":"10"}
    Where:
    • var - variable id where the input would be written.
      (can be used in an if statement like so: if {"v":"var_10_=_6319"})

Assets.txt file
You can get full assets.txt file here[mega.nz].

This file may spoil the story. Don't look if you haven't completed the game.

sfx:
Generic sound effects for notifications, game menu etc. Paths to sound effects can be changed if you've imported a resource pack.

gear:
Gear items. You can copy an item you like, paste it with a new id, then change power values, description and name. New icon require an imported resource pack to work properly.

actors:
Character information that join your party. New characters require resource packs to function.
  • s_world is a godot scene that implements character animations outside of combat.
  • s_battler is a godot scene that implements character animations during of combat.
  • portrait is a portrait displayed in the party menu.
  • health_bar_start are the base stats. If you want to make a broken character - modify those.
  • be_attack are the scenes that implement battle effects for non-crit and crit attacks.
  • be_heal are the same as be_attack but for healing.
  • features are features that enemies sometimes guess that grant bonus damage.
Possible features:
  • "str":{"id":"str", "name":"Strength", "desc":"The quality or state of being physically strong."}
  • "agi":{"id":"agi", "name":"Agility", "desc":"To move quickly and easily."}
  • "int":{"id":"int", "name":"Intelligence", "desc":"The ability to acquire and apply knowledge and skills."}
  • "cha":{"id":"cha", "name":"Chaotic", "desc":"No regard for the world around them."}
  • "neu":{"id":"neu", "name":"Neutral", "desc":"Having no strongly marked alignment."}
  • "law":{"id":"law", "name":"Lawful", "desc":"Recognizes and conforms to laws and rules."}
  • "phy":{"id":"phy", "name":"Physical", "desc":"The skill of influencing the world by using physical powers."}
  • "both":{"id":"both", "name":"Both", "desc":"Mixing physical and magical skills."}
  • "mag":{"id":"mag", "name":"Magical", "desc":"The skill of influencing the world by using mysterious powers."}
  • "ins":{"id":"ins", "name":"Insane", "desc":"Shows inconsistent and erratic behaviour."}
  • "emo":{"id":"emo", "name":"Emotional", "desc":"Having feelings that are easily excited and openly displayed."}
  • "rat":{"id":"rat", "name":"Rational", "desc":"Cold and aloof understanding of the world."}
  • "extr":{"id":"extr", "name":"External", "desc":"Outgoing and vibrant, influencing the world around them."}
  • "indi":{"id":"indi", "name":"Indifferent", "desc":"Acts based on the world around them."}
  • "intr":{"id":"intr", "name":"Internal", "desc":"Focusing on their inner thoughts and ideas."}

items are consumable items. By this point they're self-explainatory.

journal are quests and their possible stages. If the array in "desc" has true at the end of it - it means that this is quest's ending.

dialogue contains dialogue window and text configuration, paths to different emotion portraits of characters, voice files and font. Changing pretty much anything here will need a resource pack.
Is this all really required to mod?
Yes. Moving on.
Zone.txt files
You can get a main menu zone here[mega.nz];
A forest zone file here[mega.nz];
And a tutorial zone here[mega.nz].

Contain zone names, id, starting map and event ids, level cap, audio zones (stepping sounds), sound effects list, music list, battle backgrounds, enemies stats, cinematic setups and light configuration.

Enemies are the same as actors from assets.txt, except for the skills. This section will be extended at a later date since I haven't looked into this yet.

Cinematic's dialogue can be changed but you can't add or remove lines as they're called from the scene itself.

Ids from this file are used in the events.stroj file.
How to actually mod something in
  1. Go into one of those, depending on your system:
    • Windows: %APPDATA%\Ruza\mods\src\text
    • macOS: ~/Library/Application Support/Ruza/mods/src/text
    • Linux: ~/.local/share/Ruza/mods/src/text
  2. Create events.stroj, zone.txt and or assets.txt files, depending on desired changes;
  3. Depending on the files do the following:
    Events.stroj
    • Find the event you want to modify in the original events.stroj file;
    • Copy it over and paste it into new events.stroj file;
      Event example:
      zone {"id":1, "n":"forest"} map {"id":0, "n":"jeremy's house"} e {"id":19, "a":false, "n":"ink"} d {"t":"This is a test event replacing ink interaction"} d {"ts":"a_f_0", "t":"Very cool"} e {"id":20, "a":false, "n":"another event"} d {"t":"This is a another test event "} d {"ts":"a_n_0", "t":"ok"} map {"id":1, "n":"different map"} e {"id":22, "a":false, "n":"another event in another map"} d {"t":"This is a test event in another map"} d {"ts":"j_n_0", "t":"ok"}
      Zones and maps should only be defined once. Group events under the same map and maps under the same zone.
    • Repeat for all other events you want to change;
    • Save and close file;
    • Next time you load the game those events will be overridden. To undo simply remove updated events from events.stroj file.

assets.txt
  • Create a json object and add a sub-object for the group you want to add/modify stuff in. If I want to add a gear item for example I will put the following into the file:
    { "gear":{ 154:{ "id": 154, "gold":0, "name":"Crude Weapon Test", "icon": Resource("res://assets/art/icons/gear/weapon.png"), "desc":"Crude weapon for basic test.", "actions":[ {"type":"dmg", "target":"e", "power":10} ] }, 155:{ "id": 155, "gold":0, "name":"Crude Armor Test", "icon": Resource("res://assets/art/icons/gear/garment.png"), "desc":"Crude armor for basic test.", "actions":[ {"type": "atk", "power":10} ] } }
  • If the item is new, make sure there are no conflicts in ids.
  • Actors, items, journal and dialogue work on the same principle. The whole object is either replaced with your edits or new object is added on top of everything else.

zone.txt files
Are updated exactly like assets.txt file. Create a zone file (zone0.txt for main menu, zone1.txt for forest, zone10.txt for tutorial section) and add the parts you want edited.
Custom characters
Project example can be obtained here[mega.nz].

Everything in that project should be enough to make a character, NotJeremy being there for reference and can be removed along with all the dependencies (effects from assets, character scenes, battle scenes and the likes).

First things first: you need art (or "art"), specifically the character facing towards the camera (referred to as looking down), away from the camera (referred to as looking up), side perspective (more often facing right, left is the same texture but mirrored) and character "running" (all allies are floating, so it's a still image).
Those are pngs with no background and resolution of 256x256 pixels. All different perspectives go to /assets/art/world/actors/character_name/ folder (character name is capitalized), with the naming convention (that you can ignore if you really want to) like actor_name_perspective (lowercase). Examples being actor_waltuh_side or actor_waltuh_run.

Then you need battle character art. This can be either just an image or a sheet with different parts to be animated, see image attached for reference. It goes to /assets/art/battle/battlers/actors/ folder. Resolution of character sheets may vary.



Battle effects are pngs with no background and no fixed resolution. They are located in /assets/art/battle/effects/type_name/. You don't have to follow specific names but it would be more convenient to track if they're in the same group as vanilla effects. Example attached.



Dialogue portraits are located in /assets/art/dialogues/character_name/ folder, consisting of pngs with no background and 256x256 resolution.
Portraits follow naming convention of firstLetterOfName_firstLetterOfEmotion_number, examples being w_s_0 or w_n_1. Following emotion names from vanilla characters is recommended for consistency.
In /assets/audio/sfx/battle/ are sound effects used for attacks and healing actions in .ogg format. Naming conventions are sfxeffectName (spaces are replaced with underscores). Examples being sfx_bandaid_all or sfx_gunshot_crit.
Once again, you don't really have to follow those.


Character, as portrayed in the world, will need a character scene. You can create one in /scene/actors/ folder and name it as your character (capitalize name).
General overview attached.
A character consists of a number of sprites with a png image of certain perspective attached as a texture and a shadow below them; global animation player, global animation tree and animation player in the running node.


Root node must have actorScene.gd script attached. Click on the root node, then on the arrow on the script element in the right panel, select quick load and select ActorScene.gd.


In the global animation player you can see the animations used for the character. All of them just hide other sprites and show the correct one by changing visibility. There are no exceptions. Make sure the whole node is made visible/invisible, not just one sprite.


The animation tree looks like this and can be copied over to other characters. At least the structure can be.


If the animation names are changed from the tree you copied, you would have to edit tree nodes, click on the pen in the idle node and you will see the following:

In the top left select the "select and move points" element, click on one of the points in the top center, center right, bottom center or center left and you will see in the top right the animation attached to that point. You need to reattach animations based on their names for them to play correctly in the game. Bottom center point corresponds to character facing up, center left - facing left, center right - facing right, top center - facing down.

Click on the root node in the top left, select the "run" node and attach a running animation to it (see image).

Go to the local animation player in the CharacterRunning node (WaltuhRunning in my case), animate the walking part, then make the animation autoplay on load (button before "edit", it will be white when off and blue when on) and loop (element in the center right of the attached image, same deal when on/off).

For the battle part of the character a scene is also needed. Don't quote me on the bone structure, I have no idea how it works.
Deathblow, miss, Effects and Text elements were copied from another character. I believe they are standard for everyone.

Character parts are no longer sprites, they are Polygon2D objects. After selecting a texture (panel at the right) go to UV polygon editor below the assetLib, the rightmost button (see image UV button, next to the button with red cross).


In the UV editor outline the body part corresponding with its node name. Example below.


The animations that are needed in the animation player:
  • Reset animation lasts for 0.001 seconds and is basically the first frame of the idle animation.
  • Atk and def animations are always the same (you can change that though), this is the pose the character does when attacking, you don't need to animate visual effects here.
  • Hit animation is the pose the character does when hit. No moving required, just the pose. In Jeremy's case it lasts 0.1 seconds.
  • Idle animation must have autoplay on load and looping enabled.

If you really aren't feeling it, you don't a have to animate any of them either, but they need to be instantiated.

If you don't have bodyparts, you can select the entire thing as one polygon and call it a day. No fancy animations here though.


For the special effects you also need scenes, for normal attack, crit attack, normal heal and crit heal. You also need to attach the BattleEffect.gd to the root node of the scene, as can be seen in the center right in the image below.

Effects are located at /scenes/battle/effects/group_name/.


Besides animation player, you might need audioStreamPlayer (not 2d or 3d, a generic one) to play sound effects.


For the animations you need RESET and "anim" animations. Reset is essentially setting positions back to the start and making the effect sprites invisible.


"anim" is the effect itself, along with the sound effect. Nothing much to add.


Once that's done, you need to export the pck part of the project. Go to project -> export, create a preset for your system and click export pck/zip, select the pck extension and click "save".


Get the .pck file to one of the following folders:
Windows: %APPDATA%\Ruza\mods\resource_packs
macOS: ~/Library/Application Support/Ruza/mods/resource_packs
Linux: ~/.local/share/Ruza/mods/resource_packs

Follow up on custom characters (I've hit the character limit)
To finish Walter installation, go to one of the following:
Windows: %APPDATA%\Ruza\mods\src\text
macOS: ~/Library/Application Support/Ruza/mods/src/text
Linux: ~/.local/share/Ruza/mods/src/text

Create assets.txt file and make it look like the thing below:
{ "actors":{ 5:{ "id":5, "type":"actor", "name":"Walter White", "s_world":Resource("res://scenes/actors/Waltuh.tscn"), "s_battler":Resource("res://scenes/battle/battlers/actors/Waltuh.tscn"), "portrait":Resource("res://assets/art/dialogues/waltuh/w_n_0.png"), "health_bar_start":[ {"type":"atk", "value":[100,100]}, {"type":"spd", "value":[50,50]}, {"type":"def", "value":[30,30]} ], "health_bar":[], "gear":[0,1], "be_attack":{ 0:{"type":"atk", "scene":Resource("res://scenes/battle/effects/items/Gunshot.tscn")}, 1:{"type":"atk", "scene":Resource("res://scenes/battle/effects/items/GunshotCrit.tscn")} }, "be_heal":{ 0:{"type":"def", "scene":Resource("res://scenes/battle/effects/items/DrugHeal.tscn")}, 1:{"type":"def", "scene":Resource("res://scenes/battle/effects/items/DrugHealAll.tscn")} }, "features":["int", "law", "phy", "rat", "intr"], "ko":false, "health_points":0, "skill_points":0, "active":false, "alive":true, "states":[], "menu":true, "skills":{"atk":0, "spd":0, "def":0, "dmg":0, "heal":0, "uti":0} } } }

To add Walter to your party, add the following to the events.stroj file:
zone {"id":1, "n":"forest"} map {"id":10, "n":"waterfall path"} e {"id":2, "a":true, "n":"explore site 1"} system {"v":"random", "var":"0", "r":{"0":20, "1":10, "2":100}} if {"v":"var_0_=_0"} i {"m":"add", "g":2, "n":true} if {"v":"var_0_=_1"} i {"m":"add", "i":[121], "n":true} if {"v":"var_0_=_2"} ch {"v":"pa_0_5"}
This will change the small explore site in the waterfall path to change your party to just Jeremy and Walter. If you get an item instead - keep interacting with it.
Cinematic cutscenes
Cinematic scenes are interactive scenes that are called in events.stroj.
They are located at scenes/cinematics/zone_name/
Overview below:


You can get a view of a cinematic in godot (without dialogue or music) by selecting the root level animation player, switching to "2d tab" at the top of the editor and selecting "animation" at the bottom of the editor.

Cinematic metadata is located in zone files (at /src/text/zone(number).txt), which consists of:
  1. Cinematic id;
  2. Cinematic name
  3. Used ambient sounds;
  4. Used music;
  5. Used sound effects (rarely used. Usually played through an audio stream players inside the scenes);
  6. Dialogue queue;
  7. Path to godot scene as a resource.

Dialogue, music, ambience and sometimes sound effects are accessed through functions (implementation in /src/nodes/CinematicInstance.gd).

Functions that are callable within the cinematic:
  1. ambient(ambient_id, volume)
    Plays ambient sound.
    Where:
    • ambient_id - identifier of the ambient sound inside cinematic metadata, integer;
    • volume - self explanatory, floating point value.

  2. ambient_stop()
    Stops ambient sounds.

  3. music(music_id, volume)
    Plays music.
    Where:
    • music_id - identifier of the music inside cinematic metadata, integer;
    • volume - self explanatory, floating point value.

  4. music_next()
    Continues music after pause.

  5. music_stop()
    Pauses music.

  6. sfx(sfx_id, volume)
    Plays a sound effect. Rarely used.
    Where:
    • sfx_id - identifier of the sound effect inside cinematic metadata, integer;
    • volume - self explanatory, floating point value.

  7. dialogue(close_dialogue_panel, dialogue_pause)
    Displays dialogue inside the cutscene. Dialogue function calls must be at least 0.05 seconds apart, otherwise some lines might get skipped.
    Where:
    • close_dialogue_panel - denotes whether to close the dialogue box immediately after finishing the line. True when line is followed by a long pause and false during continuous exchange. Defaults to true if not specified.
    • dialogue_pause - always false (practically unused). Not sure what it is supposed to do. Defaults to false if not specified.

  8. dialogue_end()
    Pauses dialogue. Unused
The end?
New questions will arise and the guide may be updated in the future.
Hope this was of any help to whoever was reading it.
2 Comments
Stroj  [developer] 2 Apr, 2024 @ 10:11pm 
Absolutely amazing and well written!
TsarUnion 16 Mar, 2024 @ 6:47pm 
Wake up honey, new Ruza guide.