! ext_quote_box.h, a library extension for PunyInform by Fredrik Ramsberg.
!
! This is an extension to let games show a simple quote box.
! For z5+ games, the extension will try to center the quote box on the screen,
! by reading the screen width reported by the interpreter in the header.
! For z3, this information is not available. Instead, it can do it two ways:
! 1: The game programmer tells the extension to assume the screen has a certain
! width and the extension uses this information to center the quote box.
! 2: The game programmer tells the extension to just indent the quote box a
! fixed number of characters.
! To use (1), set the constant QUOTE_V3_SCREEN_WIDTH to the desired width, which
! has to be > 6.
! To use (2), set the constant QUOTE_V3_SCREEN_WIDTH to the desired number of
! characters to indent by, which must be in the range 0-6.
! By default, method (2) will be used, with 2 characters of indentation.
! To display a quote box, create a word array holding the number of lines, the
! number of characters in the longest line, and then a string per line, and call
! QuoteBox with the array name as the argument.
! Array quote_1 static --> 5 35
! "When I die, I want to go peacefully"
! "in my sleep like my grandfather."
! "Not screaming in terror, like the"
! "passengers in his car."
! " -- Jack Handey";
!
! [AnyRoutine;
! QuoteBox(quote_1);
! ];
!
! You can also add a second argument to QuoteBox. Setting it to true makes
! QuoteBox skip waiting for a keypress after the quote box has been shown:
!
! QuoteBox(quote_1, true); ! Don't wait for keypress
System_file;
Constant EXT_QUOTE_BOX = 1;
#IfnDef RUNTIME_ERRORS;
Constant RUNTIME_ERRORS = 2;
#EndIf;
#IfnDef RTE_MINIMUM;
Constant RTE_MINIMUM = 0;
Constant RTE_NORMAL = 1;
Constant RTE_VERBOSE = 2;
#EndIf;
#Iftrue RUNTIME_ERRORS > RTE_MINIMUM;
Constant QB_ERR = "^[Quote_box error #";
#Endif;
Constant QUOTE_MAX_LENGTH = 80;
#IfV3;
Default QUOTE_V3_SCREEN_WIDTH = 6;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 6;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 5;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 4;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 3;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 2;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 1;
Constant QUOTE_INDENT_STRING = " ";
#EndIf;
#Iftrue QUOTE_V3_SCREEN_WIDTH == 0;
Constant QUOTE_INDENT_STRING = "";
#EndIf;
#EndIf;
Array quote_buffer -> QUOTE_MAX_LENGTH + 3;
Global f_show_quotes = true;
! #Ifv3;
! [ QuoteBox p_quote_data p_dont_pause _quote_lines _quote_width _screen_width _i _j _k _last_index;
! #Ifnot;
! [ QuoteBox p_quote_data p_dont_pause _quote_lines _quote_width _screen_width _i _k _last_index;
! #Endif;
! _quote_lines = p_quote_data --> 0;
! _quote_width = p_quote_data --> 1;
! #IfV5;
! #IfTrue RUNTIME_ERRORS > RTE_MINIMUM;
! #IfTrue RUNTIME_ERRORS == RTE_VERBOSE;
! if(_quote_width > QUOTE_MAX_LENGTH) {
! print_ret (string) QB_ERR,"1: Tried to print quote wider than ", QUOTE_MAX_LENGTH, " characters]";
! }
! #IfNot;
! if(_quote_width > QUOTE_MAX_LENGTH) {
! print_ret (string) QB_ERR,"1]";
! }
! #EndIf;
! #EndIf;
! _screen_width = 0->$21;
! _i = _quote_lines + 5;
! @erase_window -2;
! @split_window _i;
! @set_window 1;
! ! @erase_window 1;
! @new_line;
! @new_line;
! #IfNot;
! _screen_width = QUOTE_V3_SCREEN_WIDTH;
! #EndIf;
! @new_line;
! font off;
! _last_index = 2 + _quote_lines;
! for(_i = 1 : _i <= _last_index : _i++) {
! #IfDef QUOTE_INDENT_STRING;
! print (string) QUOTE_INDENT_STRING;
! #IfNot;
! FastSpaces((_screen_width - _quote_width - 2) / 2);
! #EndIf;
! _k = p_quote_data-->_i;
! if(_i == 1 or _last_index) {
! _k = "";
! #IfV3;
! for(_j = -2 : _j < _quote_width: _j++) @print_char '-';
! #EndIf;
! }
! #IfV5;
! style reverse;
! #EndIf;
! @print_char ' ';
! print (string) _k;
! #IfV5;
! @output_stream 3 quote_buffer;
! print (string) _k;
! @output_stream -3;
! FastSpaces(_quote_width + 1 - quote_buffer->1);
! style roman;
! #EndIf;
! @new_line;
! }
! font on;
! #IfV5;
! @set_window 0;
! ! print "[Press any key to continue]";
! if(p_dont_pause == 0) {
! @read_char 1 -> _i;
! @erase_window -1;
! } else
! @split_window 0;
! ! Force a re-split to show game's statusline
! #IfDef PUNYINFORM_MAJOR_VERSION;
! statusline_current_height = 0;
! #IfNot;
! gg_statuswin_cursize = 0;
! #EndIf;
! #IfNot;
! ! @new_line;
! ! print "[ENTER]";
! if(p_dont_pause == 0) {
! quote_buffer -> 0 = 1;
! read quote_buffer quote_buffer;
! }
! #EndIf;
! ];
#IfV3;
[ QuoteBoxSimple p_quote_data _quote_lines _quote_width _i;
if (~~f_show_quotes) rtrue;
_quote_lines = p_quote_data --> 0;
_quote_width = p_quote_data --> 1;
font off;
@new_line;
@new_line;
@print_char ' ';
for (_i = 1 : _i < _quote_width + 2 : _i++) @print_char '-';
@new_line;
for(_i = 2 : _i <= _quote_lines + 1: _i++)
print " ", (string) p_quote_data-->_i, "^";
@print_char ' ';
for (_i = 1 : _i < _quote_width + 2 : _i++) @print_char '-';
@new_line;
@new_line;
font on;
];
#IfNot;
[ QuoteBoxSimple p_quote_data _quote_lines _quote_width _screen_width _i _k _last_index;
if (~~f_show_quotes) rtrue;
_quote_lines = p_quote_data --> 0;
_quote_width = p_quote_data --> 1;
_screen_width = 0->$21;
_i = _quote_lines + 5;
font off;
@new_line;
@new_line;
_last_index = 2 + _quote_lines;
for(_i = 1 : _i <= _last_index : _i++) {
FastSpaces((_screen_width - _quote_width - 2) / 2);
_k = p_quote_data-->_i;
if(_i == 1 or _last_index) _k = "";
style reverse;
@print_char ' ';
print (string) _k;
@output_stream 3 quote_buffer;
print (string) _k;
@output_stream -3;
FastSpaces(_quote_width + 1 - quote_buffer->1);
style roman;
@new_line;
}
@new_line;
font on;
];
#EndIf;
Verb meta 'quotes'
* 'on' -> QuotesOn
* 'off' -> QuotesOff;
[ ChangeQuotes v;
print "Quote boxes will ";
if (~~v) print "not ";
f_show_quotes = v;
"be displayed.";
];
[ QuotesOnSub;
ChangeQuotes(true);
];
[ QuotesOffSub;
ChangeQuotes(false);
];