! Trinitystat.h
! This library gives the ability to switch between the normal statusline and a
! Trinity style statusline. It works for both the Z-Machine and Glulx, and
! should work on all three compilers. (G.N.'s Z-Machine compiler, A.P.'s Glulx
! compiler, and A.P.'s biplatform compiler.) It has only been tested on the
! biplatform compiler, though.
! You must, of course, Replace DrawStatusLine; for this to work.
! An object is supplied, statline, with a property trinity. If trinity is true,
! then you will have a Trinity-style line. Guess what happens if trinity is
! false?
! If you have defined Constant DEBUG;, then you get an extra debugging verb.
! Typing "trinity" will switch statusline styles.
! Copyright (C) 2000 by Jonathan Rosebaugh. Released under GPL version 2.
! see
http://www.gnu.org/copyleft/gpl.html
! This is necessary to compile with Graham's current Inform 6.21 compiler.
#ifndef WORDSIZE;
Constant TARGET_ZCODE;
Constant WORDSIZE 2;
#endif;
! Debugging verb
#ifdef DEBUG;
Object statline with trinity 0;
Verb meta "trinity"
* -> Trinity;
[TrinitySub;
statline.trinity = (~~(statline.trinity));
];
#endif;
! Z-Code version
#ifdef TARGET_ZCODE;
Array printed_text table 64;
#IFV5;
[ DrawStatusLine width posa posb i j;
if (statline.trinity)
{
i = 0->33; if (i==0) i=80;
font off;
@split_window 1; @buffer_mode 0; @set_window 1;
style reverse; @set_cursor 1 1; spaces(i);
printed_text-->0 = 64;
@output_stream 3 printed_text;
if (location == thedark) print (name) location;
else
{ FindVisibilityLevels();
if (visibility_ceiling == location)
print (name) location;
else print (The) visibility_ceiling;
}
@output_stream -3;
j=(i-(printed_text-->0))/2;
@set_cursor 1 j; print (name) location; spaces(j-1);
style roman;
@buffer_mode 1; @set_window 0; font on;
}
else { @split_window 1; @set_window 1; @set_cursor 1 1; style reverse;
width = 0->33; posa = width-26; posb = width-13;
spaces width;
@set_cursor 1 2;
if (location == thedark) print (name) location;
else
{ FindVisibilityLevels();
if (visibility_ceiling == location)
print (name) location;
else print (The) visibility_ceiling;
}
if ((0->1)&2 == 0)
{ if (width > 76)
{ @set_cursor 1 posa; print (string) SCORE__TX, sline1;
@set_cursor 1 posb; print (string) MOVES__TX, sline2;
}
if (width > 63 && width <= 76)
{ @set_cursor 1 posb; print sline1, "/", sline2;
}
}
else
{ @set_cursor 1 posa;
print (string) TIME__TX;
LanguageTimeOfDay(sline1, sline2);
}
@set_cursor 1 1; style roman; @set_window 0;
}
];
#ENDIF;
#endif; ! TARGET_ZCODE
! Glulx version
#ifdef TARGET_GLULX;
Array bluelalablankage-->1;
[ DrawStatusLine width height posa posb centerarea;
! If we have no status window, we must not try to redraw it.
if (gg_statuswin == 0)
return;
! If there is no player location, we shouldn't try either.
if (location == nothing || parent(player) == nothing)
return;
glk($002F, gg_statuswin); ! set_window
StatusLineHeight(gg_statuswin_size);
glk($0025, gg_statuswin, gg_arguments, gg_arguments+4);
! window_get_size
width = gg_arguments-->0;
height = gg_arguments-->1;
posa = width-26; posb = width-13;
glk($002A, gg_statuswin); ! window_clear
if (statline.trinity)
{
if (location == thedark) {
centerarea = (width/2) - (PrintAnyToArray(bluelalablankage,0, location)/2);
}
else {
FindVisibilityLevels();
if (visibility_ceiling == location)
centerarea = (width/2) - ((PrintAnyToArray(bluelalablankage,0,
location)) / 2);
else
centerarea = (width/2) - (PrintAnyToArray(bluelalablankage,0,
visibility_ceiling)/2);
}
glk_window_move_cursor( gg_statuswin, centerarea, 0);
if (visibility_ceiling == location)
print (name) location;
else
print (The) visibility_ceiling;
}
else {
glk($002B, gg_statuswin, 1, 0); ! window_move_cursor
if (location == thedark) {
print (name) location;
}
else {
FindVisibilityLevels();
if (visibility_ceiling == location)
print (name) location;
else
print (The) visibility_ceiling;
}
if (width > 66) {
glk($002B, gg_statuswin, posa-1, 0); ! window_move_cursor
print (string) SCORE__TX, sline1;
glk($002B, gg_statuswin, posb-1, 0); ! window_move_cursor
print (string) MOVES__TX, sline2;
}
if (width > 53 && width <= 66) {
glk($002B, gg_statuswin, posb-1, 0); ! window_move_cursor
print sline1, "/", sline2;
}
}
glk($002F, gg_mainwin); ! set_window
];
#endif; ! TARGET_GLULX