<div>
keyboard input/control: <span id="keyboard_control"></span>
</div>
-<h3>button controls for mouse players</h3>
+<h3>button controls for hard-to-remember keybindings</h3>
<table id="move_table" style="float: left">
<tr>
<td style="text-align: right"><button id="hex_move_upleft"></button></td>
<td><button id="switch_to_play"></button></td>
<td>
<button id="switch_to_take_thing"></button>
- <button id="drop_thing"></button>
+ <button id="switch_to_drop_thing"></button>
<button id="door"></button>
<button id="consume"></button>
<button id="switch_to_command_thing"></button>
<button id="teleport"></button>
<button id="install"></button>
+ <button id="wear"></button>
+ <button id="spin"></button>
</td>
</tr>
<tr>
<button id="switch_to_portal"></button>
<button id="switch_to_name_thing"></button>
<button id="switch_to_password"></button>
+ <button id="switch_to_enter_face"></button>
</td>
</tr>
<tr>
<li>help: <input id="key_help" type="text" value="h" />
<li>flatten surroundings: <input id="key_flatten" type="text" value="F" />
<li>teleport: <input id="key_teleport" type="text" value="p" />
-<li>drop thing: <input id="key_drop_thing" type="text" value="u" />
+<li>spin: <input id="key_spin" type="text" value="S" />
<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" />
+<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_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" />
<script>
"use strict";
let websocket_location = "wss://plomlompom.com/rogue_chat/";
-//let websocket_location = "ws://localhost:8001/";
+//let websocket_location = "ws://localhost:8000/";
let mode_helps = {
'play': {
'intro': 'Pick up a thing in reach by entering its index number. Enter nothing to abort.',
'long': 'You see a list of things which you could pick up. Enter the target thing\'s index, or, to leave, nothing.'
},
+ 'drop_thing': {
+ 'short': 'drop thing',
+ 'intro': 'Enter number of direction to which you want to drop thing.',
+ 'long': 'Drop currently carried thing by entering the target direction index. Enter nothing to return to play mode..'
+ },
'admin_thing_protect': {
'short': 'change thing protection',
'intro': '@ enter thing protection character:',
'long': 'Change protection character for thing here.'
},
+ 'enter_face': {
+ 'short': 'enter your face',
+ 'intro': '@ enter face line (enter nothing to abort):',
+ '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..'
+ },
'write': {
'short': 'change terrain',
'intro': '',
'help': 'help',
'flatten': 'flatten surroundings',
'teleport': 'teleport',
- 'drop_thing': 'drop thing',
'door': 'open/close',
'consume': 'consume',
- 'install': 'install',
+ 'install': '(un-)install',
+ 'wear': '(un-)wear',
+ 'spin': 'spin',
'toggle_map_mode': 'toggle map view',
'toggle_tile_draw': 'toggle protection character drawing',
'hex_move_upleft': 'up-left',
t.type_ = tokens[2];
t.protection = tokens[3];
t.portable = parseInt(tokens[5]);
+ t.commandable = parseInt(tokens[6]);
} else if (tokens[0] === 'THING_NAME') {
let t = game.get_thing(tokens[1], false);
- if (t) {
- t.name_ = tokens[2];
- };
+ t.name_ = tokens[2];
+ } else if (tokens[0] === 'THING_FACE') {
+ let t = game.get_thing(tokens[1], false);
+ t.face = tokens[2];
+ } else if (tokens[0] === 'THING_HAT') {
+ let t = game.get_thing(tokens[1], false);
+ t.hat = tokens[2];
} else if (tokens[0] === 'THING_CHAR') {
let t = game.get_thing(tokens[1], false);
- if (t) {
- t.thing_char = tokens[2];
- };
+ t.thing_char = tokens[2];
} else if (tokens[0] === 'TASKS') {
game.tasks = tokens[1].split(',');
tui.mode_write.legal = game.tasks.includes('WRITE');
tui.mode_command_thing.legal = game.tasks.includes('WRITE');
tui.mode_take_thing.legal = game.tasks.includes('PICK_UP');
+ tui.mode_drop_thing.legal = game.tasks.includes('DROP');
} else if (tokens[0] === 'THING_TYPE') {
game.thing_types[tokens[1]] = tokens[2]
} else if (tokens[0] === 'THING_CARRYING') {
let t = game.get_thing(tokens[1], false);
- if (t) {
- t.carrying = true;
- };
+ t.carrying = t = game.get_thing(tokens[2], false);
+ } else if (tokens[0] === 'THING_INSTALLED') {
+ let t = game.get_thing(tokens[1], false);
+ t.installed = true;
} else if (tokens[0] === 'TERRAIN') {
game.terrains[tokens[1]] = tokens[2]
} else if (tokens[0] === 'MAP') {
mode_name_thing: new Mode('name_thing', true, true),
mode_command_thing: new Mode('command_thing', true),
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_admin_enter: new Mode('admin_enter', true),
mode_admin: new Mode('admin'),
mode_control_pw_pw: new Mode('control_pw_pw', true),
'move': 'MOVE',
'door': 'DOOR',
'install': 'INSTALL',
+ 'wear': 'WEAR',
'command': 'COMMAND',
'consume': 'INTOXICATE',
+ 'spin': 'SPIN',
},
offset: [0,0],
map_lines: [],
selectables: [],
init: function() {
this.mode_play.available_modes = ["chat", "study", "edit", "admin_enter",
- "command_thing", "take_thing"]
- this.mode_play.available_actions = ["move", "drop_thing",
- "teleport", "door", "consume", "install"];
+ "command_thing", "take_thing", "drop_thing"]
+ this.mode_play.available_actions = ["move", "teleport", "door", "consume",
+ "install", "wear", "spin"];
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",
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"]
+ "admin_enter", "enter_face"]
this.mode_edit.available_actions = ["move", "flatten", "toggle_map_mode"]
this.inputEl = document.getElementById("input");
this.inputEl.focus();
tui.log_msg('@ finished tile protection drawing.')
}
this.tile_draw = false;
+ const player = game.things[game.player_id];
+ if (mode_name == 'command_thing' && (!player.carrying || !player.carrying.commandable)) {
+ this.log_msg('? not carrying anything commandable');
+ terminal.blink_screen();
+ this.switch_mode('play');
+ return;
+ };
+ if (mode_name == 'drop_thing' && (!player.carrying)) {
+ this.log_msg('? not carrying anything droppable');
+ terminal.blink_screen();
+ this.switch_mode('play');
+ return;
+ }
if (mode_name == 'admin_enter' && this.is_admin) {
mode_name = 'admin';
} else if (['name_thing', 'admin_thing_protect'].includes(mode_name)) {
- let player_position = game.things[game.player_id].position;
let thing_id = null;
for (let t_id in game.things) {
if (t_id == game.player_id) {
continue;
}
let t = game.things[t_id];
- if (player_position[0] == t.position[0] && player_position[1] == t.position[1]) {
+ if (player.position[0] == t.position[0]
+ && player.position[1] == t.position[1]) {
thing_id = t_id;
break;
}
if (select_range.includes(t.position[0].toString()
+ ':' + t.position[1].toString())
&& t.portable) {
- this.selectables.push([t_id, t]);
+ this.selectables.push(t_id);
}
};
if (this.selectables.length == 0) {
- this.log_msg('none')
+ this.log_msg('none');
+ terminal.blink_screen();
+ this.switch_mode('play');
+ return;
} else {
- for (let [i, t] of this.selectables.entries()) {
- this.log_msg(i + ': ' + explorer.get_thing_info(t[1]));
+ for (let [i, t_id] of this.selectables.entries()) {
+ const t = game.things[t_id];
+ this.log_msg(i + ': ' + explorer.get_thing_info(t));
}
}
+ } else if (this.mode.name == 'drop_thing') {
+ this.log_msg('Direction to drop thing to:');
+ this.selectables = ['HERE'].concat(Object.values(this.movement_keys));
+ for (let [i, direction] of this.selectables.entries()) {
+ this.log_msg(i + ': ' + direction);
+ };
} else if (this.mode.name == 'command_thing') {
server.send(['TASK:COMMAND', 'HELP']);
} else if (this.mode.name == 'control_pw_pw') {
};
this.full_refresh();
},
+ pick_selectable: function(task_name) {
+ const i = parseInt(this.inputEl.value);
+ if (isNaN(i) || i < 0 || i >= this.selectables.length) {
+ tui.log_msg('? invalid index, aborted');
+ } else {
+ server.send(['TASK:' + task_name, tui.selectables[i]]);
+ }
+ this.inputEl.value = "";
+ this.switch_mode('play');
+ },
draw_map: function() {
if (!game.turn_complete && this.map_lines.length == 0) {
return;
let term_x = Math.max(0, -this.offset[1]);
let map_y = Math.max(0, this.offset[0]);
let map_x = Math.max(0, this.offset[1]);
- for (; term_y < terminal.rows && map_y < game.map_size[0]; term_y++, map_y++) {
+ for (; term_y < terminal.rows && map_y < this.map_lines.length; term_y++, map_y++) {
let to_draw = this.map_lines[map_y].slice(map_x, this.window_width + this.offset[1]);
terminal.write(term_y, term_x, to_draw);
}
if (game.fov[position_i] != '.') {
info_to_cache += 'outside field of view';
} else {
- let terrain_char = game.map[position_i]
- let terrain_desc = '?'
- if (game.terrains[terrain_char]) {
- terrain_desc = game.terrains[terrain_char];
- };
- info_to_cache += 'TERRAIN: "' + terrain_char + '" / ' + terrain_desc + "\n";
- let protection = game.map_control[position_i];
- if (protection == '.') {
- protection = 'unprotected';
- };
- info_to_cache += 'PROTECTION: ' + protection + '\n';
for (let t_id in game.things) {
let t = game.things[t_id];
if (t.position[0] == this.position[0] && t.position[1] == this.position[1]) {
protection = 'none';
}
info_to_cache += " / protection: " + protection + "\n";
+ if (t.hat) {
+ info_to_cache += t.hat.slice(0, 6) + '\n';
+ info_to_cache += t.hat.slice(6, 12) + '\n';
+ info_to_cache += t.hat.slice(12, 18) + '\n';
+ }
+ if (t.face) {
+ info_to_cache += t.face.slice(0, 6) + '\n';
+ info_to_cache += t.face.slice(6, 12) + '\n';
+ info_to_cache += t.face.slice(12, 18) + '\n';
+ }
}
}
+ let terrain_char = game.map[position_i]
+ let terrain_desc = '?'
+ if (game.terrains[terrain_char]) {
+ terrain_desc = game.terrains[terrain_char];
+ };
+ info_to_cache += 'TERRAIN: "' + terrain_char + '" / ' + terrain_desc + "\n";
+ let protection = game.map_control[position_i];
+ if (protection == '.') {
+ protection = 'unprotected';
+ };
+ info_to_cache += 'PROTECTION: ' + protection + '\n';
if (this.position in game.portals) {
info_to_cache += "PORTAL: " + game.portals[this.position] + "\n";
}
get_thing_info: function(t) {
const symbol = game.thing_types[t.type_];
let info = t.type_ + " / " + symbol;
- if (t.thing_char) {
- info += t.thing_char;
- };
- if (t.name_) {
- info += " (" + t.name_ + ")";
- }
+ if (t.thing_char) {
+ info += t.thing_char;
+ };
+ if (t.name_) {
+ info += " (" + t.name_ + ")";
+ }
+ if (t.installed) {
+ info += " / installed";
+ }
return info;
},
annotate: function(msg) {
}
if (tui.mode.has_input_prompt && event.key == 'Enter'
&& tui.inputEl.value.length == 0
- && ['chat', 'command_thing', 'take_thing',
+ && ['chat', 'command_thing', 'take_thing', 'drop_thing',
'admin_enter'].includes(tui.mode.name)) {
if (tui.mode.name != 'chat') {
tui.log_msg('@ aborted');
tui.login_name = tui.inputEl.value;
server.send(['LOGIN', tui.inputEl.value]);
tui.inputEl.value = "";
- } else if (tui.mode.name == 'command_thing' && event.key == 'Enter') {
- if (tui.task_action_on('command')) {
- server.send(['TASK:COMMAND', tui.inputEl.value]);
- tui.inputEl.value = "";
- }
- } else if (tui.mode.name == 'take_thing' && event.key == 'Enter') {
- const i = parseInt(tui.inputEl.value);
- if (isNaN(i) || i < 0 || i >= tui.selectables.length) {
- tui.log_msg('? invalid index, aborted');
+ } else if (tui.mode.name == 'enter_face' && event.key == 'Enter') {
+ if (tui.inputEl.value.length != 18) {
+ tui.log_msg('? wrong input length, aborting');
} else {
- server.send(['TASK:PICK_UP', tui.selectables[i][0]]);
+ server.send(['PLAYER_FACE', tui.inputEl.value]);
}
tui.inputEl.value = "";
- tui.switch_mode('play');
+ tui.switch_mode('edit');
+ } else if (tui.mode.name == 'command_thing' && event.key == 'Enter') {
+ server.send(['TASK:COMMAND', tui.inputEl.value]);
+ tui.inputEl.value = "";
+ } else if (tui.mode.name == 'take_thing' && event.key == 'Enter') {
+ tui.pick_selectable('PICK_UP');
+ } else if (tui.mode.name == 'drop_thing' && event.key == 'Enter') {
+ tui.pick_selectable('DROP');
} else if (tui.mode.name == 'control_pw_pw' && event.key == 'Enter') {
if (tui.inputEl.value.length == 0) {
tui.log_msg('@ aborted');
} else if (tui.mode.name == 'play') {
if (tui.mode.mode_switch_on_key(event)) {
null;
- } else if (event.key === tui.keys.drop_thing && tui.task_action_on('drop_thing')) {
- server.send(["TASK:DROP"]);
} else if (event.key === tui.keys.consume && tui.task_action_on('consume')) {
server.send(["TASK:INTOXICATE"]);
} else if (event.key === tui.keys.door && tui.task_action_on('door')) {
server.send(["TASK:DOOR"]);
} else if (event.key === tui.keys.install && tui.task_action_on('install')) {
server.send(["TASK:INSTALL"]);
+ } else if (event.key === tui.keys.wear && tui.task_action_on('wear')) {
+ server.send(["TASK:WEAR"]);
+ } else if (event.key === tui.keys.spin && tui.task_action_on('spin')) {
+ server.send(["TASK:SPIN"]);
} 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) {
tui.toggle_map_mode();
tui.full_refresh();
};
-document.getElementById("drop_thing").onclick = function() {
- server.send(['TASK:DROP']);
-};
document.getElementById("flatten").onclick = function() {
server.send(['TASK:FLATTEN_SURROUNDINGS', tui.password]);
};
document.getElementById("install").onclick = function() {
server.send(['TASK:INSTALL']);
};
+document.getElementById("wear").onclick = function() {
+ server.send(['TASK:WEAR']);
+};
+document.getElementById("spin").onclick = function() {
+ server.send(['TASK:SPIN']);
+};
document.getElementById("teleport").onclick = function() {
game.teleport();
};
for (const move_button of document.querySelectorAll('[id*="_move_"]')) {
+ if (move_button.id.startsWith('key_')) { // not a move button
+ continue;
+ };
let direction = move_button.id.split('_')[2].toUpperCase();
move_button.onclick = function() {
- if (tui.mode.available_actions.includes("move")
- || tui.mode.available_actions.includes("move_explorer")) {
+ if (tui.mode.available_actions.includes("move")) {
server.send(['TASK:MOVE', direction]);
- } else {
+ } else if (tui.mode.available_actions.includes("move_explorer")) {
explorer.move(direction);
+ tui.full_refresh();
};
};
};