#FLOO # model.floo: Model program for Floo, using Glk. # Designed by Andrew Plotkin # http://www.eblong.com/zarf/glk/floo/index.html # This program is in the public domain. # This is an even simpler model of a text adventure which uses the Glk API. # It is written in Floo. If you don't know anything about Floo, start with # the fact that it's all reverse polish. # Define an input buffer. /inbuffer 80 string def # Define a procedure to draw the status line. /draw_status_line { # Only proceed if there *is* a status line. statuswin 0 ne { # Set and clear the window statuswin glk_set_window statuswin glk_window_clear # Define a string to put in the window /statusstring "Welcome to Floo" def # Compute the width of the window... statuswin true false glk_window_get_size # ...and then compute (win-strlen) / 2. statusstring strlen sub 2 idiv # Move the cursor and print. statuswin exch 0 glk_window_move_cursor statusstring glk_put_string # Reset the window. mainwin glk_set_window } if } def # Now the actual program begins. # Open the main window. 0 0 0 wintype_TextBuffer 1 glk_window_open /mainwin exch def # If we couldn't do that, forget it. mainwin 0 eq { glk_exit } if # Open the status window. mainwin winmethod_Above winmethod_Fixed or 1 wintype_TextGrid 2 glk_window_open /statuswin exch def # Set the current stream to the main window stream. mainwin glk_set_window "Welcome to a simple sample parser in Floo.\n" glk_put_string "Type \"help\" for the short list of commands.\n" glk_put_string # Begin the program loop. { # Draw the status line, and then print the prompt. draw_status_line "\n>" glk_put_string # Request a line of input. mainwin inbuffer 0 glk_request_line_event # Here's the event loop. { glk_select /ev exch def # ev is now a four-element event array: [type window val1 val2] # Define evtype to the first element (type) ev 0 get /evtype exch def # If it was a line input event, exit the event loop. evtype evtype_LineInput eq { exit } if # If it was a window-arrangement event, redraw the status line. evtype evtype_Arrange eq { draw_status_line } if } loop # Trim the buffer down to the returned length. inbuffer ev 2 get 0 put # Parse the buffer, very simply and stupidly. inbuffer "quit" eq { "Thanks for playing.\n" glk_put_string glk_exit } if inbuffer "jump" eq { "You jump.\n" glk_put_string continue } if inbuffer "help" eq { "This is an even simpler model program.\n\ HELP: Display this list\n\ JUMP: Jump.\n\ QUIT: Quit.\n" glk_put_string continue } if inbuffer "" eq { continue } if "I don't know the command \"" glk_put_string inbuffer glk_put_string "\".\n" glk_put_string } loop