home · contact · privacy
Add writable signs.
[plomrogue2] / rogue_chat.html
index 47bf58d3aa4c937dfe5b078a6a161c25349ccd16..f7d02348195b169a3fe277bec9140ebc6b037202 100644 (file)
@@ -54,6 +54,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
       <button id="switch_to_drop_thing"></button>
       <button id="door"></button>
       <button id="consume"></button>
+      <button id="dance"></button>
       <button id="switch_to_command_thing"></button>
       <button id="teleport"></button>
       <button id="wear"></button>
@@ -72,6 +73,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
       <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>
@@ -101,6 +103,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
 <li>flatten surroundings: <input id="key_flatten" type="text" value="F" />
 <li>teleport: <input id="key_teleport" type="text" value="p" />
 <li>spin: <input id="key_spin" type="text" value="S" />
+<li>dance: <input id="key_dance" type="text" value="T" />
 <li>open/close: <input id="key_door" type="text" value="D" />
 <li>consume: <input id="key_consume" type="text" value="C" />
 <li>install: <input id="key_install" type="text" value="I" />
@@ -108,6 +111,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
 <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" />
@@ -174,13 +178,18 @@ 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_design': {
+        'short': 'edit design',
+        'intro': '@ enter design:',
+        'long': 'Enter design for carried thing as ASCII art.'
+    },
     '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..'
+        'intro': '@ enter hat line:',
+        '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.  Eat cookies to extend the ASCII characters available for drawing.'
     },
     'write': {
         'short': 'edit tile',
@@ -262,6 +271,7 @@ let key_descriptions = {
     'install': '(un-)install',
     'wear': '(un-)wear',
     'spin': 'spin',
+    'dance': 'dance',
     'toggle_map_mode': 'toggle map view',
     'toggle_tile_draw': 'toggle protection character drawing',
     'hex_move_upleft': 'up-left',
@@ -508,6 +518,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];
@@ -708,6 +721,7 @@ let tui = {
   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),
@@ -724,6 +738,7 @@ let tui = {
       'command': 'COMMAND',
       'consume': 'INTOXICATE',
       'spin': 'SPIN',
+      'dance': 'DANCE',
   },
   offset: [0,0],
   map_lines: [],
@@ -735,18 +750,19 @@ let tui = {
       this.mode_play.available_modes = ["chat", "study", "edit", "admin_enter",
                                         "command_thing", "take_thing", "drop_thing"]
       this.mode_play.available_actions = ["move", "teleport", "door", "consume",
-                                          "wear", "spin"];
+                                          "wear", "spin", "dance"];
       this.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"]
       this.mode_study.available_actions = ["toggle_map_mode", "move_explorer"];
       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",
+                                        "enter_hat"]
       this.mode_edit.available_actions = ["move", "flatten", "install",
                                           "toggle_map_mode"]
       this.inputEl = document.getElementById("input");
@@ -809,7 +825,7 @@ 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) {
@@ -818,6 +834,9 @@ let tui = {
         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';
@@ -887,7 +906,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];
@@ -975,6 +993,11 @@ let tui = {
           } else if (this.mode.name == 'enter_hat') {
               this.inputEl.value = game.player.hat.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() {
@@ -1064,18 +1087,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 = '';
@@ -1494,6 +1525,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]
@@ -1591,9 +1637,13 @@ 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');
+        tui.enter_ascii_art('PLAYER_FACE', 3, 6);
     } else if (tui.mode.name == 'enter_hat' && event.key == 'Enter') {
-        tui.enter_ascii_art('PLAYER_HAT');
+        tui.enter_ascii_art('PLAYER_HAT', 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 = "";
@@ -1686,6 +1736,8 @@ tui.inputEl.addEventListener('keydown', (event) => {
               server.send(["TASK:WEAR"]);
           } else if (event.key === tui.keys.spin && tui.task_action_on('spin')) {
               server.send(["TASK:SPIN"]);
+          } else if (event.key === tui.keys.dance && tui.task_action_on('dance')) {
+              server.send(["TASK:DANCE"]);
           } else if (event.key in tui.movement_keys && tui.task_action_on('move')) {
               server.send(['TASK:MOVE', tui.movement_keys[event.key]]);
           } else if (event.key === tui.keys.teleport) {
@@ -1710,6 +1762,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]]);
         };
@@ -1762,7 +1816,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() {
@@ -1801,6 +1858,9 @@ document.getElementById("wear").onclick = function() {
 document.getElementById("spin").onclick = function() {
     server.send(['TASK:SPIN']);
 };
+document.getElementById("dance").onclick = function() {
+    server.send(['TASK:DANCE']);
+};
 document.getElementById("teleport").onclick = function() {
     game.teleport();
 };