示例#1
0
    def move(self, player: Player, pos: Vector2):
        if self.dungeon.is_valid_position(pos):
            old_pos = player.pos
            player.pos = pos
            self.send_room_data(player)

            # Fetch the rooms
            old_room = self.dungeon.room_at_position(old_pos)
            new_room = self.dungeon.room_at_position(pos)

            # Update players in rooms
            if old_pos != pos:
                old_room.leave(player)
                self.send_msg_to_room(old_room, "%s has left the room" % player.get_true_name(), [player])

            new_room.join(player)

            # Notify everyone in the room that a player has joined
            self.send_msg_to_room(new_room, "%s has joined the room" % player.get_true_name(), [player])

            # Notify player of the players in the room they have joined
            if len(new_room.players) > 1:
                player_names = ', '.join([ply.get_true_name() for ply in new_room.players if ply != player])
                self.send(player, DataTags.WRITE, "There are %d people in this room: %s" %
                          (len(new_room.players) - 1, player_names))
            # Save the player's position
            self.player_persistence.save_data(player)
        else:
            self.send(player, DataTags.WRITE, "Not a valid direction!")  # TODO - less confusing message if map changes
    def load_data(self, player: Player):
        data = self._player_data(player.player_id)

        print(data)

        if data is not None:
            player.nickname = data['nickname']
            player.pos = Vector2(data['pos_x'], data['pos_y'])
    def test_multiple_leave(self):
        for i in range(0, 20):
            self.game_state.join(Player(i))

        for i in range(0, 20):
            self.game_state.leave(Player(i))

        for i in range(0, 20):
            assert not self.game_state.contains_player(Player(i))
示例#4
0
 def command_name(self, player: Player, name: str):
     if len(name) > 20:
         reason = "Nickname too long! (max 20)"
         self.send(player, DataTags.WRITE, reason)  # TODO change DUPLICATE_LOGIN
     else:
         old_name = player.get_name()
         player.nickname = name
         # Notify others of name change
         self.send_msg_to_room(self.dungeon.room_at_position(player.pos), "%s (%s) has changed their name to %s" %
                               (old_name, player.username, player.nickname), [player])
         # Notify the player of name change
         self.send(player, DataTags.WRITE, "You have changed your name from %s to %s" %
                   (old_name, player.get_name()))
         self.save(player)
示例#5
0
    def start(self, ip, port):
        self.sock.connect((ip, port))
        self.sendline("name {}".format(self.name))

        for line in readline_from_socket(self.sock):
            data = json.loads(line)
            if "status" in data:
                self.handle_status_message(data)
                continue

            if not self.display:
                self.board = GameBoardClient(*data["map_size"])
                self.players = [
                    Player(None, name="Player" + str(i))
                    for i in range(data["num_players"])
                ]
                self.my_id = data["player_id"]
                self.players[self.my_id].name = self.name
                self.display = Display(600, 600, self.board.width,
                                       self.board.height)
                self.display.init()

            self.board.update(data["map"])
            self.display.clear()
            self.display.draw_board(self.board, self.players)
            self.display.update(fps=0)
            self.resolve_round()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    print("Game terminated by host.")
                    sys.exit(0)
示例#6
0
async def join(ctx, rank):
    """
    The join function adds a user to the current party if they send the message
    !join <current rank>
    """
    server = get_server(ctx.guild)
    current_players = server.current_players
    player = ctx.author
    for p in current_players:
        if p.user == str(player):
            await ctx.send(
                str(player) + ' has already been added to the game!')
            return
    if rank not in RANKS:
        await ctx.send("Please give a valid rank!")
        return
    elo = RANKS[rank]
    if len(current_players) >= 10:
        await ctx.send('There are already 10 people in the game')
        return
    addUser(str(player), 0, 0)
    current_players.append(Player(str(player), elo))
    embed = discord.Embed()
    embed.add_field(name="Join success",
                    value=str(player) + " has successfully joined!",
                    inline=False)
    await ctx.send(embed=embed)
    def save_data(self, player: Player):
        print("Saving player data")
        try:
            self.cursor.execute(
                'INSERT OR IGNORE INTO %s (player_id, nickname, pos_x, pos_y) VALUES (?,?,?,?)'
                % self.PLAYER_TABLE, (player.player_id, player.get_name(),
                                      player.pos.x, player.pos.y))

            self.cursor.execute(
                'UPDATE %s SET nickname = ?, pos_x = ?, pos_y = ? WHERE player_id = ?'
                % self.PLAYER_TABLE, (player.get_name(), player.pos.x,
                                      player.pos.y, player.player_id))
        except Exception as e:
            print(e)
        else:
            self.db.commit()
示例#8
0
 def command_room_desc(self, player: Player, desc: str):
     if len(desc) > 100:
         self.send(player, DataTags.WRITE, "Description too long (max 100)")
     else:
         room = self.dungeon.room_at_position(player.pos)
         room.desc = desc
         self.send_msg_to_room(room, "Room description changed by %s to: %s" % (player.get_name(), desc))
         self.dungeon.save()
示例#9
0
 def command_room_name(self, player: Player, name: str):
     if len(name) > 30:
         self.send(player, DataTags.WRITE, "Name too long (max 30)")
     else:
         room = self.dungeon.room_at_position(player.pos)
         room.name = name
         self.send_msg_to_room(room, "Room name changed by %s to: %s" % (player.get_name(), name))
         self.dungeon.save()
示例#10
0
 def check_username(self, player: Player, username: str):
     # TODO check if user is already logged in
     if len(username) > 20:
         reason = "Username too long! (max 20)"
         self.send(player, DataTags.DUPLICATE_LOGIN,
                   reason)  # TODO change DUPLICATE_LOGIN
         self.send(player, LoginTags.ENTER_USERNAME)
         return
     # Set username first
     if player.username is None:
         player.username = username
         # Load user's salt or create one
         if self.username_exists(username):
             player.salt = self.user_salt(username)
         else:
             player.salt = self.generate_salt()
         # Tell user to enter password
         self.send(player, LoginTags.ENTER_PASSWORD, player.salt)
示例#11
0
 def setUp(cls):
     cls.player = Player()
     cls.player.player_id = 1
     cls.player.username = '******'
     cls.play = Play(sqlite3.connect(':memory:'))
     cls.play.join(cls.player)
     cls.play.output_queue.get()  # Remove clear
     cls.play.output_queue.get()  # Remove welcome msg
     cls.play.output_queue.get()  # Remove room info
     cls.play.output_queue.get()  # Remove player joined room
示例#12
0
    def join(self, player: Player):
        # Check for duplicate connections
        for ply in self.players:
            if ply.username == player.username:
                self.kick_queue.put((player, "You are already logged on from a different computer!"))
                return

        super().join(player)
        self.player_persistence.load_data(player)
        self.clear_players_screen(player)
        self.welcome_message(player)
        self.help_commands(player)
        print("Moving player: %s to %s" % (player.get_name(), player.pos))
        self.move(player, player.pos)
示例#13
0
    def test_update_to_login(self):
        player = Player(1)
        player_name = "TestMe"
        self.login.join(player)

        # First is username
        self.login.update(
            player, DataPacket.combine(LoginTags.CHECK_USERNAME, player_name))

        # Second is password - no account TestMe so will create new
        self.login.update(
            player,
            DataPacket.combine(LoginTags.CHECK_PASSWORD, self.salted_password))

        # Verify the user was created
        assert self.login.user_salt(player_name) is not None
        assert self.login.username_exists(player_name)

        # Verify the user is verified
        assert player.login_verified
示例#14
0
 def welcome_message(self, player: Player):
     msg = "Welcome to the Dungeon %s!" % player.get_name()
     self.send(player, DataTags.WRITE, msg)
示例#15
0
'''
Created on 16.08.2014
Migration helper...

put all your images in the static/face/ directory in format "forename_lastname.jpg"

@author: Christoph Gerneth
'''
import sys
import os

sys.path.append("../")
from server import Player, db

gifs = os.listdir("../static/face/")

db.drop_all()
db.create_all()

print gifs

for fn in gifs:
    name = fn.split(".")[0]
    name = name.split("_")
    name_cap = map(str.capitalize, name)
    obj = Player(name=" ".join(name_cap).decode('utf-8'),
                 imgurl=fn.decode("utf-8"))
    db.session.add(obj)

db.session.commit()
示例#16
0
 def say(self, player: Player, msg: str):
     room = self.dungeon.room_at_position(player.pos)
     self.send_msg_to_room(room, player.get_name() + ": " + msg)
示例#17
0
                for x_change in range(-1, player1.range + 1):
                    for y_change in range(-1, player1.range + 1):
                        if player1.x + x_change == sprite.x and player1.y + y_change:
                            sprite.health -= player1.attack
        last_attack_time = time()


def get_sprites_around_xy(x_range, y_range):
    sprites_in_range = {}
    for sprite_id, sprite in Sprite.sprites.items():
        if sprite.x in x_range and sprite.y in y_range:
            sprites_in_range[sprite_id] = sprite
    return sprites_in_range


last_attack_time = time()
id_counter = 0

player1 = Player.Player(id_counter, "Player", 45, 9)
id_counter += 1
# Creates 15 randomly places enemies.

for i in range(15):
    x, y = random.randint(0, 80), random.randint(0, 20)
    while not is_tile_walkable(x, y):
        x, y = random.randint(0, 80), random.randint(0, 20)
    temp_enemy = Enemy.Enemy(id_counter, x, y, "giant_eye")
    id_counter += 1


示例#18
0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(("127.0.0.1", 5050))

display = None
board = None
players = None

for line in readline_from_socket(s):
    try:
        data = json.loads(line)
        if not display:
            board = GameBoardClient(*data["map_size"])
            players = [
                Player(None, name=player["name"]) for player in data["players"]
            ]
            display = Display(600, 600, board.width, board.height)
            display.init()

        board.update(data["map"])
        display.clear()
        display.draw_board(board, players)
        display.update(fps=0)

    except Exception, e:
        print("Error parsing:", e.message)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            print("Game terminated by host.")
示例#19
0
 def test_out_of_order_join(self):
     self.game_state.join(Player(5))
     self.game_state.join(Player(50))
     self.game_state.join(Player(500))
示例#20
0
 def leave(self, player: Player):
     super().leave(player)
     room = self.dungeon.room_at_position(player.pos)
     room.leave(player)
     if player.get_name() is not None:
         self.send_msg_to_room(room, "%s has left the server" % player.get_name(), [player])
示例#21
0
 def setUp(self):
     self.game_state = GameState()
     self.player_id = Player(random.randrange(255))
 def setUp(cls):
     cls.pp = PlayerPersistence(sqlite3.connect(':memory:'))
     cls.player = Player()
     cls.player.player_id = 1
     cls.player.username = '******'