Archived
gameobject annoucing when joining
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
from controller import ObjectController
|
||||
|
||||
|
||||
class Card(ObjectController):
|
||||
pass
|
||||
@@ -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())
|
||||
)
|
||||
|
||||
+51
-4
@@ -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
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
class ObjectController:
|
||||
pass
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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],
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
class Serializable:
|
||||
def serialize(self):
|
||||
return self.__dict__
|
||||
+7
-2
@@ -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())
|
||||
|
||||
@@ -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
|
||||
@@ -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):
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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]
|
||||
}
|
||||
@@ -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__
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user