refactor: разделение кода в session_view.py
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from .session_state import SessionState
|
||||
|
||||
__all__ = ["SessionState"]
|
||||
@@ -0,0 +1,194 @@
|
||||
from wx.lib.pubsub import pub
|
||||
|
||||
from mind_reader.domain import (
|
||||
ArrowDirection,
|
||||
CardData,
|
||||
CardState,
|
||||
Player,
|
||||
PlayerRole,
|
||||
StepData,
|
||||
StepState,
|
||||
)
|
||||
|
||||
|
||||
class SessionState:
|
||||
def __init__(
|
||||
self,
|
||||
local_player: Player,
|
||||
remote_player: Player,
|
||||
sequence_length: int = 20,
|
||||
):
|
||||
self._local_player = local_player
|
||||
self._remote_player = remote_player
|
||||
|
||||
self._sequence_length = sequence_length
|
||||
self._setter_moves: list[ArrowDirection] = []
|
||||
self._guesser_moves: list[ArrowDirection] = []
|
||||
|
||||
self._step_state: StepState = StepState.WAITING_FOR_SETTER
|
||||
|
||||
@property
|
||||
def _completed_move_count(self):
|
||||
return len(self._guesser_moves)
|
||||
|
||||
def _get_setter_card_state(self, index: int) -> CardState:
|
||||
current_index = len(self._setter_moves)
|
||||
|
||||
if index > current_index:
|
||||
return CardState.SETTER_NOT_SET
|
||||
|
||||
elif index == current_index:
|
||||
if self._step_state == StepState.WAITING_FOR_GUESSER:
|
||||
if self._local_player.role == PlayerRole.SETTER:
|
||||
return CardState.SETTER_REVEALED
|
||||
else:
|
||||
return CardState.SETTER_HIDDEN
|
||||
|
||||
return CardState.SETTER_REVEALED
|
||||
|
||||
def _get_guesser_card_state(self, index: int) -> CardState:
|
||||
completed_move_count = self._completed_move_count
|
||||
|
||||
if index > completed_move_count:
|
||||
return CardState.GUESSER_DISABLED
|
||||
|
||||
elif index == completed_move_count:
|
||||
if self._step_state == StepState.WAITING_FOR_GUESSER:
|
||||
return CardState.GUESSER_WAITING
|
||||
else:
|
||||
return CardState.GUESSER_DISABLED
|
||||
|
||||
else:
|
||||
setter_move = self._setter_moves[index]
|
||||
guesser_move = self._guesser_moves[index]
|
||||
if setter_move == guesser_move:
|
||||
return CardState.GUESSER_CORRECT
|
||||
else:
|
||||
return CardState.GUESSER_WRONG
|
||||
|
||||
def start_session(self) -> None:
|
||||
index = 0
|
||||
pub.sendMessage(
|
||||
"session.session_started",
|
||||
step=StepData(
|
||||
index=index,
|
||||
setter=CardData(
|
||||
direction=None,
|
||||
state=self._get_setter_card_state(index),
|
||||
),
|
||||
guesser=CardData(
|
||||
direction=None,
|
||||
state=self._get_guesser_card_state(index),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
def setter_move(self, direction: ArrowDirection) -> bool:
|
||||
if self._step_state != StepState.WAITING_FOR_SETTER:
|
||||
return False
|
||||
|
||||
self._setter_moves.append(direction)
|
||||
self._step_state = StepState.WAITING_FOR_GUESSER
|
||||
|
||||
index = len(self._setter_moves) - 1
|
||||
|
||||
pub.sendMessage(
|
||||
"session.setter_moved",
|
||||
step=StepData(
|
||||
index=index,
|
||||
setter=CardData(
|
||||
direction=direction,
|
||||
state=self._get_setter_card_state(index),
|
||||
),
|
||||
guesser=CardData(
|
||||
direction=direction,
|
||||
state=self._get_guesser_card_state(index),
|
||||
),
|
||||
),
|
||||
)
|
||||
return True
|
||||
|
||||
def guesser_move(self, direction: ArrowDirection) -> bool:
|
||||
if self._step_state != StepState.WAITING_FOR_GUESSER:
|
||||
return False
|
||||
|
||||
self._guesser_moves.append(direction)
|
||||
|
||||
if self._completed_move_count < self._sequence_length:
|
||||
self._step_state = StepState.WAITING_FOR_SETTER
|
||||
else:
|
||||
self._step_state = StepState.SESSION_FINISHED
|
||||
|
||||
index = len(self._guesser_moves) - 1
|
||||
|
||||
pub.sendMessage(
|
||||
"session.guesser_moved",
|
||||
step=StepData(
|
||||
index=index,
|
||||
setter=CardData(
|
||||
direction=self._setter_moves[index],
|
||||
state=self._get_setter_card_state(index),
|
||||
),
|
||||
guesser=CardData(
|
||||
direction=self._guesser_moves[index],
|
||||
state=self._get_guesser_card_state(index),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
next = index + 1
|
||||
|
||||
pub.sendMessage(
|
||||
"session.step_closed",
|
||||
step=StepData(
|
||||
index=next,
|
||||
setter=CardData(
|
||||
direction=None,
|
||||
state=self._get_setter_card_state(next),
|
||||
),
|
||||
guesser=CardData(
|
||||
direction=None,
|
||||
state=self._get_guesser_card_state(next),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
if self._step_state == StepState.SESSION_FINISHED:
|
||||
pub.sendMessage("session.session_finished")
|
||||
|
||||
return True
|
||||
|
||||
def local_move(self, direction: ArrowDirection) -> bool:
|
||||
if not self.can_local_move():
|
||||
return False
|
||||
if self._local_player.role == PlayerRole.SETTER:
|
||||
return self.setter_move(direction)
|
||||
else:
|
||||
return self.guesser_move(direction)
|
||||
|
||||
def can_local_move(self) -> bool:
|
||||
match self._step_state:
|
||||
case StepState.WAITING_FOR_SETTER:
|
||||
return self._local_player.role == PlayerRole.SETTER
|
||||
case StepState.WAITING_FOR_GUESSER:
|
||||
return self._local_player.role == PlayerRole.GUESSER
|
||||
case StepState.SESSION_FINISHED:
|
||||
return False
|
||||
|
||||
@property
|
||||
def setter_name(self) -> str:
|
||||
if self._local_player.role == PlayerRole.SETTER:
|
||||
return self._local_player.name
|
||||
else:
|
||||
return self._remote_player.name
|
||||
|
||||
@property
|
||||
def guesser_name(self) -> str:
|
||||
if self._local_player.role == PlayerRole.GUESSER:
|
||||
return self._local_player.name
|
||||
else:
|
||||
return self._remote_player.name
|
||||
|
||||
@property
|
||||
def sequence_length(self) -> int:
|
||||
return self._sequence_length
|
||||
Reference in New Issue
Block a user