
    Ii@                        S r SSKJr  SSKJr  SSKJr  \(       a  SSKJrJ	r	  S\
S	   S
\S\
\   4S jrSS jrSSS\
\\\
\   4      SS4S jrSSS\
\\\
\   4      SS4S jrSSS\
\\\
\   4      SS4S jrSSS\
\\\
\   4      SS4S jrSSS.SSS
\S\S\S-  S\S-  SS4S jjrSSS\S-  4S jrSSS
\SS4S jrg)zW
Scoring logic for Scopa game.

Handles round scoring, winner detection, and game end.
    )TYPE_CHECKING   )Card)Team   )	ScopaGameScopaPlayerplayersr	   teamreturnc                     / nU  H:  nUR                   UR                  ;   d  M  UR                  UR                  5        M<     U$ )z'Get all cards captured by team members.)namemembersextendcaptured)r
   r   cardsplayers       9c:\Users\dbart\PlayPalace11\server\games\scopa\scoring.pyget_team_captured_cardsr      s8    E;;$,,&LL)  L    gamer   Nc                    U R                  S5        U R                  R                  5       nU(       d  U R                  R                  n/ nU H]  nU R                  R
                  (       a  [        U R                  U5      nO[        U R                  U5      nUR                  X445        M_     [        X5        [        X5        [        X5        [        X5        U R                  S5        U HD  nU R                  R                  U5      nU R                  SUUR                  UR                  S9  MF     U R!                  S5        g)z
Calculate and award round scores.

Awards points for:
- Most cards (1 point)
- Most diamonds (1 point)
- 7 of diamonds (1 point)
- Most sevens (1 point)
zscopa-scoring-roundzscopa-round-scoreszscopa-round-score-line)r   round_scoretotal_scoregame_pig/win.oggN)broadcast_lteam_managerget_alive_teamsteamsoptionsteam_card_scoringr   r
   append_award_most_cards_award_most_diamonds_award_seven_of_diamonds_award_most_sevensget_team_namer   r   
play_sound)r   r   	team_datar   r   r   s         r   score_roundr*      s    	*+--/E!!'' 02I<<))+DLL$?E ,DLL$?E$'  d&)T-t' 	)*  ..t4$((((	 	 	
  	OO&'r   r)   c                    U VVs/ s H  u  p#U[        U5      4PM     nnn[        S U 5       5      nU VVs/ s H  u  p&Xe:X  d  M  UPM     nnn[        U5      S:X  a  [        XS   SUS9  g U R                  S5        g s  snnf s  snnf )Nc              3   *   #    U  H	  u  pUv   M     g 7fN .0_counts      r   	<genexpr>$_award_most_cards.<locals>.<genexpr>I   s     6+haE+   r   r   zscopa-most-cardsr2   zscopa-most-cards-tie)lenmax_award_round_pointr   )r   r)   r   r   card_counts	max_cardsr2   winnerss           r   r#   r#   G   s    9BC+$D#e*%KC6+66I'2I{e6Ht{GI
7|q4-?yQ/0 DIs   BBBc           	      6   U VVs/ s H  u  p#U[        S U 5       5      4PM     nnn[        S U 5       5      nUS::  a  g U VVs/ s H  u  p&Xe:X  d  M  UPM     nnn[        U5      S:X  a  [        XS   SUS9  g U R	                  S5        g s  snnf s  snnf )Nc              3   H   #    U  H  oR                   S :X  d  M  S v   M     g7f)r   N)suitr0   cs     r   r3   '_award_most_diamonds.<locals>.<genexpr>R   s      AEqVVq[E   "	"c              3   *   #    U  H	  u  pUv   M     g 7fr-   r.   r/   s      r   r3   rB   S   s     <^u^r5   r   r   zscopa-most-diamondsr6   zscopa-most-diamonds-tiesumr8   r7   r9   r   )r   r)   r   r   diamond_countsmax_diamondsr2   r<   s           r   r$   r$   Q   s    V_`V_{ttS AE AABV_N`<^<<Lq'5O~9Nt~GO
7|q4-B,W23 a P    BBBc           	      :   U VVs/ s H  u  p#U[        S U 5       5      4PM     nnn[        S U 5       5      nUS::  a  g U VVs/ s H  u  p&Xe:X  d  M  UPM     nnn[        U5      S:X  a  [        U US   SUSS9  g U R	                  S5        g s  snnf s  snnf )	Nc              3   l   #    U  H*  oR                   S :X  d  M  UR                  S:X  d  M&  Sv   M,     g7f   r   N)rankr?   r@   s     r   r3   +_award_seven_of_diamonds.<locals>.<genexpr>_   s&     Cevv{1qvv{11es   44	4c              3   *   #    U  H	  u  pUv   M     g 7fr-   r.   r/   s      r   r3   rO   a   s     H3GxqU3Gr5   r   r   zscopa-seven-diamondszscopa-seven-diamonds-multir2   
plural_keyzscopa-seven-diamonds-tierE   )r   r)   r   r   seven_diamond_countsmax_seven_diamondsr2   r<   s           r   r%   r%   ]   s    XaXasCeCCDXa   H3GHHQ';[';u?Zt';G[
7|qAJ"$3	
 	34! \s    BBBc           	      6   U VVs/ s H  u  p#U[        S U 5       5      4PM     nnn[        S U 5       5      nUS::  a  g U VVs/ s H  u  p&Xe:X  d  M  UPM     nnn[        U5      S:X  a  [        XS   SUS9  g U R	                  S5        g s  snnf s  snnf )Nc              3   H   #    U  H  oR                   S :X  d  M  Sv   M     g7frL   )rN   r@   s     r   r3   %_award_most_sevens.<locals>.<genexpr>r   s     ?%Q66Q;qq%rC   c              3   *   #    U  H	  u  pUv   M     g 7fr-   r.   r/   s      r   r3   rW   s   s     8<xqU<r5   r   r   zscopa-most-sevensr6   zscopa-most-sevens-tierE   )r   r)   r   r   seven_counts
max_sevensr2   r<   s           r   r&   r&   q   s    T]^T][TT3?%??@T]L^8<88JQ'3K|u7Jt|GK
7|q4-@
S01 _ LrI   rQ   message_keyr2   rR   c                   U R                   R                  UR                  S   S5        U R                   R                  U5      nU(       a  Ub  US:  a  U R	                  XEUS9  g Ub  U R	                  X%US9  g U R	                  X%S9  g )Nr   r   )r   r2   )r   )r   add_to_team_round_scorer   r'   r   )r   r   r[   r2   rR   r   s         r   r9   r9   }   s     	--dll1oqA**40De'EAI>		?2r   c                    U R                   R                  nU R                   R                  (       a  U R                  R	                  5       nU He  nUR
                  U:  d  M  U R                  R                  U5        U R                  R                  U5      nU R                  SXCR
                  S9  Mg     U R                  R	                  5       n[        U5      S:X  a  US   $ [        U5      S:X  a!  U R                  R                  n[        US S9$  gU R                  R                  U5      nU(       a  [        US S9$ g)	zt
Check for a winner.

Args:
    game: The Scopa game instance.

Returns:
    Winning team or None if no winner yet.
zgame-eliminatedr   scorer   r   c                     U R                   $ r-   r   ts    r   <lambda>check_winner.<locals>.<lambda>   s    AMMr   )keyc                     U R                   $ r-   rb   rc   s    r   re   rf      s    ammr   N)r    target_scoreinverse_scopar   r   r   eliminate_teamr'   r   r7   r   minget_teams_at_or_above_scorer8   )r   targetalive_teamsr   r   	remainingr   teams_at_targets           r   check_winnerrr      s    \\&&F||!!''779D6)!!006((66t<  !24GWGW X	   %%557	y>QQ<^q %%++Eu"9:: !  ++GGO,CDDr   c                     U R                   R                  U5      nU R                  SX!R                  S9  U R	                  S5        U R                  5         g)z"Declare a winner and end the game.zgame-winner-scorer_   r   N)r   r'   r   r   r(   finish_game)r   r   r   s      r   declare_winnerru      sM    **40D(=M=MNOO&' 	r   )r   r   r   N)__doc__typingr   game_utils.cardsr   game_utils.teamsr   r   r   r	   listr   r*   tupler#   r$   r%   r&   strintr9   rr   ru   r.   r   r   <module>r~      s|   ! $ $,T-%8  d +(\1K 1DtT$Z?O9P4Q 1VZ 1	4{ 	4tE$T
BR<S7T 	4Y] 	45; 54dDQUJFV@W;X 5]a 5(	2[ 	2T%d4j@P:Q5R 	2W[ 	2" !3
3
3 3
 :3 d
3 
3$${ $td{ $N	 	D 	T 	r   