inkle / ink

inkle's open source scripting language for writing interactive narrative.
http://www.inklestudios.com/ink
MIT License
4.07k stars 489 forks source link

Open World Integration #861

Open OneManMonkeySquad opened 1 year ago

OneManMonkeySquad commented 1 year ago

Hey, I've toyed and looked around on how to best integrate Ink into an open world game (think Skyrim). Currently my dialog looks like this (please don't laugh, I'm a programmer):

VAR talked_to_faye = 0

=== InteractFaye ===
# npcs: Faye
{ talked_to_faye == 0:
    Faye: Bear. Bring me head get reward.
- else:
    Faye: Bear.
}
~ talked_to_faye++
* {has_item("Player", 22)} [Give Bear Head] {remove_item("Player", 22)} 
    Faye: Good. -> END
* [Make Faye hostile] {make_hostile_to_player("Faye")} -> END
+ [Exit] -> END

The game uses _inkStory.ChoosePathString to "start" a dialog. The __inkStory stays the same, meaning the global state is shared. This means that the knot restarts every time the dialog is triggered, thus I have to use the _talked_tofaye variable to give a different reaction. I wonder if I could somehow stay inside the dialog, using threads or parallel "flows". Or if that is even a desirable thing, KISS et al.

edit: Hmm, maybe the solution of having a [Move] choice together with having one parallel flow per NPC. That would achieve the dialog pause at predefined points. Lots of options, maybe somebody can share some experience.

IFcoltransG commented 1 year ago

You could look into Inkle's approach to resumable/quittable dialogue for A Highland Song.

IFcoltransG commented 1 year ago

At the end of the blog post, Jon Ingold mentions that Ink automatically tracks which knots have been seen. In your case, you can check if InteractFaye has been seen using the InteractFaye variable.