Code Monkey home page Code Monkey logo

inkgd's Introduction

Hey, I'm Fred โ€” I grow apples in my backyard

Status: Unavailable

I'm a seasoned iOS and watchOS developer with a decade of experience in Swift, Objective-C, Xcode, and related technologies.

Open Source things you may want to check out

iOS

  • Instructions, a pure Swift library to display coach marks. I originally wrote Instructions in Objective-C, as part of another project. In 2015, I extracted the library and rewrote it in Swift.
  • The Bell, a watchOS app designed for high-intensity interval workouts, first developed in 2020 and rebuilt in 2023 from the bottom up using SwiftUI.

ink

  • inkjs, a Javascript port of inkle's ink to which I'm a regular contributor.
  • inkgd, similar as above, but in GDScript (Godot's primary programing language).
No longer maintained
  • ink-tmLanguage, a grammar for ink, that can be used in TextMate, Sublime Text, Atom, Visual Studio code or any other editors supporting TextMate grammars.
  • inklecate's LSP implementation, an implementation of Microsoft's Language Server Protocol directly inside inklecate (ink's compiler).
  • Pomme Plate, a collection of apple-device mockup templates.
  • Sophisticate, a handy JavaScript tool that cleans up and adds appropriate metadata to SVGs.
  • Autodazzler, a script written in ECMAScript 5, designed to automate the rendering pipeline of Daz Studio.
Linkedin Linkedin

inkgd's People

Contributors

2shady4u avatar bram-dingelstad avatar cesarizu avatar ephread avatar francoisdlt avatar magejohn avatar stoeoeoe avatar videlanicolas 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

inkgd's Issues

Best Practice for Functions that utilize List Items as Parameters?

[NOTE: Using the Godot4 Branch]

I have many different native functions in Ink that use List parameters... so I when I rolled out inkgd I wanted to make sure those worked in particular. One of my concerns was that I didn't want to have to generate a 'fresh' parameter every time I queried these functions, as I know performance can be an issue. So here's what I did... I'm curious if you have any suggestions for improvement?

I ended up creating a local Dictionary that I could call with the item name only (I don't reuse items names between lists), and it'd return a cached formatted InkList with a Single Item that I could pass as a parameter to the function. It looks something like this:

        #Creating a Godot Dictionary & populating it with List parameters from 1 list called "fields"
        var listItems: Dictionary
	var fields: InkList = story.get_variable("fields")
	for each_field: InkListItem in fields.all.keys(): 
		listItems[each_field.item_name] = InkList.new_with_single_item(InkListItem.new_with_full_name(each_field.full_name), 0)

        #Example Function Call that returns a string response
        var resultText: String = story.evaluate_function("exampleFunction", [listItems[each_field.item_name]]).return_value

Is this the 'best' way to accomplish this goal? I ultimately wrote a wrapper function for some of this but wanted to see if there was an alternative recommendation for what I was trying to do.

Additionally.... I have 20-30 lists I'd have to loop through in this manner to cache them in the Dictionary. I think it's technically possible to use InkStory and get the lists via ListDefinitions as an alternative-- but to get that to work you'd have to be using InkStory, not the InkPlayer-- correct? There's no way to loop through all the ListDefinitions otherwise? Just want to confirm :)

Errors Combined with OpenXR

Describe the bug
Tries reimporting a json file from the openxr plugin, over and over again - the "reimporting" popup doesn't stop.

editor/editor_file_system.cpp:1759 - Error importing 'res://addons/godot-openxr/runtimes.json'.

To Reproduce
Have godot-openxr and inkgd installed and both enabled.

Expected behavior
the json support to ignore files in other addons.

Environment:

  • OS: Kubuntu 22.04
  • Godot version: 3.5.1
  • Inklecate version: 1.0.0
  • inkgd version: 0.4.7

Additional context
Can be fixed by forcing re-import of the other plugin's json file as "Keep File (No Import)"

call_external_function errors when a parameter is populated with a blank/Nil value

Describe the bug
Have an External Function in your Ink with a parameter that is populated with a blank value eg. "", you get the following error on line 1411 in ink_story.gd (Godot4 branch) when you handle the External Function.

while i < number_of_arguments:
		var popped_obj = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "Value")
		var value_obj = popped_obj.value_object
		arguments.append(value_obj)

		i += 1

The error in this case is: Invalid get index 'value_object' (on base: 'Nil').

popped_obj renders as Void when I do a print on it.

To Reproduce

  1. Add an External Function in Ink with a parameter
  2. In your Ink code, call the External Function and populate the parameter as ""
  3. Bind/call the External Function via InkGD. You'll get the error documented above.

Expected behavior
Null/blank values passed into External Functions are considered acceptable values and do not throw errors. In my specific scenario, I have a random variable that populates 25% of the time. In the scenarios when it is blank, I'd like that blank result to be passed via External Function the same way as any other parameter. I can technically workaround this with a specific nuller External Function, but that's not my preference.

Ink files
ink_story.gd

Environment:

  • OS: Windows 11
  • Godot version: Godot 4.2 mono
  • inkgd version: godot4 branch

Unable to find Json file in export

Describe the bug
My game runs fine in the Editor. When I export to Mac build or run in Firefox, it is unable to load the Ink Json file.

The exported game is unable to find the Ink file an logs this error:

Condition ' !f ' is true. returned: String()
At: core/bind/core_bind.cpp:1755:get_as_text() - Condition ' !f ' is true. returned: String()

I have added *.json to the export filter in export settings, so the file should be exported.

I also came along this issue in another plugin, where the Json files get consumed by the plugin:
vnen/godot-tiled-importer#85

Sorry if this is the wrong place to ask, but could this be something related to Inkgd?

To Reproduce
The project is in a private gitlab repo, but I am happy to give read access.

Expected behavior
Ink Json file should be read same from export as from editor.

Environment:

  • OS: macOS Mojave 10.14.5
  • Inklecate version: 0.9.0
  • inkgd version: 0.1.3

v0.4.0 not available on the Godot Assets Library

Describe the bug
The doc describes how to use the 0.4.0 version, with an InkPlayer node. The available version on the GAL is 0.3.0 which does not seem to work in the same way.

To Reproduce
Install the plugin through the GAL. Try to follow the doc at https://inkgd.readthedocs.io/. Confusion ensues. :]

Expected behavior
The latest stable & documented version should match the one available on readthedoc. Especially so because the docs recommend installing the plugin through the GAL.

Unused class variable warnings

Describe the bug
Lots of (about 70) unused class variable warnings.

To Reproduce
Run a scene using the library, e.g. the example from this repository.

Expected behaviour
Ideally these shouldn't appear, as they pollute the output and make it hard to find errors originating from your own script.

Environment:
Manjaro Linux

EDIT: I notice that these warnings are suppressed in the project file in this repo.

Script templates for Godot 4 not usable

Describe the bug
The script templates are not usable in Godot 4.

To Reproduce
If one wants to create a script, the templates are not shown.

Expected behavior
The templates ink_template.gd and ink_template_signals.gd should be offered.

Environment:

  • OS: MacOS 14.2.1
  • Godot version: 4.2.1. stable
  • Inklecate version: 1.1.1
  • inkgd version: 0.6.0 branch Godot4

Additional context
According to the documentation

  • script templates must be in a folder corresponding to the appropirate node type, for instance:
    res://script_templates/Control/ink_template.gd
  • base placeholders must be surrounded with _ not with %, for instance:
    _TS_ instead of %TS%

Reading an Ink file.

Hi, I'm a novice at both godot and coding in general, so I hope you can bear with me. All I would like to do is display text from Ink in dialogue boxes, and have those respond to certain inputs. The example scene feels too large for me to figure out exactly how to do this.
image

I tried to insert elements of the example scene that might deliver that basic functionality, but the as you can see the "print" function won't print anything, and If I call the start_story() function in _ready(). I get the following error:

image

Hope this is something that can be helped! Appreciate your time.

Multiline functions are executed all at once

Describe the bug
Putting multiple functions on different lines results in all these functions being executed at once without any respect for the new line.

To Reproduce

  • Make a new Godot project
  • Download and activate the inkgd plugin from the Asset Store
  • Download the examples-folder from the Github repository
  • Take the minimum ink-file I supplied below and copy-paste it into the "Interceptor.ink" and rebuild the JSON using inklecate
  • Change the "bind_externals" function (found in ink_runner.gd) to:
func _bind_externals():
    story.observe_variables(["currentActor"], self, "_observe_variables")
    #story.bind_external_function("should_show_debug_menu", self, "_should_show_debug_menu")
  • Run the ink_runner.tscn and see what happens.

OUTPUT in game:

It's Philippe!

It's Andre!

It's Andre!

choose Andre

It's Philippe!

(story complete)

Expected behavior
As seen in both Quill and Inky I expect the function, that is part of the new line to only be executed AFTER the current line, and thus give following output for the script given below:

It's Philippe!

It's Andre!

It's Philippe!

choose Andre

It's Philippe!

(story complete)

Ink files

VAR currentActor = "player"

VAR s = -> set_actor
-> start

===function set_actor(x)
{ x:
- "P": ~ currentActor = "Philippe"
- "A": ~ currentActor = "Andre"
- else: ~ currentActor = "player"
}

=== start ===
{s("P")} It's {currentActor}!
{s("A")} It's {currentActor}!
{s("P")} It's {currentActor}!
{s("A")}
+ choose {currentActor}
    {s("P")} It's {currentActor}!
    -> END
+ choose {currentActor}
    {s("A")} It's {currentActor}!
    -> END

Environment:

  • OS: Windows
  • Inklecate version: 0.9.0
  • inkgd version: 0.1.3

Additional context
I currently don't have a work-around for this problem....

Compiling the example doesn't work)

Describe the bug
I cloned the current master branch and wanted to use the editor to compile "the_intercept" example.
I tried setting the path to the executable both via absolute path as well as using a resource-path (res://).
In case of an absolute path, pressing "Compile" gives me this output:
image

In case of a resource-path, I get no output at all.

To Reproduce
I cloned the master branch and downloaded the latest inklecate. This does not allow me to compile with the plugin. Not sure what I'm missing.

Expected behavior
The ink file to be compiled.

Ink files
It's the example that comes with this repository.

Environment:

  • OS: Windows 10
  • Inklecate version: 0.8.2
  • inkgd version: 0.1.1

Refuses to work with new Ink versions (state is always Null).

Describe the bug
I was trying to set up a super basic Ink scene to get started and I kept getting an error spiral. A lot of stuff under story.gd would randomly be Null.

To Reproduce
Here's the Ink JSON I was using:
{"inkVersion":21,"root":[["^Hello World!","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"#f":1}],"listDefs":{}}

Expected behavior
I didn't change anything about the Ink handler script (besides adding the correct filepath), so I was expecting it to print
`Hello World!

The End
`

Solution
Turns out (to the best of my knowledge) that inkgd noticed that root_object["inkVersion"] was 21, while INK_VERSION_CURRENT was 20, so it would throw an error and crash. Since story generation is done in a separate thread, the error never showed up and the main thread continued as usual, but without an actual story to be working off of.

I ended up commenting out the return call on line 164 of story.gd so that it would be forced to continue with story creation even if the Ink version was higher than expected. I imagine there's more elegant solutions, but I wanted to drop this here in case some future soul has a similar experience.

Environment:

  • OS: Windows
  • Godot version: 3.5
  • Ink version: 21
  • inkgd version: 0.4.7, I believe

Bug - inkplayer not running with HTML export/Loads in Background turned off

Describe the bug
inkplayer create_story method throws "InkRuntime could not be found" error if run in HTML or "Loads In Background" turned off.

To Reproduce

  1. Install inkgd plugin and create inkPlayer node and load with InkFile.
  2. Turn "Loads in Background" off.
  3. In code, have the inkplayer run the "create_story" method and run the scene.

Expected behavior
Scene should run as normal, with no errors.

Environment:

  • OS: Windows
  • Godot version: 3.4.3 vanilla
  • inkgd version: 0.4.5

Can't download the example

Describe the bug
Hello I don't know if it's only me but whether I install inkgd from assert lib or download here, I couldn't get the example folder... So I tried to download the tscn file directly but my godot said " Error while parsing" when I tried to open the scene file.

To Reproduce
Clone or Download ->Download ZIP

Expected behavior
Be able to run the example

Environment:

  • Windows 10 x64
  • Godot 3.1

godot4: Inkgd seems to try and load any json file in the project

Describe the bug
We are using Panku and Inkgd. Panku has some json files in its addon directory, and it appears once inkgd is added it starts trying to load the panku json files

  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.
  Error importing 'res://addons/panku_console/modules/interactive_shell/side_menu_config.json'.

To Reproduce
Install Panku and Inkgd at the same time

I am curious if it would be worth having a setting that would limit inkgd to only a directory. We, for example, always keep our ink files within one directory structure dedicated to ink stories - it could absolutely recursively load from there while avoiding the rest of the project.

I may make this change to my local copy myself just to stop these errors, but wanted to suggest it for the repo as well

Documentation

While the tutorial in the README helps to get started with inkgd and setup a story, it does not explain the methods to use. Once must infer them from the code and test their way through to get the most out of Ink.

To solve this Inkgd must have a documentation that details the methods found in the API, this way the user can read the docs and understand what methods they should use. I propose we open an account in ReadTheDocs for Inkgd, and build the Sphinx documentation in a separate folder in this repo.

Error while parsing ink_runner.tscn

Describe the bug
I think everything is in the title. I have some experience with ink and wanted to develop a small game using Godot rather than Unity which I find cumbersome, but I can't seem to make it work.

Do you happen to have a Godot project running an ink story, just so I can look at how it is set up?

I'm sorry for this very simple question, I think I bit more than I could chew in trying to make this Godot/ink thing work with my limited programmking skills. Thank you for the tool, however, although I can't make it work!

To Reproduce
Create a new godot project, activate "inkgd" from the assetlib, download ink_runner.tscn and just double-click on it after configuring the addon.

Expected behavior
Seeing something

Ink files
Those contained within the scene, I suppose?

Environment:

  • OS: Win 10
  • Inklecate version: 0.9
  • inkgd version: 0.1.3

Additional context

Feature: refresh current path

In most games, game state that is not handled by Ink itself can change after an ink knot has already been rendered.

This can render Ink's story state stale.

For example, imagine I can pick up an item on the story scene told by the current knot. This could happen via an external function call from Ink into your game. However, if one of the choices in the current knot is itself dependent on the player owning that particular item (e.g. via conditional diverts), the current scene state is now stale and needs to be refreshed.

I have not found a clean way to do that with inkgd. The primary issue is that inkgd forgets the current path as soon as it has finished playing the current knot (i.e. it current_path always returns null so you cannot remember it). I have to work around this by capturing this state manually in a data structure StorySegment by capturing internal inkgd state such as path pointers before allowing the story to continue:

class StorySegment:
	var text: String
	var type: int  # SegmentType
	var path: String
	var visit_count: int
	var choices: Array

	func _init(ink_player):
		type = ink_player.get_variable("segment_type")
		path = _path_from_player(ink_player)

	func _path_from_player(ink_player) -> String:
		var story_state = ink_player._story.state
		var ink_path = story_state.current_pointer.path
		if not ink_path:
			ink_path = story_state.previous_pointer.path
		assert(ink_path, "no ink path found")

		var primary = ink_path.get_head().name
		var secondary = ink_path.get_tail().get_head().name
		return "%s.%s" % [primary, secondary] if secondary else primary

I use the same mechanism to provide a scene refresh function, which "rewinds" inkgd's state to the current knot by replaying the captured pathname onto InkPlayer#choose_path and then call InkPlayer#continue_story:

func refresh():
	_ink_player.choose_path(_current_segment.path)
	_ink_player.continue_story()

However, this is clearly a workaround, and it has some unintended side effects such as incrementing the visit count, when the player really only visited this scene once.

I think it would be helpful to:

  • provide a getter that returns the current path string from InkPlayer even after the continued signal fired, so that we can feed it back to the player
  • provide a refresh or reload method that reloads the current knot without affecting visit counts, so that Ink variables and conditionals get re-evaluated.

else statement in switch block doesnt redirect if switch statement is 1

Describe the bug
I'm not really sure if this is an inkgd or a ink-issue in general, but when there's a switch statement such as this:

=== knot ===
{some_variable:
    - else: -> else_divert
}

= else_divert
It is else!
-> DONE

The switch will only choose the 'else' divert if the some_variable is equal to zero, otherwise it just gets stuck.
This is unexpected behavior as I would expect that the else-clause serves as a "catch-all" sort of thing in a switch
statement. In other words: 'If nothing applies, choose the else divert'

To Reproduce
I made a repository that replicates the issue here.
In that Godot project you have a player (controlled with the ARROW keys) that can talk to either a red or a green NPC.
You talk to them by overlapping with them and pressing the SPACEBAR or ENTER key.

Capture

Their dialogue will appear in the console and talking to the green NPC works flawlessly!

elsewithgreen

But when talking to the red NPC, all dialogues will be empty after that.... and the switch statement never diverts...

elsewithred

Like you can see in the image above, the dialogue with the red NPC appears and then.... nothing...
Even when talking to the green NPC, you just get an empty line back from the story.

Expected behavior
I would expect the 'else' clause to serve as a way to capture everything that isn't matched by any of the other clauses.
And ,as is the case here, there are no other clauses so the 'else' clause should always be chosen.

Ink files
Here's the ink-file I used for both red and green NPCs:

VAR some_variable = 1

=== green ===
It's the GREEN that I need!
{some_variable:
    - 0: -> zero
    - else: -> else_divert
}

= zero
It is zero!
-> DONE

= else_divert
It is else!
-> DONE

=== red ===
REDRUM
{some_variable:
    - else: -> else_divert
}

= else_divert
It is else!
-> DONE

Environment:

  • OS: Windows 10
  • Godot version: 3.2.2 (GDScript)

Persistance of lists does not work

Describe the bug
When adding an entry to a list, the change will not be persisted.

To Reproduce
Start the attached project. Click on 'Add entry to list' -> Click on 'Save Ink' -> Close program and reopen -> Click on 'Load Ink' and observe the text in the label.

Expected behavior
After the steps outline above, the label should say that the entry is contained in the list.

Ink files
test.ink in attached project

Environment:

  • OS: Windows, also observed in web-browsers on Windows, mobile devices and Mac
  • Godot version: 3.2.3
  • Inklecate version: 0.9.0 (I think)
  • inkgd version: 0.2.1

Additional context
It can be fixed by _story._get_runtime().dont_save_default_values = false

Attached Godot project
inkgd_issue.zip

Cannot change scene with InkPlayer instantiated

Describe the bug

It's not possible to change a scene via get_tree().change_scene_to_file() with InkPlayer instance in the active scene.
To Reproduce

  1. Run a scene with instantiated and loaded InkPlayer
  2. Change it to another one (it doesn't work with and without the inkplayer in the new scene).
  3. Crash

Expected behavior

Normal scene change, just like with any scene that doesn't have InkPlayer

Ink files

It happens with any .json ink file

Environment:

  • OS: MacOS 14.2.1
  • Godot version: 4.2.1 vanilla
  • Inklecate version:
  • inkgd version: 0.6.0

Additional context

The exact issue is caused by line 838 in ink_player.gd with error Invalid get index 'root' (on base: 'null instance').

Also, I noticed that if I just comment that line out, there's no errors and the scene changes, though I don't know exactly if something else breaks in the back that I don't know about.

Attempting to create a story results in error spam due to null state

Describe the bug
Attempting to create a new story via Story.new() repeatedly spams the error log with errors until the game is closed. The exact error differs every time but all of them stem from setgets being called while state is null

To Reproduce
Create a new story while running inkgd on godot 3.3 stable

Expected behavior
Creating a new story should work instead of crashing the game.

Ink files
N/A

Environment:

  • OS: Windows 10
  • Godot version: 3.3 stable, standard
  • Inklecate version: 0.9.0
  • inkgd version: 0.2.2

inkgd not in asset library

Describe the bug
I wanted to try out this plugin, but cannot find it in the asset library

To Reproduce
I searched for inkgd as well as looking for it in the alphabetically ordered list, no inkgd.
image

Environment:

  • OS: Windows 10
  • Inklecate version: 0.8.2
  • inkjs version: not yet installed
  • Godot: 3.1.1.stable.official

Issue with saving and loading state

I'm trying to figure out how to create a save/load system, but I'm running into a problem. I save the ink story's state with story.state.to_json(), which works fine, but I'm having difficulty loading the state back into play. Specifically "clearing the board" of the old choices and passage text without it running out of story.

So my first attempt was to simply call continue_story() after loading with story.state.load_json(state):

func loadState(state):
	story.state.load_json(state)
	continue_story()

func continue_story():
	while story.can_continue:
		var text = story.continue()

		TextPassage.get_node("Label").text = text
		if story.current_tags.size() > 0:
			check_tags()
	
	if story.current_choices.size() > 0:
        
		_current_choice_container = ChoiceContainer.instance()
		StoryMarginContainer.add_child(_current_choice_container)

		_current_choice_container.create_choices(story.current_choices)
		_current_choice_container.connect("choice_selected", self, "_choice_selected")
	else:
		pass

This just added the saved state's choices to the bottom of the list of whatever was on screen when I was loaded, without changing the passage text.

So then I tried to add

    StoryVBoxContainer.remove_child(_current_choice_container)
    _current_choice_container.queue_free()

to my load function to wipe out the old choices before loading, and that worked to clear away the old choices, but left me with the old passage text. Continuing by clicking a choice works just fine.

I'm a bit stuck from here - tried throwing in a TextPassage.get_node("Label").text = story.continue() and that sort of works - the passage is correct - but the console tells me I can't continue and clicking options just makes the buttons disappear.

I may have gone as far as my limited understanding of gdscript will take me.

Web export not working

Describe the bug
Desktop export for the included example works. When playing the Web export, the game crashes immediately.

To Reproduce

Export the example to html5

Expected behavior

it works on web as it does on desktop

Ink files

Environment:
Windows, godot 3.3.4, fails in every browser I tried (chrome and edge). Godot editor HTML5 preview gives same result.

Additional context
I set SHOULD_LOAD_IN_BACKGROUND to false; if I don't do this, the game gets stuck in the load screen, with no reported errors in the console.

export.js:354 **ERROR**: File must be opened before use.
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_File::get_as_text() const @ 0598f57e:0x852f32
$MethodBind0RC<String>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0xbffdf2
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 7 more frames
export.js:354    At: core/bind/core_bind.cpp:2125:get_as_text() - Condition "!f" is true. Returned: String()
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_File::get_as_text() const @ 0598f57e:0x852f32
$MethodBind0RC<String>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0xbffdf2
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 7 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index '0' (on base: 'String').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce5b
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 25 more frames
export.js:354    At: res://addons/inkgd/runtime/simple_json.gdc:54:Reader.read_object() - Invalid get index '0' (on base: 'String').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce5b
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 25 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index 'inkVersion' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 11 more frames
export.js:354    At: res://addons/inkgd/runtime/story.gdc:119:_init() - Invalid get index 'inkVersion' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScript::_create_instance(Variant const**, int, Object*, bool, Variant::CallError&) @ 0598f57e:0x4094ba
$GDScript::_new(Variant const**, int, Variant::CallError&) @ 0598f57e:0x409269
$MethodBindVarArg<NativeScript>::call(Object*, Variant const**, int, Variant::CallError&) @ 0598f57e:0x8f8a7
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197318
$GDScript::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6ce79
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59c4
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 11 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index 'variables_state' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 12 more frames
export.js:354    At: res://addons/inkgd/runtime/story.gdc:1295:observe_variable() - Invalid get index 'variables_state' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 12 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index 'variables_state' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 12 more frames
export.js:354    At: res://addons/inkgd/runtime/story.gdc:1295:observe_variable() - Invalid get index 'variables_state' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 12 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index 'can_continue' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$GDScriptInstance::get(StringName const&, Variant&) const @ 0598f57e:0xd6aaba
$Object::get(StringName const&, bool*) const @ 0598f57e:0x36b38
$Variant::get_named(StringName const&, bool*) const @ 0598f57e:0x8e495
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xac6c8
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 9 more frames
export.js:354    At: res://addons/inkgd/runtime/story.gdc:233:get_continue() - Invalid get index 'can_continue' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$GDScriptInstance::get(StringName const&, Variant&) const @ 0598f57e:0xd6aaba
$Object::get(StringName const&, bool*) const @ 0598f57e:0x36b38
$Variant::get_named(StringName const&, bool*) const @ 0598f57e:0x8e495
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xac6c8
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 9 more frames
export.js:354 **SCRIPT ERROR**: Invalid get index 'current_choices' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$GDScriptInstance::get(StringName const&, Variant&) const @ 0598f57e:0xd6aaba
$Object::get(StringName const&, bool*) const @ 0598f57e:0x36b38
$Variant::get_named(StringName const&, bool*) const @ 0598f57e:0x8e495
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xac6c8
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 9 more frames
export.js:354    At: res://addons/inkgd/runtime/story.gdc:47:get_current_choices() - Invalid get index 'current_choices' (on base: 'Nil').
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$GDScriptInstance::get(StringName const&, Variant&) const @ 0598f57e:0xd6aaba
$Object::get(StringName const&, bool*) const @ 0598f57e:0x36b38
$Variant::get_named(StringName const&, bool*) const @ 0598f57e:0x8e495
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xac6c8
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 9 more frames
export.js:354 **SCRIPT ERROR**: Invalid call. Nonexistent function 'size' in base 'Nil'.
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e34
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 4 more frames
export.js:354    At: <built-in>:78:continue_story() - Invalid call. Nonexistent function 'size' in base 'Nil'.
onPrintError @ export.js:354
put_char @ export.js:9
write @ export.js:9
write @ export.js:9
doWritev @ export.js:9
_fd_write @ export.js:9
$__stdio_write @ 0598f57e:0x2ec136
$__vfprintf_internal @ 0598f57e:0x1e234e
$vfprintf @ 0598f57e:0xe9728
$StdLogger::logv(char const*, void*, bool) @ 0598f57e:0x97106d
$Logger::logf_error(char const*, ...) @ 0598f57e:0x19cf36
$Logger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xce2e5c
$CompositeLogger::log_error(char const*, char const*, int, char const*, char const*, Logger::ErrorType) @ 0598f57e:0xddae38
$_err_print_error(char const*, char const*, int, char const*, char const*, ErrorHandlerType) @ 0598f57e:0x32b08
$_err_print_error(char const*, char const*, int, char const*, ErrorHandlerType) @ 0598f57e:0x3009b
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xaf516
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) @ 0598f57e:0x1ecea3
$GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) @ 0598f57e:0xa59da
$GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0xd6acaf
$Object::call(StringName const&, Variant const**, int, Variant::CallError&) @ 0598f57e:0x197288
$MessageQueue::_call_function(Object*, StringName const&, Variant const*, int, bool) @ 0598f57e:0xca4eb7
$MessageQueue::flush() @ 0598f57e:0xe3a8d
$SceneTree::iteration(float) @ 0598f57e:0x9dd1bf
$Main::iteration() @ 0598f57e:0xce1dae
$OS_JavaScript::main_loop_iterate() @ 0598f57e:0xae2cd0
$main_loop_callback() @ 0598f57e:0x2af90b
$godot_js_main(int, char**) @ 0598f57e:0x2b89f1
$main @ 0598f57e:0x70ee0e
Module._main @ export.js:9
callMain @ export.js:9
(anonymous) @ export.js:684
(anonymous) @ export.js:679
Promise.then (async)
(anonymous) @ export.js:678
Promise.then (async)
start @ export.js:657
(anonymous) @ export.js:717
Promise.then (async)
startGame @ export.js:716
(anonymous) @ export.html:222
(anonymous) @ export.html:242
Show 4 more frames

If web export is not supported please make that clear in the readme.

Works in Editor, Not in Export

Describe the bug
ERROR: get_node: Node not found: __InkRuntime
At: scene/main/node.cpp:1382.

To Reproduce
Export this project: https://github.com/lunarcloud/not-a-halloween-game/tree/inkgd

Expected behavior
To behave the same in export as editor - no find and use the static runtime node

Ink files
See "to reproduce"

Environment:

  • OS: Kubuntu 19.04
  • Inklecate version:(precompiled main.json)
  • inkgd version: ca86352
  • Godot: 3.1.1 (Standard Version)

Additional context
I tested the linux and web exports on my machine.

Combined lists and functions don't work as intended

Describe the bug
Passing list elements to a switch function should result in this list element being matched. This is not the case... the function doesn't recognize the element and simply chooses the "else" path.

To Reproduce

  • Make a new Godot project
  • Download and activate the inkgd plugin from the Asset Store
  • Download the examples-folder from the Github repository
  • Take the minimum ink-file I supplied below and copy-paste it into the "Interceptor.ink" and rebuild the JSON using inklecate
  • Change the "bind_externals" function (found in ink_runner.gd) to:
func _bind_externals():
    story.observe_variables(["currentActor"], self, "_observe_variables")
    #story.bind_external_function("should_show_debug_menu", self, "_should_show_debug_menu")
  • Run the ink_runner.tscn and see what happens.

OUTPUT in log:

Variable 'currentActor' changed to: Bobby
Variable 'currentActor' changed to: Bobby
Variable 'currentActor' changed to: Bobby

OUTPUT in game:

Hey, my name is Bobby. What about yours? 
I am Bobby and I need my rheumatism pills!
Would you like me, Bobby, to get some more for you?

This is the wrong behavior...

Expected behavior
Go to Quill (http://jeejah.xyz/quill/) or download Inky, copy-paste the Ink content (see below) and press play. This gives following story (which is correct):

Hey, my name is Philippe. What about yours?

I am Andre and I need my rheumatism pills!

Would you like me, Philippe, to get some more for you?

(story complete)

Ink files
Here's a minimum version of the *.ink-script that I'm using:

VAR currentActor = "Bobby"

LIST listOfActors = P, A, S, C
VAR s = -> set_actor
-> start

===function set_actor(x)
{ x:
- P: ~ currentActor = "Philippe"
- A: ~ currentActor = "Andre"
- else: ~ currentActor = "Bobby"
}

=== start ===
{s(P)} Hey, my name is {currentActor}. What about yours? 
{s(A)} I am {currentActor} and I need my rheumatism pills!
{s(P)} Would you like me, {currentActor}, to get some more for you?
-> END

Environment:

  • OS: Windows
  • Inklecate version: 0.9.0
  • inkgd version: 0.1.3

Additional context
A current work-around is to not use LISTs and just use string (meaning: {s("P")} instead of {s(P)}), but I would very much like not to write the double quotes at all.

Support Godot 4

I know the 4.0 alpha is hot off the presses, but the inkGD plugin doesn't yet work with it, at least not on my autoconverted project, and the new text / font improvements make it really appealing for ink storytellers.

Glue is trimming whitespaces in the end of line

Describe the bug
Whitespaces before glue marks are being trimmed.

To Reproduce
If I compile this ink:

Partial   <>
* line

It gives this (excerpt of) JSON:

"^Partial ",
"<>",
"\n",
[
    "ev",
    ...
    {
        "s": [
            "^line",
            ...
            null
        ]
    }
],
...

Notice there is a whitespace after "Partial ".

But when I load this with InkGD (latest from master) the whitespaces are trimmed.

Expected behavior
The whitespaces should be kept to allow concatenation with text from the selected choice.

Ink files
THe one above

Environment:

  • OS: Windows
  • Godot version: 3.2.3-vanilla
  • Inklecate version: 1.0.0
  • inkgd version: 3127d99

Additional context
I think is something here

inkgd not compatible with Godot 4.2

Describe the bug
When running inkgd in Godot 4.2.beta1, I get the following error :

res://addons/inkgd/runtime/values/value.gd:104 :
Parser Error: The function signature doesn't match the parent. Parent signature is "copy() -> Variant".

To Reproduce
Install Godot 4.2.beta.1 with the godot4 version of the plugin

Expected behavior
No error :)

Ink files
Irrelevant

Environment:

  • OS: macOS 14.0 (M2 chip)
  • Godot version: Godot 4.2.beta1 vanilla
  • Inklecate version: 1.1.1
  • inkgd version: 0.6.0 (godot4 branch)

Error when trying to run example project

Describe the bug
The game won't run. Here's the debug log:

Godot version:  3.2.0
 res://addons/gut/gut.gd:823 - Invalid call. Nonexistent function 'get_text_box' in base 'Panel (GutScene.gd)'.
GUT version:  6.8.1
 res://addons/gut/gut.gd:823 - Invalid call. Nonexistent function 'get_text_box' in base 'Panel (GutScene.gd)'.
 res://addons/inkgd/editor/ink.gd:23 - Invalid call. Nonexistent function '_build_button_pressed' in base 'Control (ink_dock.gd)'.
 editor/editor_node.cpp:5140 - An EditorPlugin build callback failed.
 res://addons/inkgd/editor/ink.gd:23 - Invalid call. Nonexistent function '_build_button_pressed' in base 'Control (ink_dock.gd)'.
 editor/editor_node.cpp:5140 - An EditorPlugin build callback failed.
 res://addons/inkgd/editor/ink.gd:23 - Invalid call. Nonexistent function '_build_button_pressed' in base 'Control (ink_dock.gd)'.
 editor/editor_node.cpp:5140 - An EditorPlugin build callback failed.

To Reproduce
Clone the project directly from GitHub and press play after loading it into Godot.

Expected behavior
The game running as normal.

Environment:

  • OS: Windows 10
  • Godot version: 3.2.alpha1.mono.official
  • Inklecate version: 0.8.3
  • inkgd version: 0.1.4

Example crashes

Describe the bug
Example doesn't work in Godot 3.3.4 on Debian 11.

To Reproduce

  1. $ git clone https://github.com/ephread/inkgd.git
  2. Import project.godot.
  3. Run game.

Game crashes with the following error: Assertion failed: Story execution will stop: Failed to find content at path 'asdasdasdasdads', and no approximation of it was possible.

Expected behavior
Game should not crash.

Ink files
N/A

Environment:

  • OS: Debian 11
  • Godot version: 3.3.4.stable.flathub
  • Inklecate version: n/a
  • inkgd version: 0.2.1

Additional context
I'm guessing the error is in ink_runner.gd:132, I'm not seeing a path named asdasdasdasdads. Removing this entry makes hte example run again.

External function is called twice after divert

Describe the bug
After diverting from a knot and calling an external function from the new knot

To Reproduce
Example included below. When diverting to quest_completed from from_quest_accepted_0, the function end_quest(quest_name) is called twice.

= from_quest_accepted_0
~ current_speaker = "LEFT"
"..."

* {check_quest(quest_name)} "Yes" []
-> quest_completed
* {not check_quest(quest_name)}  "Yes" (lie) []
-> quest_completed_lie
* "Not yet" [] -> from_quest_accepted_1

=== quest_completed
~ current_speaker = "RIGHT"
{end_quest(quest_name)}
"Well ain't that something. I guess there are still good people out there."

* [next] -> dialogue_end

Expected behavior
When diverting to a new knot, the end_quest function should only be called once.

The problem is fixed if the choice is structured like so:

* {check_quest(quest_name)} ["Yes"]
-> quest_completed

Note that the "Yes" has been moved inside the brackets.

It can also be fixed by removing the newline like so:

* {check_quest(quest_name)} ["Yes"] -> quest_completed

However, following this pattern for other diverts breaks the formatting since the newline is no longer present.

* "Yes" [] -> start_scenario

This causes "Yes" to be displayed on the same line as the divert.

Ink files
Available upon request

Environment:

  • OS: Windows 10
  • Godot version: 3.2.3 vanilla
  • Inklecate version: 1.7.2
  • inkgd version: 0.2.1

Additional context

Support multiple languages

Describe the bug
Support multiple languages.

To Reproduce
?

Expected behavior
Read language files from Godot so it automatically translates.

Additional Info

TTR so it generates the proper translation keys?

Problems with the settings panel

Describe the bug
When using the file selectors in the settings panel, the selected files aren't accepted. Instead, one can only set the paths directly in the text inputs.

Also, the mono selector button is missing an icon.

And mono isn't required for macOS (anymore)

To Reproduce
Try to select a mono binary, the path to inklecate, an ink file or a target file. None of the file selectors work.

The compile button requires a mono path, even for macOS where it isn't required.

Expected behavior
The selectors work and no mono is required for macOS.

Environment:

  • OS: macOS 11.6.1
  • Godot version: 3.3.4 vanilla
  • Inklecate version: 0.9.0
  • inkgd version: 0.2.1

Best way to integrate Mono?

Thank you very much for providing this!

What is the best way to integrate Mono? I saw in the doku that one should link to the mono runtime. But is there a preferred way to use Mono? Like using the Godot Mono version? Or better to use Godot without Mono but have a separate installation of Mono?

Maybe it would also be interesting to add to the readme.

Thank you! :)

Best way to implement multiple ink stories?

Hi, I'm very new to gdscript, and I've been using your implementation of The Intercept as a guide to building my own ink runner node. I've got something working, I'm happy so far, inkgd has been a great help.

I'd like to link self-contained ink stories together into a sort-of anthology. How would I go about having the runner stop the current story and load a new .json? Or would it be easier/a better practice to instance a new ink runner node each time?

Thanks!

continue_story_maximally() does not concatenate multiple lines as expected

Describe the bug
Calling the continue_story_maximally() method in ink_player.gd (both on the current & godot4 branches) does not concatenate as the description states. It only returns the last rendered line from Ink.

To Reproduce
Call continue_story_maximally() when there are multiple rows of Ink text that need to be returned. Only the last line will appear.

Expected behavior
All lines before the choice stopping point appear as rendered in native Ink.

Ink files
ink_player.gd

Environment:

  • OS: Windows 11
  • Godot version: 4.2 mono
  • inkgd version: godot4 branch

Implementing save/load

I thought I had saving and loading the state of the ink figured out, but it's only working if I haven't made any choices yet. My game uses multiple ink story jsons, and If I try loading while the same ink story is in the runner, the passage text displays the very first passage in the story (incorrect, it should display the loaded passage), displays the correct choices for the loaded passage, and continues from that point.

If I load from a different story (load a state from json B while json A is currently playing), it displays the correct choices but the passage text is blank and clicking just makes the choices vanish.

Here's my code:

func save_game():
    var save_game = File.new()
    var dir = Directory.new()
    dir.remove("user://savegame.save")
    save_game.open("user://savegame.save", File.WRITE)
    save_game.store_line(inkRunner.myStory) # current loaded ink json reference
    save_game.store_line(inkRunner.saveState()) # function to save the story state
    save_game.close()

func saveState():
    var savedJson = story.state.to_json()
    return (savedJson)

func load_game():
    var save_game = File.new()
    if not save_game.file_exists("user://savegame.save"):
        return # Error! We don't have a save to load.
    save_game.open("user://savegame.save", File.READ)
    var loadStory = save_game.get_line()
    var data = save_game.get_line()
        inkRunner.myStory = loadStory 
    inkRunner.wipeChoices() # function to clear the current choice buttons
    inkRunner.on_new_story_start(loadStory)
    inkRunner.loadState(data)
    save_game.close()

func loadState(state):
    story.state.load_json(state)
    wipeChoices()
    continue_story()

# Without calling wipeChoices() the new buttons just pop up under the old ones.

func wipeChoices():
    StoryVBoxContainer.remove_child(_current_choice_container)
    if is_instance_valid(_current_choice_container):
        _current_choice_container.queue_free()

here's my continue_story():

func continue_story():
    while story.can_continue:
        var text = story.continue()
        var label = LineLabel.instance()
        label.bbcode_text = text

        StoryVBoxContainer.add_child(label)
        var scrollbar = StoryScrollContainer.get_v_scrollbar()

        scrollbar.max_value += 1000
        StoryScrollContainer.scroll_vertical = scrollbar.max_value
        
        if story.current_tags.size() > 0:
            check_tags()
    
    if story.current_choices.size() > 0:
        
        _current_choice_container = ChoiceContainer.instance()
        StoryMarginContainer.add_child(_current_choice_container)

        _current_choice_container.create_choices(story.current_choices)
        _current_choice_container.connect("choice_selected", self, "_choice_selected")

Performance issues when building the container hierarchy

Building the container hierarchy of The Intercept currently takes about 2 seconds on my MacBook Pro. This is insanely slow.

  • Check the performances of other implementations (original C#, inkjs).
  • Document the best way to offload the story setup to a background thread.
  • Find a way to improve the performances.

Edit:

  • The container hierarchy is usually built between 50 and 75 ms in other implementations.
  • The creation of Diverts and Choices seems to create most expensive individual calls (between .05ms and .6ms). The first call to NativeFunctionCall (building the list of available native calls for the Story) is also very expensive (~ 2ms).
  • At the moment, all scripts required by an object are loaded during the init phase; I suspect this is one of the reasons for the poor performance during instancing. It may make sense to defer loading the scripts (even if they are cached) during the actual execution of the story (at the cost of, perhaps, slightly worse performance during execution).
  • Another expensive thing is Path creation (notably used in Diverts and Choices).

Loading a story state doesn't rollback the error stack

Hey ๐Ÿ˜„

Let's consider the following code.

var state = self.story.state.to_json()
# any action resulting in an error being stacked for interruption 
self.story.state.load_json(state)
if self.story.can_continue:
    self.story.continue()

The expected behavior would be for everything after the new state is loaded to go on smoothly. But at the moment, story execution will stop when continue() is called and the stacked error will be displayed. The error stack needs to be cleared out and InkRuntime.should_interrupt should be reset.

The tricky part would be to determine if some errors are from before the state was saved or not.
E.g.

var state1 = self.story.state.to_json()
# any action resulting in an error being stacked for interruption 
var state2 = self.story.state.to_json()
# any action resulting in an error being stacked for interruption 
self.story.state.load_json(state1|state2)

Depending on which state (state1 or state2) is loaded on the last line, the rollback should probably not be the same.


Environment:

  • OS: Windows 10 Pro
  • Godot version: v3.2.3
  • inkgd version: 96b743b

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.