home · contact · privacy
Add writable signs.
[plomrogue2] / rogue_chat.html
index 82bfbed97fd8902e48aca9e86bb8ec3e15c109eb..f7d02348195b169a3fe277bec9140ebc6b037202 100644 (file)
@@ -73,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>
@@ -110,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" />
@@ -176,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',
@@ -511,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];
@@ -711,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),
@@ -749,8 +760,9 @@ let tui = {
       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");
@@ -822,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';
@@ -891,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];
@@ -979,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() {
@@ -1068,22 +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 max 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 < 6) {
-          while (this.inputEl.value.length < 6) {
+      } 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 = '';
@@ -1502,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]
@@ -1599,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 = "";