home · contact · privacy
In web client, switch mode and stats line.
[plomrogue2] / rogue_chat.html
index eb23d1cf3bfeb411f60079bcaf78eac35fa0aa8e..d644d626c960b75df384baa2caaa04106498ccce 100644 (file)
@@ -72,7 +72,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
       <button id="switch_to_name_thing"></button>
       <button id="switch_to_password"></button>
       <button id="switch_to_enter_face"></button>
-      <button id="switch_to_enter_hat"></button>
+      <button id="switch_to_enter_design"></button>
     </td>
   </tr>
   <tr>
@@ -109,7 +109,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
 <li>(un-)wear: <input id="key_wear" type="text" value="W" />
 <li><input id="key_switch_to_drop_thing" type="text" value="u" />
 <li><input id="key_switch_to_enter_face" type="text" value="f" />
-<li><input id="key_switch_to_enter_hat" type="text" value="H" />
+<li><input id="key_switch_to_enter_design" type="text" value="D" />
 <li><input id="key_switch_to_take_thing" type="text" value="z" />
 <li><input id="key_switch_to_chat" type="text" value="t" />
 <li><input id="key_switch_to_play" type="text" value="p" />
@@ -176,13 +176,13 @@ let mode_helps = {
     },
     'enter_face': {
         'short': 'edit face',
-        'intro': '@ enter face line (enter nothing to abort):',
+        'intro': '@ enter face line:',
         'long': 'Draw your face as ASCII art.  The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom.  Eat cookies to extend the ASCII characters available for drawing.'
     },
-    'enter_hat': {
-        'short': 'edit hat',
-        'intro': '@ enter hat line (enter nothing to abort):',
-        'long': 'Draw your hat as ASCII art.  The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom..'
+    'enter_design': {
+        'short': 'edit design',
+        'intro': '@ enter design:',
+        'long': 'Enter design for carried thing as ASCII art.'
     },
     'write': {
         'short': 'edit tile',
@@ -511,6 +511,9 @@ let server = {
         } else if (tokens[0] === 'THING_HAT') {
             let t = game.get_thing_temp(tokens[1]);
             t.hat = tokens[2];
+        } else if (tokens[0] === 'THING_DESIGN') {
+            let t = game.get_thing_temp(tokens[1]);
+            t.design = [parser.parse_yx(tokens[2]), tokens[3]];
         } else if (tokens[0] === 'THING_CHAR') {
             let t = game.get_thing_temp(tokens[1]);
             t.thing_char = tokens[2];
@@ -710,7 +713,7 @@ let tui = {
   mode_take_thing: new Mode('take_thing', true),
   mode_drop_thing: new Mode('drop_thing', true),
   mode_enter_face: new Mode('enter_face', true),
-  mode_enter_hat: new Mode('enter_hat', true),
+  mode_enter_design: new Mode('enter_design', true),
   mode_admin_enter: new Mode('admin_enter', true),
   mode_admin: new Mode('admin'),
   mode_control_pw_pw: new Mode('control_pw_pw', true),
@@ -745,12 +748,12 @@ let tui = {
       this.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type",
                                          "control_tile_type", "chat",
                                          "study", "play", "edit"]
-      this.mode_admin.available_actions = ["move"];
+      this.mode_admin.available_actions = ["move", "toggle_map_mode"];
       this.mode_control_tile_draw.available_modes = ["admin_enter"]
       this.mode_control_tile_draw.available_actions = ["toggle_tile_draw"];
       this.mode_edit.available_modes = ["write", "annotate", "portal", "name_thing",
-                                        "password", "chat", "study", "play",
-                                        "admin_enter", "enter_face", "enter_hat"]
+                                        "enter_design", "password", "chat", "study",
+                                        "play", "admin_enter", "enter_face"]
       this.mode_edit.available_actions = ["move", "flatten", "install",
                                           "toggle_map_mode"]
       this.inputEl = document.getElementById("input");
@@ -813,15 +816,16 @@ let tui = {
                                          || !game.player.carrying.commandable)) {
         return fail('not carrying anything commandable');
     } else if (mode_name == 'name_thing' && !game.player.carrying) {
-        return fail('not carrying anything to re-name');
+        return fail('not carrying anything to re-name', 'edit');
     } else if (mode_name == 'admin_thing_protect' && !game.player.carrying) {
         return fail('not carrying anything to protect')
     } else if (mode_name == 'take_thing' && game.player.carrying) {
         return fail('already carrying something');
     } else if (mode_name == 'drop_thing' && !game.player.carrying) {
         return fail('not carrying anything droppable');
-    } else if (mode_name == 'enter_hat' && !game.player.hat) {
-        return fail('not wearing hat to edit', 'edit');
+    } else if (mode_name == 'enter_design' && (!game.player.carrying
+                                               || !game.player.carrying.design)) {
+        return fail('not carrying designable to edit', 'edit');
     }
     if (mode_name == 'admin_enter' && this.is_admin) {
         mode_name = 'admin';
@@ -891,7 +895,6 @@ let tui = {
                 directed_moves['DOWNRIGHT'] = [1, 0];
             }
         }
-        console.log(directed_moves);
         let select_range = {};
         for (const direction in directed_moves) {
             const move = directed_moves[direction];
@@ -929,8 +932,14 @@ let tui = {
         for (let [i, direction] of this.selectables.entries()) {
             this.log_msg(i + ': ' + direction);
         };
-    } else if (this.mode.name == 'enter_hat') {
-        this.log_msg('legal characters: ' + game.players_hat_chars);
+    } else if (this.mode.name == 'enter_design') {
+        this.log_msg('@ The design you enter must be '
+                     + game.player.carrying.design[0][0] + ' lines of max '
+                     + game.player.carrying.design[0][1] + ' characters width each');
+        if (game.player.carrying.type_ == 'Hat') {
+            this.log_msg('@ Legal characters: ' + game.players_hat_chars);
+            this.log_msg('@ (Eat cookies to extend the ASCII characters available for drawing.)');
+        }
     } else if (this.mode.name == 'command_thing') {
         server.send(['TASK:COMMAND', 'HELP']);
     } else if (this.mode.name == 'control_pw_pw') {
@@ -971,14 +980,15 @@ let tui = {
           if (game.player.carrying && game.player.carrying.protection) {
               this.inputEl.value = game.player.carrying.protection;
           }
-      } else if (['enter_face', 'enter_hat'].includes(this.mode.name)) {
+      } else if (this.mode.name == 'enter_face') {
           const start = this.ascii_draw_stage * 6;
           const end = (this.ascii_draw_stage + 1) * 6;
-          if (this.mode.name == 'enter_face') {
-              this.inputEl.value = game.player.face.slice(start, end);
-          } else if (this.mode.name == 'enter_hat') {
-              this.inputEl.value = game.player.hat.slice(start, end);
-          }
+          this.inputEl.value = game.player.face.slice(start, end);
+      } else if (this.mode.name == 'enter_design') {
+          const width = game.player.carrying.design[0][1];
+          const start = this.ascii_draw_stage * width;
+          const end = (this.ascii_draw_stage + 1) * width;
+          this.inputEl.value = game.player.carrying.design[1].slice(start, end);
       }
   },
   recalc_input_lines: function() {
@@ -1068,18 +1078,26 @@ let tui = {
       this.inputEl.value = "";
       this.switch_mode('play');
   },
-  enter_ascii_art: function(command) {
-      if (this.inputEl.value.length != 6) {
-          this.log_msg('? wrong input length, must be 6; try again');
+  enter_ascii_art: function(command, height, width, with_pw=false) {
+      if (this.inputEl.value.length > width) {
+          this.log_msg('? wrong input length, must be max ' + width + '; try again');
           return;
+      } else if (this.inputEl.value.length < width) {
+          while (this.inputEl.value.length < width) {
+              this.inputEl.value += ' ';
+          }
       }
       this.log_msg('  ' + this.inputEl.value);
       this.full_ascii_draw += this.inputEl.value;
       this.ascii_draw_stage += 1;
-      if (this.ascii_draw_stage < 3) {
+      if (this.ascii_draw_stage < height) {
           this.restore_input_values();
       } else {
-          server.send([command, this.full_ascii_draw]);
+          if (with_pw) {
+              server.send([command, this.full_ascii_draw, this.password]);
+          } else {
+              server.send([command, this.full_ascii_draw]);
+          }
           this.full_ascii_draw = '';
           this.ascii_draw_stage = 0;
           this.inputEl.value = '';
@@ -1219,10 +1237,10 @@ let tui = {
       if (this.mode.has_input_prompt) {
           help = 'enter /help for help';
       }
-      terminal.write(0, this.window_width, 'MODE: ' + this.mode.short_desc + ' – ' + help);
+      terminal.write(1, this.window_width, 'MODE: ' + this.mode.short_desc + ' – ' + help);
   },
   draw_stats_line: function(n) {
-      terminal.write(1, this.window_width,
+      terminal.write(0, this.window_width,
                      'ENERGY: ' + game.energy +
                      ' BLADDER: ' + game.bladder_pressure);
   },
@@ -1498,6 +1516,21 @@ let explorer = {
                          info_to_cache += t.face.slice(6, 12) + '\n';
                          info_to_cache += t.face.slice(12, 18) + '\n';
                      }
+                     if (t.design) {
+                         const line_length = t.design[0][1];
+                         if (t.type_ == 'Sign') {
+                             info_to_cache += '-'.repeat(line_length + 4) + '\n';
+                         }
+                         const regexp = RegExp('.{1,' + line_length + '}', 'g');
+                         const lines = t.design[1].match(regexp);
+                         console.log(lines);
+                         for (const line of lines) {
+                             info_to_cache += '| ' + line + ' |\n';
+                         }
+                         if (t.type_ == 'Sign') {
+                             info_to_cache += '-'.repeat(line_length + 4) + '\n';
+                         }
+                     }
                  }
             }
             let terrain_char = game.map[position_i]
@@ -1595,9 +1628,11 @@ tui.inputEl.addEventListener('keydown', (event) => {
         server.send(['LOGIN', tui.inputEl.value]);
         tui.inputEl.value = "";
     } else if (tui.mode.name == 'enter_face' && event.key == 'Enter') {
-        tui.enter_ascii_art('PLAYER_FACE');
-    } else if (tui.mode.name == 'enter_hat' && event.key == 'Enter') {
-        tui.enter_ascii_art('PLAYER_HAT');
+        tui.enter_ascii_art('PLAYER_FACE', 3, 6);
+    } else if (tui.mode.name == 'enter_design' && event.key == 'Enter') {
+        tui.enter_ascii_art('THING_DESIGN',
+                            game.player.carrying.design[0][0],
+                            game.player.carrying.design[0][1], true);
     } else if (tui.mode.name == 'command_thing' && event.key == 'Enter') {
         server.send(['TASK:COMMAND', tui.inputEl.value]);
         tui.inputEl.value = "";
@@ -1716,6 +1751,8 @@ tui.inputEl.addEventListener('keydown', (event) => {
     } else if (tui.mode.name == 'admin') {
         if (tui.mode.mode_switch_on_key(event)) {
               null;
+        } else if (event.key == tui.keys.toggle_map_mode) {
+            tui.toggle_map_mode();
         } else if (event.key in tui.movement_keys && tui.task_action_on('move')) {
             server.send(['TASK:MOVE', tui.movement_keys[event.key]]);
         };
@@ -1768,7 +1805,10 @@ window.setInterval(function() {
 }, 1000);
 window.setInterval(function() {
     if (document.activeElement.tagName.toLowerCase() != 'input') {
+        const scroll_x = window.scrollX;
+        const scroll_y = window.scrollY;
         tui.inputEl.focus();
+        window.scrollTo(scroll_x, scroll_y);
     };
 }, 100);
 document.getElementById("help").onclick = function() {