
    Ii:                       S r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
Jr  SSKJrJr  SSKJr  \(       a  SS	KJrJr  SS
 jrSS jr  S            S!S jjrS"S jr        S#S jr          S$S jr          S%S jrS&S jrS'S jrS(S jrS)S jrS*S jr          S+S jr S(S jr!      S,S jr"S-S jr#          S.S jr$S/S jr%            S0S jr&g)1z)Trading/Auction system for Age of Heroes.    )annotations)TYPE_CHECKING   )CardCardTypeResourceTypeSpecialResourceType	EventTypeget_card_name)
TradeOfferTRIBE_SPECIAL_RESOURCE   )Localization)AgeOfHeroesGameAgeOfHeroesPlayerc                   US:  d  U[        UR                  5      :  a  gUR                  U   nUR                  (       aY  UR                  [        R
                  :X  a;  [        R                  " UR                  R                  5      nUR                  U:X  a  gUR                  [        R
                  :X  a  [        XR                  5      (       d  gg)zHCheck if a card can be offered for trade. Returns error message or None.r   Invalid card indexz$ageofheroes-cannot-trade-own-specialz ageofheroes-resource-not-in-gameN)lenhandtribe_state	card_typer   SPECIALr   gettribesubtypeis_special_resource_in_game)gameplayer
card_indexcardown_specials        ?c:\Users\dbart\PlayPalace11\server\games\ageofheroes\trading.pycan_offer_cardr#      s    A~s6;;'77#;;z"D dnn0@0@@,001C1C1I1IJ<<;&9 ~~)))*4>>5    c                    U R                  5        HZ  n[        US5      (       d  M  UR                  (       d  M)  [        R                  " UR                  R
                  5      nX1:X  d  MZ    g   g)z=Check if a special resource type is being used by any player.r   TF)get_active_playershasattrr   r   r   r   )r   special_typer   player_specials       r"   r   r   #   sW    ))+6=))f.@.@.@3778J8J8P8PQN-	 ,
 r$   Nc                H   [        XU5      nU(       a  gU R                  5       nUR                  U5      nU R                   H5  nUR                  U:X  d  M  UR
                  U:X  d  M'  X8l        XHl        Us  $    [        UUUUS9nU R                  R                  U5        U$ )zCreate a new trade offer.N)player_indexr   wanted_typewanted_subtype)
r#   r&   indextrade_offersr+   r   r,   r-   r   append)	r   r   r   r,   r-   erroractive_playersr+   offers	            r"   create_offerr4   -   s     44E,,.N!''/L ""-%2B2Bj2P +#1 L # !%	E 	U#Lr$   c                    U R                  5       nUR                  U5      n[        U R                  5       HD  u  pVUR                  U:X  d  M  UR
                  U:X  d  M)  U R                  R                  U5          g   g)zCancel a trade offer.TF)r&   r.   	enumerater/   r+   r   pop)r   r   r   r2   r+   ir3   s          r"   cancel_offerr9   O   sn    ,,.N!''/Ld//0-%2B2Bj2P!!!$ 1 r$   c                \   / nU R                  5       nUR                  U5      nU R                   Hx  nUR                  U:X  a  M  UR                  b  UR                  UR
                  :w  a  M>  UR                  b  UR                  UR                  :w  a  Mg  UR                  U5        Mz     U$ )z,Get offers that match a card the player has.)	r&   r.   r/   r+   r,   r   r-   r   r0   )r   r   r    matchesr2   r+   r3   s          r"   get_matching_offersr<   [   s     G,,.N!''/L""- (U->->$..-P+0D0D0Tu # Nr$   c                   US:  d  U[        UR                  5      :  a  gU R                  5       nUR                  U5      nUR                  U:X  a  gXBR                     n[        US5      (       d  gUR                  [        UR                  5      :  a  gUR                  U   nUR                  b  UR                  UR                  :w  a  gUR                  b  UR                  UR                  :w  a  g	[        XU5      nU(       a  U$ g)
zECheck if a player can accept an offer. Returns error message or None.r   r   zCannot accept your own offerr   zOfferer has no handz Offered card no longer availableNzCard type doesn't matchzCard subtype doesn't match)r   r   r&   r.   r+   r'   r   r,   r   r-   r   r#   )	r   acceptorr3   acceptor_card_indexr2   acceptor_indexoffereracceptor_cardr1   s	            r"   can_accept_offerrC   s   s     Q"5X]]9K"K#,,.N $))(3N^+- //0G7F##$3w||,,1 MM"56M$)@)@EDUDU)U('M,A,AUEYEY,Y+ 4+>?Er$   c                   U R                  5       nUR                  [        U5      :  a  gXAR                     n[        US5      (       a  [        US5      (       d  gUR                  [        UR
                  5      :  a  gU[        UR
                  5      :  a  gUR
                  R                  UR                  5      nUR
                  R                  U5      nUR
                  R                  U5        UR
                  R                  U5        XR                  ;   a  U R                  R                  U5        [        U 5        U R                  S5        g)z$Execute a trade between two players.Fr   game_ageofheroes/trade.oggT)r&   r+   r   r'   r   r   r7   r0   r/   removecleanup_offers
play_sound)r   r3   r>   r?   r2   rA   offerer_cardrB   s           r"   execute_traderJ      s    ,,.NS00//0G7F##78V+D+D3w||,,c(--00 <<##E$4$45LMM%%&9:MLL&MM& !!!  ' 4 	OO01r$   c                >   U R                  5       n/ nU R                   Hu  nUR                  [        U5      :  a  M  XR                     n[	        US5      (       d  M?  UR
                  [        UR                  5      :  a  Md  UR                  U5        Mw     X l        g)z8Remove invalid offers (e.g., card indices out of range).r   N)r&   r/   r+   r   r'   r   r   r0   )r   r2   valid_offersr3   r   s        r"   rG   rG      s    ,,.NL""^!44 2 23vv&&s6;;//E" # %r$   c                    SUl         U R                  5       nUR                  U5      nU R                   Vs/ s H  oDR                  U:w  d  M  UPM     snU l        gs  snf )z(Mark a player as having stopped trading.TN)has_stopped_tradingr&   r.   r/   r+   r   r   r2   r+   r3   s        r"   stop_tradingrP      sX    !%F ,,.N!''/L,0,=,=d,=5ASASWcAc,=dDds   AAc                ~    U R                  5        H)  n[        US5      (       d  M  UR                  (       a  M)    g   g)z*Check if all players have stopped trading.rN   FT)r&   r'   rN   )r   r   s     r"   is_trading_completerR      s6    ))+6011&:T:T:T , r$   c                    U R                  5       nUR                  U5      nU R                   Vs/ s H  oDR                  U:X  d  M  UPM     sn$ s  snf )z)Get all offers made by a specific player.)r&   r.   r/   r+   rO   s        r"   get_player_offersrT      sK    ,,.N!''/L#00W0e4F4F,4VE0WWWs   AAc                ^   U R                  5       nUR                  [        U5      :  a  gX1R                     n[        US5      (       d  gUR                  [        UR
                  5      :  a  gUR
                  UR                     n[        XR5      nUR                  c%  UR                  c  [        R                  " US5      nOVUR                  b4  [        SUR                  =(       d    SUR                  S9n[        X5      nOUR                  =(       d    SnUR                   SU SU 3$ )z!Format a trade offer for display. r   ageofheroes-any-cardidr   r   z: z -> )r&   r+   r   r'   r   r   r   r,   r-   r   r   r   name)	r   r3   localer2   rA   offered_cardoffered_namewanted_namewanted_cards	            r"   format_offerra      s   ,,.NS00//0G7F##3w||,,<< 0 01L 6L  U%9%9%A"&&v/EF				)bE,=,=,CUMaMab#K8''-2ll^2l^4}==r$   c                   U R                    GHj  nU R                  U5      nU(       d  M  [        X%R                  5      nUc"  [        R
                  " UR                  S5      nOU[         Vs/ s H  oPM     sn;   a/  [        S[        R                  US9n	[        XR                  5      nOU[         V
s/ s H  oPM     sn
;   a/  [        S[        R                  US9n	[        XR                  5      nOKU[         Vs/ s H  oPM     sn;   a/  [        S[        R                  US9n	[        XR                  5      nOUnXA:X  a  UR                  SUUS9  GMN  UR                  SUR                  UUS9  GMm     gs  snf s  sn
f s  snf )	zAnnounce a trade offer.NrW   rX   rY   zageofheroes-offer-made-you)r    wantedzageofheroes-offer-made)r   r    rc   )playersget_userr   r\   r   r   r   r   r   RESOURCEr	   r   r
   EVENTspeak_lr[   )r   r   r]   r-   puserr^   r_   rr`   ses               r"   announce_offerrn     sU    \\}}Q4({{CL %*..t{{<RS|#<|!A|#<<"bH4E4E~^+KE/B#C/B!A/B#CC"bH4D4Dn]+KEy#9y!Ay#99"bHNNN[+KE,{0%&   ,!;;%&	  7  $= $D $:s   .E=7F Fc                Z   SnU R                  5       nSnU[        U R                  5      :  a  U R                  U   n[        X$5      nUc  US-  nM=  Uu  pgUS-   nU[        U R                  5      :  a  U R                  U   n	U	R                  UR                  :X  a  US-  nMI  [        X)5      n
U
c  US-  nM^  U
u  p[        XL5      (       a6  [        X5      (       a&  [        XgX5      (       a  [        XXKU	5        SnSn  U$ US-  nU[        U R                  5      :  a  M  US-  nGM  U$ )zMCheck for matching offers and execute trades. Returns True if any trade made.Fr   r   T)r&   r   r/   _get_offer_selectionr+   _offers_match_trade_is_validexecute_matched_trade)r   trades_mader2   r8   offer1
selection1player1card1joffer2
selection2player2card2s                r"   check_and_execute_tradesr~   9  sO   K,,.N 	
A
c$##$
$""1%).A
FA#E#d''((&&q)F""f&9&99Q-nEJ!Q'NG V++f0L0L"77BB)$&Q"&KA 	 FA- #d''((0 FA r$   c                    UR                   [        U 5      :  a  g XR                      n[        US5      (       d  g UR                  [        UR                  5      :  a  g X"R                  UR                     4$ )Nr   )r+   r   r'   r   r   )r2   r3   r   s      r"   rp   rp   i  sj     S00../F66""3v{{++;;u//000r$   c                    U R                   S L =(       d    U R                   UR                  :H  =(       a.    U R                  S L =(       d    U R                  UR                  :H  $ N)r,   r   r-   r   )r3   r    s     r"   rq   rq   w  sP    %L):):dnn)L $L(<(<(Lr$   c                <    [        X5      =(       a    [        X!5      $ r   )!_special_resource_allows_transfer)rw   rx   r|   r}   s       r"   rr   rr   }  s"     -W< AbB r$   c                .   UR                   [        R                  :w  a  gS n[        R                  " 5        H  u  p4XAR
                  :X  d  M  Un  O   U(       d  g[        U S5      (       a  U R                  (       d  gU R                  R                  U:H  $ )NTr   )	r   r   r   r   itemsr   r'   r   r   )r   r    	needed_byr   specials        r"   r   r     sz    ~~)))I0668ll"I 9 6=))1C1C##y00r$   c           	        UR                   UR                     nUR                   UR                     nXaR                   UR                  '   XSR                   UR                  '   X R                  ;   a  U R                  R                  U5        X@R                  ;   a  U R                  R                  U5        U R	                  S5        U R
                   H  nU R                  U5      nU(       d  M  [        XXR                  5      n	[        XhR                  5      n
Xq:X  a  UR                  SUR                  U
S9  Mi  Xs:X  a  UR                  SUR                  U	S9  M  UR                  SUR                  UR                  U	U
S9  M     g)z,Execute a matched trade between two players.rE   zageofheroes-trade-accepted-you)otherreceivezageofheroes-trade-accepted)r   r   giver   N)r   r   r/   rF   rH   rd   re   r   r\   rh   r[   )r   rw   ru   r|   rz   rx   r}   ri   rj   
card1_name
card2_names              r"   rs   rs     sR    LL**+ELL**+E ',LL""#&+LL""# """  ("""  ( 	OO01\\}}Q4&ukk:J&ukk:J|4!,,&  
 4!,,&   0"<<!,,#&  ' r$   )r   r   r   r   r   intreturn
str | None)r   r   r(   strr   bool)NN)r   r   r   r   r   r   r,   r   r-   r   r   zTradeOffer | None)r   r   r   r   r   r   r   r   )r   r   r   r   r    r   r   list[TradeOffer])
r   r   r>   r   r3   r   r?   r   r   r   )
r   r   r3   r   r>   r   r?   r   r   r   )r   r   r   None)r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r3   r   r\   r   r   r   )
r   r   r   r   r]   r   r-   r   r   r   )r2   zlist[AgeOfHeroesPlayer]r3   r   r   z%tuple[AgeOfHeroesPlayer, Card] | None)r3   r   r    r   r   r   )
rw   r   rx   r   r|   r   r}   r   r   r   )r   r   r    r   r   r   )r   r   rw   r   ru   r   r|   r   rz   r   r   r   )'__doc__
__future__r   typingr   cardsr   r   r   r	   r
   r   stater   r   messages.localizationr   r   r   r   r#   r   r4   r9   r<   rC   rJ   rG   rP   rR   rT   ra   rn   r~   rp   rq   rr   r   rs    r$   r"   <module>r      s   / "   ^ ^ 5 18* #!%
  	
  D	
#4<@0%
%% % 	%
 %P&
&&  & 	&
 
&R%*eX><$
$#4$DH$Zd$	$N-`1+11 +1  	
 
11
11 1 	1
 1 
1r$   