From 29b9839452a2d695bf40aec36b68379366fd63a9 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Thu, 28 Mar 2024 10:33:05 +0100 Subject: [PATCH] gameobject annoucing when joining --- src/controller/__init__.py | 2 + src/controller/card.py | 5 +++ src/controller/client.py | 20 ++++++--- src/controller/game.py | 55 +++++++++++++++++++++-- src/controller/object_controller.py | 2 + src/game/__init__.py | 5 --- src/game/game.py | 38 ---------------- src/game/player.py | 43 ------------------ src/game/serializable.py | 3 -- src/main.py | 9 +++- src/model/__init__.py | 5 +++ src/{game => model}/card.py | 24 +++++++--- src/model/game.py | 68 +++++++++++++++++++++++++++++ src/model/player.py | 46 +++++++++++++++++++ src/model/serializable.py | 14 ++++++ src/{game => model}/team.py | 10 ++--- 16 files changed, 235 insertions(+), 114 deletions(-) create mode 100644 src/controller/card.py create mode 100644 src/controller/object_controller.py delete mode 100644 src/game/__init__.py delete mode 100644 src/game/game.py delete mode 100644 src/game/player.py delete mode 100644 src/game/serializable.py create mode 100644 src/model/__init__.py rename src/{game => model}/card.py (60%) create mode 100644 src/model/game.py create mode 100644 src/model/player.py create mode 100644 src/model/serializable.py rename src/{game => model}/team.py (55%) diff --git a/src/controller/__init__.py b/src/controller/__init__.py index be139b5..e639f7c 100644 --- a/src/controller/__init__.py +++ b/src/controller/__init__.py @@ -1,5 +1,7 @@ """controller handles the translation between netcode messages and model functions""" +from controller.object_controller import ObjectController +from controller.card import Card from controller.game import GameController from controller.client import ClientController diff --git a/src/controller/card.py b/src/controller/card.py new file mode 100644 index 0000000..571c722 --- /dev/null +++ b/src/controller/card.py @@ -0,0 +1,5 @@ +from controller import ObjectController + + +class Card(ObjectController): + pass diff --git a/src/controller/client.py b/src/controller/client.py index 3575cf8..441fe6f 100644 --- a/src/controller/client.py +++ b/src/controller/client.py @@ -5,7 +5,7 @@ from controller import GameController from netcode.models import Message, LoginMessage -from game import Player +from model import Player def vibe_check(t): @@ -93,14 +93,20 @@ class ClientController: self.on_message = self.game_context print("user logged in : " + username) - await self.send( - Message(type="context", data_type="game_context_id", data="game") - ) + await self.game_controller.announce_game(self.websocket) await self.send( Message( - type="create", - data_type="player_self", - data=self.player.serialize_team(), + type="set", + data_type="self", + data=self.player.uuid, ) ) + + for player in self.game_controller.game.players: + if player.team != self.player.team: + continue + + await self.send( + Message(type="update", data_type="object", data=player.serialize_team()) + ) diff --git a/src/controller/game.py b/src/controller/game.py index 14004a8..60c3bcf 100644 --- a/src/controller/game.py +++ b/src/controller/game.py @@ -1,7 +1,7 @@ -import json from netcode import WSServer +from netcode.ws_server import WebSocketServerProtocol from netcode.models import Message -from game import Game, Player, Team +from model import Game, Player, Team class GameController: @@ -11,10 +11,50 @@ class GameController: def __init__(self, game: Game, server: WSServer): self.server = server self.game = game + self.server.message_callbacks.append(self.guest_handler) async def broadcast(self, message: Message): await self.server.broadcast(message.model_dump_json()) + async def announce_game(self, websocket: WebSocketServerProtocol): + for card in self.game.cards: + await websocket.send( + Message( + type="create", + data_type="object", + data=card.serialize(), + ).model_dump_json() + ) + + for team in self.game.teams: + await websocket.send( + Message( + type="create", + data_type="object", + data=team.serialize(), + ).model_dump_json() + ) + + for player in self.game.players: + await websocket.send( + Message( + type="create", + data_type="object", + data=player.serialize_guest(), + ).model_dump_json() + ) + + await websocket.send( + Message( + type="create", + data_type="object", + data=self.game.serialize_guest(), + ).model_dump_json() + ) + + async def guest_handler(self, websocket: WebSocketServerProtocol): + await self.announce_game(websocket) + def get_player(self, username: str) -> Player | None: players = [p for p in self.game.players if p.username == username] if players and len(players) > 0: @@ -29,7 +69,7 @@ class GameController: await self.broadcast( Message( type="create", - data_type="player", + data_type="object", data=player.serialize_guest(), ) ) @@ -38,9 +78,16 @@ class GameController: async def create_team(self): team = self.game.create_team() await self.broadcast( - Message(type="create", data_type="team", data=team.serialize()) + Message(type="create", data_type="object", data=team.serialize()) ) return team + async def create_card(self): + card = self.game.create_card() + await self.broadcast( + Message(type="create", data_type="object", data=card.serialize()) + ) + return card + def start_game(self): pass diff --git a/src/controller/object_controller.py b/src/controller/object_controller.py new file mode 100644 index 0000000..2b57bd5 --- /dev/null +++ b/src/controller/object_controller.py @@ -0,0 +1,2 @@ +class ObjectController: + pass diff --git a/src/game/__init__.py b/src/game/__init__.py deleted file mode 100644 index 009ad0d..0000000 --- a/src/game/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from game.serializable import Serializable -from game.card import Card -from game.team import Team -from game.player import Player -from game.game import Game diff --git a/src/game/game.py b/src/game/game.py deleted file mode 100644 index 6ddc78f..0000000 --- a/src/game/game.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -from typing import List - -from game import Card, Player, Team, Serializable - - -class Game(Serializable): - """Instance of the game, with players and a market""" - - market_stack: List[Card] - market: List[Card] - gem_stack: List[Card] - _players: List[Player] - - started: bool - - default_health = 80 - - def __init__(self): - self.market_stack = [] - self.market = [] - self.gem_stack = [] - self.players = [] - self.started = False - - def start_game(self): - pass - - def create_player(self, username: str, team: Team) -> Player: - player = Player(username, team) - self.players.append(player) - return player - - def create_team(self) -> Team: - return Team() - - def serialize(): - return super().serialize() diff --git a/src/game/player.py b/src/game/player.py deleted file mode 100644 index a5ffb29..0000000 --- a/src/game/player.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import List -from game import Card, Team, Serializable - - -class Player(Serializable): - """Game player, controller by a Client""" - - username: str - - stack_pile: List[Card] - discard_pile: List[Card] - team: Team - - hand: List[Card] - board: List[Card] - - def __init__(self, username: str, team: Team): - self.stack_pile = [] - self.discard_pile = [] - self.hand = [] - self.board = [] - self.team = team - self.username = username - - def serialize_guest(self) -> dict: - return { - "username": self.username, - "stack_pile_amount": len(self.stack_pile), - "discard_pile": [card.serialize() for card in self.discard_pile], - "team": self.team.id, - "hand_amount": len(self.hand), - "board": [card.serialize() for card in self.board], - } - - def serialize_team(self) -> dict: - return { - "username": self.username, - "stack_pile_amount": len(self.stack_pile), - "discard_pile": [card.serialize() for card in self.discard_pile], - "team": self.team.id, - "hand": self.hand, - "board": [card.serialize() for card in self.board], - } diff --git a/src/game/serializable.py b/src/game/serializable.py deleted file mode 100644 index 0e1bd0c..0000000 --- a/src/game/serializable.py +++ /dev/null @@ -1,3 +0,0 @@ -class Serializable: - def serialize(self): - return self.__dict__ diff --git a/src/main.py b/src/main.py index bc98938..3056b27 100644 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import asyncio -from game import Game +from model import Game from netcode.ws_server import WebSocketServerProtocol from netcode import WSServer @@ -22,8 +22,13 @@ async def handler(websocket: WebSocketServerProtocol): playerServer.message_callbacks.append(handler) +async def game_init(): + for i in range(10): + await game_controller.create_card() + + async def main(): - await asyncio.gather(gameServer.serve(), playerServer.serve(port=8766)) + await asyncio.gather(gameServer.serve(), playerServer.serve(port=8766), game_init()) asyncio.run(main()) diff --git a/src/model/__init__.py b/src/model/__init__.py new file mode 100644 index 0000000..aa4b1c9 --- /dev/null +++ b/src/model/__init__.py @@ -0,0 +1,5 @@ +from model.serializable import Serializable +from model.card import Card, CardType, CardFaction +from model.team import Team +from model.player import Player +from model.game import Game diff --git a/src/game/card.py b/src/model/card.py similarity index 60% rename from src/game/card.py rename to src/model/card.py index 57e33f5..c960bb4 100644 --- a/src/game/card.py +++ b/src/model/card.py @@ -1,5 +1,5 @@ from enum import Enum -from game import Serializable +from model import Serializable class CardType(str, Enum): @@ -25,6 +25,7 @@ class CardFaction(str, Enum): class Card(Serializable): """Represents any playable card""" + object_type = "card" sprite: str name: str text: str @@ -32,11 +33,22 @@ class Card(Serializable): card_type: CardType faction: CardFaction - def __init__(self): - pass - - def serialize(self) -> dict: - return self.__dict__ + def __init__( + self, + sprite: str, + name: str, + text: str, + cost: int, + card_type: CardType, + faction: CardFaction, + ): + super().__init__() + self.sprite = sprite + self.name = name + self.text = text + self.cost = cost + self.card_type = card_type + self.faction = faction class CardChampion(Card): diff --git a/src/model/game.py b/src/model/game.py new file mode 100644 index 0000000..31f1d9c --- /dev/null +++ b/src/model/game.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +from typing import List + +from model import Card, CardType, CardFaction, Player, Team, Serializable + + +class Game(Serializable): + """Instance of the game, with players and a market""" + + object_type = "game" + + cards: List[Card] + market_stack: List[Card] + market: List[Card] + gem_stack: List[Card] + players: List[Player] + teams: List[Team] + + started: bool + + default_health = 80 + + def __init__(self): + super().__init__() + self.market_stack = [] + self.market = [] + self.gem_stack = [] + self.players = [] + self.cards = [] + self.teams = [] + self.started = False + + def start_game(self): + pass + + def create_card(self) -> Card: + card = Card( + card_type=CardType.ACTION, + faction=CardFaction.BLUE, + cost=1, + name="test", + text="testtext", + sprite="testsprite", + ) + self.cards.append(card) + return card + + def create_player(self, username: str, team: Team) -> Player: + player = Player(username, team) + self.players.append(player) + return player + + def create_team(self) -> Team: + team = Team(health=self.default_health) + self.teams.append(team) + return team + + def serialize_guest(self) -> dict: + return self.__dict__ | { + "cards": [card.uuid for card in self.cards], + "market_stack": [None for card in self.market_stack], + "market": [card.uuid for card in self.market], + "gem_stack": [card.uuid for card in self.gem_stack], + "players": [player.uuid for player in self.players], + "teams": [team.uuid for team in self.teams], + "started": self.started, + "default_health": self.default_health, + } diff --git a/src/model/player.py b/src/model/player.py new file mode 100644 index 0000000..446e7df --- /dev/null +++ b/src/model/player.py @@ -0,0 +1,46 @@ +from typing import List +from model import Card, Team, Serializable + + +class Player(Serializable): + """Game player, controller by a Client""" + + object_type = "player" + username: str + + stack_pile: List[Card] + discard_pile: List[Card] + team: Team + + hand: List[Card] + board: List[Card] + + def __init__(self, username: str, team: Team): + super().__init__() + self.stack_pile = [] + self.discard_pile = [] + self.hand = [] + self.board = [] + self.team = team + self.username = username + + def serialize_guest(self) -> dict: + """Get data available to the public""" + return self.__dict__ | { + "stack_pile": [None for card in self.stack_pile], + "discard_pile": [card.uuid for card in self.discard_pile], + "team": self.team.uuid, + "hand": [None for card in self.hand], + "board": [card.uuid for card in self.board], + } + + def serialize_team(self) -> dict: + """Get data available to members of the same team""" + return self.serialize_guest() | { + "hand": [card.uuid for card in self.hand], + } + + def serialize(self) -> dict: + return self.serialize_team() | { + "stack_pile": [card.uuid for card in self.stack_pile] + } diff --git a/src/model/serializable.py b/src/model/serializable.py new file mode 100644 index 0000000..ff38dac --- /dev/null +++ b/src/model/serializable.py @@ -0,0 +1,14 @@ +from uuid import uuid4, UUID + + +class Serializable: + object_type = "generic" + + uuid: UUID + + def __init__(self): + self.uuid = uuid4() + self.object_type = self.__class__.object_type + + def serialize(self): + return self.__dict__ diff --git a/src/game/team.py b/src/model/team.py similarity index 55% rename from src/game/team.py rename to src/model/team.py index 77a2c75..24ce4ed 100644 --- a/src/game/team.py +++ b/src/model/team.py @@ -1,18 +1,16 @@ -from game import Serializable +from model import Serializable class Team(Serializable): """Shared object for health storage""" - id = 1 - + object_type = "team" health: int color: str name: str - def __init__(self, health=80, color="red", name="Team " + str(id)): - self.id = Team.id - Team.id += 1 + def __init__(self, health=80, color="red", name="unnamed Team"): + super().__init__() self.health = health self.color = color self.name = name