1/*                   
    2% NomicMUD: A MUD server written in Prolog
    3% Maintainer: Douglas Miles
    4% Dec 13, 2035
    5%
    6% Bits and pieces:
    7%
    8% LogicMOO, Inform7, FROLOG, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    9% 
   10% Copyright (C) 2004 Marty White under the GNU GPL 
   11% Sept 20,1999 - Douglas Miles
   12% July 10,1996 - John Eikenberry 
   13%
   14% Logicmoo Project changes:
   15%
   16% Main file.
   17%
   18*/
   19% Marty's Tokenizer/Scanner/Lexer, written in Prolog.
   20:- module(adv_io_key,[
   21
   22
   23 wait_for_key/0,
   24     wait_for_key/1,
   25     keyboard_init/0,
   26 pprint/2,
   27 init_logging/0,
   28 stop_logging/0,
   29 bug/1,
   30 agent_to_input/2,
   31 agent_to_output/2,
   32 get_overwritten_chars/2,
   33 restore_overwritten_chars/1,
   34 %setup_console/0, 
   35 setup_console/1,
   36
   37 current_error/1,set_error/1]).   38
   39
   40mutex_create_safe(M):- notrace(catch(mutex_create(M),_,true)).
   41
   42messages_init:-
   43 mutex_create_safe(messages).
   44
   45flag(N,V):-
   46 flag(N,_,V).
   47
   48% FIXME - word wrap
   49% post_message(M):-
   50% atom_length(M,N),N>72
   51post_message(M):-
   52 with_mutex(messages,(post_message_int(M),
   53      flag(unacked_messages,_,1))),
   54 nop(request_screen_update(0,0,1,80)).
   55
   56post_message(F,L):-
   57 atom(A) = AtomStream,
   58 format(AtomStream,F,L),post_message(A).
   59
   60post_message_int(M):-
   61 flag(line0,'',M),
   62 atom_length(M,L),
   63 flag(requested_cursor_row,_,0),
   64 flag(requested_cursor_col,_,L),!.
   65post_message_int(M):-
   66 \+(more_prompt),
   67 flag(line0,OL),
   68 atom_length(OL,OLL),
   69 atom_length(M,ML),
   70 OLL+ML=<70,
   71 concat_atom([OL,' ',M],NL),
   72 flag(line0,_,NL),
   73 atom_length(NL,Len),
   74 flag(requested_cursor_row,_,0),
   75 flag(requested_cursor_col,_,Len),!.
   76post_message_int(M):-
   77 more_prompt,
   78 recordz(messages,M),!.
   79post_message_int(M):-
   80 flag(more_prompt,_,1),
   81 flag(line0,OL),
   82 atom_concat(OL,' [More]',NL),
   83 flag(line0,_,NL),!,
   84 post_message_int(M).
   85
   86more_prompt:-flag(more_prompt,1).
   87
   88ack_messages:-flag(unacked_messages,0).
   89ack_messages:-
   90 with_mutex(messages,(
   91  flag(line0,_,''),
   92  flag(unacked_messages,_,0),
   93  flag(more_prompt,_,0),
   94  flag(requested_cursor_row,_,0),
   95  flag(requested_cursor_col,_,0),
   96  gather_messages(L),
   97  (L=[];flag(unacked_messages,_,1),resend_messages(L))
   98 )),
   99 nop(request_screen_update(0,0,1,80)).
  100
  101gather_messages([H|T]):-
  102 recorded(messages,H,R),
  103 erase(R),
  104 !,gather_messages(T).
  105gather_messages([]).
  106
  107resend_messages([H|T]):-
  108 post_message_int(H),!,resend_messages(T).
  109resend_messages([]).
  110
  111/*
  112sv_message(S,V):-
  113 care_about(S),
  114 sconj(S,SC),
  115 vconj(S,V,VC),
  116 post_message('~w ~w.',[SC,VC]),!.
  117sv_message(_,_).
  118
  119svo_message(S,V,O):-
  120 care_about(S),care_about(O),
  121 sconj(S,SC),
  122 vconj(S,V,VC),
  123 oconj(S,O,OC),
  124 post_message('~w ~w ~w.',[SC,VC,OC]),!.
  125svo_message(S,V,_):-
  126 care_about(S), % not care_about(O),
  127 sconj(S,SC),
  128 vconj(S,V,VC),
  129 post_message('~w ~w it.',[SC,VC]),!.
  130svo_message(_,V,O):-
  131 care_about(O), % not care_about(S),
  132 vconj(it,V,VC),
  133 oconj(it,O,OC),
  134 post_message('It ~w ~w.',[VC,OC]),!.
  135svo_message(_,_,_).
  136
  137svi_message(S,V,I):-
  138 care_about(S),
  139 sconj(S,SC),
  140 vconj(S,V,VC),
  141 post_message('~w ~w ~w.',[SC,VC,I]),!.
  142svi_message(_,_,_).
  143
  144svoi_message(S,V,O,I):-
  145 care_about(S),care_about(O),
  146 sconj(S,SC),
  147 vconj(S,V,VC),
  148 oconj(S,O,OC),
  149 post_message('~w ~w ~w ~w.',[SC,VC,OC,I]),!.
  150svoi_message(S,V,_,I):-
  151 care_about(S), % not care_about(O),
  152 sconj(S,SC),
  153 vconj(S,V,VC),
  154 post_message('~w ~w it ~w.',[SC,VC,I]),!.
  155svoi_message(_,V,O,I):-
  156 care_about(O), % not care_about(S),
  157 vconj(it,V,VC),
  158 oconj(it,O,OC),
  159 post_message('It ~w ~w ~w.',[VC,OC,I]),!.
  160svoi_message(_,_,_,_).
  161
  162care_about(player).
  163care_about(O):-
  164 attribute(player-dungeon,D),attribute(O-dungeon,D),
  165 attribute(player-level,L),attribute(O-level,L),
  166 attribute(O-row,R),attribute(O-column,C),
  167 visible(R,C),
  168log_stuff('viz~n',[]).
  169*/
  170
  171:-dynamic key_translate/2.  172
  173%:-include(gheader).
  174
  175%:-use_module(screen).
  176%:-use_module(messages).
  177
  178% FIXME dynamify key translations
  179
  180key_translate(['\014\'],redraw). 
  181
  182key_translate(['\033\','[','A'],up).
  183key_translate(['\033\','[','B'],down).
  184key_translate(['\033\','[','C'],right).
  185key_translate(['\033\','[','D'],left).
  186
  187key_translate(['\033\','[','5','~'],page_up).
  188key_translate(['\033\','[','6','~'],page_down).
  189
  190key_translate(['\033\',K],meta(K)):-char_type(K,alnum). %'
  191
  192keyboard_thread(Buffer):-
  193 set_stream(user_input,buffer(none)),
  194 get_single_char(Code),char_code(Key,Code),
  195 append(Buffer,[Key],NB),
  196 !,process_buffer(NB).
  197
  198process_buffer([]):-!,keyboard_thread([]).
  199process_buffer(NB):-
  200 key_translate(NNB,_),
  201 append(NB,X,NNB),X\=[],
  202 !,keyboard_thread(NB).
  203process_buffer(NB):-
  204 append(NBA,NBB,NB),
  205 key_translate(NBA,Key),
  206% log_stuff('got key ~w.~n',[Key]),
  207 global_key_hook(Key),
  208 !,process_buffer(NBB).
  209process_buffer([K|T]):-
  210 nop(log_stuff('got key ~w.~n',[K])),global_key_hook(K),!,process_buffer(T).
  211/*
  212global_key_hook(redraw):-!,request_screen_update(redraw).
  213global_key_hook(meta(h)):-!,
  214 attribute(player-hit_points,H),
  215 HH is H+random(6)+1,
  216 attribute(player-hit_points,_,HH),
  217 request_screen_update(23,0,1,10).
  218global_key_hook(meta(t)):-!,threads.
  219global_key_hook(meta(l)):-
  220 (dungeon:player_dungeon(R,C,A,B),
  221 log_stuff('~w~n',[player_dungeon(R,C,A,B)]),fail;true),!.
  222*/
  223keystrokes_thread_name(keystrokes).
  224
  225global_key_hook(Key):-
  226 keystrokes_thread_name(Keystrokes),
  227 with_mutex(messages,(
  228  nop(more_prompt),(Key=' ',nop(ack_messages);true);
  229  nop(ack_messages),thread_send_message(Keystrokes,Key)
  230 )),!.
  231
  232keyboard_init:-
  233 keystrokes_thread_name(Keystrokes),
  234 (message_queue_property(_, alias(Keystrokes))->true;message_queue_create(Keystrokes)),
  235 thread_create(keyboard_thread([]),_,[]).
  236
  237wait_for_key(Key):-
  238 keystrokes_thread_name(Keystrokes),
  239 thread_get_message(Keystrokes,Key).
  240
  241wait_for_key:-wait_for_key(_)