||4 years ago|
|examples||5 years ago|
|pink||4 years ago|
|test||5 years ago|
|.gitignore||5 years ago|
|.travis.yml||5 years ago|
|LICENSE||6 years ago|
|README.md||5 years ago|
|lpeg.so||4 years ago|
|main3.lua||4 years ago|
|test.ink||4 years ago|
Ink is inkle's scripting language for writing interactive narrative, both for text-centric games as well as more graphical games that contain highly branching stories.
- choice and output text
- nested choices
boolean story.canContinue string story.continue() table story.currentChoices nil story.chooseChoiceIndex(index) nil story.choosePathString(path) table story.globalTags table story.tagsForContentAtPath(path) table story.currentTags number story.state.visitCountAtPathString(path)
string story.state.toJson() nil story.state.loadJson(savedJson) story.variablesState["variable_name"] = newValue value = story.variablesState["variable_name"] story.observeVariable ("variable_name", function(string varName, object newValue) ) story.bindExternalFunction ("function_name", function(...)) });
pink is used by my small game https://github.com/premek/enjoy
Let me know if you want to use it too - or just use it!
Install luarocks (Or see https://luarocks.org/#quick-start for instructions for other platforms):
sudo aptitude install luarocks
luarocks install --local lpeg
Clone this repo or download an archive from releases page. You need just the
Note on dependencies
The pink parser depends on lpeg which can easily be instaled by luarocks (see above) but it may be difficult to distribute it with your game for each platform (it is a C library). Please consider compiling the .ink file into lua table, save it into a file and distribute just the compiled file with a lua table instead of compiling at runtime. (See: #3)
Pink runtime is just a pure lua.
How to use this to run a game
Given some .ink file like below, you can easily run it in your lua application using the pink library.
=== back_in_london === We arrived into London at 9.45pm exactly. * "There is not a moment to lose!" I declared. -> hurry_outside * "Monsieur, let us savour this moment!" I declared. My master clouted me firmly around the head and dragged me out of the door. -> dragged_outside === hurry_outside === We hurried home to Savile Row -> as_fast_as_we_could === dragged_outside === He insisted that we hurried home to Savile Row -> as_fast_as_we_could === as_fast_as_we_could === <> as fast as we could.
local pink = require('pink.pink') -- 1) Load story local story = pink.getStory('examples/game.ink') while true do -- 2) Game content, line by line while story.canContinue do print(story.continue()) end -- 3) Display story.currentChoices list, allow player to choose one for i = 1, #story.currentChoices do print(i .. "> " .. story.currentChoices[i].text) end if #story.currentChoices == 0 then break end -- cannot continue and there are no choices local answer=io.read() print (story.currentChoices[tonumber(answer)].choiceText) story.chooseChoiceIndex(answer) end
See the examples directory for a simple text based example and a LÖVE integration.
This is how to run the text-based example:
$ lua examples/game.lua
And this example shows LÖVE integration:
$ love examples/love2d
How to run tests
$ lua test/test.lua