home · contact · privacy
Guide user interaction based on server availability.
[plomrogue2-experiments] / new2 / rogue_chat_nocanvas_monochrome.html
index 096b6d55fa3f8eee0726999b57b1faa44bae5da6..d7e00180dea297527480957269d77bc4f20fa967 100644 (file)
@@ -124,11 +124,16 @@ let server = {
         this.websocket = new WebSocket(url);
         this.websocket.onopen = function(event) {
             window.setInterval(function() { server.send(['PING']) }, 30000);
-            server.send(['GET_GAMESTATE']);
+            tui.log_msg("@ server connected!");
+            tui.init_login();
         };
     },
     send: function(tokens) {
-        this.websocket.send(unparser.untokenize(tokens));
+        if (this.websocket.readyState !== WebSocket.OPEN) {
+            tui.log_msg('server disconnected :(');
+        } else {
+            this.websocket.send(unparser.untokenize(tokens));
+        }
     }
 }
 
@@ -164,6 +169,8 @@ class Mode {
         this.shows_annotations = shows_annotations;
     }
 }
+let mode_waiting_for_server = new Mode('waiting_for_server', false, false);
+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);
@@ -171,8 +178,9 @@ let mode_study = new Mode('study', false, true);
 let mode_edit = new Mode('edit', false, false);
 
 let tui = {
-  mode: mode_chat,
+  mode: mode_waiting_for_server,
   log: [],
+  input_prompt: '> ',
   input: '',
   input_lines: [],
   window_width: terminal.cols / 2,
@@ -182,6 +190,11 @@ let tui = {
   init: function() {
       this.recalc_input_lines();
       this.height_header = this.height_turn_line + this.height_mode_line;
+      this.log_msg("@ waiting for server connection ...");
+  },
+  init_login: function() {
+      this.log_msg("@ please enter your username:");
+      this.switch_mode(mode_login);
   },
   switch_mode: function(mode, keep_pos=false) {
     if (mode == mode_study && !keep_pos) {
@@ -189,6 +202,12 @@ let tui = {
     }
     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() {
@@ -258,14 +277,14 @@ let tui = {
       }
   },
   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() {
@@ -310,29 +329,29 @@ let tui = {
     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);
@@ -365,7 +384,6 @@ let game = {
 
 terminal.initialize();
 tui.init();
-tui.log_help();
 tui.full_refresh();
 
 server.init(websocket_location);
@@ -395,6 +413,11 @@ server.websocket.onmessage = function (event) {
   } else if (tokens[0] === 'META') {
      tui.log_msg('@ ' + tokens[1]);
      tui.refresh();
+  } else if (tokens[0] === 'LOGIN_OK') {
+      server.send(['GET_GAMESTATE']);
+      tui.log_help();
+      tui.log_msg('@ ' + tokens[1]);
+      tui.switch_mode(mode_chat);
   } else if (tokens[0] === 'ANNOTATION') {
      let position = parser.parse_yx(tokens[1]);
      explorer.update_info_db(position, tokens[2]);
@@ -483,6 +506,9 @@ document.addEventListener('keydown', (event) => {
     } 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);
@@ -497,7 +523,7 @@ document.addEventListener('keydown', (event) => {
                 } 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 {