! FOOTNOTE.H An Inform Library Extention for Inform 5.5 or greater ! To produce sequentially numbered footnotes. ! L. Ross Raszewski ! VERSION 2.0 ! New features: *Define Redisplay_Footnotes to 1 before inclusion to prevent ! the player from seeing the footnote indicator more than once ! *Define footnote1__tx to the text to be printed before the ! number and footnote2__tx to the text to be printed after it ! in order to change the default [footnote #] message ! (multi-lingual support) ! ! ! ! ! This library, based on the excercise in the manual, allows you to integrate ! footnotes into a game, which are numbered IN THE ORDER THEY APPEAR. It has ! two advantages over the simple, obvious system (ie. the one used in ! Hitchhiker's Guide): First, footnotes which have not been mentioned cannot ! be accessed. Second, the footnotes will always count upward in series, no ! matter what order they're called in. The example in the manual, I found, ! sometimes numbers the same footnote twice. I've avoided this, so that the ! same footnote will have the same number, regardless of how it is called ! (sort of like Achieved(#);) ! Include AFTER Grammar.h ! define the constant MAX_FOOTNOTES to the number of footnotes in the game ! before inclusion. ! To print a footnote in running text, call Note() with the number of the ! footnote (THe number is internal, and may not be the one that apears on the ! screen. Ex: If two footnotes have already been seen, then the statement: ! Print "All the world's a stage.", (note) 1; ! will print "All the world's a stage. [Footnote 3]", with the [Footnote 3] ! in underline print. Note() prints the text contained in Footnote1__TX ! and Footnote2__TX, which defaults to having a leading space, but no trailing ! one. ! The footnote is read by issuing the command FOOTNOTE 3 (or NOTE 3, or ! READ FOOTNOTE 3). FOOTNOTE alone will instruct the player on the use of ! Footnotes. ! ! You must define the function Printnote(n); before inclusion. This function ! actually prints the footnote text after FootnoteSub has printed the words ! [Footnote #]^ and has converted the number the player typed into its ! original number in the footnote list A sample PrintNote sub might read: ! [ PrintNote n; ! switch(n){ ! 1: "William Shakespeare"; ! 2: "Sloathes have no taste"; ! 3: {Style bold; print "Sesame Street"; style roman; " was \ ! brought to you by the letter ~K~ and the number 4.";}; ! }; ! ]; ! ! You can have a footnote do anything you like, even call another footnote. ! (I've tried it, it seems to work). ! Word of warning: The footnotes_seen array is a bit array, so I think you ! can't have more than 256 footnotes. ! ! ! System_file; Array footnotes_seen -> MAX_FOOTNOTES; Global footnote_count; #IFNDEF Redisplay_Footnotes; Constant Redisplay_Footnotes 0; #ENDIF; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Multi-lingual block. Define the following ! contants before inclusion to use alternate ! Messages !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #IFNDEF Footnote1__TX; Constant Footnote1__TX "[Footnote "; #ENDIF; #IFNDEF Footnote2__TX; Constant Footnote2__TX "]"; #ENDIF; #IFNDEF Footnote3__TX; Constant Footnote3__TX "Footnotes count upward from 1."; #ENDIF; #IFNDEF Footnote4__TX; Constant Footnote4__TX "That footnote ["; #ENDIF; #IFNDEF Footnote5__TX; Constant Footnote5__TX "] has not been mentioned."; #ENDIF; #IFNDEF Footnote6__TX; Constant Footnote6__TX "To view a footnote, type ~FOOTNOTE #~, where # is the number of the footnote you wish to read."; #ENDIF; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! End of Multi-lingual block !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [ FNWarnSub; print_ret (string) Footnote6__TX; ]; [ Note n; if (footnotes_seen->n~=0 && Redisplay_Footnotes==1) rfalse; if (footnotes_seen->n==0) { footnote_count++; footnotes_seen->n=footnote_count;}; print " "; style underline; print (string) Footnote1__TX,footnotes_seen->n, (string) Footnote2__TX; style roman; ]; [ FootnoteSub n; if (noun>footnote_count) { print (string) Footnote4__TX,noun, (string) Footnote5__TX, "^"; rtrue; } if (noun==0) print_ret (string) Footnote3__tx; for(n=1:(footnotes_seen->n~=noun && n<=(MAX_FOOTNOTES-1)):n++); style underline; print (string) Footnote1__TX,noun,(string) Footnote2__tx, "^"; style roman; PrintNote(n); ]; Verb meta "footnote" "note" * ->FNWarn * number ->Footnote; Extend "read" * "footnote" number ->Footnote * "note" number ->Footnote * "footnote" ->FNWarn * "footnotes" ->FNWarn; #Stub PrintNote 1;