Integrated WS server

This commit is contained in:
Eden Kirin
2023-03-25 17:23:00 +01:00
parent 8971c64713
commit 1b745c756f
8 changed files with 117 additions and 108 deletions

View File

@ -1,26 +1,29 @@
import asyncio
import logging
from typing import Optional
from hopper.enums import Direction, PlayerMoveResult
from hopper.errors import Collision, PositionOutOfBounds
from hopper.models.board import (
BOARD_DUMP_CHARS,
BoardLayout,
Destination,
GameBoard,
Layer,
LayerObject,
ObjectType,
create_random_position, BoardLayout,
create_random_position,
)
from hopper.models.player import Player, PlayerList, Position
from hopper.watchdog import InactivityWatchdog
from hopper.ws_client import ws_send_game_state
from hopper.ws_server import WSServer
from settings import settings
class GameEngine:
def __init__(self, board: GameBoard) -> None:
def __init__(self, board: GameBoard, ws_server: Optional[WSServer] = None) -> None:
self.board = board
self.ws_server = ws_server
self.players = PlayerList()
self._inacivity_watchdog = None
self.__debug_print_board()
@ -59,11 +62,14 @@ class GameEngine:
logging.info(f"Starting new game for player: {player}")
self.__debug_print_board()
await ws_send_game_state()
if self.ws_server:
await self.ws_server.send_game_state()
return player
async def move_player(self, player: Player, direction: Direction) -> PlayerMoveResult:
async def move_player(
self, player: Player, direction: Direction
) -> PlayerMoveResult:
player.reset_timeout()
new_position = Position(player.position.x, player.position.y)
@ -91,7 +97,8 @@ class GameEngine:
player.position = new_position
player.move_count += 1
await ws_send_game_state()
if self.ws_server:
await self.ws_server.send_game_state()
if self.is_player_on_destination(player):
logging.info(f"Player {player} reached destination!")
@ -116,12 +123,14 @@ class GameEngine:
def get_board_layout(self) -> BoardLayout:
return BoardLayout(board=self.board, players=self.players)
class GameEngineFactory:
@staticmethod
def create(
board_width: int,
board_height: int,
obstacle_count: int = 0,
ws_server: Optional[WSServer] = None,
) -> GameEngine:
board = GameBoard(
width=board_width,
@ -138,16 +147,20 @@ class GameEngineFactory:
)
board.layers.append(obstacle_layer)
game = GameEngine(board=board)
game = GameEngine(
board=board,
ws_server=ws_server,
)
GameEngineFactory.__add_test_player(game.players)
return game
@staticmethod
def create_default() -> GameEngine:
def create_default(ws_server: Optional[WSServer] = None) -> GameEngine:
return GameEngineFactory.create(
board_width=settings.board.WIDTH,
board_height=settings.board.HEIGHT,
obstacle_count=settings.board.OBSTACLE_COUNT,
ws_server=ws_server,
)
@staticmethod