§
    Šª½jÜ  ã            
       ó(  — d Z ddlZddlZddlZddlZej                             dej                             ej                             ej         	                    e
¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZ ddlmZ  G d„ d¦  «        ZdS )zØ
Unit tests for Wilderness Encounter Density and Spatial Pack Clustering.
Verifies zone encounter densities, minion radial distribution (1.2m - 3.2m),
endgame map tier pack scaling, and safe haven 0-pack guarantees.
é    Nz../../server)ÚWildernessEncounterEngineÚZONE_DENSITY_SPECS)ÚMonsterRankc                   ó6   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )	ÚTestWildernessEncounterDensityÚreturnNc                 ó.  — t          ¦   «         }g d¢}|D ]}|                     |¦  «        }|€J d|› �¦   «         ‚|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚|                     |¦  «        }t          |¦  «        |d         k    sJ ‚Œ€dS )zNVerifies each canonical outer wilderness zone has at least 3 packs configured.)Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_blood_scale_ruinsNzMissing density spec for Ú
base_packsé   Únative_genusé   )r   Úget_zone_density_specÚlenÚgenerate_zone_encounter_packs)ÚselfÚengineÚcanonical_zonesÚz_idÚspecÚpackss         úEC:\Projects\FreeExile\tests\unit\test_wilderness_encounter_density.pyÚ2test_outer_zones_have_configured_encounter_densityzQTestWildernessEncounterDensity.test_outer_zones_have_configured_encounter_density   sÏ   € å*Ñ,Ô,ˆð
ð 
ð 
ˆð $ð 	4ð 	4ˆDØ×/Ò/°Ñ5Ô5ˆDØÐ#Ð#Ð%GÀÐ%GÐ%GÑ#Ô#Ð#Ø˜Ô%¨Ò*Ð*Ð*Ð*Ý�t˜NÔ+Ñ,Ô,°Ò1Ð1Ð1Ð1Ø×8Ò8¸Ñ>Ô>ˆEÝ�u‘:”:  lÔ!3Ò3Ð3Ð3Ð3Ð3ð	4ð 	4ó    c                 ó¤  — t          ¦   «         }|                     d¦  «        }t          |¦  «        dk    sJ ‚|D ]”}|j        €J ‚|j        j        du sJ ‚|j        j        t          j        k    sJ ‚t          |j        ¦  «        dk    sJ ‚|j        D ];}|j        du sJ ‚|j        t          j	        k    sJ ‚|j
        |j        j        k    sJ ‚Œ<Œ•dS )zEVerifies generated packs contain 1 Rare leader and 3+ Common minions.r
   r   NTr   F)r   r   r   ÚleaderÚis_pack_leaderÚrankr   ÚRAREÚminionsÚCOMMONÚpack_leader_idÚ
monster_id)r   r   r   ÚpackÚminions        r   Ú(test_monster_pack_has_leader_and_minionszGTestWildernessEncounterDensity.test_monster_pack_has_leader_and_minions'   s  € å*Ñ,Ô,ˆØ×4Ò4Ð5JÑKÔKˆÝ�5‰zŒz˜AŠ~ˆ~ˆ~ˆ~àð 	Gð 	GˆDØ”;Ð*Ð*Ð*Ø”;Ô-°Ð5Ð5Ð5Ð5Ø”;Ô#¥{Ô'7Ò7Ð7Ð7Ð7Ý�t”|Ñ$Ô$¨Ò)Ð)Ð)Ð)Øœ,ð Gð G�ØÔ,°Ð5Ð5Ð5Ð5Ø”{¥kÔ&8Ò8Ð8Ð8Ð8ØÔ,°´Ô0FÒFÐFÐFÐFÐFðGð	Gð 	Gr   c                 óX  — t          ¦   «         }|                     d¦  «        }|d         }|j                             |¦  «        }|d         }|dd…         }|D ]O}t	          j        |j        |j        z
  |j        |j        z
  ¦  «        }d|cxk    rdk    sn J d|d›d	�¦   «         ‚ŒPdS )
zJVerifies minions are placed radially around the leader within 1.2m - 3.5m.r
   r   é   Ngffffffò?g      @zMinion distance z.2fz,m outside radial cluster bounds [1.2m, 3.5m])r   r   Úprocedural_engineÚcreate_pack_runtime_statesÚmathÚhypotÚ	current_xÚ	current_y)	r   r   r   r'   Úruntime_statesÚ	leader_stÚminion_statesÚm_stÚdists	            r   Ú"test_pack_minion_radial_clusteringzATestWildernessEncounterDensity.test_pack_minion_radial_clustering7   sÚ   € å*Ñ,Ô,ˆØ×4Ò4Ð5JÑKÔKˆØ�QŒxˆàÔ1×LÒLÈTÑRÔRˆØ" 1Ô%ˆ	Ø& q r rÔ*ˆà!ð 	rð 	rˆDÝ”:˜dœn¨yÔ/BÑBÀDÄNÐU^ÔUhÑDhÑiÔiˆDØ˜4Ð&Ð&Ò&Ð& 3Ò&Ð&Ð&Ð&Ð&Ð(q¸4Ð(qÐ(qÐ(qÐ(qÑ&Ô&Ð&Ð&ð	rð 	rr   c                 ó`  — t          ¦   «         }|                     dd¬¦  «        }|                     dd¬¦  «        }|                     dd¬¦  «        }t          |¦  «        t          |¦  «        cxk    rt          |¦  «        k    sn J ‚t          |¦  «        t          |¦  «        k    sJ ‚dS )zHVerifies pack density scales upwards with endgame Map Tiers (T1 -> T16).r
   r+   )Úmap_tieré   é   N©r   r   r   )r   r   Úpacks_t1Úpacks_t8Ú	packs_t16s        r   Útest_endgame_tier_pack_scalingz=TestWildernessEncounterDensity.test_endgame_tier_pack_scalingE   sµ   € å*Ñ,Ô,ˆØ×7Ò7Ð8MÐXYÐ7ÑZÔZˆØ×7Ò7Ð8MÐXYÐ7ÑZÔZˆØ×8Ò8Ð9NÐY[Ð8Ñ\Ô\ˆ	å�8‰}Œ}¥ H¡¤Ð?Ð?Ò?Ð?µ°Y±´Ò?Ð?Ð?Ð?Ð?Ð?Ý�9‰~Œ~¥ H¡¤Ò-Ð-Ð-Ð-Ð-Ð-r   c                 óÊ   — t          ¦   «         }|                     d¦  «        }|                     d¦  «        }t          |¦  «        dk    sJ ‚t          |¦  «        dk    sJ ‚dS )z=Verifies Safe Havens produce exactly 0 hostile monster packs.Úzone_player_hideoutÚzone_boundless_sanctuaryr   Nr<   )r   r   Úhideout_packsÚsanctuary_packss       r   Ú(test_safe_haven_density_is_strictly_zerozGTestWildernessEncounterDensity.test_safe_haven_density_is_strictly_zeroO   sm   € å*Ñ,Ô,ˆØ×<Ò<Ð=RÑSÔSˆØ ×>Ò>Ð?YÑZÔZˆå�=Ñ!Ô! QÒ&Ð&Ð&Ð&Ý�?Ñ#Ô# qÒ(Ð(Ð(Ð(Ð(Ð(r   )r   N)Ú__name__Ú
__module__Ú__qualname__r   r)   r7   r@   rF   © r   r   r   r      s€   € € € € € ð4ð 4ð 4ð 4ð"Gð Gð Gð Gð rð rð rð rð.ð .ð .ð .ð)ð )ð )ð )ð )ð )r   r   )Ú__doc__r.   ÚosÚsysÚpytestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Ú!world.wilderness_encounter_enginer   r   Úworld.monster_typesr   r   rJ   r   r   ú<module>rW      sï   ððð ð €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +ðA)ð A)ð A)ð A)ð A)ñ A)ô A)ð A)ð A)ð A)r   