Page 1 of 2

Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 1:01 pm
by NotVeryProfessional
Working on getting the Ink integration working with the SaveSystem and I get an error. To ensure it's not something strange in my scene setup, I opened the Ink Integration example and added a save system:

* add SaveSystem Prefab to Dialogue Manager
* add DialogSystemSaver Component to Dialogue Manager and set it as described in Tony's last posting here: https://www.pixelcrushers.com/phpbb/vie ... f=3&t=4566
* added a "load" and "save" button to the UI that simply call the SaveSystem Load/SaveSceneFromIndex(1)

The error is the same as in my game:

Code: Select all

Dialogue System: Lua code 'Variable={Alert="", Actor="Player", Conversant="Story", ActorIndex="Player", ConversantIndex="Story", wagerAmount=0, forceful=0, evasive=0, teacup=0, gotcomponent=0, drugged=0, hooper_mentioned=0, losttemper=0, admitblackmail=0, hooperClueType=0, hooperConfessed=0, smashingWindowItem=0, notraitor=0, revealedhooperasculprit=0, smashedglass=0, muddyshoes=0, framedhooper=0, putcomponentintent=0, throwncomponentaway=0, piecereturned=0, longgrasshooperframe=0, DEBUG=0, Story_story="{\"flows\":{\"DEFAULT_FLOW\":{\"callstack\":{\"threads\":[{\"callstack\":[{\"cPath\":\"\",\"idx\":0,\"exp\":false,\"type\":0}],\"threadIndex\":0}],\"threadCounter\":0},\"outputStream\":[],\"currentChoices\":[]}},\"currentFlowName\":\"DEFAULT_FLOW\",\"variablesState\":{},\"evalStack\":[],\"visitCounts\":{\"\":1},\"turnIndices\":{},\"turnIdx\":-1,\"storySeed\":95,\"previousRandom\":0,\"inkSaveVersion\":9,\"inkFormatVersion\":20}", Story_TheIntercept="{\"flows\":{\"DEFAULT_FLOW\":{\"callstack\":{\"threads\":[{\"callstack\":[{\"exp\":false,\"type\":0,\"temp\":{\"$r\":{\"^->\":\"start.waited.0.g-0.5.$r1\"}}}],\"threadIndex\":6,\"previousContentObject\":\"start.waited.0.g-0.11\"}],\"threadCounter\":9},\"outputStream\":[\"^\\"Well, then,\\" he begins, awkwardly. This is an unseemly situation.\",\"\n\"],\"choiceThreads\":{\"7\":{\"callstack\":[{\"cPath\":\"start.waited.0.g-0.4\",\"idx\":8,\"exp\":false,\"type\":0,\"temp\":{\"$r\":{\"^->\":\"start.waited.0.g-0.4.$r1\"}}}],\"threadIndex\":7,\"previousContentObject\":\"start.waited.0.g-0.4.7\"},\"8\":{\"callstack\":[{\"cPath\":\"start.waited.0.g-0.5\",\"idx\":10,\"exp\":false,\"type\":0,\"temp\":{\"$r\":{\"^->\":\"start.waited.0.g-0.5.$r1\"}}}],\"threadIndex\":8,\"previousContentObject\":\"start.waited.0.g-0.5.9\"},\"9\":{\"callstack\":[{\"cPath\":\"start.waited.0.g-0\",\"idx\":11,\"exp\":false,\"type\":0,\"temp\":{\"$r\":{\"^->\":\"start.waited.0.g-0.5.$r1\"}}}],\"threadIndex\":9,\"previousContentObject\":\"start.waited.0.g-0.10\"}},\"currentChoices\":[{\"text\":\"\\"Commander.\\"\",\"index\":0,\"originalChoicePath\":\"start.waited.0.g-0.4.8\",\"originalThreadIndex\":7,\"targetPath\":\"start.waited.0.g-0.c-0\"},{\"text\":\"\\"Tell me what this is about.\\"\",\"index\":1,\"originalChoicePath\":\"start.waited.0.g-0.5.10\",\"originalThreadIndex\":8,\"targetPath\":\"start.waited.0.g-0.c-1\"},{\"text\":\"Wait\",\"index\":2,\"originalChoicePath\":\"start.waited.0.g-0.11\",\"originalThreadIndex\":9,\"targetPath\":\"start.waited.0.g-0.c-2\"}]}},\"currentFlowName\":\"DEFAULT_FLOW\",\"variablesState\":{},\"evalStack\":[],\"visitCounts\":{\"\":1,\"start\":1,\"start.0.g-0\":1,\"start.0.g-0.c-0\":1,\"start.0.opts\":2,\"start.0.opts.0\":2,\"start.0.opts.c-1\":1,\"start.0.opts.c-3\":1,\"start.0.g-1\":1,\"start.waited\":1,\"start.waited.0.g-0\":1},\"turnIndices\":{},\"turnIdx\":2,\"storySeed\":69,\"previousRandom\":0,\"inkSaveVersion\":9,\"inkFormatVersion\":20}", CurrentStory="TheIntercept", WasPlayerSpeaking=false}; Item["The_Wager"].State="unassigned"; Item["The_Wager"].Track=true; Actor={Player={Name="Player", Pictures="[]", Description="", IsPlayer=true, Bark_Index=0}, Story={Name="Story", Pictures="[]", Description="", IsPlayer=false}, PlayerSpeaker={Name="PlayerSpeaker", Pictures="[]", Description="", IsPlayer=false, Display_Name="Player"}, Monsieur_Fogg={Name="Monsieur Fogg", Pictures="[]", Description="", IsPlayer=false}}; StatusTable = ""; RelationshipTable = ""; ' threw exception 'Code has syntax errors:
Line 1, Col 9 '=': Failed to parse Letter of Name.
Line 1, Col 9 '=': Failed to parse Name of VarName.
Line 1, Col 9 '=': Failed to parse 'nil' of NilLiteral.
Line 1, Col 9 '=': Failed to parse Text of BoolLiteral.
Line 1, Col 9 '=': Failed to parse '0'...'9' of Digit.
Line 1, Col 9 '=': Failed to parse (Digit)+ of FloatNumber.
Line 1, Col 9 '=': Failed to parse Name of VariableArg.
Line 1, Col 9 '=': Failed to parse firstTerm of OperatorExpr.
Line 1, Col 9 '=': Failed to parse Expr of ExprStmt.
Line 1, Col 9 '=': Failed to parse remaining input.
'
UnityEngine.Debug:LogError (object)
PixelCrushers.DialogueSystem.Lua:RunRaw (string,bool,bool) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Lua/Lua Wrapper/Lua Interpreter/Lua.cs:228)
PixelCrushers.DialogueSystem.Lua:Run (string,bool,bool) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Lua/Lua Wrapper/Lua Interpreter/Lua.cs:129)
PixelCrushers.DialogueSystem.Lua:Run (string,bool) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Lua/Lua Wrapper/Lua Interpreter/Lua.cs:139)
PixelCrushers.DialogueSystem.PersistentDataManager:ApplyLuaInternal (string,bool) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Save System/PersistentDataManager.cs:261)
PixelCrushers.DialogueSystem.DialogueSystemSaver:ApplyDataImmediate () (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Save System/DialogueSystemSaver.cs:64)
PixelCrushers.SaveSystem:ApplyDataImmediate () (at Assets/Plugins/Pixel Crushers/Common/Scripts/Save System/SaveSystem.cs:779)
PixelCrushers.SaveSystem/<LoadSceneCoroutine>d__107:MoveNext () (at Assets/Plugins/Pixel Crushers/Common/Scripts/Save System/SaveSystem.cs:756)
UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr) (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)
save file attached (had to add a .txt extension so it lets me upload it)

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 3:01 pm
by Tony Li
Did you assign a unique key to DialogueSystemSaver?

I just tested the same thing, except since the scene already has a Demo Menu I just used that to save and load. (It calls SaveSystem.SaveToSlot and LoadFromSlot.) Instead of the SaveSystem prefab, I added a SaveSystem, JsonDataSerializer, and PlayerPrefsSavedGameDataStorer

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 4:42 pm
by NotVeryProfessional
Yes, it has a unique key and I'm using the same setup, except that I use the disk and not the playerprefs storer.

I missed the demo menu. Tried to replicate it there. The error does not always show up, but once it does, it sticks. Might be something in the actual save game data.

Attached is my scene and the save game data. This for me 100% reproduces the error when I start the scene and press "load game" in the escape menu.

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 5:00 pm
by Tony Li
Thanks for the repro file. I'll check it out and get back to you by tomorrow morning.

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 5:31 pm
by NotVeryProfessional
I'd try debugging it myself, but whenever it gets into the Lua parts, I understand not enough about it for that. As long as it's plain C# I'd try to be more useful in finding the root issue.

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 8:39 pm
by Tony Li
Looks like Ink now generates JSON that the integration doesn't translate cleanly into a Lua string. I'll update the integration to include an InkSaver instead of using Lua.

Re: Ink integration and savesystem (error)

Posted: Thu Jun 10, 2021 9:55 pm
by Tony Li
Hi,

The Extras page has a new Ink integration package (direct link) that adds an InkSaver script.

Add the InkSaver script to your Dialogue Manager, and set the Key field. The script will automatically untick the DialogueSystemInkIntegration's 'Include In Save Data' checkbox at runtime since InkSaver does the saving instead. I'm keeping the checkbox to support existing projects that are using older versions of Ink for Unity but it's otherwise basically deprecated by InkSaver now.

Re: Ink integration and savesystem (error)

Posted: Fri Jun 11, 2021 1:18 am
by NotVeryProfessional
Excellent. I've done a few quick tests and it seems to be saving everything correctly (including ink-internal states, such as visited knots) and without errors.

Re: Ink integration and savesystem (error)

Posted: Fri Jun 11, 2021 9:17 am
by Tony Li
Great!

Re: Ink integration and savesystem (error)

Posted: Fri Jul 09, 2021 5:27 am
by NotVeryProfessional
Can I revive this topic to ask what the InkSaver should be saving and when?
And how should it handle variables that get initialized in the Ink files?

I have problems with both variables and visited knots. It may be related to the "save across scene changes" toggle, but either way I can't seem to get it save and load everything reliably when the game moves over several scenes.