L3-Bataille-Navale/source/network/game_network.py

45 lines
1.6 KiB
Python

import socket
from typing import Any
from source.core.enums import BombState
from source.core.error import InvalidBombPosition, PositionAlreadyShot
from source.gui import scene
from source.network.packet.abc import Packet
from source.network import packet
from source.gui.window import Window
from source.utils import StoppableThread
from source.utils.thread import in_pyglet_context
def game_network(thread: "StoppableThread", window: "Window", connection: socket.socket):
game_scene = in_pyglet_context(window.set_scene, scene.Game, connection=connection)
while True:
data: Any = Packet.from_connection(connection)
if data is None:
if thread.stopped: return # vérifie si le thread n'est pas censé s'arrêter
continue
match type(data):
case packet.PacketChat:
print(data.message)
case packet.PacketBoatPlaced:
print("adversaire à posé ses bateaux")
case packet.PacketBombPlaced:
try:
bomb_state = game_scene.grid_ally.board.bomb(data.position)
except (InvalidBombPosition, PositionAlreadyShot):
bomb_state = BombState.ERROR
packet.PacketBombState(position=data.position, bomb_state=bomb_state).send_connection(connection)
case packet.PacketBombState:
if data.bomb_state is BombState.ERROR: continue
touched = data.bomb_state in [BombState.TOUCHED, BombState.SUNKEN, BombState.WON]
in_pyglet_context(game_scene.grid_enemy.place_bomb, data.position, touched)