home · contact · privacy
Allow toggling of map control preset drawing.
[plomrogue2] / rogue_chat.html
index 35dc5d4aa812e88907dcdc80348f12e04b0476f2..a09892dbc86576e8db2d437a29e22212e09508c2 100644 (file)
@@ -16,7 +16,7 @@ terminal rows: <input id="n_rows" type="number" step=4 min=24 value=24 />
 </div>
 <div style="position: relative; display: inline-block;">
 <pre id="terminal"></pre>
-<textarea id="input" style="position: absolute; left: 0; height: 100%; width: 100%; opacity: 0"></textarea>
+<textarea id="input" style="position: absolute; left: 0; height: 100%; width: 100%; opacity: 0; z-index: -1;"></textarea>
 </div>
 <h3>button controls for hard-to-remember keybindings</h3>
 <table id="move_table" style="float: left">
@@ -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>
@@ -101,6 +102,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" />
@@ -262,6 +264,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',
@@ -485,11 +488,13 @@ let server = {
         let tokens = parser.tokenize(event.data);
         if (tokens[0] === 'TURN') {
             game.turn_complete = false;
-            game.turn = parseInt(tokens[1]);
         } else if (tokens[0] === 'OTHER_WIPE') {
             game.portals_new = {};
             explorer.annotations_new = {};
             game.things_new = [];
+        } else if (tokens[0] === 'STATS') {
+            game.bladder_pressure_new = parseInt(tokens[1])
+            game.energy_new = parseInt(tokens[2])
         } else if (tokens[0] === 'THING') {
             let t = game.get_thing_temp(tokens[4], true);
             t.position = parser.parse_yx(tokens[1]);
@@ -546,6 +551,8 @@ let server = {
             game.things = game.things_new;
             game.player = game.things[game.player_id];
             game.players_hat_chars = game.players_hat_chars_new;
+            game.bladder_pressure = game.bladder_pressure_new
+            game.energy = game.energy_new
             game.turn_complete = true;
             if (tui.mode.name == 'post_login_wait') {
                 tui.switch_mode('play');
@@ -566,6 +573,9 @@ let server = {
         } else if (tokens[0] === 'LOGIN_OK') {
             this.send(['GET_GAMESTATE']);
             tui.switch_mode('post_login_wait');
+            tui.log_msg('@ welcome!')
+            tui.log_msg('@ hint: see top of terminal for how to get help.')
+            tui.log_msg('@ hint: enter study mode to understand your environment.')
         } else if (tokens[0] === 'DEFAULT_COLORS') {
             terminal.set_default_colors();
         } else if (tokens[0] === 'RANDOM_COLORS') {
@@ -717,6 +727,7 @@ let tui = {
       'command': 'COMMAND',
       'consume': 'INTOXICATE',
       'spin': 'SPIN',
+      'dance': 'DANCE',
   },
   offset: [0,0],
   map_lines: [],
@@ -728,7 +739,7 @@ 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",
@@ -802,7 +813,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) {
@@ -861,29 +872,45 @@ let tui = {
         this.log_msg("Portable things in reach for pick-up:");
         const y = game.player.position[0]
         const x = game.player.position[1]
-        let select_range = [y.toString() + ':' + x.toString(),
-                            (y + 0).toString() + ':' + (x - 1).toString(),
-                            (y + 0).toString() + ':' + (x + 1).toString(),
-                            (y - 1).toString() + ':' + (x).toString(),
-                            (y + 1).toString() + ':' + (x).toString()];
-        if (game.map_geometry == 'Hex') {
+        let directed_moves = {
+            'HERE': [0, 0], 'LEFT': [0, -1], 'RIGHT': [0, 1]
+        }
+        if (game.map_geometry == 'Square') {
+            directed_moves['UP'] = [-1, 0];
+            directed_moves['DOWN'] = [1, 0];
+        } else if (game.map_geometry == 'Hex') {
             if (y % 2) {
-                select_range.push((y - 1).toString() + ':' + (x + 1).toString());
-                select_range.push((y + 1).toString() + ':' + (x + 1).toString());
+                directed_moves['UPLEFT'] = [-1, 0];
+                directed_moves['UPRIGHT'] = [-1, 1];
+                directed_moves['DOWNLEFT'] = [1, 0];
+                directed_moves['DOWNRIGHT'] = [1, 1];
             } else {
-                select_range.push((y - 1).toString() + ':' + (x - 1).toString());
-                select_range.push((y + 1).toString() + ':' + (x - 1).toString());
+                directed_moves['UPLEFT'] = [-1, -1];
+                directed_moves['UPRIGHT'] = [-1, 0];
+                directed_moves['DOWNLEFT'] = [1, -1];
+                directed_moves['DOWNRIGHT'] = [1, 0];
             }
-        };
+        }
+        console.log(directed_moves);
+        let select_range = {};
+        for (const direction in directed_moves) {
+            const move = directed_moves[direction];
+            select_range[direction] = [y + move[0], x + move[1]];
+        }
         this.selectables = [];
-        for (const t_id in game.things) {
-            const t = game.things[t_id];
-            if (select_range.includes(t.position[0].toString()
-                                      + ':' + t.position[1].toString())
-                && t.portable) {
-                this.selectables.push(t_id);
+        let directions = [];
+        for (const direction in select_range) {
+            for (const t_id in game.things) {
+                const t = game.things[t_id];
+                const position = select_range[direction];
+                if (t.portable
+                    && t.position[0] == position[0]
+                    && t.position[1] == position[1]) {
+                    this.selectables.push(t_id);
+                    directions.push(direction);
+                }
             }
-        };
+        }
         if (this.selectables.length == 0) {
             this.log_msg('none');
             terminal.blink_screen();
@@ -892,7 +919,8 @@ let tui = {
         } else {
             for (let [i, t_id] of this.selectables.entries()) {
                 const t = game.things[t_id];
-                this.log_msg(i + ': ' + explorer.get_thing_info(t));
+                const direction = directions[i];
+                this.log_msg(i + ' ' + direction + ': ' + explorer.get_thing_info(t));
             }
         }
     } else if (this.mode.name == 'drop_thing') {
@@ -969,10 +997,11 @@ let tui = {
           };
           inner_links[y].push([url_start_x, end_x, url]);
       };
-      const matches = msg.matchAll(/https?:\/\/[^\s]+/g)
       let link_data = {};
       let url_ends = [];
-      for (const match of matches) {
+      const regexp = RegExp('https?://[^\\s]+', 'g');
+      let match;
+      while ((match = regexp.exec(msg)) !== null) {
           const url = match[0];
           const url_start = match.index;
           const url_end = match.index + match[0].length;
@@ -1192,10 +1221,10 @@ let tui = {
       }
       terminal.write(0, this.window_width, 'MODE: ' + this.mode.short_desc + ' – ' + help);
   },
-  draw_turn_line: function(n) {
-      if (game.turn_complete) {
-          terminal.write(1, this.window_width, 'TURN: ' + game.turn);
-      }
+  draw_stats_line: function(n) {
+      terminal.write(1, this.window_width,
+                     'ENERGY: ' + game.energy +
+                     ' BLADDER: ' + game.bladder_pressure);
   },
   draw_history: function() {
       let log_display_lines = [];
@@ -1310,7 +1339,7 @@ let tui = {
         this.draw_input();
     } else {
         this.draw_map();
-        this.draw_turn_line();
+        this.draw_stats_line();
         this.draw_mode_line();
         if (this.mode.shows_info) {
           this.draw_info();
@@ -1350,6 +1379,8 @@ let game = {
         this.portals = {};
         this.portals_new = {};
         this.players_hat_chars = "";
+        this.bladder_pressure = 0;
+        this.bladder_pressure_new = 0;
     },
     get_thing_temp: function(id_, create_if_not_found=false) {
         if (id_ in game.things_new) {
@@ -1659,6 +1690,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) {
@@ -1735,7 +1768,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() {
@@ -1774,6 +1810,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();
 };