Boti: pauza pred vedenim kopky, spravne poradie broadcastov po tahu
Bot doteraz vedel zahodit prvu kartu novej kopky uz po BOT_MOVE_DELAY_SECONDS (0.8s), zatial co frontend zmetaciu animaciu predoslej kopky prehraval 1650ms -- karta tak "vyletela" uprostred zmetania. _run_bot_turns teraz pri vedeni novej kopky caka TRICK_SWEEP_SECONDS (1.7s), zhodne s SETTLE_MS+ COLLECT_MS v GameTable.tsx. _run_bot_turns tiez posielal player_cards PRED game_status (opacne ako human play_card handler) -- pri prechode do noveho kola tak klient dostal novu ruku skor, nez vedel, ze zacalo nove kolo, a fixne ju hned zobrazil. Poradie broadcastov je teraz zhodne s human handlerom. GameTable/Hand: ruka noveho kola sa zobrazi az po dobehnuti zmetacej animacie poslednej kopky predchadzajuceho kola (displayedHand + freeze efekt), a Hand.tsx rezervuje fixny priestor pre karty aj ked je ruka docasne prazdna, aby layout neposkakoval. tests/test_bots.py: nulovanie TRICK_SWEEP_SECONDS v setUpClass, aby testy zostali rychle. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+23
-5
@@ -383,6 +383,11 @@ def _load_game_into_memory(info: dict) -> "Game":
|
||||
|
||||
# Pauza medzi tahmi bota, nech ludia stihaju sledovat hru (0 = okamzite).
|
||||
BOT_MOVE_DELAY_SECONDS = float(os.environ.get("BOT_MOVE_DELAY_SECONDS", "0.8"))
|
||||
# Kopka na stole sa po dohrati este chvilu zmieta smerom k vitazovi (SETTLE_MS +
|
||||
# COLLECT_MS vo frontend/src/pages/GameTable.tsx, spolu 1650ms) -- kym tato
|
||||
# animacia nedobehne vsetkym hracom, prvy bot na tahu nesmie zahodit kartu do
|
||||
# novej kopky, inak by mu karta "vyletela" uprostred zmetania predoslej.
|
||||
TRICK_SWEEP_SECONDS = 1.7
|
||||
|
||||
|
||||
def _kick_bots(gid: str) -> None:
|
||||
@@ -410,10 +415,16 @@ async def _run_bot_turns(gid: str):
|
||||
bot = game.player_by_order(seat)
|
||||
if bot is None or not bot.is_bot:
|
||||
return # na tahu je clovek
|
||||
if BOT_MOVE_DELAY_SECONDS > 0:
|
||||
await asyncio.sleep(BOT_MOVE_DELAY_SECONDS)
|
||||
delay = BOT_MOVE_DELAY_SECONDS
|
||||
if rnd.is_guessing_completed() and not rnd.get_last_stash().get_cards() \
|
||||
and core.get_previous_stash() is not None:
|
||||
# Bot vedie novu kopku a este bezi zmetanie tej predoslej.
|
||||
delay = max(delay, TRICK_SWEEP_SECONDS)
|
||||
if delay > 0:
|
||||
await asyncio.sleep(delay)
|
||||
if games.get(gid) is not game:
|
||||
return # hru medzitym niekto ukoncil (end_game)
|
||||
played_card = False
|
||||
try:
|
||||
if not rnd.is_guessing_completed():
|
||||
guess = await loop.run_in_executor(None, bot.brain.guess, rnd, seat)
|
||||
@@ -422,15 +433,22 @@ async def _run_bot_turns(gid: str):
|
||||
action = await loop.run_in_executor(None, bot.brain.play, rnd, seat)
|
||||
core.play_card(seat, index_card(action))
|
||||
await history.record_completed_rounds(gid, core)
|
||||
for player in game.players:
|
||||
if player.sid:
|
||||
await send_player_cards(gid, player.order, player.sid)
|
||||
played_card = True
|
||||
except BridzikException as exc:
|
||||
# Nemalo by nastat (bot hra len legalne tahy) -- nezacykli sa,
|
||||
# slucku znovu spusti dalsia akcia cloveka.
|
||||
await send_error_room(gid, str(exc))
|
||||
return
|
||||
# game_status musi ist PRED player_cards -- klient podla neho (novy
|
||||
# round_number + previous_stash) pozna, ze prave zacalo nove kolo, a
|
||||
# dovtedy si drzi starych karty na obrazovke (pozri "displayedHand" vo
|
||||
# frontend/src/pages/GameTable.tsx), kym nedobehne animacia zmetenia
|
||||
# poslednej kopky. Opacne poradie by novu ruku odhalilo predcasne.
|
||||
await send_game_status(gid)
|
||||
if played_card:
|
||||
for player in game.players:
|
||||
if player.sid:
|
||||
await send_player_cards(gid, player.order, player.sid)
|
||||
|
||||
|
||||
async def send_error_room(gid: str, message: str):
|
||||
|
||||
Reference in New Issue
Block a user