L3-Bataille-Navale/source/gui/scene/Game.py

252 lines
7 KiB
Python

import socket
from typing import TYPE_CHECKING
import pyglet
from source.gui.scene import Result
from source.gui.scene.abc import Scene
from source.gui import widget, texture
from source import core
from source.network.packet import PacketChat, PacketBombPlaced, PacketBoatPlaced
from source.type import Point2D
if TYPE_CHECKING:
from source.gui.window import Window
class Game(Scene):
def __init__(self, window: "Window", connection: socket.socket, **kwargs):
super().__init__(window, **kwargs)
self.connection = connection
self.batch_label = pyglet.graphics.Batch()
self.batch_button_background = pyglet.graphics.Batch()
self.batch_input_background = pyglet.graphics.Batch()
self.batch_grid_background = pyglet.graphics.Batch()
self.batch_grid_line = pyglet.graphics.Batch()
self.batch_grid_cursor = pyglet.graphics.Batch()
self.batch_grid_boat = pyglet.graphics.Batch()
self.batch_grid_bomb = pyglet.graphics.Batch()
self.background = self.add_widget(
widget.Image,
x=0, y=0, width=1.0, height=1.0,
image=texture.Background.game,
)
self.grid_ally = self.add_widget(
widget.GameGrid,
x=75, y=0.25, width=0.35, height=0.5,
boats_length=[5, 5, 4, 3, 2],
grid_style=texture.Grid.Style1,
boat_style=texture.Grid.Boat.Style1,
bomb_style=texture.Grid.Bomb.Style1,
rows=8, columns=8,
background_batch=self.batch_grid_background,
line_batch=self.batch_grid_line,
cursor_batch=self.batch_grid_cursor,
boat_batch=self.batch_grid_boat,
bomb_batch=self.batch_grid_bomb
)
def board_ally_ready(widget):
self.boat_ready_ally = True
self.me_ready()
if self.boat_ready_enemy: self.refresh_turn_text()
PacketBoatPlaced().send_connection(connection)
self.grid_ally.add_listener("on_all_boats_placed", board_ally_ready)
self.grid_enemy = self.add_widget(
widget.GameGrid,
x=lambda widget: widget.scene.window.width - 75 - widget.width, y=0.25, width=0.35, height=0.5,
grid_style=texture.Grid.Style1,
boat_style=texture.Grid.Boat.Style1,
bomb_style=texture.Grid.Bomb.Style1,
rows=8, columns=8,
background_batch=self.batch_grid_background,
line_batch=self.batch_grid_line,
cursor_batch=self.batch_grid_cursor,
boat_batch=self.batch_grid_boat,
bomb_batch=self.batch_grid_bomb
)
def board_enemy_bomb(widget, cell: Point2D):
if not (self.boat_ready_ally and self.boat_ready_enemy): return
if not self.my_turn: return
PacketBombPlaced(position=cell).send_connection(connection)
self.my_turn = False
self.grid_enemy.add_listener("on_request_place_bomb", board_enemy_bomb)
self.name_ally = self.add_widget(
widget.Text,
x=0.27, y=0.995,
text="Raphael",
font_size=20,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.name_enemy = self.add_widget(
widget.Text,
x=0.73, y=0.995,
text="Leo",
font_size=20,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.score_ally = self.add_widget(
widget.Text,
x=0.44, y=0.995,
text="0",
font_size=25,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.score_enemy = self.add_widget(
widget.Text,
x=0.56, y=0.995,
text="0",
font_size=25,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.chat_log = self.add_widget(
widget.Text,
x=10, y=35, width=0.5,
text="",
anchor_x="left",
multiline=True,
batch=self.batch_label,
)
self.chat_input = self.add_widget(
widget.Input,
x=10, y=10, width=0.5, height=30,
style=texture.Button.Style1,
background_batch=self.batch_input_background,
label_batch=self.batch_label,
)
def send_chat(widget):
text = widget.text
widget.text = ""
self.chat_log.text += "\n" + text
self.chat_log.label.y = self.chat_log.y + self.chat_log.label.content_height
PacketChat(message=text).send_connection(connection)
self.chat_input.add_listener("on_enter", send_chat)
self.button_save = self.add_widget(
widget.Button,
x=0.7, y=0, width=0.15, height=0.1,
label_text="Sauvegarder",
style=texture.Button.Style1,
background_batch=self.batch_button_background,
label_batch=self.batch_label,
)
self.button_quit = self.add_widget(
widget.Button,
x=0.85, y=0, width=0.15, height=0.1,
label_text="Quitter",
style=texture.Button.Style1,
background_batch=self.batch_button_background,
label_batch=self.batch_label,
)
self.label_state = self.add_widget(
widget.Text,
x=0.5, y=0.15,
anchor_x="center",
text="Placer vos bateaux",
font_size=20,
batch=self.batch_label
)
self.board_ally = core.Board(rows=8, columns=8)
self.board_enemy = core.Board(rows=8, columns=8)
self.my_turn: bool = False # is it the player turn ?
self.boat_ready_ally: bool = False # does the player finished placing his boat ?
self.boat_ready_enemy: bool = False # does the opponent finished placing his boat ?
self._boat_broken_ally: int = 0
self._boat_broken_enemy: int = 0
def boat_broken_ally(self):
self._boat_broken_ally += 1
self.score_ally.text = str(self._boat_broken_ally)
def boat_broken_enemy(self):
self._boat_broken_enemy += 1
self.score_enemy.text = str(self._boat_broken_enemy)
def me_ready(self):
self.label_state.text = "L'adversaire place ses bateaux"
def refresh_turn_text(self):
self.label_state.text = "Placer vos bombes" if self.my_turn else "L'adversaire place ses bombes"
def game_end(self, won: bool):
self.window.add_scene(Result, won=won)
def on_draw(self):
self.background.draw()
self.batch_button_background.draw()
self.batch_input_background.draw()
self.batch_grid_background.draw()
self.batch_grid_boat.draw()
self.batch_grid_bomb.draw()
self.batch_grid_line.draw()
self.batch_grid_cursor.draw()
self.batch_label.draw()