1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/inform6/Tests/include/punylib-16/ext_menu.h
2022-03-06 23:37:05 +00:00

167 lines
3.9 KiB
C
Executable file

System_file;
Global menu_item;
Global item_width;
Global item_name;
Global menu_nesting;
#IfV3;
[ DoMenu menu_choices EntryR ChoiceR lines main_title i j;
menu_choices = 0; ! Avoid warning
menu_nesting++;
.LKRD;
menu_item = 0;
lines = indirect(EntryR);
main_title = item_name;
print "--- "; print (string) main_title; print " ---^^";
!if (menu_choices ofclass Routine) menu_choices.call();
!else print (string) menu_choices;
print "There is information provided on the following:^^";
for(i = 1: i <= lines: i++) {
menu_item = i;
indirect(EntryR);
print i, ": ", (string) item_name, "^";
}
if(menu_nesting == 1) {
print "q: Resume the game^";
} else {
print "q: Previous menu^";
}
for (::) {
print "^Select 1 to ", lines, " or ENTER to show the options again.^";
print "> ";
_ReadPlayerInput(true);
j = parse->1; ! number of words
if (j == 0) jump LKRD;
i = parse-->1;
if(i == 'q//') {
menu_nesting--; if (menu_nesting > 0) rfalse;
if (deadflag == 0) <<Look>>;
rfalse;
}
i = TryNumber(1);
if (i < 1 || i > lines) continue;
menu_item = i;
j = indirect(EntryR);
print "^--- "; print (string) item_name; print " ---^^";
j = indirect(ChoiceR);
if (j == 2) jump LKRD;
if (j == 3) rfalse;
}
];
#IfNot;
Constant NKEY__TX = "N = next subject";
Constant PKEY__TX = "P = previous";
Constant QKEY1__TX = " Q = resume game";
Constant QKEY2__TX = "Q = previous menu";
Constant RKEY__TX = "RETURN = read subject";
Constant NKEY1__KY = 'N';
Constant NKEY2__KY = 'n';
Constant PKEY1__KY = 'P';
Constant PKEY2__KY = 'p';
Constant QKEY1__KY = 'Q';
Constant QKEY2__KY = 'q';
[ DoMenu menu_choices EntryR ChoiceR
lines main_title main_wid cl i j oldcl pkey ch cw y x;
menu_nesting++;
menu_item = 0;
lines = indirect(EntryR);
main_title = item_name; main_wid = item_width;
cl = 7;
.ReDisplay;
oldcl = 0;
@erase_window $ffff;
ch = 1;
i = ch * (lines+7);
@split_window i;
i = HDR_SCREENWCHARS->0;
if (i == 0) i = 80;
@set_window 1;
@set_cursor 1 1;
cw = 1;
style reverse;
spaces(i); j=1+(i/2-main_wid)*cw;
@set_cursor 1 j;
print (string) main_title;
y=1+ch; @set_cursor y 1; spaces(i);
x=1+cw; @set_cursor y x; print (string) NKEY__TX;
j=1+(i-13)*cw; @set_cursor y j; print (string) PKEY__TX;
y=y+ch; @set_cursor y 1; spaces(i);
@set_cursor y x; print (string) RKEY__TX;
j=1+(i-18)*cw; @set_cursor y j;
if (menu_nesting == 1) print (string) QKEY1__TX;
else print (string) QKEY2__TX;
style roman;
y = y+2*ch;
@set_cursor y x; font off;
if (menu_choices ofclass String) print (string) menu_choices;
else menu_choices.call();
x = 1+3*cw;
for (::) {
if (cl ~= oldcl) {
if (oldcl>0) {
y=1+(oldcl-1)*ch; @set_cursor y x; print " ";
}
y=1+(cl-1)*ch; @set_cursor y x; print ">";
}
oldcl = cl;
@read_char 1 -> pkey;
if (pkey == NKEY1__KY or NKEY2__KY or 130) {
cl++; if (cl == 7+lines) cl = 7; continue;
}
if (pkey == PKEY1__KY or PKEY2__KY or 129) {
cl--; if (cl == 6) cl = 6+lines; continue;
}
if (pkey == QKEY1__KY or QKEY2__KY or 27 or 131) break;
if (pkey == 10 or 13 or 132) {
@set_window 0; font on;
new_line; new_line; new_line;
menu_item = cl-6;
EntryR.call();
@erase_window $ffff;
@split_window ch;
i = HDR_SCREENWCHARS->0; if ( i== 0) i = 80;
@set_window 1; @set_cursor 1 1; style reverse; spaces(i);
j=1+(i/2-item_width)*cw;
@set_cursor 1 j;
print (string) item_name;
style roman; @set_window 0; new_line;
i = ChoiceR.call();
if (i == 2) jump ReDisplay;
if (i == 3) break;
print "^[Please press SPACE.]";
@read_char 1 -> pkey; jump ReDisplay;
}
}
menu_nesting--; if (menu_nesting > 0) rfalse;
font on; @set_cursor 1 1;
@erase_window $ffff; @set_window 0;
new_line; new_line; new_line;
if (deadflag == 0) <<Look>>;
];
#EndIf;