t.name = name
cmd_THING_NAME.argtypes = 'int:nonneg string'
+def cmd_THING_CHAR(game, thing_id, c):
+ t = game.get_thing(thing_id)
+ if t:
+ t.player_char = c
+cmd_THING_CHAR.argtypes = 'int:nonneg char'
+
def cmd_MAP(game, geometry, size, content):
map_geometry_class = globals()['MapGeometry' + geometry]
game.map_geometry = map_geometry_class(size)
game.tui.switch_mode('play')
if game.tui.mode.shows_info:
game.tui.query_info()
- player = game.get_thing(game.player_id)
- if player.position in game.portals:
- game.tui.teleport_target_host = game.portals[player.position]
- game.tui.switch_mode('teleport')
game.turn_complete = True
game.tui.do_refresh = True
cmd_GAME_STATE_COMPLETE.argtypes = ''
cmd_PORTAL.argtypes = 'yx_tuple:nonneg string'
def cmd_PLAY_ERROR(game, msg):
- game.tui.flash()
+ game.tui.log_msg('? ' + msg)
+ game.tui.flash = True
game.tui.do_refresh = True
cmd_PLAY_ERROR.argtypes = 'string'
game.thing_types[thing_type] = symbol_hint
cmd_THING_TYPE.argtypes = 'string char'
+def cmd_TERRAIN(game, terrain_char, terrain_desc):
+ game.terrains[terrain_char] = terrain_desc
+cmd_TERRAIN.argtypes = 'char string'
+
def cmd_PONG(game):
pass
cmd_PONG.argtypes = ''
self.register_command(cmd_THING)
self.register_command(cmd_THING_TYPE)
self.register_command(cmd_THING_NAME)
+ self.register_command(cmd_THING_CHAR)
+ self.register_command(cmd_TERRAIN)
self.register_command(cmd_MAP)
self.register_command(cmd_MAP_CONTROL)
self.register_command(cmd_PORTAL)
self.player_id = -1
self.info_db = {}
self.portals = {}
+ self.terrains = {}
def get_string_options(self, string_option_type):
if string_option_type == 'map_geometry':
self.mode_waiting_for_server = self.Mode('waiting_for_server', 'Waiting for a server response.', is_intro=True)
self.mode_login = self.Mode('login', 'Pick your player name.', has_input_prompt=True, is_intro=True)
self.mode_post_login_wait = self.Mode('post_login_wait', 'Waiting for a server response.', is_intro=True)
- self.mode_teleport = self.Mode('teleport', 'Follow the instructions to re-connect and log-in to another server, or enter anything else to abort.', has_input_prompt=True)
self.mode_password = self.Mode('password', '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.', has_input_prompt=True)
self.game = Game()
self.game.tui = self
'flatten': 'F',
'take_thing': 'z',
'drop_thing': 'u',
+ 'teleport': 'p',
'toggle_map_mode': 'M',
'hex_move_upleft': 'w',
'hex_move_upright': 'e',
self.force_instant_connect = True
self.input_lines = []
self.fov = ''
+ self.flash = False
curses.wrapper(self.loop)
- def flash(self):
- curses.flash()
-
def connect(self):
def handle_recv(msg):
self.socket_thread.start()
self.disconnected = False
self.game.thing_types = {}
+ self.game.terrains = {}
self.socket.send('TASKS')
+ self.socket.send('TERRAINS')
self.socket.send('THING_TYPES')
self.switch_mode('login')
except ConnectionRefusedError:
self.send('LOGIN ' + quote(self.login_name))
else:
self.log_msg('@ enter username')
- elif self.mode.name == 'teleport':
- self.log_msg("@ May teleport to %s" % (self.teleport_target_host)),
- self.log_msg("@ Enter 'YES!' to enthusiastically affirm.");
self.restore_input_values()
def loop(self, stdscr):
self.window_width)
def move_explorer(direction):
- target = self.game.map_geometry.move(self.explorer, direction)
+ target = self.game.map_geometry.move_yx(self.explorer, direction)
if target:
self.explorer = target
self.query_info()
else:
- self.flash()
+ self.flash = True
def draw_history():
lines = []
pos_i = self.explorer.y * self.game.map_geometry.size.x + self.explorer.x
info = 'outside field of view'
if self.game.fov[pos_i] == '.':
- info = 'TERRAIN: %s\n' % self.game.map_content[pos_i]
+ terrain_char = self.game.map_content[pos_i]
+ terrain_desc = '?'
+ if terrain_char in self.game.terrains:
+ terrain_desc = self.game.terrains[terrain_char]
+ info = 'TERRAIN: "%s" / %s\n' % (terrain_char, terrain_desc)
for t in self.game.things:
if t.position == self.explorer:
- info += 'THING: %s' % t.type_
+ info += 'THING: %s / %s' % (t.type_,
+ self.game.thing_types[t.type_])
+ if hasattr(t, 'player_char'):
+ info += t.player_char
if hasattr(t, 'name'):
- info += ' (name: %s)' % t.name
+ info += ' (%s)' % t.name
info += '\n'
if self.explorer in self.game.portals:
info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
end = start + self.game.map_geometry.size.x
map_lines_split += [[c + ' ' for c in map_content[start:end]]]
if self.map_mode == 'terrain':
+ for p in self.game.portals.keys():
+ map_lines_split[p.y][p.x] = 'P '
used_positions = []
for t in self.game.things:
symbol = self.game.thing_types[t.type_]
+ meta_char = ' '
+ if hasattr(t, 'player_char'):
+ meta_char = t.player_char
if t.position in used_positions:
- map_lines_split[t.position.y][t.position.x] = symbol + '+'
- else:
- map_lines_split[t.position.y][t.position.x] = symbol + ' '
+ meta_char = '+'
+ map_lines_split[t.position.y][t.position.x] = symbol + meta_char
used_positions += [t.position]
if self.mode.shows_info:
map_lines_split[self.explorer.y][self.explorer.x] = '??'
content += "[%s] – drop carried thing\n" % self.keys['drop_thing']
if 'FLATTEN_SURROUNDINGS' in self.game.tasks:
content += "[%s] – flatten player's surroundings\n" % self.keys['flatten']
+ content += '[%s] – teleport to other space\n' % self.keys['teleport']
content += 'Other modes available from here:\n'
content += '[%s] – chat mode\n' % self.keys['switch_to_chat']
content += '[%s] – study mode\n' % self.keys['switch_to_study']
else:
self.send('PING')
last_ping = now
+ if self.flash:
+ curses.flash()
+ self.flash = False
if self.do_refresh:
draw_screen()
self.do_refresh = False
self.send('NICK ' + quote(tokens[1]))
else:
self.log_msg('? need login name')
- #elif self.input_.startswith('/msg'):
- # tokens = self.input_.split(maxsplit=2)
- # if len(tokens) == 3:
- # self.send('QUERY %s %s' % (quote(tokens[1]),
- # quote(tokens[2])))
- # else:
- # self.log_msg('? need message target and message')
else:
self.log_msg('? unknown command')
else:
quote(self.password)))
self.input_ = ""
self.switch_mode('play')
- elif self.mode == self.mode_teleport and key == '\n':
- if self.input_ == 'YES!':
- self.host = self.teleport_target_host
- self.reconnect()
- else:
- self.log_msg('@ teleport aborted')
- self.switch_mode('play')
- self.input_ = ''
elif self.mode == self.mode_study:
if key == self.keys['switch_to_chat']:
self.switch_mode('chat')
self.send('TASK:PICK_UP')
elif key == self.keys['drop_thing'] and 'DROP' in self.game.tasks:
self.send('TASK:DROP')
+ elif key == self.keys['teleport']:
+ player = self.game.get_thing(self.game.player_id)
+ if player.position in self.game.portals:
+ self.host = self.game.portals[player.position]
+ self.reconnect()
+ else:
+ self.flash = True
+ self.log_msg('? not standing on portal')
elif key in self.movement_keys and 'MOVE' in self.game.tasks:
self.send('TASK:MOVE ' + self.movement_keys[key])
elif self.mode == self.mode_edit:
self.send('TASK:WRITE %s %s' % (key, quote(self.password)))
self.switch_mode('play')
-TUI('localhost:5000')
+#TUI('localhost:5000')
+TUI('wss://plomlompom.com/rogue_chat/')