39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
"""玩家实体:人类(持 WebSocket 连接)或 AI。"""
|
|
from __future__ import annotations
|
|
|
|
import secrets
|
|
|
|
from fastapi import WebSocket
|
|
|
|
from .roles import Role
|
|
|
|
|
|
class Player:
|
|
def __init__(self, seat: int, name: str, is_ai: bool = False) -> None:
|
|
self.seat = seat
|
|
self.name = name
|
|
self.is_ai = is_ai
|
|
self.token = secrets.token_hex(8)
|
|
self.role: Role | None = None
|
|
self.alive = True
|
|
self.ws: WebSocket | None = None # AI 恒为 None
|
|
self.speaking = False # 当前正在发言(仅用于 UI 高亮)
|
|
self.persona: str = "" # AI 性格(LLM 提示词用)
|
|
|
|
# ------------------------------------------------------------------
|
|
@property
|
|
def connected(self) -> bool:
|
|
return self.is_ai or self.ws is not None
|
|
|
|
def bind_ws(self, ws: WebSocket) -> None:
|
|
self.ws = ws
|
|
|
|
def unbind_ws(self, ws: WebSocket) -> None:
|
|
if self.ws is ws:
|
|
self.ws = None
|
|
|
|
def reset_for_new_game(self, role: Role) -> None:
|
|
self.role = role
|
|
self.alive = True
|
|
self.speaking = False
|