home · contact · privacy
Fix QUERY/msg bug.
[plomrogue2-experiments] / new2 / rogue_chat_nocanvas_monochrome.html
index 906a15483790c7c994ec5a581663145d049abb59..3f907c0432b4eadcc58e5013b04e589b088f7de4 100644 (file)
@@ -59,6 +59,7 @@ let terminal = {
 
 let parser = {
   tokenize: function(str) {
+    let token_ends = [];
     let tokens = [];
     let token = ''
     let quoted = false;
@@ -72,7 +73,7 @@ let parser = {
         } else if (c == '\\') {
           escaped = true;
         } else if (c == '"') {
-           quoted = false
+          quoted = false
         } else {
           token += c;
         }
@@ -80,6 +81,7 @@ let parser = {
         quoted = true
       } else if (c === ' ') {
         if (token.length > 0) {
+          token_ends.push(i);
           tokens.push(token);
           token = '';
         }
@@ -90,7 +92,11 @@ let parser = {
     if (token.length > 0) {
       tokens.push(token);
     }
-    return tokens;
+    let token_starts = [];
+    for (let i = 0; i < token_ends.length; i++) {
+      token_starts.push(token_ends[i] - tokens[i].length);
+    };
+    return [tokens, token_starts];
   },
   parse_yx(position_string) {
     let coordinate_strings = position_string.split(',')
@@ -176,18 +182,18 @@ let tui = {
     terminal.drawBox(terminal.rows - 1, terminal.cols / 2, 1, terminal.cols / 2);
     terminal.write(terminal.rows - 1, terminal.cols / 2, chat.input_line);
   },
-  log_msg: function(msg, indent=0) {
-    let line_length = (terminal.cols / 2) - indent;
+  log_msg: function(msg) {
+    let line_length = (terminal.cols / 2);
     let chunk = "";
     for (let i = 0, x = 0; i < msg.length; i++, x++) {
       if (x >= line_length) {
-       chat.history.unshift(' '.repeat(indent) + chunk);
-       chunk = "";
+        chat.history.unshift(chunk);
+        chunk = "";
         x = 0;
       };
       chunk += msg[i];
     }
-    chat.history.unshift(' '.repeat(indent) + chunk);
+    chat.history.unshift(chunk);
     while (chat.history.length > terminal.rows - 2) {
       chat.history.pop();
     };
@@ -198,21 +204,34 @@ let tui = {
   },
   log_help: function() {
     tui.log_msg("");
-    tui.log_msg("HELP", 1);
-    tui.log_msg("chat mode commands:", 1);
+    tui.log_msg("HELP");
+    tui.log_msg("chat mode commands:");
+    tui.log_msg("");
+    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 - switch to play mode");
     tui.log_msg("");
-    tui.log_msg("/login USER - register as USER", 3);
-    tui.log_msg("/msg USER TEXT - send TEXT to USER", 3);
-    tui.log_msg("/help - show this help", 3);
-    tui.log_msg("/play - switch to game mode", 3);
+    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 explore mode");
     tui.log_msg("");
-    tui.log_msg("map mode commands:", 1);
-    tui.log_msg("w, a, s, d - move avatar", 3);
-    tui.log_msg("f - flatten surroundings", 3);
-    tui.log_msg("e - write following ASCII character", 3);
-    tui.log_msg("c - switch to chat mode", 3);
+    tui.log_msg("explore mode commands:");
+    tui.log_msg("w, a, s, d - move question mark");
+    tui.log_msg("c - switch to chat mode");
+    tui.log_msg("p - switch to play mode");
     tui.log_msg("");
   },
+  draw_info: function() {
+    terminal.drawBox(0, terminal.cols / 2, terminal.rows, terminal.cols / 2);
+    let lines = ['unfinished info screen'];
+    for (let y = 0, i = 0; y < terminal.rows && i < lines.length; y++, i++) {
+      terminal.write(y, terminal.cols / 2, lines[i]);
+    }
+  },
   full_refresh: function() {
     this.draw_map();
     this.draw_turn_line();
@@ -241,7 +260,7 @@ tui.full_refresh();
 
 let websocket = new WebSocket(websocket_location);
 websocket.onmessage = function (event) {
-  let tokens = parser.tokenize(event.data);
+  let tokens = parser.tokenize(event.data)[0];
   if (tokens[0] === 'TURN') {
     game.things = {}
     game.turn = parseInt(tokens[1]);
@@ -254,27 +273,27 @@ websocket.onmessage = function (event) {
     tui.draw_turn_line();
     tui.draw_map();
     tui.refresh();
-  } else if (tokens[0] === 'LOG') {
-     tui.log_msg(tokens[1], 1);
+  } else if (tokens[0] === 'CHAT') {
+     tui.log_msg('# ' + tokens[1], 1);
      tui.refresh();
   } else if (tokens[0] === 'PLAYER_ID') {
       game.player_id = parseInt(tokens[1]);
   } else if (tokens[0] === 'META') {
-     tui.log_msg(tokens[1]);
+     tui.log_msg('@ ' + tokens[1]);
      tui.refresh();
   } else if (tokens[0] === 'UNHANDLED_INPUT') {
-     tui.log_msg('unknown command');
+     tui.log_msg('unknown command');
      tui.refresh();
   } else if (tokens[0] === 'ARGUMENT_ERROR') {
-     tui.log_msg('syntax error: ' + tokens[1]);
+     tui.log_msg('syntax error: ' + tokens[1]);
      tui.refresh();
   } else if (tokens[0] === 'GAME_ERROR') {
-     tui.log_msg('game error: ' + tokens[1]);
+     tui.log_msg('game error: ' + tokens[1]);
      tui.refresh();
   } else if (tokens[0] === 'PONG') {
     console.log('PONG');
   } else {
-     tui.log_msg('unhandled input: ' + event.data);
+     tui.log_msg('unhandled input: ' + event.data);
      tui.refresh();
   }
 }
@@ -300,6 +319,7 @@ let explorer = {
             && !(try_pos[1] >= game.map_size[1])) {
             this.position = try_pos;
             tui.draw_map();
+            tui.draw_info();
             tui.refresh();
         }
     }
@@ -316,7 +336,7 @@ document.addEventListener('keydown', (event) => {
             tui.draw_input_line();
             tui.refresh();
         } else if (event.key == 'Enter') {
-            let tokens = parser.tokenize(chat.input_line);
+            let [tokens, token_starts] = parser.tokenize(chat.input_line);
             if (tokens.length > 0 && tokens[0].length > 0) {
                 if (tokens[0][0] == '/') {
                     if (tokens[0] == '/play') {
@@ -328,16 +348,17 @@ document.addEventListener('keydown', (event) => {
                         if (tokens.length > 1) {
                             websocket.send('LOGIN ' + quote(tokens[1]));
                         } else {
-                            tui.log_msg('need login name');
+                            tui.log_msg('need login name');
                         }
                     } else if (tokens[0] == '/msg') {
                         if (tokens.length > 2) {
-                            websocket.send('QUERY ' + quote(tokens[1]) + ' ' + quote(tokens[2]));
+                            let msg = chat.input_line.slice(token_starts[2]);
+                            websocket.send('QUERY ' + quote(tokens[1]) + ' ' + quote(msg));
                         } else {
-                            tui.log_msg('need message target and message');
+                            tui.log_msg('need message target and message');
                         }
                     } else {
-                        tui.log_msg('unknown command');
+                        tui.log_msg('unknown command');
                     }
                 } else {
                     websocket.send('ALL ' + quote(chat.input_line));