§
    øÕÀj}<  ã            
      óÞ   — U d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZ ddlmZmZmZ ddd	d
ddddddœ	Zded<   ddddddddddœ	Zded<    G d„ d¦  «        ZdS ) aC  
FreeExile Open-World Wilderness Map Generator.
Generates organic, replayable wilderness tile maps for 10 canonical zones (60x45 to 120x90).
Guarantees sinuous main path (sinuosity >= 1.25), 2-3 encounter clusters, rewarded dead-ends,
isolated sealed Boss Gate, 1-3 POIs, and an 8-tile radius safe floor clearing at spawn.
é    )ÚannotationsN)ÚListÚTupleÚDictÚOptionalÚSetÚUnion)ÚTileTypeÚTileCellÚMapGridDataÚMapRoomÚEncounterZoneÚObstacleTypeÚObstacleInstance)Úget_biome_definitionÚget_biome_by_codeÚMapBiomeDefinition©é<   é-   )éD   é4   )éL   é:   )éT   é@   )é\   éF   )éd   r   )él   éR   )ér   éV   )éx   éZ   )	Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_blood_scale_ruinsÚzone_five_elements_altarÚzone_abyssal_ice_pondÚzone_infinite_blood_riftÚzone_purgatory_lava_cavernÚzone_boundless_celestial_palacezDict[str, Tuple[int, int]]ÚZONE_DEFAULT_SIZESÚBLEACHED_BONE_CANYONÚSTY_01_HOANG_MANG_CO_LOÚSTY_12_SA_COT_HOANG_MACÚCRIMSON_BLOOD_FORESTÚSTY_23_TE_DAN_MAN_HOANGÚSTY_08_VUC_DAM_BANG_DOCÚ STY_27_VET_NUT_VO_HAN_HUYET_GIOIÚSTY_19_HAM_LUA_LUYEN_NGUCÚ$STY_30_TAN_TICH_THIEN_CUNG_HOANG_PHEzDict[str, str]ÚZONE_CANONICAL_BIOMESc                  ó’   — e Zd ZdZdCdDd„Ze	 	 	 	 dEdFd„¦   «         ZdGdHd„ZdId!„ZdJd'„Z	dKd*„Z
dLd0„ZdMd3„ZdNdOd6„ZdPd:„ZdQd=„ZdRdB„ZdS )SÚWildernessMapGeneratorzKOrganic procedural wilderness terrain generator adhering to PoE2 standards.r   r   r0   ÚwidthÚintÚheightÚbiome_idúUnion[str, int]ÚreturnÚNonec                ót  — t          d|¦  «        | _        t          d|¦  «        | _        t          |t          ¦  «        s6t          |t
          ¦  «        rOt          |¦  «                             ¦   «         r.t          t	          |¦  «        ¦  «        }|r|j        nd| _        d S t          |¦  «        | _        d S )Né0   é$   r0   )	Úmaxr<   r>   Ú
isinstancer=   ÚstrÚisdigitr   r?   )Úselfr<   r>   r?   Údefns        ú>C:\Projects\FreeExile\server\world\wilderness_map_generator.pyÚ__init__zWildernessMapGenerator.__init__7   s—   € Ý˜˜U‘^”^ˆŒ
Ý˜"˜f‘o”oˆŒÝ�h¥Ñ$Ô$ð 	*­°H½cÑ)BÔ)Bð 	*ÅsÈ8Á}Ä}×G\ÒG\ÑG^ÔG^ð 	*Ý$¥S¨¡]¤]Ñ3Ô3ˆDØ-1ÐM˜DœM˜MÐ7MˆDŒMˆMˆMå ™MœMˆDŒMˆMˆMó    r   Né   Úzone_idrH   ÚseedúOptional[Union[str, int]]Úplayer_levelÚmap_tierúOptional[int]c                óD  — ddl m} |�"|dk    r |||¬¦  «        }|j        |j        f}n=|dk    r |||¬¦  «        }|j        |j        f}nt                               |d¦  «        }|�ƒt          |t          ¦  «        s6t          |t          ¦  «        rIt          |¦  «         	                    ¦   «         r(t          t          |¦  «        ¦  «        }	|	r|	j        nd}
n+t          |¦  «        }
nt                               |d¦  «        }
 | |d         |d         |
¬	¦  «        S )
Nr   )Úcalculate_map_scale_profile)ÚlevelrT   é
   )rX   rP   r   r0   rO   )r<   r>   r?   )Ú#server.world.map_progression_scalerrW   Ú
grid_widthÚgrid_heightr/   ÚgetrG   r=   rH   rI   r   r?   r9   )ÚclsrP   rQ   r?   rS   rT   rW   ÚprofileÚdimsrK   Úb_ids              rL   Úfor_zonezWildernessMapGenerator.for_zone@   s=  € ð 	TÐSÐSÐSÐSÐSØÐ H¨q¢L LØ1Ð1¸ÈxÐXÑXÔXˆGØÔ&¨Ô(;Ð<ˆDˆDØ˜BÒÐØ1Ð1¸ÈgÐVÑVÔVˆGØÔ&¨Ô(;Ð<ˆDˆDå%×)Ò)¨'°8Ñ<Ô<ˆDàÐÝ˜(¥CÑ(Ô(ð %­Z¸Å#Ñ-FÔ-Fð %Í3ÈxÉ=Ì=×K`ÒK`ÑKbÔKbð %Ý(­¨X©¬Ñ7Ô7�Ø(,ÐH�t”}�}Ð2H��å˜8‘}”}��å(×,Ò,¨WÐ6LÑMÔMˆDØˆs˜˜aœ¨¨a¬¸4Ð@Ñ@Ô@Ð@rN   úOptional[str]r   c                ó€  ‡ — t          j        |¦  «        }t          ‰ j        ¦  «        }ˆ fd„t	          ‰ j        ¦  «        D ¦   «         }dt          ‰ j        dz
  t          d‰ j        dz
  ¦  «        ¦  «        }}‰                      |||d¬¦  «         t          dt          d‰ j	        dz  ¦  «        ¦  «        }t          d	t          d
‰ j        dz  ¦  «        ¦  «        }	‰ j	        |z
  dz
  }
d}‰  
                    |||	|
|¦  «        \  }}‰                      ||||d         |d         |¦  «        \  }}||fg|z   |d         dz
  |d         fgz   }‰                      |||¦  «         ‰                      ||||
|||	f¦  «        }‰                      ||||¦  «        }‰                      |||||df|
|||	f¦  «         ‰                      ||
|||	|¦  «         |t#          d|d         |d         t$          j        ddd¬¦  «        i}t)          ‰ j	        ‰ j        |‰ j        |||g||f|
|dz  z   ||	dz  z   f|||||¬¦  «        S )Nc                óR   •‡— g | ]"Šˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ#S )c           	     óL   •— g | ] }t          |‰t          j        d d¬¦  «        ‘Œ!S )FT)ÚxÚyÚ	tile_typeÚwalkableÚblocks_vision)r   r
   ÚWALL)Ú.0rg   rh   s     €rL   ú
<listcomp>z>WildernessMapGenerator.generate.<locals>.<listcomp>.<listcomp>a   s0   ø€ ÐxÐxÐxÐab�X˜˜Q­(¬-À%ÐW[Ð\Ñ\Ô\ÐxÐxÐxrN   )Úranger<   )rm   rh   rJ   s    @€rL   rn   z3WildernessMapGenerator.generate.<locals>.<listcomp>`   sL   øø€ ð 
ð 
ð 
àð yÐxÐxÐxÕfkÐlpÔlvÑfwÔfwÐxÑxÔxð
ð 
ð 
rN   rY   é   é   g       @)Úradiusé   é   é   é   é   r   rO   g      !@Úobs_boss_sealéÈ   T)ÚhpÚblocks_movementrk   é   )r<   r>   rQ   ÚbiomeÚtilesÚ	obstaclesÚroomsÚspawn_pointÚ
boss_pointÚ
poi_pointsÚdead_end_pointsÚ	boss_roomÚ	boss_gateÚencounter_zones)ÚrandomÚRandomr   r?   ro   r>   ÚminrF   Ú_carve_spawn_safe_zoner<   Ú_carve_boss_arenaÚ_build_encounter_zonesÚ_carve_sinuous_pathÚ_carve_dead_endsÚ_place_poisÚ_decorate_terrainÚ_seal_boss_perimeterr   r   ÚBOSS_SEAL_BARRIERr   )rJ   rQ   rP   Úrngr}   r~   ÚsxÚsyÚbwÚbhÚbxÚbyr†   r…   Ú
encountersÚ	waypointsÚ
path_nodesÚ	dead_endsÚpoisr   s   `                   rL   ÚgeneratezWildernessMapGenerator.generate]   s±  ø€ ÝŒm˜DÑ!Ô!ˆÝ$ T¤]Ñ3Ô3ˆð
ð 
ð 
ð 
å˜4œ;Ñ'Ô'ð
ñ 
ô 
ˆð
 •S˜œ rÑ)­3¨r°4´;ÀÑ3CÑ+DÔ+DÑEÔEˆBˆØ×#Ò# E¨2¨r¸#Ð#Ñ>Ô>Ð>å�•S˜˜TœZ¨1™_Ñ-Ô-Ñ.Ô.ˆÝ�•C˜˜DœK¨1Ñ,Ñ-Ô-Ñ.Ô.ˆØŒZ˜"‰_˜qÑ ˆØˆØ#×5Ò5°e¸RÀÀRÈÑLÔLÑˆ	�9à $× ;Ò ;¸EÀ2ÀrÈ9ÐUVÌ<ÐYbÐcdÔYeÐgjÑ kÔ kÑˆ
�IØ˜2�h�Z )Ñ+°	¸!´¸qÑ0@À)ÈAÄ,Ð/OÐ.PÑPˆ
Ø× Ò  ¨
°CÑ8Ô8Ð8Ø×)Ò)¨%°¸CÀ"ÀbÈ"ÈbÐAQÑRÔRˆ	Ø×Ò  y°)¸SÑAÔAˆØ×Ò˜u c¨5°2°r¸3°-À"ÀbÈ"ÈbÐAQÑRÔRÐRØ×!Ò! %¨¨R°°R¸ÑCÔCÐCð Õ'¨¸À1¼ÀyÐQRÄ|ÕUaÔUsÐx{ð  NRð  bfð  gñ  gô  gð>
ˆ	õ Ø”*Ø”;ØØ”-ØØØ�+Ø˜R˜Ø˜R 1™W™ b¨2°©7¡lÐ3ØØ%ØØØ&ð
ñ 
ô 
ð 	
rN   r~   úList[List[TileCell]]r•   r–   rr   Úfloatc                ó  — ||z  }t          t          dt          ||z
  dz
  ¦  «        ¦  «        t          | j        dz
  t          ||z   dz   ¦  «        ¦  «        ¦  «        D ]«}t          t          dt          ||z
  dz
  ¦  «        ¦  «        t          | j        dz
  t          ||z   dz   ¦  «        ¦  «        ¦  «        D ]N}||z
  dz  ||z
  dz  z   |k    r7||         |         }t          j        dddf\  |_        |_	        |_
        |_        ŒOŒ¬d S )NrO   r|   TFç      ð?)ro   rF   r=   rŠ   r>   r<   r
   ÚFLOORri   rj   rk   Úmovement_cost)	rJ   r~   r•   r–   rr   Úr_sqrh   rg   Úcs	            rL   r‹   z-WildernessMapGenerator._carve_spawn_safe_zone‹   s!  € Ø˜‰ˆÝ•s˜1�c " v¡+°¡/Ñ2Ô2Ñ3Ô3µS¸¼Àq¹Í#ÈbÐSYÉkÐ\]ÉoÑJ^ÔJ^Ñ5_Ô5_Ñ`Ô`ð 	qð 	qˆAÝ�3˜q¥# b¨6¡k°A¡oÑ"6Ô"6Ñ7Ô7½¸T¼ZÈ!¹^ÍSÐQSÐV\ÑQ\Ð_`ÑQ`ÑMaÔMaÑ9bÔ9bÑcÔcð qð q�Ø˜‘F˜q‘= A¨¡F¨q¡=Ñ0°DÒ8Ð8Ø˜aœ œ�AÝPXÔP^Ð`dÐfkÐmpÐPpÑM�A”K ¤¨Q¬_¸a¼oøðqð	qð 	qrN   r—   r˜   r™   rš   úTuple[Tuple[int, int], MapRoom]c                óF  — t          |||z   ¦  «        D ]”}t          |||z   ¦  «        D ]~}||         |         }||k    s|||z   dz
  k    s||k    s|||z   dz
  k    r!t          j        ddc|_        |_        |_        ŒUt          j        dddf\  |_        |_        |_        |_        ŒŒ•||dz  z   ||dz  z   }
}	t          |dz   ||z   dz
  ¦  «        D ]™}t          |dz   ||z   dz
  ¦  «        D ]}}||	k    r$||
k    rt          j        ||         |         _        Œ,t          t          ||	z
  ¦  «        t          ||
z
  ¦  «        ¦  «        dk    rt          j        ||         |         _        Œ~Œš||
}}t          j        ddc||         |         _        ||         |         _        ||         |         _        t          j        dc||         |dz
           _        ||         |dz
           _        d||         |dz
           _        t          d||||dd||f|	|
f¬¦	  «	        }||f|fS )	NrO   FTr¤   r|   éc   Úboss)	Úroom_idrg   rh   ÚwÚhÚ	room_typeÚis_boss_roomÚboss_gate_posÚboss_altar_pos)ro   r
   rl   ri   rj   rk   r¥   r¦   Ú
BOSS_ALTARrF   ÚabsÚRUNIC_FLOORÚ	BOSS_GATEr   )rJ   r~   r—   r˜   r™   rš   rh   rg   r¨   ÚcxÚcyÚryÚrxÚgxÚgyr…   s                   rL   rŒ   z(WildernessMapGenerator._carve_boss_arena“   se  € õ �r˜2 ™7Ñ#Ô#ð 	qð 	qˆAÝ˜2˜r B™wÑ'Ô'ð qð q�Ø˜!”H˜Q”K�Ø˜’7�7˜a 2¨¡7¨Q¡;Ò.Ð.°!°r²'°'¸QÀ"ÀrÁ'ÈAÁ+Ò=MÐ=MÝ?G¼}ÈeÐUYÐ<�A”K ¤¨Q¬_¨_åPXÔP^Ð`dÐfkÐmpÐPpÑM�A”K ¤¨Q¬_¸a¼o¸oðqð �b˜A‘g‘˜r B¨!¡G™|ˆBˆÝ˜˜Q™  R¡¨!¡Ñ,Ô,ð 	Cð 	CˆBÝ˜B ™F B¨¡G¨a¡KÑ0Ô0ð Cð C�Ø˜’8�8  b¢ Ý.6Ô.A�E˜"”I˜b”MÔ+Ð+Ý�˜R "™W™œ¥s¨2°©7¡|¤|Ñ4Ô4¸Ò9Ð9Ý.6Ô.B�E˜"”I˜b”MÔ+øð	Cð �RˆBˆÝW_ÔWiÐkpÐrvÐTˆˆbŒ	�"ŒÔ  r¤¨2¤Ô!7¸¸r¼À2¼Ô9TÝBJÄ.ÐRVÐ?ˆˆbŒ	�"�q‘&ÔÔ# U¨2¤Y¨r°A©vÔ%6Ô%?Ø*/ˆˆbŒ	�"�q‘&ÔÔ'åØ˜"  b¨B¸&ÈtØ˜r˜(°B¸°8ð
ñ 
ô 
ˆ	ð �Bˆx˜Ð"Ð"rN   r†   úTuple[int, int]c                óÂ  — |\  }}t          |||z   ¦  «        D ]�}	t          j        x||         |	         _        |||z   dz
           |	         _        dx||         |	         _        |||z   dz
           |	         _        dx||         |	         _        |||z   dz
           |	         _        Œ‘t          |||z   ¦  «        D ]�}
t          j        x||
         |         _        ||
         ||z   dz
           _        dx||
         |         _        ||
         ||z   dz
           _        dx||
         |         _        ||
         ||z   dz
           _        Œ‘t          j        ddc||         |         _        ||         |         _        ||         |         _        t          j        ddc||         |dz
           _        ||         |dz
           _        ||         |dz
           _        d S )NrO   FT)ro   r
   rl   ri   rj   rk   r·   r¥   )rJ   r~   r™   rš   r—   r˜   r†   r¼   r½   rg   rh   s              rL   r’   z+WildernessMapGenerator._seal_boss_perimeter±   sÐ  € ð ‰ˆˆBÝ�r˜2 ™7Ñ#Ô#ð 	Tð 	TˆAÝGOÄ}ÐTˆE�"ŒI�aŒLÔ" U¨2°©7°Q©;Ô%7¸Ô%:Ô%DØEJÐJˆE�"ŒI�aŒLÔ! E¨"¨r©'°A©+Ô$6°qÔ$9Ô$BØOSÐSˆE�"ŒI�aŒLÔ&¨¨r°B©w¸©{Ô);¸AÔ)>Ô)LÐ)LÝ�r˜2 ™7Ñ#Ô#ð 	Tð 	TˆAÝGOÄ}ÐTˆE�!ŒH�RŒLÔ" U¨1¤X¨b°2©g¸©kÔ%:Ô%DØEJÐJˆE�!ŒH�RŒLÔ! E¨!¤H¨R°"©W°q©[Ô$9Ô$BØOSÐSˆE�!ŒH�RŒLÔ&¨¨q¬°"°r±'¸A±+Ô)>Ô)LÐ)LåW_ÔWiÐkpÐrvÐTˆˆbŒ	�"ŒÔ  r¤¨2¤Ô!7¸¸r¼À2¼Ô9TÝckÔcqÐswÐy~Ð`ˆˆbŒ	�"�q‘&ÔÔ# U¨2¤Y¨r°A©vÔ%6Ô%?ÀÀrÄÈ2ÐPQÉ6ÔARÔA`ÐA`ÐA`rN   r¼   r½   r”   úrandom.Randomú1Tuple[List[EncounterZone], List[Tuple[int, int]]]c                ó@  — | j         dk    rd}g d¢}g d¢}	n6| j         dk    rd}g d¢}g d¢}	n | j         d	k    rd
}g d¢}g d¢}	n
d}ddg}ddg}	g }
g }t          j        t          j        t          j        g}t          |¦  «        D �]\  }}t          ||||z
  z  z   ¦  «        }|dz  dk    rFt          dt          dt          |dz  | 	                    dd¦  «        z   ¦  «        ¦  «        ¦  «        }nZt          | j
        dz
  t          | j
        dz
  t          | j
        dz  | 	                    dd¦  «        z   ¦  «        ¦  «        ¦  «        }| j         dk     rdnd}t          d||z
  ¦  «        t          | j         d
z
  ||z   ¦  «        }}t          d||z
  ¦  «        t          | j
        d
z
  ||z   ¦  «        }}|t          |¦  «        k     r||         nt          j        }t          ||dz   ¦  «        D ]f}t          ||dz   ¦  «        D ]P}||z
  |dz   z  dz  ||z
  |dz   z  dz  z   dk    r-||         |         }|dddf\  |_        |_        |_        |_        ŒQŒg|
                     t%          |||||	|         ¬¦  «        ¦  «         |                     ||f¦  «         �Œ|
|fS )Né´   é   )g
×£p=
Ç?g
×£p=
×?gHáz®Gá?ç
×£p=
ç?g)\�Âõ(ì?)rO   r|   r|   rw   rw   én   rt   )g)\�Âõ(Ì?g)\�Âõ(Ü?g…ëQ¸å?g333333ë?)rO   r|   r|   rw   é8   rw   )g333333Ó?g�Âõ(\�â?g=
×£p=ê?)rO   r|   rw   r|   gR¸…ëQØ?rÅ   rO   r   é   rs   gffffffÖ?éÿÿÿÿg      è?éþÿÿÿr   g      à?r¤   TF)Útier)r<   r
   ÚENCOUNTER_LOWÚENCOUNTER_MEDIUMÚENCOUNTER_HIGHÚ	enumerater=   rF   rŠ   Úrandintr>   Úlenro   ri   rj   rk   r¦   Úappendr   )rJ   r~   r•   r–   r¼   r½   r”   ÚcountÚ	fractionsÚtiersr›   rœ   Ú
tile_typesÚiÚfracÚbase_xÚbase_yÚrÚmin_xÚmax_xÚmin_yÚmax_yÚttrh   rg   r¨   s                             rL   r�   z-WildernessMapGenerator._build_encounter_zonesÁ   s  € ð Œ:˜ÒÐØˆEØ6Ð6Ð6ˆIØ#�O�OˆEˆEØŒZ˜3ÒÐØˆEØ0Ð0Ð0ˆIØ �L�LˆEˆEØŒZ˜2ÒÐØˆEØ*Ð*Ð*ˆIØ�I�IˆEˆEàˆEØ˜t˜ˆIØ˜�FˆEØ*,ˆ
Ø+-ˆ	ÝÔ,­hÔ.GÍÔI`Ðaˆ
å  Ñ+Ô+ð 	/ñ 	/‰GˆAˆtÝ˜˜d b¨2¡gÑ.Ñ.Ñ/Ô/ˆFØ�1‰u˜ŠzˆzÝ˜Q¥ B­¨B°©I¸¿ºÀBÈÑ8JÔ8JÑ,JÑ(KÔ(KÑ LÔ LÑMÔM��å˜Tœ[¨2Ñ-­s°4´;À±?ÅCÈÌÐVZÑHZÐ]`×]hÒ]hÐikÐmnÑ]oÔ]oÑHoÑDpÔDpÑ/qÔ/qÑrÔr�à”Z "’_�_��¨!ˆAÝ˜q &¨1¡*Ñ-Ô-­s°4´:À±>À6ÈAÁ:Ñ/NÔ/N�5ˆEÝ˜q &¨1¡*Ñ-Ô-­s°4´;À±?ÀFÈQÁJÑ/OÔ/O�5ˆEØ"#¥c¨*¡o¤oÒ"5Ð"5�˜A”�½8Ô;RˆBå˜5 %¨!¡)Ñ,Ô,ð ið i�Ý˜u e¨a¡iÑ0Ô0ð ið i�AØ˜V™¨¨C©Ñ0°QÑ6¸1¸v¹:È!ÈcÉ'Ñ:RÐWXÑ9XÑXÐ\_Ò_Ð_Ø! !œH QœK˜ØTVÐX\Ð^cÐehÐThÑQ˜œ Q¤Z°´À!Ä/øðið
 ×Ò�m¨E°5¸%ÀÈUÐSTÌXÐVÑVÔVÑWÔWÐWØ×Ò˜f fÐ-Ñ.Ô.Ð.Ñ.à˜9Ð$Ð$rN   ÚnodesúList[Tuple[int, int]]c                óh  — t          t          |¦  «        dz
  ¦  «        D �]}||         \  }}||dz            \  }}||z
  ||z
  }
}	t          j        |	|
¦  «        }|dk     rŒB|
 |z  |	|z  }}|                     dd¦  «        |dz  dk    rdndz  }t          dt          | j        dz
  t          ||z   dz  ||z  z   ¦  «        ¦  «        ¦  «        }t          dt          | j	        dz
  t          ||z   dz  ||z  z   ¦  «        ¦  «        ¦  «        }|  
                    |||f||f||fgd¬	¦  «         �Œd S )
NrO   r|   g      @g      @r   rÉ   rw   rt   ©r<   )ro   rÑ   ÚmathÚhypotÚuniformrF   rŠ   r<   r=   r>   Ú_carve_polyline)rJ   r~   rá   r”   r×   Úx1Úy1Úx2Úy2ÚdxÚdyÚdistÚperp_xÚperp_yÚ	bend_distÚmxÚmys                    rL   rŽ   z*WildernessMapGenerator._carve_sinuous_pathï   s]  € õ •s˜5‘z”z A‘~Ñ&Ô&ð 	Qñ 	QˆAØ˜1”X‰FˆB�Ø˜1˜q™5”\‰FˆB�Ø˜"‘W˜b 2™g�ˆBÝ”:˜b "Ñ%Ô%ˆDØ�aŠxˆxØà ˜S 4™Z¨¨d©�FˆFØŸš C¨Ñ-Ô-°a¸!±e¸q²j°j°°ÀbÑIˆIÝ�Q�˜DœJ¨™N­C°°b±¸A±ÀÈÑ@RÑ0RÑ,SÔ,SÑTÔTÑUÔUˆBÝ�Q�˜DœK¨!™O­S°"°r±'¸Q±ÀÈ)ÑASÑ1SÑ-TÔ-TÑUÔUÑVÔVˆBà× Ò  ¨"¨b¨°B¸°8¸bÀ"¸XÐ(FÈaÐ ÑPÔPÐPÑPð	Qð 	QrN   r|   Úptsc                óv  — t          t          |¦  «        dz
  ¦  «        D �]—}||         \  }}||dz            \  }}t          t          ||z
  ¦  «        t          ||z
  ¦  «        ¦  «        dz  }	|	dk    rŒVt          |	dz   ¦  «        D �]-}
|
|	z  }t	          t          ||||z
  z  z   ¦  «        ¦  «        t	          t          ||||z
  z  z   ¦  «        ¦  «        }}t          t          d|dz
  ¦  «        t          | j        dz
  ||z   ¦  «        ¦  «        D ] }t          t          d|dz
  ¦  «        t          | j        dz
  ||z   ¦  «        ¦  «        D ]c}||         |         }|j	        t          j        t          j        t          j        fvr)t          j        dddf\  |_	        |_        |_        |_        ŒdŒ¡�Œ/�Œ™d S )NrO   r|   r   TFgš™™™™™é?)ro   rÑ   rF   rµ   r=   ÚroundrŠ   r>   r<   ri   r
   r·   r´   r¶   ÚPATHrj   rk   r¦   )rJ   r~   rõ   r<   Úkré   rê   rë   rì   ÚstepsÚsÚtr¸   r¹   ÚwyÚwxr¨   s                    rL   rè   z&WildernessMapGenerator._carve_polyline  sÆ  € Ý•s˜3‘x”x !‘|Ñ$Ô$ð 	xñ 	xˆAØ˜”V‰FˆB�Ø˜˜Q™”Z‰FˆB�Ý�˜B ™G™œ¥c¨"¨r©'¡l¤lÑ3Ô3°aÑ7ˆEØ˜ŠzˆzØÝ˜5 1™9Ñ%Ô%ð xñ x�Ø˜‘I�Ý�U 2¨¨R°"©W©Ñ#5Ñ6Ô6Ñ7Ô7½½UÀ2ÈÈRÐRTÉWÉÑCUÑ=VÔ=VÑ9WÔ9W�B�Ý¥ A r¨A¡v¡¤µ°D´KÀ!±OÀRÈ%ÁZÑ0PÔ0PÑQÔQð xð x�BÝ#¥C¨¨2°©6¡N¤NµC¸¼
ÀQ¹ÈÈUÉ
Ñ4SÔ4SÑTÔTð xð x˜Ø! "œI bœM˜Øœ;­xÔ/AÅ8ÔCVÕX`ÔXlÐ.mÐmÐmÝX`ÔXeÐgkÐmrÐtwÐXwÑU˜AœK¨¬°Q´_ÀaÄoøðxñxñxð	xð 	xrN   rœ   Úboss_boxúTuple[int, int, int, int]c                óÌ  — g }|\  }}}}	t          dt          dt          |¦  «        ¦  «        ¦  «        }
t          |
¦  «        D �]ž}||         \  }}|| j        dz  k    rdnd}|                     dd¦  «        }t          dt          | j        dz
  ||                     dd¦  «        z   ¦  «        ¦  «        }t          dt          | j        dz
  |||z  z   ¦  «        ¦  «        }|dz
  |cxk    r||z   dz   k    rn n|dz
  |cxk    r||	z   dz   k    rn nŒÒ|                      |||f||fgd¬	¦  «         t          dd¦  «        D ]†}t          dd¦  «        D ]s}||z   ||z   }}d|cxk    r| j        dz
  k     rRn Œ$d|cxk    r| j        dz
  k     r:n Œ<||         |         }t          j	        d
ddf\  |_
        |_        |_        |_        ŒtŒ‡|                     ||f¦  «         �Œ |S )Nr|   rO   rÉ   é   rp   rw   rt   rÊ   rä   TFr¤   )rŠ   rF   rÑ   ro   r>   rÐ   r<   rè   r
   r¥   ri   rj   rk   r¦   rÒ   )rJ   r~   rœ   r”   rÿ   rž   r™   rš   r—   r˜   rÓ   r×   rþ   rý   Údir_yÚlengthÚexÚeyrî   rí   ÚnxÚnyr¨   s                          rL   r�   z'WildernessMapGenerator._carve_dead_ends  sR  € ð ,.ˆ	Ø!‰ˆˆB��BÝ�A•s˜1�c )™nœnÑ-Ô-Ñ.Ô.ˆå�u‘”ð 	'ñ 	'ˆAØ˜q”\‰FˆB�Ø˜tœ{¨aÑ/Ò/Ð/�B�B°QˆEØ—[’[  BÑ'Ô'ˆFÝ�Q�˜DœJ¨™N¨B°·²¸RÀÑ1CÔ1CÑ,CÑDÔDÑEÔEˆBÝ�Q�˜DœK¨!™O¨R°%¸&±.Ñ-@ÑAÔAÑBÔBˆBà�A‰v˜Ð*Ð*Ò*Ð*˜r B™w¨™{Ò*Ð*Ð*Ð*Ð*¨r°A©v¸Ð/JÐ/JÒ/JÐ/J¸rÀB¹wÈ¹{Ò/JÐ/JÐ/JÐ/JÐ/JØà× Ò  ¨"¨b¨°B¸°8Ð(<ÀAÐ ÑFÔFÐFÝ˜B ‘l”lð uð u�Ý  A™,œ,ð uð u�BØ "™W b¨2¡g˜�BØ˜BÐ/Ð/Ò/Ð/ ¤¨a¡Ò/Ð/Ð/Ð/Ð/°A¸Ð4MÐ4MÒ4MÐ4M¸d¼kÈA¹oÒ4MÐ4MÐ4MÐ4MÐ4MØ! "œI bœM˜ÝT\ÔTbÐdhÐjoÐqtÐTtÑQ˜œ Q¤Z°´À!Ä/øð	uð
 ×Ò˜b "˜XÑ&Ô&Ð&Ñ&àÐrN   rž   úList[Tuple[int, int, str]]c                ó¬  — g }g }|D ]&}|                      |d         |d         df¦  «         Œ'|r?|t          |¦  «        dz           }|                      |d         dz   |d         df¦  «         t          |¦  «        dk    r6|                      |d         d         dz
  |d         d         dz   df¦  «         |d d…         D ]‘\  }	}
}d|	cxk    r| j        dz
  k     rvn Œd|
cxk    r| j        dz
  k     r^n Œ6t          j        ||
         |	         _        d||
         |	         _        d	||
         |	         _        |                      |	|
|f¦  «         Œ’|S )
Nr   rO   Úcache_shriner|   Úmerchant_postÚancient_tabletrw   TF)	rÒ   rÑ   r<   r>   r
   ÚPOIri   rj   rk   )rJ   r~   rœ   rž   r”   rŸ   Ú
candidatesÚdeÚmidÚpxÚpyÚp_kinds               rL   r�   z"WildernessMapGenerator._place_pois-  sŒ  € ð ,.ˆØ13ˆ
àð 	>ð 	>ˆBØ×Ò˜r !œu b¨¤e¨^Ð<Ñ=Ô=Ð=Ð=Øð 	EØ�C 	™NœN¨aÑ/Ô0ˆCØ×Ò˜s 1œv¨™z¨3¨q¬6°?ÐCÑDÔDÐDÝˆy‰>Œ>˜AÒÐØ×Ò˜y¨œ|¨Aœ°Ñ2°I¸a´LÀ´OÀaÑ4GÐIYÐZÑ[Ô[Ð[à(¨¨!¨œnð 	.ð 	.‰NˆB��FØ�BÐ'Ð'Ò'Ð'˜œ a™Ò'Ð'Ð'Ð'Ð'¨A°Ð,EÐ,EÒ,EÐ,E°d´kÀA±oÒ,EÐ,EÐ,EÐ,EÐ,EÝ*2¬,��b”	˜"”Ô'Ø)-��b”	˜"”Ô&Ø.3��b”	˜"”Ô+Ø—’˜R  VÐ,Ñ-Ô-Ð-øàˆrN   r}   r   Ú
spawn_safeúTuple[int, int, float]c                ó  — |\  }}}|\  }	}
}}||z  }t          d| j        dz
  ¦  «        D ]à}t          d| j        dz
  ¦  «        D ]Å}||z
  dz  ||z
  dz  z   |k    rŒ|	|cxk    r	|	|z   k     rn n|
|cxk    r	|
|z   k     rn nŒ?||         |         }|j        t          j        k    rc|                     ¦   «         }|dk     rt          j        dc|_        |_        Œ–|dk     r)|j	        t          j        k    r|j	        dc|_        |_        ŒÆŒád S )Nr|   g¸…ëQ¸¾?gáz®Gáö?gÃõ(\�ÂÅ?g       @)
ro   r>   r<   ri   r
   r¥   rˆ   ÚDENSE_TERRAINr¦   Úprimary_tile)rJ   r~   r”   r}   r  rÿ   r•   r–   Úsrr™   rš   r—   r˜   Úsr_sqrh   rg   r¨   Úr_vals                     rL   r‘   z(WildernessMapGenerator._decorate_terrainD  s]  € ð  ‰
ˆˆB�Ø!‰ˆˆB��BØ�R‘ˆå�q˜$œ+¨™/Ñ*Ô*ð 	Oð 	OˆAÝ˜1˜dœj¨1™nÑ-Ô-ð Oð O�Ø˜‘F˜q‘= A¨¡F¨q¡=Ñ0°EÒ9Ð9ØØ˜Ð$Ð$Ò$Ð$˜R "™WÒ$Ð$Ð$Ð$Ð$¨¨qÐ):Ð):Ò):Ð):°2¸±7Ò):Ð):Ð):Ð):Ð):ØØ˜!”H˜Q”K�Ø”;¥(¤.Ò0Ð0ØŸJšJ™LœL�EØ˜t’|�|Ý7?Ô7MÈtÐ4˜œ Q¤_ _Ø š˜¨%Ô*<ÅÄÒ*NÐ*NØ7<Ô7IÈ3Ð4˜œ Q¤_øðOð	Oð 	OrN   )r   r   r0   )r<   r=   r>   r=   r?   r@   rA   rB   )r   NrO   N)rP   rH   rQ   r=   r?   rR   rS   r=   rT   rU   rA   r;   )N)rQ   r=   rP   rc   rA   r   )
r~   r¡   r•   r=   r–   r=   rr   r¢   rA   rB   )r~   r¡   r—   r=   r˜   r=   r™   r=   rš   r=   rA   r©   )r~   r¡   r™   r=   rš   r=   r—   r=   r˜   r=   r†   r¾   rA   rB   )r~   r¡   r•   r=   r–   r=   r¼   r=   r½   r=   r”   rÀ   rA   rÁ   )r~   r¡   rá   râ   r”   rÀ   rA   rB   )r|   )r~   r¡   rõ   râ   r<   r=   rA   rB   )
r~   r¡   rœ   râ   r”   rÀ   rÿ   r   rA   râ   )
r~   r¡   rœ   râ   rž   râ   r”   rÀ   rA   r	  )r~   r¡   r”   rÀ   r}   r   r  r  rÿ   r   rA   rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   Úclassmethodrb   r    r‹   rŒ   r’   r�   rŽ   rè   r�   r�   r‘   © rN   rL   r;   r;   4   sV  € € € € € ØUÐUð*ð *ð *ð *ð *ð ð Ø.2ØØ"&ðAð Að Að Añ „[ðAð8,
ð ,
ð ,
ð ,
ð ,
ð\qð qð qð qð#ð #ð #ð #ð<ð ð ð ð ,%ð ,%ð ,%ð ,%ð\Qð Qð Qð Qð$xð xð xð xð xð ð ð ð ð8ð ð ð ð.Oð Oð Oð Oð Oð OrN   r;   )r   Ú
__future__r   rå   rˆ   Útypingr   r   r   r   r   r	   Úserver.world.map_data_typesr
   r   r   r   r   r   r   Úserver.world.map_biome_catalogr   r   r   r/   Ú__annotations__r9   r;   r"  rN   rL   ú<module>r(     s¸  ððð ð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð $Ø!)Ø (Ø&Ø (Ø&Ø )Ø"+Ø'0ð
2ð 
2Ð ð 
ð 
ð 
ñ 
ð 2Ø!:Ø 9Ø4Ø 9Ø6Ø BØ"=Ø'Mð
)ð 
)Ð ð 
ð 
ð 
ñ 
ðhOð hOð hOð hOð hOñ hOô hOð hOð hOð hOrN   