
    Ii;                    2   S r SSKJr  SSKJr  SSKJrJrJrJ	r	  SSK
JrJrJrJr  \(       a  SSKJr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S jjrSS jrg) z&Construction system for Age of Heroes.    )annotations)TYPE_CHECKING   )CardCardTypeResourceTypeget_card_name)BuildingTypeBUILDING_COSTSPlaySubPhaseget_building_name)AgeOfHeroesGameAgeOfHeroesPlayerc                    UR                   (       d  / $ / n[         H'  n[        XU5      (       d  M  UR                  U5        M)     U$ )z5Get list of buildings the player can afford to build.)tribe_stater
   	can_buildappend)gameplayer
affordablebuilding_types       Dc:\Users\dbart\PlayPalace11\server\games\ageofheroes\construction.pyget_affordable_buildingsr      sB    	J%T=11m, &     c                    UR                   (       d  g[        XU5      (       d  g[        R                  " U/ 5      n[	        X5      (       d  gU[
        R                  :X  a  [        X5      (       d  gg)z0Check if a player can build a specific building.FT)r   
has_supplyr   gethas_resourcesr
   ROADhas_road_target)r   r   r   requireds       r   r   r       sc     dM22 !!-4H** )))t,,r   c                b   U[         R                  :X  a  U R                  S:  $ U[         R                  :X  a  U R                  S:  $ U[         R
                  :X  a  U R                  S:  $ U[         R                  :X  a  U R                  S:  $ U[         R                  :X  a  U R                  S:  $ g)z1Check if the building supply has available units.r   F)r
   ARMYarmy_supplyCITYcity_supplyFORTRESSfortress_supplyGENERALgeneral_supplyr   road_supply)r   r   r   s      r   r   r   7   s    )))!##	,++	+!##	,//	/##a''	,..	.""Q&&	,++	+!##r   c                   0 nU R                    HN  nUR                  [        R                  :X  d  M#  UR	                  UR
                  S5      S-   X#R
                  '   MP     0 nU H  nUR	                  US5      S-   XE'   M     SnUR	                  [        R                  S5      nUR                  5        H&  u  pXUR	                  US5      n	X:  d  M  X-
  n
Xj-  nM(     Xg:  a  gg)zwCheck if a player has the required resource cards.

Gold acts as a wildcard and can substitute for any other resource.
r   r   FT)	hand	card_typer   RESOURCEr   subtyper   GOLDitems)r   r!   resource_countscardrequired_countsresourcegold_neededgold_availablecount	available	shortfalls              r   r   r   F   s     ')O>>X...,;,?,?a,PST,TOLL) 
 ')O$3$7$7!$Dq$H!  K$(():):A>N*002#''!4	)I$K 3 #r   c                6   UR                   (       d  gU R                  5       nUR                  U5      nUR                   R                  (       dX  US-
  [	        U5      -  nX$   nXQ:w  a>  [        US5      (       a-  UR                   (       a  UR                   R                  (       d  gUR                   R                  (       dX  US-   [	        U5      -  nX&   nXq:w  a>  [        US5      (       a-  UR                   (       a  UR                   R                  (       d  gg)z5Check if there's a valid neighbor to build a road to.Fr   r   T)r   get_active_playersindex	road_leftlenhasattr
road_right)r   r   active_playersplayer_index
left_indexleft_playerright_indexright_players           r   r    r    i   s    ,,.N!''/L ''"Q&#n*==
$0 W[-%H%H&&{/F/F/Q/Q ((#a'3~+>>%2!glM&J&J''0H0H0R0Rr   c                  ^ UR                   (       d  / $ / nU R                  5       nUR                  U5      nUR                   R                  (       dy  US-
  [	        U5      -  nX5   nXa:w  a_  [        US5      (       aN  UR                   (       a=  UR                   R                  (       d"  XQR                  ;  a  UR                  US45        UR                   R                  (       d  US-   [	        U5      -  mUT   nXq:w  az  [        US5      (       ai  UR                   (       aX  UR                   R                  (       d=  TUR                  ;  a-  [        U4S jU 5       5      (       d  UR                  TS45        U$ )zGet list of valid road targets (player_index, direction).

Excludes targets that have declined during this construction action.
In 2-player games, left and right neighbors are the same, so only one is returned.
r   r   leftc              3  2   >#    U  H  oS    T:H  v   M     g7f)r   N ).0targetrG   s     r   	<genexpr>#get_road_targets.<locals>.<genexpr>   s     GwVq	[0ws   right)
r   r=   r>   r?   r@   rA   rB   declined_road_targetsr   any)	r   r   targetsrC   rD   rE   rF   rH   rG   s	           @r   get_road_targetsrU      s<    	G,,.N!''/L ''"Q&#n*==
$0!]33''++66">">>NNJ/0 ((#a'3~+>>%k2 "m44(( ,,666#?#??GwGGGNNK12Nr   c                   / n0 nU H  nUR                  US5      S-   XE'   M     UR                  5        GHQ  u  pV[        U5       GH;  nSn[        U R                  5       Hv  u  pU
R
                  [        R                  :X  d  M%  U
R                  U:X  d  M7  U R                  R                  U	5      nUR                  U5        UR                  U5        Sn  O   U(       a  M  [        U R                  5       H  u  pU
R
                  [        R                  :X  d  M%  U
R                  [        R                  :X  d  ME  U R                  R                  U	5      nUR                  U5        UR                  U5          GM9     GM>     GMT     U$ )zRemove resource cards from player's hand. Returns the spent cards.

Gold acts as a wildcard and can substitute for any other resource.
r   r   FT)r   r2   range	enumerater-   r.   r   r/   r0   popr   r   r1   )r   r!   discard_pilespentr5   r6   r9   _foundir4   removeds               r   spend_resourcesr`      s7    E&(O$3$7$7!$Dq$H!  +002uAE$V[[1>>X%6%664<<8;S$kkooa0GLL) ''0 E 2 5(5GA~~):)::t|||O`O`?`"(++//!"4W-$++G4  6  3* Lr   c                
   [        XU5      (       d  gUR                  (       d  g[        R                  " U/ 5      n[	        XU R
                  5        U[        R                  :X  a6  U =R                  S-  sl        UR                  =R                  S-  sl	        GOU[        R                  :X  a5  U =R                  S-  sl        UR                  =R                  S-  sl        OU[        R                  :X  a5  U =R                  S-  sl        UR                  =R                  S-  sl        OsU[        R                   :X  a5  U =R"                  S-  sl        UR                  =R$                  S-  sl        O*U[        R&                  :X  a  U =R(                  S-  sl        gU R+                  S5        U R-                  U5      nU(       a=  [/        X$R0                  5      nU[        R                  :X  a  SOSnUR3                  SXVS9  U R4                   Hm  nXq:w  d  M
  U R-                  U5      nU(       d  M$  [/        X(R0                  5      nU[        R                  :X  a  SOSnUR3                  S	UR6                  UUS
9  Mo     g)z9Build a building, spending resources and updating supply.Fr   Tgame_ageofheroes/build.ogganaz!ageofheroes-construction-done-you)buildingarticlezageofheroes-construction-done)r   re   rf   )r   r   r   r   r`   rZ   r
   r#   r$   armiesr%   r&   citiesr'   r(   
fortressesr)   r*   generalsr   r+   
play_soundget_userr   localespeak_lplayersname)	r   r   r   r!   userbuilding_namerf   p
other_users	            r   buildru      s   T=11 !!-4HFd&7&78 )))A!!Q&!	,++	+A!!Q&!	,//	/!%%*%	,..	.q ##q(#	,++	+A 	OO01 == D)-E'<+<+<<$#8=b\\;q)Jz 1-ARAR S"/<3D3D"D$#""3!;;*#	 #   r   c                D   UR                   (       d  gU R                  5       nUS:  d  U[        U5      :  a  gXB   n[        US5      (       a  UR                   (       d  gUS:X  a#  SUR                   l        SUR                   l        O"SUR                   l        SUR                   l        U R                  S5        [        UR                   R                  S5      n[        UR                   R                  S5      nU R                  SUR                  UR                  S	9  g)
z+Complete road building between two players.Fr   r   rJ   Trb   enzageofheroes-road-built)tribe1tribe2)r   r=   r@   rA   r?   rB   rk   r   tribebroadcast_lrp   )r   buildertarget_index	directionrC   rN   builder_tribetarget_tribes           r   
build_roadr     s     ,,.Na<3~+>>)F6=))1C1C F(,%(,%)-&'+$ 	OO01%g&9&9&?&?FM$V%7%7%=%=tDL-gll6;;Wr   c                   / n[          H  n[        XU5      (       d  M  [        XB5      n[        R                  " U/ 5      n/ n[        U5       H^  nUR                  U5      n	SSKJn
  U
R	                  USU 35      nU	S:  a  UR                  U	 SU 35        MM  UR                  U5        M`     SR                  U5      nU SU S3nUR                  XM45        M     U$ )	z[Get menu items for construction selection.

Returns list of (building_type, label) tuples.
   )Localizationzageofheroes-resource-r   zx z + z ())r
   r   r   r   r   setr9   messages.localizationr   r   join)r   r   rm   r2   r   rr   r!   
cost_partsr6   r9   r   resource_namecost_strlabels                 r   get_construction_menu_itemsr   3  s     E%T=11-mDM &))-<HJM x0A , 0 0;PQYPZ9[ \19%%r-&AB%%m4 * zz*-H$oRz3ELL-/0' &* Lr   c                   SSK Jn  UR                  (       d  gU[        R                  :X  a  [        X5      nU(       d  gU(       a  US   u  pgU R                  5       nUR                  U5      n	XQl        Xl	        X`l
        [        R                  U l        U R                  5         U[        U5      :  aW  X   n
U R!                  U
5      nU(       a  UR#                  SUR$                  S9  U
R&                  (       a  UR)                  U
SS9  g	g[+        XU5      (       d  gU[        R,                  :X  aA  UR                  R.                  U R0                  R2                  :  a  U R5                  US
5        gg	)ac  Execute building a single item. Returns True if successful, False otherwise.

Args:
    game: The game instance
    player: The player building
    building_type: Type of building to construct
    auto_road: If True, automatically build road to first target (for bots)

Returns:
    True if building was successful, False if it failed or victory occurred
r   )	BotHelperFr   z!ageofheroes-road-request-received)	requester   )ticksTrh   )game_utils.bot_helperr   r   r
   r   rU   r=   r>   pending_road_targetsroad_request_fromroad_request_tor   ROAD_PERMISSION	sub_phaserebuild_all_menusr@   rl   rn   rp   is_botjolt_botru   r%   rh   optionsvictory_cities_declare_victory)r   r   r   	auto_roadr   rT   r}   r~   rC   builder_indexrN   target_users               r   execute_single_buildr   T  sN    3 )))"40&-aj#L!446N*008M +2'%2"#/  *99DN""$ c.11'5"mmF3''(KW]WbWb'c ==&&vQ&7   }-- )))$$(C(CC!!&(3r   c                   SSK Jn  UR                  (       d  U R                  U5        g[	        X5      nU(       d*  U R                  U5      nU(       a  UR                  S5        gUR                  (       a  UR                  X5        g[        R                  U l        U R                  U5      nU(       a  UR                  S5        U R                  5         g)zkStart construction action.

Args:
    game: The game instance
    player: The player starting construction
r   )botNzageofheroes-no-resourceszageofheroes-construction-menu) r   r   _end_actionr   rl   rn   r   bot_perform_constructionr   CONSTRUCTIONr   r   )r   r   bot_air   rq   s        r   start_constructionr     s       )$7J}}V$LL34 }}''5 &22}}V$LL89 r   N)r   r   r   r   return	list[str])r   r   r   r   r   strr   bool)r   r   r!   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   zlist[tuple[int, str]])r   r   r!   r   rZ   
list[Card]r   r   )
r   r   r|   r   r}   intr~   r   r   r   )r   r   r   r   rm   r   r   zlist[tuple[str, str]])F)
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   None)__doc__
__future__r   typingr   cardsr   r   r   r	   stater
   r   r   r   r   r   r   r   r   r   r   r    rU   r`   ru   r   r   r   r   rL   r   r   <module>r      s   , "   > >  8. F6*Z!!)2!BL!!H6r"
"" " 	"
 
"J
#4>AD ]bE
E#4EEHEUYE	EP!r   