§
    NÖÀj~  ã                  ó¸   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ  G d„ d	¦  «        Z G d
„ d¦  «        Z G d„ d¦  «        ZdS )zü
Unit Test Suite for Progressive Map Scaling & Vast Endgame Labyrinth Architecture.
Validates that map dimensions, room counts, and secret chambers strictly scale
proportionally with quest progression from Act I (compact) to Pinnacle Labyrinth (vast).
é    )ÚannotationsN)Úcalculate_map_scale_profileÚget_zone_scaled_dimensionsÚPROGRESSION_PROFILESÚMapScaleProfile)ÚProceduralMapEngine)ÚWildernessMapGenerator)ÚTileTypec                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
ÚTestProgressiveMapScalingzGVerifies that map scale grows monotonically from early game to endgame.ÚreturnÚNonec                óâ   — g d¢}d}d}|D ]c\  }}}t          ||¬¦  «        }|j        |j        z  }||k    sJ d|› d|› d|› �¦   «         ‚|j        |k    sJ d|› d|› �¦   «         ‚|}|j        }Œdd S )	N))ÚACT_I_ONBOARDINGé   N)ÚACT_II_EXPLORATIONé   N)ÚACT_III_SANDSTORMé#   N)ÚACT_IV_V_CRUCIBLEé7   N)ÚENDGAME_WHITE_ATLASéH   é   )ÚENDGAME_YELLOW_RED_ATLASéP   é
   )ÚENDGAME_PINNACLE_LABYRINTHéZ   é   r   ©ÚlevelÚmap_tierz	Area for z (z) must exceed zMax rooms for z must exceed )r   Ú
grid_widthÚgrid_heightÚ	max_rooms)	ÚselfÚstagesÚ	prev_areaÚ
prev_roomsÚ
stage_nameÚlvlÚtierÚprofÚareas	            úFC:\Projects\FreeExile\tests\unit\test_map_progression_and_labyrinth.pyÚ,test_progressive_dimensions_monotonic_growthzFTestProgressiveMapScaling.test_progressive_dimensions_monotonic_growth   sÎ   € ð
ð 
ð 
ˆð ˆ	Øˆ
Ø%+ð 	(ð 	(Ñ!ˆJ˜˜TÝ.°SÀ4ÐHÑHÔHˆDØ”? TÔ%5Ñ5ˆDØ˜)Ò#Ð#Ð#Ð%^°Ð%^Ð%^¸tÐ%^Ð%^ÐS\Ð%^Ð%^Ñ#Ô#Ð#Ø”> JÒ.Ð.Ð.Ð0fÀÐ0fÐ0fÐZdÐ0fÐ0fÑ.Ô.Ð.ØˆIØœˆJˆJð	(ð 	(ó    c                óÚ   — t          dd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        d	k    sJ ‚d S )
Nr   ÚACT_I_HUNGER©r"   Úact_idé<   é-   iŒ
  Fr   g      D@)r   r$   r%   Útotal_tilesÚis_labyrinthÚsecret_chambersÚpillar_totemsÚboss_distance_min©r'   r.   s     r0   Ú+test_act1_is_compact_and_onboarding_focusedzETestProgressiveMapScaling.test_act1_is_compact_and_onboarding_focused.   s¥   € Ý*°¸>ÐJÑJÔJˆØŒ "Ò$Ð$Ð$Ð$ØÔ 2Ò%Ð%Ð%Ð%ØÔ 4Ò'Ð'Ð'Ð'ØÔ  EÐ)Ð)Ð)Ð)ØÔ# qÒ(Ð(Ð(Ð(ØÔ! QÒ&Ð&Ð&Ð&ØÔ%¨Ò-Ð-Ð-Ð-Ð-Ð-r2   c                óô   — t          dd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        d	k    sJ ‚|j        d
k    sJ ‚|j        dk    sJ ‚d S )Nr   r    r!   éð   é´   iÀ¨  Té   é   r   g      i@)	r   r$   r%   r9   r:   r;   r<   r&   r=   r>   s     r0   Ú%test_endgame_tier16_is_vast_labyrinthz?TestProgressiveMapScaling.test_endgame_tier16_is_vast_labyrinth8   s¸   € Ý*°¸bÐAÑAÔAˆØŒ #Ò%Ð%Ð%Ð%ØÔ 3Ò&Ð&Ð&Ð&ØÔ 5Ò(Ð(Ð(Ð(ØÔ  DÐ(Ð(Ð(Ð(ØÔ# qÒ(Ð(Ð(Ð(ØÔ! QÒ&Ð&Ð&Ð&ØŒ~ Ò#Ð#Ð#Ð#ØÔ%¨Ò.Ð.Ð.Ð.Ð.Ð.r2   c                ó@  — t          d¬¦  «        }t          d¬¦  «        }t          dd¬¦  «        }t          dd¬¦  «        }|j        dk    sJ ‚|j        d	k    sJ ‚|j        d
k    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        d	k    sJ ‚|j        dk    sJ ‚d S )NrC   )r"   é   éI   r!   éU   r    r   é   r   é   rD   )r   r;   r<   )r'   Úact1Úact3Út5Út16s        r0   Ú/test_secret_chambers_and_totems_scale_with_tierzITestProgressiveMapScaling.test_secret_chambers_and_totems_scale_with_tierC   sØ   € Ý*°Ð3Ñ3Ô3ˆÝ*°Ð4Ñ4Ô4ˆÝ(¨r¸AÐ>Ñ>Ô>ˆÝ)°¸RÐ@Ñ@Ô@ˆàÔ# qÒ(Ð(Ð(Ð(ØÔ# qÒ(Ð(Ð(Ð(ØÔ! QÒ&Ð&Ð&Ð&ØÔ" aÒ'Ð'Ð'Ð'àÔ! QÒ&Ð&Ð&Ð&ØÔ! QÒ&Ð&Ð&Ð&ØÔ  AÒ%Ð%Ð%Ð%Ð%Ð%r2   N©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r?   rE   rP   © r2   r0   r   r      sj   € € € € € ØQÐQð(ð (ð (ð (ð(.ð .ð .ð .ð	/ð 	/ð 	/ð 	/ð&ð &ð &ð &ð &ð &r2   r   c                  ó"   — e Zd ZdZdd„Zdd„ZdS )Ú$TestVastLabyrinthProceduralSynthesiszUVerifies that ProceduralMapEngine synthesizes high-complexity mazes at endgame scale.r   r   c                ó  — t          j        dd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|                     d¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚t          |j        ¦  «        dk    sJ ‚|j        €J ‚d S )NrC   r4   r5   r7   r8   é*   ©Úseed)r   Úfor_progressionÚwidthÚheightÚgenerate_mapÚlenÚroomsÚ	boss_room)r'   ÚengineÚgrids      r0   Ú/test_procedural_map_engine_for_progression_act1zTTestVastLabyrinthProceduralSynthesis.test_procedural_map_engine_for_progression_act1V   s¦   € Ý$Ô4¸1À^ÐTÑTÔTˆØŒ|˜rÒ!Ð!Ð!Ð!ØŒ} Ò"Ð"Ð"Ð"Ø×"Ò"¨Ð"Ñ+Ô+ˆØŒz˜RÒÐÐÐØŒ{˜bÒ Ð Ð Ð Ý�4”:‰Œ !Ò#Ð#Ð#Ð#ØŒ~Ð)Ð)Ð)Ð)Ð)r2   c                ó’  — t          j        dd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚t	          j        ¦   «         }|                     d¬¦  «        }t	          j        ¦   «         |z
  dz  }|j        dk    sJ ‚|j        dk    sJ ‚t          |j        ¦  «        d	k    sJ d
t          |j        ¦  «        › �¦   «         ‚|j	        €J ‚t          j        |j	        j        d         |j        d         z
  |j	        j        d         |j        d         z
  ¦  «        }|dk    sJ d|d›�¦   «         ‚|dk     sJ d|d›d�¦   «         ‚d S )Nr   r    r!   rA   rB   i9  r[   g     @�@é   z,Expected >= 20 rooms in vast labyrinth, got r   r   g      ^@z5Boss distance in labyrinth must be >= 120 tiles, got z.1fzSynthesis of 240x180 maze took zms (budget < 1000ms))r   r]   r^   r_   ÚtimeÚperf_counterr`   ra   rb   rc   ÚmathÚhypotÚcenterÚspawn_point)r'   rd   Út0re   Ú
elapsed_msÚdists         r0   Ú=test_procedural_map_engine_for_progression_pinnacle_labyrinthzbTestVastLabyrinthProceduralSynthesis.test_procedural_map_engine_for_progression_pinnacle_labyrinth`   s{  € Ý$Ô4¸2ÈÐKÑKÔKˆØŒ|˜sÒ"Ð"Ð"Ð"ØŒ} Ò#Ð#Ð#Ð#ÝÔÑ Ô ˆØ×"Ò"¨Ð"Ñ-Ô-ˆÝÔ'Ñ)Ô)¨BÑ.°&Ñ8ˆ
àŒz˜SÒ Ð Ð Ð ØŒ{˜cÒ!Ð!Ð!Ð!Ý�4”:‰Œ "Ò$Ð$Ð$Ð&fÕUXÐY]ÔYcÑUdÔUdÐ&fÐ&fÑ$Ô$Ð$ØŒ~Ð)Ð)Ð)õ ŒzØŒNÔ! !Ô$ tÔ'7¸Ô':Ñ:ØŒNÔ! !Ô$ tÔ'7¸Ô':Ñ:ñ
ô 
ˆð �uŠ}ˆ}ˆ}Ð`ÐVZÐ`Ð`Ð`‰}Œ}ˆ}Ø˜FÒ"Ð"Ð"Ð$jÀjÐ$jÐ$jÐ$jÐ$jÑ"Ô"Ð"Ð"Ð"r2   NrQ   )rR   rS   rT   rU   rf   rr   rV   r2   r0   rX   rX   S   sH   € € € € € Ø_Ð_ð*ð *ð *ð *ðkð kð kð kð kð kr2   rX   c                  ó   — e Zd ZdZdd„ZdS )Ú TestWildernessProgressionScalingzNVerifies that WildernessMapGenerator scales dimensions and encounter clusters.r   r   c                óP  — t          j        ddd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚t          j        dddd	¬
¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|                     d¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚t          |j        ¦  «        dk    s
J d¦   «         ‚|j        |j        d                  |j        d                  j	        du sJ ‚|j        |j
        d                  |j
        d                  j        t          j        k    sJ ‚d S )NÚzone_tang_kiem_nhair   r   )r\   Úplayer_levelr7   r8   Úzone_boundless_celestial_palacer   r    )r\   rw   r#   rA   rB   i	  r[   rD   z6High tier wilderness must have >= 4 encounter clustersr   T)r	   Úfor_zoner^   r_   Úgeneratera   Úencounter_zonesÚtilesrn   ÚwalkableÚ	boss_gateÚ	tile_typer
   Ú	BOSS_GATE)r'   Ú	gen_earlyÚgen_endgamere   s       r0   Ú-test_wilderness_for_zone_scales_with_map_tierzNTestWildernessProgressionScaling.test_wilderness_for_zone_scales_with_map_tiery   sS  € Ý*Ô3Ð4IÐPRÐabÐcÑcÔcˆ	ØŒ "Ò$Ð$Ð$Ð$ØÔ 2Ò%Ð%Ð%Ð%å,Ô5Ð6WÐ^`ÐoqÐ|~ÐÑÔˆØÔ  CÒ'Ð'Ð'Ð'ØÔ! SÒ(Ð(Ð(Ð(à×#Ò#¨Ð#Ñ-Ô-ˆØŒz˜SÒ Ð Ð Ð ØŒ{˜cÒ!Ð!Ð!Ð!Ý�4Ô'Ñ(Ô(¨AÒ-Ð-Ð-Ð/gÑ-Ô-Ð-ð Œz˜$Ô*¨1Ô-Ô.¨tÔ/?ÀÔ/BÔCÔLÐPTÐTÐTÐTÐTØŒz˜$œ.¨Ô+Ô,¨T¬^¸AÔ->Ô?ÔIÍXÔM_Ò_Ð_Ð_Ð_Ð_Ð_r2   NrQ   )rR   rS   rT   rU   rƒ   rV   r2   r0   rt   rt   v   s4   € € € € € ØXÐXð`ð `ð `ð `ð `ð `r2   rt   )rU   Ú
__future__r   rk   ri   ÚpytestÚ#server.world.map_progression_scalerr   r   r   r   Ú"server.world.procedural_map_enginer   Ú%server.world.wilderness_map_generatorr	   Úserver.world.map_data_typesr
   r   rX   rt   rV   r2   r0   ú<module>rŠ      sI  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð CÐ BÐ BÐ BÐ BÐ BØ HÐ HÐ HÐ HÐ HÐ HØ 0Ð 0Ð 0Ð 0Ð 0Ð 0ð9&ð 9&ð 9&ð 9&ð 9&ñ 9&ô 9&ð 9&ðx kð  kð  kð  kð  kñ  kô  kð  kðF`ð `ð `ð `ð `ñ `ô `ð `ð `ð `r2   