1:- module(ap_ui,
2 [ banner/0,
3 pause/0,
4 prompt_string/3,
5 prompt_number/5,
6 prompt_choice/4,
7 clear_screen/0
8 ]). 9
10:- use_module(library(readutil)). 11
12banner :-
13 format('~n', []),
14 format(' █████ ANTISIPASI PEJABAT █████~n', []),
15 format(' Indonesian Civil Demonstration Risk Simulator~n', []),
16 format(' v0.1.0.0 | full SWI-Prolog | terminal~n', []),
17 format(' "sebelum tiket makin bengkak" edition 💀~n', []),
18 format('------------------------------------------------------------~n', []),
19 format('Simulasi agregat. Bukan alat pengawasan individu / represi.~n~n', []).
20
21pause :-
22 format('~nTekan ENTER untuk lanjut...', []), flush_output,
23 read_line_to_string(user_input, _).
24
25prompt_string(Label, Default, Value) :-
26 format('~w [~w]: ', [Label, Default]), flush_output,
27 read_line_to_string(user_input, S0),
28 normalize_space(string(S), S0),
29 ( S == "" -> Value = Default ; Value = S ).
30
31prompt_number(Label, Min, Max, Default, Value) :-
32 repeat,
33 format('~w (~w-~w) [~w]: ', [Label, Min, Max, Default]), flush_output,
34 read_line_to_string(user_input, S0), normalize_space(string(S), S0),
35 ( S == "" -> Value = Default, !
36 ; catch(number_string(N, S), _, fail), N >= Min, N =< Max -> Value=N, !
37 ; format('Input harus angka ~w sampai ~w.~n', [Min, Max]), fail
38 ).
39
40prompt_choice(Label, Options, DefaultIndex, Value) :-
41 format('~n~w~n', [Label]),
42 forall(member(I-_V-Text, Options), format(' [~w] ~w~n', [I, Text])),
43 repeat,
44 format('Pilih [~w]: ', [DefaultIndex]), flush_output,
45 read_line_to_string(user_input, S0), normalize_space(string(S), S0),
46 ( S == "" -> I=DefaultIndex
47 ; catch(number_string(I, S), _, fail)
48 ),
49 ( memberchk(I-Value-_, Options) -> ! ; format('Pilihan tidak valid.~n', []), fail ).
50
51clear_screen :-
52 ( current_prolog_flag(windows, true) -> shell('cls') ; shell('clear') ), !.
53clear_screen