Forfeit = 2x coin loss + 0 XP (no kot); end-of-game roster + add friend
CI/CD / CI - API (dotnet build + engine sim) (push) Successful in 21s
CI/CD / CI - Web (tsc + next build) (push) Successful in 1m0s
CI/CD / Deploy - local stack (db + server + web) (push) Failing after 0s

Forfeit penalty reworked (client + server gamification, in sync):
- Surrendering team loses DOUBLE the entry coins; winner takes the stake.
- Forfeiter earns NO XP. No kot is applied or mentioned anymore.
- MatchSummary/Dto carry a `forfeit` flag; GameRoom.FinalizeForfeit →
  ApplyRewardsAsync(team) with Forfeit=true (dropped the kot path).
- Forfeit confirm dialogs now alert the real penalty (double coins, no XP).

End-of-game roster: SeatPlayerDto/ServerSeatPlayer + game-store SeatPlayer gain
userId/isBot. New <MatchPlayersList> lists everyone at the table on the final
screen (PostMatchRewardsModal + AI MatchOverlay) with a tactile "Add" button to
send a friend request to real (non-bot, non-self) players ("Sent" after).

Verified: tsc + sim + dotnet + next build clean; stack rebuilt :1500/:1505.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-05 10:40:14 +03:30
parent 6bbdbac23b
commit b739b503eb
13 changed files with 127 additions and 19 deletions
+12 -2
View File
@@ -47,9 +47,14 @@ const fa: Dict = {
"forfeit.title": "تسلیم",
"forfeit.ask": "از این بازی تسلیم می‌شوید؟",
"forfeit.teammateAsks": "{name} می‌خواهد تسلیم شود. موافقید؟",
"forfeit.rule": "اگر حتی یک دست برده باشید باخت عادی، وگرنه کُت می‌شوید.",
"forfeit.rule": "با تسلیم، دو برابر سکهٔ ورودی را از دست می‌دهید و هیچ امتیاز تجربه‌ای نمی‌گیرید.",
"forfeit.confirm": "تسلیم",
"forfeit.keepPlaying": "ادامه می‌دهم",
"match.players": "بازیکنان",
"match.you": "شما",
"match.bot": "ربات",
"match.addFriend": "افزودن",
"match.sent": "ارسال شد",
"seat.you": "شما",
"team.us": "ما",
@@ -314,9 +319,14 @@ const en: Dict = {
"forfeit.title": "Forfeit",
"forfeit.ask": "Surrender this match?",
"forfeit.teammateAsks": "{name} wants to forfeit. Agree?",
"forfeit.rule": "Win ≥1 round = normal loss, otherwise it's a Kot.",
"forfeit.rule": "Forfeiting costs double your entry coins and earns no XP.",
"forfeit.confirm": "Forfeit",
"forfeit.keepPlaying": "Keep playing",
"match.players": "Players",
"match.you": "You",
"match.bot": "Bot",
"match.addFriend": "Add",
"match.sent": "Sent",
"seat.you": "You",
"team.us": "Us",