let terminal = {
rows: 24,
cols: 80,
+ foreground: 'white',
+ background: 'black',
initialize: function() {
this.pre_el = document.getElementById("terminal");
+ this.pre_el.style.color = this.foreground;
+ this.pre_el.style.backgroundColor = this.background;
this.content = [];
let line = []
for (let y = 0, x = 0; y <= this.rows; x++) {
line.push(' ');
}
},
+ blink_screen: function() {
+ this.pre_el.style.color = this.background;
+ this.pre_el.style.backgroundColor = this.foreground;
+ setTimeout(() => {
+ this.pre_el.style.color = this.foreground;
+ this.pre_el.style.backgroundColor = this.background;
+ }, 100);
+ },
refresh: function() {
let pre_string = '';
for (let y = 0; y < this.rows; y++) {
this.shows_annotations = shows_annotations;
}
}
+let mode_login = new Mode('login', true, false);
let mode_chat = new Mode('chat', true, false);
let mode_annotate = new Mode('annotate', true, true);
let mode_play = new Mode('play', false, false);
let mode_edit = new Mode('edit', false, false);
let tui = {
- mode: mode_chat,
+ mode: mode_login,
log: [],
+ input_prompt: '> ',
input: '',
input_lines: [],
window_width: terminal.cols / 2,
init: function() {
this.recalc_input_lines();
this.height_header = this.height_turn_line + this.height_mode_line;
+ this.log_msg("Please enter your username:");
},
switch_mode: function(mode, keep_pos=false) {
if (mode == mode_study && !keep_pos) {
}
this.mode = mode;
this.empty_input();
+ if (mode == mode_annotate && explorer.position in explorer.info_db) {
+ let info = explorer.info_db[explorer.position];
+ if (info != "(none)") {
+ this.add_to_input(explorer.info_db[explorer.position]);
+ }
+ }
this.full_refresh();
},
draw_mode_line: function() {
}
},
add_to_input: function(str) {
- if (this.input.length + str.length > this.window_width * terminal.rows) {
+ if (this.input_prompt.length + this.input.length + str.length > this.window_width * terminal.rows) {
return;
}
this.input += str;
this.recalc_input_lines();
},
recalc_input_lines: function() {
- this.input_lines = this.msg_into_lines_of_width("> " + this.input, this.window_width);
+ this.input_lines = this.msg_into_lines_of_width(this.input_prompt + this.input, this.window_width);
this.height_input = this.input_lines.length;
},
shorten_input: function() {
- this.input = tui.input.slice(0, -1);
- this.recalc_input_lines();
+ if (this.input.length == 0) {
+ terminal.blink_screen();
+ } else {
+ this.input = tui.input.slice(0, -1);
+ this.recalc_input_lines();
+ }
},
draw_input: function() {
terminal.drawBox(terminal.rows - this.height_input, this.window_width, this.height_input, this.window_width);
terminal.refresh();
},
log_help: function() {
- tui.log_msg("");
- tui.log_msg("HELP");
- tui.log_msg("");
- tui.log_msg("chat mode commands:");
- tui.log_msg(":login USER - register as USER");
- tui.log_msg(":msg USER TEXT - send TEXT to USER");
- tui.log_msg(":help - show this help");
- tui.log_msg(":play or :p - switch to play mode");
- tui.log_msg(":study or :s - switch to study mode");
- tui.log_msg("");
- tui.log_msg("play mode commands:");
- tui.log_msg("w, a, s, d - move avatar");
- tui.log_msg("f - flatten surroundings");
- tui.log_msg("e - write following ASCII character");
- tui.log_msg("c - switch to chat mode");
- tui.log_msg("? - switch to study mode");
- tui.log_msg("");
- tui.log_msg("study mode commands:");
- tui.log_msg("w, a, s, d - move question mark");
- tui.log_msg("A - annotate terrain");
- tui.log_msg("c - switch to chat mode");
- tui.log_msg("p - switch to play mode");
- tui.log_msg("");
+ this.log_msg("");
+ this.log_msg("HELP");
+ this.log_msg("");
+ this.log_msg("chat mode commands:");
+ this.log_msg(":nick NAME - re-name yourself to NAME");
+ this.log_msg(":msg USER TEXT - send TEXT to USER");
+ this.log_msg(":help - show this help");
+ this.log_msg(":play or :p - switch to play mode");
+ this.log_msg(":study or :s - switch to study mode");
+ this.log_msg("");
+ this.log_msg("play mode commands:");
+ this.log_msg("w, a, s, d - move avatar");
+ this.log_msg("f - flatten surroundings");
+ this.log_msg("e - write following ASCII character");
+ this.log_msg("c - switch to chat mode");
+ this.log_msg("? - switch to study mode");
+ this.log_msg("");
+ this.log_msg("study mode commands:");
+ this.log_msg("w, a, s, d - move question mark");
+ this.log_msg("A - annotate terrain");
+ this.log_msg("c - switch to chat mode");
+ this.log_msg("p - switch to play mode");
+ this.log_msg("");
},
draw_info: function() {
terminal.drawBox(this.height_header, this.window_width, terminal.rows - this.height_header - this.height_input, this.window_width);
terminal.initialize();
tui.init();
-tui.log_help();
tui.full_refresh();
server.init(websocket_location);
} else if (tokens[0] === 'META') {
tui.log_msg('@ ' + tokens[1]);
tui.refresh();
+ } else if (tokens[0] === 'LOGIN_OK') {
+ tui.log_msg('@ ' + tokens[1]);
+ tui.log_help();
+ tui.switch_mode(mode_chat);
} else if (tokens[0] === 'ANNOTATION') {
let position = parser.parse_yx(tokens[1]);
explorer.update_info_db(position, tokens[2]);
} else if (tokens[0] === 'UNHANDLED_INPUT') {
tui.log_msg('? unknown command');
tui.refresh();
+ } else if (tokens[0] === 'PLAY_ERROR') {
+ terminal.blink_screen();
} else if (tokens[0] === 'ARGUMENT_ERROR') {
tui.log_msg('? syntax error: ' + tokens[1]);
tui.refresh();
} else if (tui.mode.has_input_prompt && event.key == 'Backspace') {
tui.shorten_input();
tui.full_refresh();
+ } else if (tui.mode == mode_login && event.key == 'Enter') {
+ server.send(['LOGIN', tui.input]);
+ tui.switch_mode(mode_login);
} else if (tui.mode == mode_annotate && event.key == 'Enter') {
explorer.annotate(tui.input);
tui.switch_mode(mode_study, true);
} else if (tokens[0] == ':help') {
tui.log_help();
tui.refresh();
- } else if (tokens[0] == ':login') {
+ } else if (tokens[0] == ':nick') {
if (tokens.length > 1) {
server.send(['LOGIN', tokens[1]]);
} else {