<tr>
<td><button id="switch_to_chat">chat mode</button><br /></td>
</tr>
+ <tr>
<td><button id="switch_to_study">study mode</button></td>
<td><button id="toggle_map_mode">toggle terrain/annotations/control view</button>
+ </tr>
<tr>
<td><button id="switch_to_play">play mode</button></td>
<td>
<table>
<tr>
<td><button id="take_thing">take thing</button></td>
+ <td><button id="switch_to_annotate">annotate tile</button></td>
<td><button id="switch_to_edit">change tile</button></td>
- <td><button id="switch_to_admin">become admin</button></td>
+ <td><button id="teleport">teleport</button></td>
</tr>
<tr>
<td><button id="drop_thing">drop thing</button></td>
+ <td><button id="flatten">flatten surroundings</button></td>
<td><button id="switch_to_password">change tile editing password</button></td>
- <td><button id="switch_to_control_pw_type">change tile control password</button></td>
+ <td><button id="switch_to_portal">edit portal link</button></td>
</tr>
+ </table>
+ </td>
+ </tr>
+ <td><button id="switch_to_admin_enter">admin mode</button></td>
+ <td>
+ <table>
<tr>
- <td><button id="flatten">flatten surroundings</button></td>
- <td><button id="switch_to_annotate">annotate tile</button></td>
- <td><button id="switch_to_control_tile_type">change tiles control</button></td>
+ <td><button id="switch_to_control_pw_type">change tile control password</button></td>
</tr>
<tr>
- <td><button id="teleport">teleport</button></td>
- <td><button id="switch_to_portal">edit portal link</button></td>
+ <td><button id="switch_to_control_tile_type">change tiles control</button></td>
</tr>
</table>
</td>
+ <tr>
</tr>
</table>
<h3>edit keybindings</h3> (see <a href="https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values">here</a> for non-obvious available values):<br />
<li><input id="key_switch_to_study" type="text" value="?" />
<li><input id="key_switch_to_edit" type="text" value="m" />
<li><input id="key_switch_to_password" type="text" value="P" />
-<li><input id="key_switch_to_admin" type="text" value="A" />
+<li><input id="key_switch_to_admin_enter" type="text" value="A" />
<li><input id="key_switch_to_control_pw_type" type="text" value="C" />
<li><input id="key_switch_to_control_tile_type" type="text" value="Q" />
<li><input id="key_switch_to_annotate" type="text" value="M" />
</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': {
'short': 'map edit password',
'long': 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles. Hit return to confirm and leave.'
},
- 'admin': {
+ 'admin_enter': {
'short': 'become admin',
'long': 'This mode allows you to become admin if you know an admin password.'
+ },
+ 'admin': {
+ 'short': 'admin',
+ 'long': 'This mode allows you access to actions limited to administrators.'
}
}
} else if (tokens[0] === 'LOGIN_OK') {
this.send(['GET_GAMESTATE']);
tui.switch_mode('post_login_wait');
+ } else if (tokens[0] === 'ADMIN_OK') {
+ tui.is_admin = true;
+ tui.log_msg('@ you now have admin rights');
+ tui.switch_mode('admin');
} else if (tokens[0] === 'PORTAL') {
let position = parser.parse_yx(tokens[1]);
game.portals[position] = tokens[2];
height_input: 1,
password: 'foo',
show_help: false,
+ is_admin: false,
mode_waiting_for_server: new Mode('waiting_for_server',
false, false, true),
mode_login: new Mode('login', true, false, true),
false, false, false, true),
mode_portal: new Mode('portal', true, true),
mode_password: new Mode('password', true),
- mode_admin: new Mode('admin', true),
+ mode_admin_enter: new Mode('admin_enter', true),
+ mode_admin: new Mode('admin'),
mode_control_pw_pw: new Mode('control_pw_pw', true),
mode_control_tile_type: new Mode('control_tile_type',
false, false, false, true),
init: function() {
this.mode_play.available_modes = ["chat", "study", "edit",
"annotate", "portal",
- "password", "admin",
- "control_pw_type",
- "control_tile_type"]
- this.mode_study.available_modes = ["chat", "play"]
- this.mode_control_tile_draw.available_modes = ["play"]
+ "password", "admin_enter"];
+ this.mode_study.available_modes = ["chat", "play", "admin_enter"];
+ this.mode_admin.available_modes = ["chat", "play", "study",
+ "control_pw_type",
+ "control_tile_type"];
+ this.mode_control_tile_draw.available_modes = ["admin_enter"];
this.mode = this.mode_waiting_for_server;
this.inputEl = document.getElementById("input");
this.inputEl.focus();
switch_mode: function(mode_name) {
this.inputEl.focus();
this.map_mode = 'terrain';
+ if (mode_name == 'admin_enter' && this.is_admin) {
+ mode_name = 'admin';
+ };
this.mode = this['mode_' + mode_name];
if (game.player_id in game.things && (this.mode.shows_info || this.mode.name == 'control_tile_draw')) {
explorer.position = game.things[game.player_id].position;
if (!this.mode.is_intro && this.mode.name != 'chat') {
document.getElementById("switch_to_chat").disabled = false;
}
+ if (!this.mode.is_intro && this.mode.name != 'admin' && this.mode.name != 'admin_enter') {
+ document.getElementById("switch_to_admin_enter").disabled = false;
+ }
if (this.mode.name == 'login') {
if (this.login_name) {
server.send(['LOGIN', this.login_name]);
document.getElementById("switch_to_edit").disabled = false;
document.getElementById("switch_to_portal").disabled = false;
document.getElementById("switch_to_password").disabled = false;
- document.getElementById("switch_to_admin").disabled = false;
+ document.getElementById("switch_to_admin_enter").disabled = false;
+ } else if (this.mode.name == 'admin') {
document.getElementById("switch_to_control_pw_type").disabled = false;
document.getElementById("switch_to_control_tile_type").disabled = false;
} else if (this.mode.name == 'study') {
document.getElementById("toggle_map_mode").disabled = false;
} else if (this.mode.is_single_char_entry) {
this.show_help = true;
- } else if (this.mode.name == 'admin') {
+ } else if (this.mode.name == 'admin_enter') {
this.log_msg('@ enter admin password:')
} else if (this.mode.name == 'control_pw_pw') {
this.log_msg('@ enter tile control password for "' + this.tile_control_char + '":');
content += '/nick NAME – re-name yourself to NAME\n';
content += '/' + this.keys.switch_to_play + ' or /play – switch to play mode\n';
content += '/' + this.keys.switch_to_study + ' or /study – switch to study mode\n';
+ content += '/' + this.keys.switch_to_admin_enter + ' or /admin – switch to admin mode\n';
}
content += this.mode.list_available_modes();
let start_x = 0;
server.send(['SET_MAP_CONTROL_PASSWORD',
tui.tile_control_char, tui.inputEl.value]);
}
- tui.switch_mode('play');
+ tui.switch_mode('admin');
} else if (tui.mode.name == 'portal' && event.key == 'Enter') {
explorer.set_portal(tui.inputEl.value);
tui.switch_mode('play');
}
tui.password = tui.inputEl.value
tui.switch_mode('play');
- } else if (tui.mode.name == 'admin' && event.key == 'Enter') {
+ } else if (tui.mode.name == 'admin_enter' && event.key == 'Enter') {
server.send(['BECOME_ADMIN', tui.inputEl.value]);
tui.switch_mode('play');
} else if (tui.mode.name == 'chat' && event.key == 'Enter') {
tui.switch_mode('play');
} else if (tokens[0].slice(1) == 'study' || tokens[0][1] == tui.keys.switch_to_study) {
tui.switch_mode('study');
+ } else if (tokens[0].slice(1) == 'admin' || tokens[0][1] == tui.keys.switch_to_admin_enter) {
+ tui.switch_mode('admin_enter');
} else if (tokens[0].slice(1) == 'nick') {
if (tokens.length > 1) {
server.send(['NICK', tokens[1]]);
} else if (event.key in tui.movement_keys) {
explorer.move(tui.movement_keys[event.key]);
};
+ } else if (tui.mode.name == 'admin') {
+ if (tui.mode.mode_switch_on_key(event)) {
+ null;
+ };
}
tui.full_refresh();
}, false);
tui.switch_mode('portal');
tui.full_refresh();
};
-document.getElementById("switch_to_admin").onclick = function() {
+document.getElementById("switch_to_admin_enter").onclick = function() {
tui.switch_mode('admin');
tui.full_refresh();
};
'short': 'map edit password',
'long': 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles. Hit return to confirm and leave.'
},
- 'admin': {
+ 'admin_enter': {
'short': 'become admin',
'long': 'This mode allows you to become admin if you know an admin password.'
+ },
+ 'admin': {
+ 'short': 'admin',
+ 'long': 'This mode allows you access to actions limited to administrators.'
}
}
game.tui.log_msg('@ welcome')
cmd_LOGIN_OK.argtypes = ''
+def cmd_ADMIN_OK(game):
+ game.tui.is_admin = True
+ game.tui.log_msg('@ you now have admin rights')
+ game.tui.switch_mode('admin')
+ game.tui.do_refresh = True
+cmd_ADMIN_OK.argtypes = ''
+
def cmd_CHAT(game, msg):
game.tui.log_msg('# ' + msg)
game.tui.do_refresh = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.register_command(cmd_LOGIN_OK)
+ self.register_command(cmd_ADMIN_OK)
self.register_command(cmd_PONG)
self.register_command(cmd_CHAT)
self.register_command(cmd_PLAYER_ID)
return False
class TUI:
- mode_admin = Mode('admin', has_input_prompt=True)
+ mode_admin_enter = Mode('admin_enter', has_input_prompt=True)
+ mode_admin = Mode('admin')
mode_play = Mode('play')
mode_study = Mode('study', shows_info=True)
mode_edit = Mode('edit', is_single_char_entry=True)
mode_login = Mode('login', has_input_prompt=True, is_intro=True)
mode_post_login_wait = Mode('post_login_wait', is_intro=True)
mode_password = Mode('password', has_input_prompt=True)
+ is_admin = False
def __init__(self, host):
import os
import json
self.mode_play.available_modes = ["chat", "study", "edit",
"annotate", "portal",
- "password", "admin",
- "control_pw_type",
- "control_tile_type"]
- self.mode_study.available_modes = ["chat", "play"]
- self.mode_control_tile_draw.available_modes = ["play"]
+ "password", "admin_enter"]
+ self.mode_study.available_modes = ["chat", "play", "admin_enter"]
+ self.mode_admin.available_modes = ["chat", "play", "study",
+ "control_pw_type",
+ "control_tile_type"]
+ self.mode_control_tile_draw.available_modes = ["admin"]
self.host = host
self.game = Game()
self.game.tui = self
'switch_to_portal': 'T',
'switch_to_study': '?',
'switch_to_edit': 'm',
- 'switch_to_admin': 'A',
+ 'switch_to_admin_enter': 'A',
'switch_to_control_pw_type': 'C',
'switch_to_control_tile_type': 'Q',
'flatten': 'F',
def switch_mode(self, mode_name):
self.map_mode = 'terrain'
+ if mode_name == 'admin_enter' and self.is_admin:
+ mode_name = 'admin'
self.mode = getattr(self, 'mode_' + mode_name)
if self.mode.shows_info or self.mode.name == 'control_tile_draw':
player = self.game.get_thing(self.game.player_id)
self.send('LOGIN ' + quote(self.login_name))
else:
self.log_msg('@ enter username')
- elif self.mode.name == 'admin':
+ elif self.mode.name == 'admin_enter':
self.log_msg('@ enter admin password:')
elif self.mode.name == 'control_pw_pw':
self.log_msg('@ enter tile control password for "%s":' % self.tile_control_char)
content += '/nick NAME – re-name yourself to NAME\n'
content += '/%s or /play – switch to play mode\n' % self.keys['switch_to_play']
content += '/%s or /study – switch to study mode\n' % self.keys['switch_to_study']
+ content += '/%s or /admin – switch to admin mode\n' % self.keys['switch_to_admin_enter']
content += self.mode.list_available_modes(self)
for i in range(self.size.y):
safe_addstr(i,
else:
self.send('SET_MAP_CONTROL_PASSWORD ' + quote(self.tile_control_char) + ' ' + quote(self.input_))
self.input_ = ""
- self.switch_mode('play')
+ self.switch_mode('admin')
elif self.mode.name == 'password' and key == '\n':
if self.input_ == '':
self.input_ = ' '
self.password = self.input_
self.input_ = ""
self.switch_mode('play')
- elif self.mode.name == 'admin' and key == '\n':
+ elif self.mode.name == 'admin_enter' and key == '\n':
self.send('BECOME_ADMIN ' + quote(self.input_))
self.input_ = ""
self.switch_mode('play')
self.switch_mode('play')
elif self.input_ in {'/' + self.keys['switch_to_study'], '/study'}:
self.switch_mode('study')
+ elif self.input_ in {'/' + self.keys['switch_to_admin_enter'], '/admin'}:
+ self.switch_mode('admin_enter')
elif self.input_.startswith('/nick'):
tokens = self.input_.split(maxsplit=1)
if len(tokens) == 2:
continue
elif key in self.movement_keys:
move_explorer(self.movement_keys[key])
+ elif self.mode.name == 'admin':
+ if self.mode.mode_switch_on_key(self, key):
+ continue
if len(sys.argv) != 2:
raise ArgError('wrong number of arguments, need game host')