X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=plomrogue%2Fcommands.py;h=5b8bb28293fbff0b5baa5a37a69f6b14fc499e68;hb=e9188b469ca75643cea9dbfd49e7400d060ca06a;hp=dea07173c6181f2233260823977c95766732bd60;hpb=54d8db95b3bb690b712ec09179922829d0c68a54;p=plomrogue2 diff --git a/plomrogue/commands.py b/plomrogue/commands.py index dea0717..5b8bb28 100644 --- a/plomrogue/commands.py +++ b/plomrogue/commands.py @@ -1,5 +1,6 @@ from plomrogue.misc import quote from plomrogue.errors import GameError, ArgError +from plomrogue.misc import Terrain @@ -16,11 +17,17 @@ def cmd_THING_TYPES(game, connection_id): cmd_THING_TYPES.argtypes = '' def cmd_TERRAINS(game, connection_id): - for t in game.terrains.keys(): - game.io.send('TERRAIN %s %s' % (quote(t), quote(game.terrains[t])), - connection_id) + for t in game.terrains.values(): + game.io.send('TERRAIN %s %s' % (quote(t.character), + quote(t.description)), connection_id) cmd_TERRAINS.argtypes = '' +def cmd_TERRAIN(game, character, description, + blocks_light, blocks_sound, blocks_movement): + game.terrains[character] = Terrain(character, description, blocks_light, + blocks_sound, blocks_movement) +cmd_TERRAIN.argtypes = 'char string bool bool bool' + def cmd_ALL(game, msg, connection_id): speaker = game.get_player(connection_id) if not speaker: @@ -36,28 +43,28 @@ def cmd_SPAWN_POINT(game, big_yx, little_yx): cmd_SPAWN_POINT.argtypes = 'yx_tuple yx_tuple:nonneg' def cmd_LOGIN(game, nick, connection_id): + nick = nick.strip() + if len(nick) == 0: + raise GameError('empty name') for t in [t for t in game.things if t.type_ == 'Player' and t.name == nick]: raise GameError('name already in use') if game.get_player(connection_id): raise GameError('cannot log in twice') - t = game.thing_types['Player'](game) - t.position = game.spawn_point - game.things += [t] # TODO refactor into Thing.__init__? + t = game.add_thing('Player', game.spawn_point) + t.name = nick t.thing_char = game.get_next_player_char() game.sessions[connection_id] = { 'thing_id': t.id_, 'status': 'player' } + game.io.send('PLAYER_ID %s' % t.id_, connection_id) game.io.send('LOGIN_OK', connection_id) - t.name = nick game.io.send('CHAT ' + quote(t.name + ' entered the map.')) - game.io.send('PLAYER_ID %s' % t.id_, connection_id) for s in [s for s in game.things if s.type_ == 'SpawnPoint' and s.name == t.name]: t.position = s.position break - game.changed = True - game.changed_fovs = True + # game.changed = True # handled by game.add_thing cmd_LOGIN.argtypes = 'string' def cmd_BECOME_ADMIN(game, password, connection_id): @@ -85,7 +92,7 @@ def cmd_SET_TILE_CONTROL(game, yx, control_char, connection_id): map_control = game.get_map(big_yx, 'control') map_control[little_yx] = control_char game.changed = True - game.changed_fovs = True + game.record_change((big_yx, little_yx), 'fov') cmd_SET_TILE_CONTROL.argtypes = 'yx_tuple:nonneg char' def cmd_THING_PROTECTION(game, thing_id, protection_char, connection_id): @@ -98,7 +105,8 @@ def cmd_THING_PROTECTION(game, thing_id, protection_char, connection_id): if not t: raise GameError('thing of ID %s not found' % thing_id) t.protection = protection_char - #game.changed = True + game.changed = True + game.record_change(t.position, 'other') cmd_THING_PROTECTION.argtypes = 'int:pos char' def cmd_SET_MAP_CONTROL_PASSWORD(game, tile_class, password, connection_id): @@ -114,6 +122,9 @@ def cmd_SET_MAP_CONTROL_PASSWORD(game, tile_class, password, connection_id): cmd_SET_MAP_CONTROL_PASSWORD.argtypes = 'char string' def cmd_NICK(game, nick, connection_id): + nick = nick.strip() + if len(nick) == 0: + raise GameError('empty name') for t in [t for t in game.things if t.type_ == 'Player' and t.name == nick]: raise GameError('name already in use') t = game.get_player(connection_id) @@ -123,6 +134,7 @@ def cmd_NICK(game, nick, connection_id): t.name = nick game.io.send('CHAT ' + quote(old_nick + ' renamed themselves to ' + nick)) game.changed = True + game.record_change(t.position, 'other') cmd_NICK.argtypes = 'string' def cmd_GET_GAMESTATE(game, connection_id): @@ -169,6 +181,7 @@ def cmd_ANNOTATE(game, yx, msg, pw, connection_id): if big_yx not in game.annotations: game.annotations[big_yx] = {} game.annotations[big_yx][little_yx] = msg + game.record_change([big_yx, little_yx], 'other') game.changed = True cmd_ANNOTATE.argtypes = 'yx_tuple:nonneg string string' @@ -187,6 +200,7 @@ def cmd_PORTAL(game, yx, msg, pw, connection_id): if big_yx not in game.portals: game.portals[big_yx] = {} game.portals[big_yx][little_yx] = msg + game.record_change([big_yx, little_yx], 'other') game.changed = True cmd_PORTAL.argtypes = 'yx_tuple:nonneg string string' @@ -215,6 +229,7 @@ def cmd_MAP(game, geometry, size): if geometry == 'Hex': map_geometry_class = MapGeometryHex game.new_world(map_geometry_class(size)) + game.terrains = {} cmd_MAP.argtypes = 'string:map_geometry yx_tuple:pos' def cmd_MAP_CONTROL_LINE(game, big_yx, y, line): @@ -230,17 +245,8 @@ def cmd_THING(game, big_yx, little_yx, thing_type, thing_id): if thing_type not in game.thing_types: raise GameError('illegal thing type %s' % thing_type) _ = game.get_map(big_yx) - t_old = None - if thing_id > 0: - t_old = game.get_thing(thing_id) - t_new = game.thing_types[thing_type](game, id_=thing_id, position=(big_yx, - little_yx)) - if t_old: - game.things[game.things.index(t_old)] = t_new - else: - game.things += [t_new] - game.changed = True - game.changed_fovs = True + game.add_thing(thing_type, (big_yx, little_yx), id_=thing_id) + # game.changed = True handled by add_thing cmd_THING.argtypes = 'yx_tuple yx_tuple:nonneg string:thing_type int:nonneg' def cmd_THING_NAME(game, thing_id, name, pw, connection_id): @@ -249,9 +255,16 @@ def cmd_THING_NAME(game, thing_id, name, pw, connection_id): if not t: raise GameError('thing of ID %s not found' % thing_id) if not game.can_do_thing_with_pw(t, pw): - raise GameError('wrong password for tile') - t.name = name + raise GameError('wrong password for thing') + if name == ' ': + if hasattr(t.__class__, 'name'): + raise GameError('cannot un-name things of this type') + if hasattr(t, 'name'): + del t.name + else: + t.name = name game.changed = True + game.record_change(t.position, 'other') cmd_THING_NAME.argtypes = 'int:pos string string' def cmd_GOD_THING_NAME(game, thing_id, name): @@ -274,9 +287,7 @@ def cmd_THING_DOOR_CLOSED(game, thing_id): raise GameError('thing of ID %s not found' % thing_id) if not t.type_ == 'Door': raise GameError('thing of ID %s not door' % thing_id) - t.blocking = True - t.portable = False - t.thing_char = '#' + t.close() cmd_THING_DOOR_CLOSED.argtypes = 'int:pos' def cmd_THING_MUSICPLAYER_SETTINGS(game, thing_id, playing, index, repeat): @@ -325,8 +336,28 @@ def cmd_PLAYER_FACE(game, face, connection_id): raise GameError('wrong face string length') game.faces[t.name] = face game.changed = True + game.record_change(t.position, 'other') cmd_PLAYER_FACE.argtypes = 'string' +def cmd_PLAYER_HAT(game, hat, connection_id): + t = game.get_player(connection_id) + if not t: + raise GameError('can only edit hat when already logged in') + if not t.name in game.hats: + raise GameError('not currently wearing an editable hat') + if len(hat) != 18: + raise GameError('wrong hat string length') + legal_chars = t.get_cookie_chars() + for c in hat: + if c not in legal_chars: + raise GameError('used illegal character: "%s" – ' + 'allowed characters: %s' + % (c, legal_chars)) + game.hats[t.name] = hat + game.changed = True + game.record_change(t.position, 'other') +cmd_PLAYER_HAT.argtypes = 'string' + def cmd_GOD_PLAYER_FACE(game, name, face): if len(face) != 18: raise GameError('wrong face string length') @@ -339,6 +370,10 @@ def cmd_GOD_PLAYER_HAT(game, name, hat): game.hats[name] = hat cmd_GOD_PLAYER_HAT.argtypes = 'string string' +def cmd_GOD_PLAYERS_HAT_CHARS(game, name, hat_chars): + game.players_hat_chars[name] = hat_chars +cmd_GOD_PLAYERS_HAT_CHARS.argtypes = 'string string' + def cmd_THING_HAT_DESIGN(game, thing_id, design): if len(design) != 18: raise GameError('hat design of wrong length')