Storyteller is a bot for use with Slack which helps a group of people play through a gamebook co-operatively. It was designed for Fighting Fantasy, but can now play a number of different gamebook types, including Lone Wolf.
It should work with almost any gamebook.
Storyteller adds commands to read the story, manage your character and roll dice for fights and other challenges. It will assist you in playing the game but does not strictly enforce rules - replicating the experience of playing with a real book and dice.
Storyteller is programmed in PHP, requires no database and is state-based. This means it can be installed on an ordinary web-server.
- Discord is also supported, with some caveats, see Using Discord below.
Anything without a character sheet is supported, this includes the Choose Your Own Adventure books.
The following Fighting Fantasy books currently work very well: Battleblade Warrior, Black Vein Prophecy, Bloodbones, Caverns of the Snow Witch, The Citadel of Chaos, City of Thieves, Creature of Havoc, Crypt of the Sorcerer, Deathmoor, Deathtrap Dungeon, Demons of the Deep, Eye of the Dragon, The Forest of Doom, House of Hell, Island of the Lizard King, Legend of Zagor, Masks of Mayhem, Portal of Evil, Rebel Planet, Return to Firetop Mountain, Scorpion Swamp, Seas of Blood, Starship Traveller, Stealer of Souls, Talisman of Death, Temple of Terror, Trial of Champions, The Warlock of Firetop Mountain. Most other can still be played.
The first 20 Lone Wolf books have good support, as do the 8 Lone Wolf: New Order books.
The following other books / series are supported: Alice's Nightmare in Wonderland, The Crystal Maze Adventure, The Sonic The Hedgehog Gamebooks, The Narnia Solo Games books.
The full list of supported books is here: http://htmlpreview.github.io/?https://github.com/JiFish/Storyteller/master/extras/book_support.html
Download and unzip. Place on a webserver running PHP. PHP7 is recommended.
First you must create an incoming and outgoing webhook. In Slack, go to Administration > Manage Apps > Custom Integrations.
- Set the channel to where you want the story to be told. You will probably want to dedicate a channel to the story.
- Give the bot a good name. I suggest Storyteller or StorytellerBot.
- Make a note of the Webhook URL. Open
config.ini
and setslack_hook
to this URL.
- Set the channel to the same channel as the incoming hook.
- Set the trigger word. I suggest using
!
to keep things simple. The trigger word must be prefixed to every command. - Set the URL to where your installation will be located.
- Make a note of the Webhook Token. Open
config.ini
and setslack_token
to this value.
By default Storyteller ships with a very short and simple sample book. It isn't very fun, so you'll likely want to replace it. You have 3 options.
Joe Dever has generously allowed Project Aon to host copies of the Lone Wolf gamebooks. I've provided a tool that downloads the books ready for use. If you go with this option, the config.ini file will be updated for you, and you can skip section 3. Run the script and follow the on-screen prompts:
php tools/install_lonewolf.php
It is your responsibility to comply with with the Project Aon Licence. Also, consider making a donation: https://www.projectaon.org/
Storyteller comes with two tools for importing existing texts: one for plain text and one for htmlz. Use htmlz if your book has images. If you own the book in a eBook format, you can use the tool calibre (https://calibre-ebook.com/) to convert it to one of these two formats.
Many books, notably Fighting Fantasy, are not currently available in eBook formats. Your only option here is to scan and OCR the text yourself!
The text is converted to a php array. See jofm.php
in books for an example
book. The converters aren't perfect and you may need to clean up the output
manually.
Use the bookconvert.php script in the tools directory e.g.
php tools/bookconvert.php mybook.txt mybook
htmlzconvert.php will attempt to extract images from the book to Storyteller's images directory at the same time as converting the text.
php tools/htmlzconvert.php mybook.htmlz mypicturebook
Perhaps one of the best ways to get a story in to the bot is to write your own. Choose a set of supported rules you like and come up with your own adventure. If anyone does do this, please consider submitting your story back here. I'd love to include longer stories with this distribution.
Once you have your book php file, put it in the books
directory. Next add a
new section to config.ini
for your book.
- The section name will be used as the book id.
name
is the full title of the book.file
is the php file from step 2.rules
is the ruleset to use for the book. This controls which stats are available, the character sheet and ensures character generation matches the book. You can look up the correct book type inbook_support.html
found in the extras directory. Usenone
for books with no character sheet.
Here is an example section:
[wofm]
name = "Warlock of Firetop Mountain"
file = books/wofm.php
rules = ff_wofm
Set default_book
under [general]
to your book id.
Create a directory in images
with the name of your book id and copy in
illustrations. The images should be named after the page number e.g.
42.jpg
or 1.png
You may wish to adjust other settings in config.php at this point. You might
like to remove save
and load
from the disabled commands list. This will
allow players to use save-points. Alternatively, you could add the undo
command to this list if you want to prevent players from undoing their
mistakes.
- Upload the installation to your PHP enabled web-server. No database is needed. The uploaded directory must be writeable.
- Make sure it's location matches what you step up for the outgoing hook in step 1. If it's different go back and alter the hook.
- If you are not using apache, you must replicate the rules in
.htaccess
to ensure the installation is secure.
Type !library
in the channel you chose for the webhook to see a list of available
books and open one with the !book
commands shown.
Type !0
to read the background page and !1
to start the story. When the
story tells you to turn to a page or section, you can read it in the same way,
e.g. !42
.
For games with character sheets, like Lone Wolf or Fighting Fantasy, the use
!newgame
to roll a character.
!help
will list other commands available for the open gamebook.
The bot can also be used for Discord. The biggest limitation is Discord does not support outgoing hooks. You can work around this one of two ways:
- Run a discord bot to emulate outgoing hooks. There's a working python
example
discord_oghook_bot.py
in the extras directory. Setting up a discord app account and getting tokens ready etc. is left as an exercise for the reader. - Expose
input.php
by editing.htaccess
. This will allow entering commands by submitting a URL likehttp:\\yourdomain.com\storyteller\input.php?c=!echo%20Hello%20World!
You could submit this with a form (seeexample-form.html
in the extras directory.) Or use your imagination! If you come up with a creative input method, please consider submitting it back here!
- Don't forget to add
/slack
to the end of your discord incoming hook to make it slack compatible. It will look likehttps://discordapp.com/api/webhooks/0123456789/YOURCODEHERE/slack
- Set
discord_mode
to true inconfig.ini
. This will ensure messages are formatted correctly for Discord. - Ensure
images/emoji_cache
is writeable. Discord does not support emoji avatars, so emoji PNGs are cached and sent instead. This will cause a short delay when using an emoji for the first time.
- Remember, you have to enforce the rules!
!help
to see some basic commands. Help will be customised depending on the ruleset.- If a book adds complications to the normal
!fight
rules. Check!help
to see if there is parameter or alternate command that can help you. The Fighting Fantasy rulesets has several alternate fight rules programmed. Most others allow you to stop fights after a given number of rounds. - If the book asks you to do something there isn't a command for, you can
always roll dice with
!roll
and apply any effects manually.
It is YOUR responsibility to comply with copyright laws and determine what is fair-use.
Do you accept bug reports?
Yes. Particularly security issues should be reported. Please provide a test case and post it on the github project's issue page.
What about support requests and feature ideas?
Sure. You can also post them on the issues page. No promises though.
Will you support other books?
I'd like to. Please make requests on the issues page.
What about pull requests / patches etc.?
Gladly.
What about a proper bot that isn't state-based / support for other chat software?
I'd like to do this, but I'm not sure how to best achieve this with PHP. This is why the discord outgoing hook bot is written in python.