*  u_u_u   \/'''\. ./'''\. \    / ./'''\. \    /  '#_#'   |     | |     |  \  /  |     |  \  /  ^#.#^   |     | '\___/'   \/   '\___/'   \/ ^/\^/\^

 __  __  _ |  \/  \| | | | | | | | |__/|/ \|_| by novov (tm)

A very small one-file Python interactive fiction module with a very simplistic set of features. As this was made in 2016, when I was still learning to program, the code quality... isn't that good, and it has a few quirks and oddities. Oh, and it has completely nothing in the way of documentation. If you've actually considering making serious IF, I recommend using Twine instead.

The code

As I said, it's one file. One. File. And not a particularly long one either. Copy the source code below or get it here.

#    __  __  _
#   |  \/  \| |
#   | | | | | |
#   |__/|/ \|_| 
#
#   by novov

title = 'No title'
author = 'None'
tracking = True
index = [] #A list of all rooms. doesn't show actual object names, but still works as intended
history = [] #All rooms visited.
textfunc = 'p_text'
source = None
pgcount = 0

class pg:
    def __init__(self,name,text = 'There is no text added yet',func = None,track = True,view = True):
        global index
        index.append(self) 
        self.name = name
        self.text = text
        self.func = func
        self.track = track
        self.view = view
        self.links = []
        self.objects = []

    def link(self,label,dest = 'p_empty',keyword = None,view = True):
        self.links.append([label,dest,keyword,view,None])
        
def start(*places,dest = 'startpg'):
    global currentpg
    for x in places:
        try: globals().update(x)
        except: pass
    currentpg = eval(dest)
    return run()

def run():
    global currentpg, allpg, index, history, allfunc, textfunc, pgcount, source, glldiin
    if currentpg.track is True:
        pgcount += 1
        history.append(currentpg)
    for x in [allpg.func, currentpg.func]:
        if type(x) is str: p_getfunc(x)
        elif type(x) is list:
           for y in x: p_getfunc(y)
    if currentpg.view is True: 
        for x in p_getfunc(textfunc): print(x)
    while True:
        prompt = input('> ')
        for x in currentpg.links + allpg.links:
            if x[1] =='p_history' and tracking is False: continue
            elif prompt == x[4]:
                source = x
                try: currentpg = eval(x[1])
                except TypeError: currentpg = x[1]
                except NameError: currentpg = p_empty
                return run()
        else: print('input not valid')

def p_getfunc(name):
    if '(' not in name: name += '()'
    return eval(name)
    
def p_text():
    global currentpg, allpg, title, author
    output = []
    output.append('======= {:} | {:} by {:} ======='.format(currentpg.name,title,author))
    output.append(currentpg.text)
    for x, y in enumerate(currentpg.links + allpg.links):
        if y[2] is None: y[4] = str(x+1)
        else: y[4] = y[2]
        if y[3] is True: output.append('[{:}] {:}'.format(y[4],y[0]))
    return output

allpg = pg(' ')
allpg.link(' ',dest='p_history',keyword ='history',view = False)
allpg.link(' ',dest='p_exitbay', keyword = 'exit', view = False)
p_empty = pg('Room not found',text='The author failed to add this room',track = False)
p_empty.link('Return to the last page',dest='history[-1]')
p_history = pg('History',text='Pages you have visited previously:',func='p_histlinks',track = False)
p_exitbay = pg(' ',func='p_exit(0)',track = False, view = False)

def p_histlinks():
    global history, p_history
    p_history.links = []
    for x in history:
        p_history.link(x.name,dest=x)
        
def p_exit(code):
    raise SystemExit(code)
		

Example adventure

Since there is no documentation, and my crap code isn't exactly the most readable, have this instead.

from dai import *

title = 'The Lobby'
author = 'novov'

lobby = pg('Lobby')
lobby.text = 'You happen to be in a fancy lobby. To your left and right are doors.'
lobby.link('Enter the door on your left',dest='green')
lobby.link('Enter the door on your right',dest='red')

green = pg('Green Room')
green.text='You are now in a room padded wall-to ceiling with green cushioning. There is no furniture here.'

green.link('Go back',dest='lobby')

start(globals(),dest='lobby')
		
<--- Return to experiments