<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>
<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" />
</div>
<script>
"use strict";
-//let websocket_location = "wss://plomlompom.com/rogue_chat/";
-let websocket_location = "ws://localhost:8000/";
+let websocket_location = "wss://plomlompom.com/rogue_chat/";
+//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:',
'help': 'help',
'flatten': 'flatten surroundings',
'teleport': 'teleport',
- 'drop_thing': 'drop thing',
'door': 'open/close',
'consume': 'consume',
'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);
t.name_ = tokens[2];
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);
- 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;
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'),
'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", "wear"];
+ "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",
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;
if (event.key == 'Enter') {
event.preventDefault();
}
- if (tui.mode.has_input_prompt && event.key == 'Enter'
- && tui.inputEl.value.length == 0
- && ['chat', 'command_thing', 'take_thing',
- 'admin_enter'].includes(tui.mode.name)) {
- if (tui.mode.name != 'chat') {
+ if ((!tui.mode.is_intro && event.key == 'Escape')
+ || (tui.mode.has_input_prompt && event.key == 'Enter'
+ && tui.inputEl.value.length == 0
+ && ['chat', 'command_thing', 'take_thing', 'drop_thing',
+ 'admin_enter'].includes(tui.mode.name))) {
+ if (!['chat', 'play', 'study', 'edit'].includes(tui.mode.name)) {
tui.log_msg('@ aborted');
}
tui.switch_mode('play');
tui.inputEl.value = "";
tui.switch_mode('edit');
} 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 {
- server.send(['TASK:PICK_UP', tui.selectables[i][0]]);
- }
+ server.send(['TASK:COMMAND', tui.inputEl.value]);
tui.inputEl.value = "";
- tui.switch_mode('play');
+ } 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: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("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();
};
};
};