§
    ã¾jÏI  ã                   ó’  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZmZmZmZ ddlZej                             ej                             ej                             e¦  «        d¦  «        ¦  «        Zee
j        vre
j                             de¦  «         ddlmZmZ ddlmZ ddl m!Z!m"Z" dd	l#m$Z$m%Z% d
e&de&fd„Z'de&de&de(fd„Z)d
e&de(fd„Z*ej+        de	j,        fd„¦   «         Z-ej+        deeeef         fd„¦   «         Z. G d„ d¦  «        Z/ G d„ d¦  «        Z0 G d„ d¦  «        Z1 G d„ d¦  «        Z2dS )aC  
Comprehensive E2E Test Suite for FreeExile Level 1-100 Progression, Piecewise EXP Curve,
Hybrid Tiered Death Penalty & Godhood Avatar Metamorphosis (PoE2 2026 Standards).

4-Tier Methodology:
- Tier 1: Feature Coverage (F1-F8: EXP Curve, Schema, Level Gap, Death Penalty, Service, Trial 10, Godhood, Sim)
- Tier 2: Boundary & Corner Cases (Level boundaries, Gap thresholds, Safe floor, Resist caps)
- Tier 3: Cross-Feature Combinations (Progression -> Zone -> Combat -> Death -> Respawn)
- Tier 4: Real-World Scenarios (Full Journey Simulation, Level 99 Death Streak, Anti-Bot)
é    N)ÚPath)ÚDictÚListÚTupleÚAnyÚOptionalz../../server)ÚCombatEngineÚCombatActor)ÚFiveElements)Úget_canonical_trialsÚget_ascendancy_nodes)ÚAscendancyAppliedEffectsÚAscendancyTrialÚlevelÚreturnc           
      ó–  — | dk     s| dk    rdS d| cxk    rdk    r0n n-t          t          j        d| dz  z  d| z  z   ¦  «        ¦  «        S d| cxk    rdk    rBn n?t          d¦  «        }t          t          j        |dd	| dz
  z  z   d
z  z  ¦  «        ¦  «        S d| cxk    rdk    rNn nKt          d¦  «        }t          t          j        |t          j        d| dz
  z  ¦  «        z  ¦  «        ¦  «        S d| cxk    rdk    r?n n<t          d¦  «        }t          t          j        |d|z  | dz
  z  z   ¦  «        ¦  «        S d| cxk    rdk    rNn nKt          d¦  «        }t          t          j        |t          j        d| dz
  z  ¦  «        z  ¦  «        ¦  «        S d| cxk    rdk    rNn nKt          d¦  «        }t          t          j        |t          j        d| dz
  z  ¦  «        z  ¦  «        ¦  «        S | dk    rKt          d„ t          dd¦  «        D ¦   «         ¦  «        }t          t          j        d|z  ¦  «        ¦  «        S dS )zG7-segment piecewise exponential EXP curve delta for level -> level + 1.é   éd   r   é   iô  gffffff@é   é(   gÃõ(\�Âµ?g333333@é)   é<   gZd;ßO�·?é=   éP   ç¸…ëQ¸¾?éQ   éZ   g�Âõ(\�Â?é[   éb   g¸…ëQ¸Î?éc   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N©Úcalc_delta_exp©Ú.0Úis     ú=C:\Projects\FreeExile\tests\e2e\test_level_progression_e2e.pyú	<genexpr>z!calc_delta_exp.<locals>.<genexpr>5   ó*   è è € Ð?Ð?¨Q•~ aÑ(Ô(Ð?Ð?Ð?Ð?Ð?Ð?ó    çffffffÖ?)ÚintÚmathÚfloorr%   ÚexpÚsumÚrange)r   Úd20Úd40Úd60Úd80Úd90Úsum_1_98s          r)   r%   r%      s‡  € àˆq‚y€y�E˜S’L�LØˆqØˆEÐÐÒÐ�RÒÐÐÐÐÝ•4”:˜c U¨c¡\Ñ2°S¸5±[Ñ@ÑAÔAÑBÔBÐBØ	ˆuÐ	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ð	Ý˜RÑ Ô ˆÝ•4”:˜c a¨%°5¸2±:Ñ*>Ñ&>À3Ñ%FÑGÑHÔHÑIÔIÐIØ	ˆuÐ	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ð	Ý˜RÑ Ô ˆÝ•4”:˜c¥D¤H¨U°e¸b±jÑ-AÑ$BÔ$BÑBÑCÔCÑDÔDÐDØ	ˆuÐ	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ð	Ý˜RÑ Ô ˆÝ•4”:˜c D¨3¡J°%¸"±*Ñ$=Ñ=Ñ>Ô>Ñ?Ô?Ð?Ø	ˆuÐ	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ð	Ý˜RÑ Ô ˆÝ•4”:˜c¥D¤H¨U°e¸b±jÑ-AÑ$BÔ$BÑBÑCÔCÑDÔDÐDØ	ˆuÐ	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ð	Ý˜RÑ Ô ˆÝ•4”:˜c¥D¤H¨U°e¸b±jÑ-AÑ$BÔ$BÑBÑCÔCÑDÔDÐDØ	�"ŠˆÝÐ?Ð?µ%¸¸2±,´,Ð?Ñ?Ô?Ñ?Ô?ˆÝ•4”:˜d X™oÑ.Ô.Ñ/Ô/Ð/Øˆ1r,   Úplayer_levelÚmonster_levelc                 óì   — | |z
  }t          |¦  «        dk    rdS |dk    r*|dz
  }t          dt          j        d|z  ¦  «        ¦  «        S | dz
  }t          dt          j        d|z  ¦  «        ¦  «        S )zKCalculates level gap efficiency multiplier (>=10 levels lower gives <= 5%).é   ç      ð?ç{®Gáz„?g333333ã¿çš™™™™™©?gš™™™™™Ù¿)ÚabsÚmaxr/   r1   )r:   r;   ÚgapÚds       r)   Úcalc_level_gap_decayrE   :   sy   € à
˜Ñ
&€CÝ
ˆ3�x„x�1‚}€}ØˆsØ
ˆQ‚w€wØ�!‰GˆÝ�4�œ %¨!¡)Ñ,Ô,Ñ-Ô-Ð-Ø
ˆ�‰
€AÝˆt•T”X˜e a™iÑ(Ô(Ñ)Ô)Ð)r,   c                 óV   — | dk    rdS | dk    rdS | dk    rdS | dk    rdS | d	k    rd
S dS )zbCalculates tiered death penalty ratio (1-60: 0%, 61-80: 5%, 81-89: 10%, 90-99: 15%, 99->100: 25%).r   ç        r   r@   éY   çš™™™™™¹?r    ç333333Ã?r!   ç      Ð?© )r   s    r)   Úcalc_death_penalty_ratiorM   F   sM   € à�‚{€{ØˆsØ	�"ŠˆØˆtØ	�"ŠˆØˆtØ	�"ŠˆØˆtØ	�"ŠˆØˆtØˆ3r,   c               #   ó¼   K  — t          d¦  «        } t          j        t          | ¦  «        ¦  «        }t          j        |_        |V — |                     ¦   «          d S )Nzdata/game_design_matrix.db)r   Úsqlite3ÚconnectÚstrÚRowÚrow_factoryÚclose)Údb_pathÚconns     r)   Úmatrix_db_connrW   W   sM   è è € åÐ/Ñ0Ô0€GÝŒ?�3˜w™<œ<Ñ(Ô(€DÝ”{€DÔØ
€J€J€JØ‡J‚J�L„L€L€L€Lr,   c                  óò   — t          ¦   «         } t          ddt          j        d¬¦  «        }t          ddt          j        dd¬¦  «        }|                      |¦  «         |                      |¦  «         | ||fS )	Nr   u   Boss Tháº§n Mag      i@)Úbase_attacké   u   LÆ°u Ä�Ã y Giáº£ç     @�@)Ú
current_hpÚmax_hp)r	   r
   r   ÚHOAÚregister_actor)ÚengineÚattackerÚdefenders      r)   Úcombat_pairrc   `   sw   € å‰^Œ^€FÝ˜1Ð.µÔ0@ÈeÐTÑTÔT€HÝ˜1Ð0µ,Ô2BÈvÐ^dÐeÑeÔe€HØ
×Ò˜(Ñ#Ô#Ð#Ø
×Ò˜(Ñ#Ô#Ð#Ø�8˜XÐ%Ð%r,   c                   ó°  — e Zd ZdZd%d„Zd%d„Zd%d„Zd%d„Zd%d„Zd	e	j
        ddfd
„Zd	e	j
        ddfd„Zd	e	j
        ddfd„Zd	e	j
        ddfd„Zd	e	j
        ddfd„Zd%d„Zd%d„Zd%d„Zd%d„Zd%d„Zej                             dg d¢¦  «        dededdfd„¦   «         Zd%d„Zd%d„Zd%d„Zd%d„Zd%d„Zd%d„Z d%d„Z!d%d „Z"d!e#e$e%e%f         ddfd"„Z&d%d#„Z'd%d$„Z(dS )&ÚTestTier1FeatureCoveragezFTier 1: Feature Coverage across F1 to F8 (>=5 test cases per feature).r   Nc                 óâ  ‡— d„ t          dd¦  «        D ¦   «         Šˆfd„t          dt          ‰¦  «        ¦  «        D ¦   «         }t          |¦  «        }|s•ddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )	z0EXP delta strictly increases from level 1 to 99.c                 ó,   — g | ]}t          |¦  «        ‘ŒS rL   r$   )r'   Úlvls     r)   ú
<listcomp>zWTestTier1FeatureCoverage.test_f01_exp_curve_monotonicity_all_levels.<locals>.<listcomp>r   s    € Ð?Ð?Ð?¨#•. Ñ%Ô%Ð?Ð?Ð?r,   r   r   c              3   óB   •K  — | ]}‰|         ‰|d z
           k    V — ŒdS )r   NrL   )r'   r(   Údeltass     €r)   r*   zVTestTier1FeatureCoverage.test_f01_exp_curve_monotonicity_all_levels.<locals>.<genexpr>s   s4   øè è € ÐLÐL°�6˜!”9˜v a¨!¡eœ}Ò,ÐLÐLÐLÐLÐLÐLr,   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©Úpy0Úpy2Úpy4N)
r3   Úlenrl   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)ÚselfÚ@py_assert1Ú@py_assert3Ú@py_format5rk   s       @r)   Ú*test_f01_exp_curve_monotonicity_all_levelszCTestTier1FeatureCoverage.test_f01_exp_curve_monotonicity_all_levelsp   sð   ø€ à?Ð?µ°q¸#±´Ð?Ñ?Ô?ˆØLÐLÐLÐLµe¸A½sÀ6¹{¼{Ñ6KÔ6KÐLÑLÔLÐL�sÐLÑLÔLÐLÐLÐLÐLÐLÕLÔLÑLÔLÐLÐLÕLÔL�sÑLÔLÐLÕLÔL�sÑLÔLÐLÐLÕLÔLÐLÑLÔLÕLÔLÐLÑLÔLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLr,   c                 óv  — t          d„ t          dd¦  «        D ¦   «         ¦  «        }t          d„ t          dd¦  «        D ¦   «         ¦  «        }||z  }d}||k     }|sÕt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )z=Level 1-20 cumulative EXP is strictly < 0.1% of lifetime EXP.c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r#   r$   r&   s     r)   r*   zTTestTier1FeatureCoverage.test_f01_exp_curve_tutorial_tier1_budget.<locals>.<genexpr>w   s*   è è € ÐAÐA¨q�¨Ñ*Ô*ÐAÐAÐAÐAÐAÐAr,   r   r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r#   r$   r&   s     r)   r*   zTTestTier1FeatureCoverage.test_f01_exp_curve_tutorial_tier1_budget.<locals>.<genexpr>x   s*   è è € ÐFÐF°1�^¨AÑ.Ô.ÐFÐFÐFÐFÐFÐFr,   r   gü©ñÒMbP?©ú<)z(%(py0)s / %(py1)s) < %(py5)sÚ
total_1_20Útotal_lifetime)rn   Úpy1Úpy5úassert %(py7)sÚpy7N)
r2   r3   rt   Ú_call_reprcomparerr   rs   ru   rv   rw   rx   )ry   rƒ   r„   Ú@py_assert2Ú@py_assert4r{   Ú@py_format6Ú@py_format8s           r)   Ú(test_f01_exp_curve_tutorial_tier1_budgetzATestTier1FeatureCoverage.test_f01_exp_curve_tutorial_tier1_budgetu   s^  € åÐAÐAµE¸!¸R±L´LÐAÑAÔAÑAÔAˆ
ÝÐFÐF½¸aÀ¹¼ÐFÑFÔFÑFÔFˆØ˜^Ñ+Ð4¨uÐ4Ð+¨uÒ4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð+¨uÐ4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�
Ñ4Ô4Ð4Õ4Ô4�
Ñ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4˜^Ñ4Ô4Ð4Õ4Ô4˜^Ñ4Ô4Ð4Ð4Õ4Ô4¨uÑ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r,   c                 ór  — t          d¦  «        t          d¦  «        t          d¦  «        }}}g }d}||z  }||k    }|}|rd}	||	z  }
||
k    }|}|�sÔt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }|                     |¦  «         |rÉt          j        d|fd||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	}
dS )z?Segments 2 (21-40) and 3 (41-60) exhibit moderate deceleration.r   r   r   g       @ç      @©ú>)z%(py2)s > (%(py4)s * %(py6)s)r5   r4   )ro   rp   Úpy6ú%(py9)sÚpy9)z %(py11)s > (%(py13)s * %(py15)s)r6   )Úpy11Úpy13Úpy15ú%(py18)sÚpy18r   úassert %(py21)sÚpy21N)r%   rt   r‰   rr   rs   ru   rv   ÚappendÚ_format_booloprw   rx   )ry   r4   r5   r6   rz   Ú@py_assert5Ú@py_assert7r{   Ú@py_assert0Ú@py_assert14Ú@py_assert16Ú@py_assert12r�   Ú@py_format10Ú@py_format17Ú@py_format19Ú@py_format20Ú@py_format22s                     r)   Ú.test_f01_exp_curve_story_deceleration_tiers2_3zGTestTier1FeatureCoverage.test_f01_exp_curve_story_deceleration_tiers2_3{   sŸ  € å& rÑ*Ô*­N¸2Ñ,>Ô,>ÅÈrÑ@RÔ@R�#ˆSˆØ2Ð2˜3Ð2�S˜3‘YÐ2ˆs�YŠÐ2Ð2Ð2Ð2Ð2¨sÐ2¨¨s©Ð2 3¨¢?Ð2Ð2Ð2Ð2Ñ2Õ2Ô2Ð2Ð2Ð2Ð2ˆs�YÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆsÑ2Ô2Ð2Õ2Ô2ˆsÑ2Ô2Ð2Ð2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2�SÑ2Ô2Ð2Õ2Ô2�SÑ2Ô2Ð2Ð2Õ2Ô2˜3Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2×2Ò2Ð2Ñ2Ô2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2 3¨Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2 3Ñ2Ô2Ð2Õ2Ô2 3Ñ2Ô2Ð2Ð2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨Ñ2Ô2Ð2Õ2Ô2¨Ñ2Ô2Ð2Ð2Õ2Ô2¨sÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2×2Ò2Ð2Ñ2Ô2Ð2Õ2Ô2Ð2Ð2Ñ2Ô2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r,   c                 óö  — t          d¦  «        t          d¦  «        t          d¦  «        }}}||z
  }t          j        }d}||z  }d}||z  }	 ||	¦  «        }
t          |
¦  «        }||k    }|�sït	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndd	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	d
t          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nd
dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœ
z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}
}t          d¦  «        t          d¦  «        }}d}||z  }||k    }|sÕt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )zKSegment 4 has stable linear growth; Segment 6 has steep exponential growth.r   éF   r   r   é
   ©ú==)z“(%(py0)s - %(py1)s) == %(py18)s
{%(py18)s = %(py4)s(%(py16)s
{%(py16)s = %(py7)s
{%(py7)s = %(py5)s.floor
}(((%(py9)s * %(py10)s) * %(py13)s))
})
}Úd70r6   r.   r/   )
rn   r…   rp   r†   rˆ   r•   Úpy10r—   Úpy16rš   zassert %(py20)sÚpy20Nr   é_   r�   r‘   )z%(py0)s > (%(py2)s * %(py4)s)Úd95r8   rm   r‡   rˆ   )r%   r/   r0   r.   rt   r‰   rr   rs   ru   rv   rw   rx   )ry   r6   r°   r7   rŠ   Ú@py_assert6Ú@py_assert8Ú@py_assert11r¤   r¢   Ú@py_assert15Ú@py_assert17r{   r§   Ú@py_format21r8   rµ   rŸ   rz   rŒ   r�   s                        r)   Ú4test_f01_exp_curve_mapping_linear_and_steep_tiers4_6zMTestTier1FeatureCoverage.test_f01_exp_curve_mapping_linear_and_steep_tiers4_6€   s¤  € å& rÑ*Ô*­N¸2Ñ,>Ô,>ÅÈrÑ@RÔ@R�#ˆSˆØ�c‘	Ð>¥$¤*Ð>¨TÐ>¨T°C©ZÐ>¸"Ð>¨Z¸"©_Ð> * *¨_Ñ"=Ô"=Ð>�cÐ"=Ñ>Ô>Ð>�	Ð>Ò>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>�	Ð>Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�Ñ>Ô>Ð>Õ>Ô>�Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�cÑ>Ô>Ð>Õ>Ô>�cÑ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�cÑ>Ô>Ð>Õ>Ô>�cÑ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¥$Ñ>Ô>Ð>Õ>Ô>¥$Ñ>Ô>Ð>Ð>Õ>Ô> *Ñ>Ô>Õ>Ô>¨TÑ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>°CÑ>Ô>Ð>Õ>Ô>°CÑ>Ô>Ð>Ð>Õ>Ô>¸"Ñ>Ô>Õ>Ô>Ð"=Ñ>Ô>Õ>Ô>Ð>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ý! "Ñ%Ô%¥~°bÑ'9Ô'9ˆSˆØÐ�S˜3‘YÐˆs�YŠÐÐÐÕÔÐÐÐÐˆs�YÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÐÕÔÑÔÐÐÕÔ�SÑÔÐÕÔ�SÑÔÐÐÕÔ˜3ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr,   c                 ój  — t          d„ t          dd¦  «        D ¦   «         ¦  «        }t          d¦  «        }||z   }d}||z  }||k    }|sÕt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}d}	||z  }
|	|
k    }d}|
|k    }|r|sêt          j        d||fd|	|
|f¦  «        t          j        |	¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}	x}x}x}
}dS )zKLevel 99->100 delta is >= 30% of total 1-99 EXP and 25-35% of lifetime EXP.c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r#   r$   r&   s     r)   r*   z\TestTier1FeatureCoverage.test_f01_exp_curve_pinnacle_softwall_tier7_ratio.<locals>.<genexpr>‰   r+   r,   r   r!   g333333Ó?©ú>=)z%(py0)s >= (%(py3)s * %(py4)s)Údelta_99r9   )rn   Úpy3rp   r‡   rˆ   NrK   r-   )ú<=rÃ   )z%(py1)s <= (%(py4)s / %(py5)s)z(%(py4)s / %(py5)s) <= %(py8)sr„   )r…   rp   r†   Úpy8zassert %(py10)sr±   )r2   r3   r%   rt   r‰   rr   rs   ru   rv   rw   rx   )ry   r9   rÁ   r„   rŠ   rŸ   rz   rŒ   r�   r¡   r¶   r    r{   Ú@py_format9Ú@py_format11s                  r)   Ú0test_f01_exp_curve_pinnacle_softwall_tier7_ratiozITestTier1FeatureCoverage.test_f01_exp_curve_pinnacle_softwall_tier7_ratio‡   s‘  € åÐ?Ð?µ%¸¸2±,´,Ð?Ñ?Ô?Ñ?Ô?ˆÝ! "Ñ%Ô%ˆØ! HÑ,ˆØÐ*˜4 (™?Ð*ˆx˜?Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆx˜?Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*˜4Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* (Ñ*Ô*Ð*Õ*Ô* (Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ:˜ >Ñ1Ð:ˆtÐ1Ò:Ð:°dÐ:Ð1°dÒ:Ð:Ð:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð:ˆtÐ1°dÐ:Ñ:Ô:Õ:Ô:ˆtÑ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:˜Ñ:Ô:Ð:Õ:Ô:˜Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô: >Ñ:Ô:Ð:Õ:Ô: >Ñ:Ô:Ð:Ð:Õ:Ô:°dÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:r,   rW   c                 óª  — |                      d¦  «                             ¦   «         d         }d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}d
S )z@progression_benchmarks has exactly 100 rows for levels 1 to 100.z+SELECT COUNT(*) FROM progression_benchmarksr   r   r®   ©z%(py0)s == %(py3)sÚcount©rn   rÂ   úassert %(py5)sr†   N)
ÚexecuteÚfetchonert   r‰   rr   rs   ru   rv   rw   rx   )ry   rW   rÊ   rŠ   rz   Ú@py_format4rŒ   s          r)   Ú)test_f02_progression_benchmarks_row_countzBTestTier1FeatureCoverage.test_f02_progression_benchmarks_row_count�   sï   € à×&Ò&Ð'TÑUÔU×^Ò^Ñ`Ô`ÐabÔcˆØÐˆu˜Š|ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   c                 ó  — |                      d¦  «                             ¦   «         }g }d}||u}|}|r|d         }d}||k    }	|	}|�s-t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
d	d
|
iz  }|                     |¦  «         |r`t          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	}dS )z5Level 85 allows max affix tier 1 (T1 affix unlocked).zJSELECT max_affix_tier_allowed FROM progression_benchmarks WHERE level = 85Nr   r   ©úis not©z%(py2)s is not %(py5)sÚrow©ro   r†   ú%(py7)srˆ   r®   )z%(py10)s == %(py13)s©r±   r—   ú%(py15)sr˜   úassert %(py18)srš   ©rÍ   rÎ   rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   ©ry   rW   rÕ   rz   r‹   r{   r¡   Ú@py_assert9r¤   r¸   rŒ   r�   Ú@py_format14Ú@py_format16r¦   r§   s                   r)   Ú9test_f02_progression_benchmarks_endgame_affix_tier_unlockzRTestTier1FeatureCoverage.test_f02_progression_benchmarks_endgame_affix_tier_unlock•   së  € à×$Ò$Ð%qÑrÔr×{Ò{Ñ}Ô}ˆØ.Ð.˜$Ð.ˆs˜$ˆÐ.Ð.Ð.Ð.Ð. 3 q¤6Ð.¨QÐ. 6¨Q¢;Ð.Ð.Ð.Ð.Ñ.Õ.Ô.Ð.Ð.Ð.Ð.ˆs˜$Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ˆsÑ.Ô.Ð.Õ.Ô.ˆsÑ.Ô.Ð.Ð.Õ.Ô.˜$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.×.Ò.Ð.Ñ.Ô.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð. 6¨QÐ.Ñ.Ô.Õ.Ô. 6Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.×.Ò.Ð.Ñ.Ô.Ð.Õ.Ô.Ð.Ð.Ñ.Ô.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r,   c                 óä  — |                      d¦  «                             ¦   «         }g }d}||u}|}|r!|d         }d}t          |¦  «        }	||	k    }
|
}|�sˆt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }| 	                    |¦  «         |r»t          j        d|
fd||	f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}
x}}	dS )zBSchema contains exp_to_next_level column matching 7-segment curve.zDSELECT exp_to_next_level FROM progression_benchmarks WHERE level = 1Nr   r   rÒ   rÔ   rÕ   rÖ   r×   rˆ   r®   )z5%(py10)s == %(py16)s
{%(py16)s = %(py12)s(%(py14)s)
}r%   )r±   Úpy12Úpy14r²   r™   rš   r›   rœ   )rÍ   rÎ   r%   rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rW   rÕ   rz   r‹   r{   r¡   rÝ   Ú@py_assert13r¹   r¸   rŒ   r�   r¦   r§   r¨   r©   s                    r)   Ú,test_f02_progression_benchmarks_delta_columnzETestTier1FeatureCoverage.test_f02_progression_benchmarks_delta_columnš   sJ  € à×$Ò$Ð%kÑlÔl×uÒuÑwÔwˆØ>Ð>˜$Ð>ˆs˜$ˆÐ>Ð>Ð>Ð>Ð> 3 q¤6Ð>¸AÐ>­^¸AÑ->Ô->Ð> 6Ð->Ò#>Ð>Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>ˆs˜$Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆsÑ>Ô>Ð>Õ>Ô>ˆsÑ>Ô>Ð>Ð>Õ>Ô>˜$Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð> 6Ð->Ð>Ñ>Ô>Õ>Ô> 6Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>­^Ñ>Ô>Ð>Õ>Ô>­^Ñ>Ô>Ð>Ð>Õ>Ô>¸AÑ>Ô>Õ>Ô>Ð->Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Õ>Ô>Ð>Ð>Ñ>Ô>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>r,   c                 ó   — |                      d¦  «                             ¦   «         }g }d}||u}|}|r(|d         }d}||z
  }	t          |	¦  «        }
d}|
|k     }|}|�s›t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }| 	                    |¦  «         |rÎt          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}
x}}dS )zGSchema contains death_penalty_ratio column populated with tiered rates.zGSELECT death_penalty_ratio FROM progression_benchmarks WHERE level = 99Nr   rK   ç-Cëâ6?rÒ   rÔ   rÕ   rÖ   r×   rˆ   r�   )z@%(py16)s
{%(py16)s = %(py9)s((%(py11)s - %(py13)s))
} < %(py19)srA   )r•   r–   r—   r²   Úpy19z%(py21)srœ   zassert %(py24)sÚpy24)rÍ   rÎ   rA   rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rW   rÕ   rz   r‹   r{   r¡   Ú@py_assert10r¤   r¢   r¹   Ú@py_assert18rº   rŒ   r�   r¨   r©   Ú@py_format23Ú@py_format25s                      r)   Ú4test_f02_progression_benchmarks_death_penalty_columnzMTestTier1FeatureCoverage.test_f02_progression_benchmarks_death_penalty_columnŸ   sr  € à×$Ò$Ð%nÑoÔo×xÒxÑzÔzˆØ<Ð<˜$Ð<ˆs˜$ˆÐ<Ð<Ð<Ð<Ð< s¨1¤vÐ<°Ð< v°¡}Ð<¥3 }Ñ#5Ô#5Ð<¸Ð<Ð#5¸Ò#<Ð<Ð<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<ˆs˜$Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆsÑ<Ô<Ð<Õ<Ô<ˆsÑ<Ô<Ð<Ð<Õ<Ô<˜$Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð#5¸Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¥3Ñ<Ô<Ð<Õ<Ô<¥3Ñ<Ô<Ð<Ð<Õ<Ô< vÑ<Ô<Õ<Ô<°Ñ<Ô<Õ<Ô<Ð#5Ñ<Ô<Õ<Ô<¸Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Õ<Ô<Ð<Ð<Ñ<Ô<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r,   c                 ó  — |                      d¦  «                             ¦   «         }g }d}||u}|}|r|d         }d}||k    }	|	}|�s-t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
d	d
|
iz  }|                     |¦  «         |r`t          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	}dS )zCSchema contains cumulative_exp matching cumulative lifetime values.zCSELECT cumulative_exp FROM progression_benchmarks WHERE level = 100Nr   l    d(	 rÒ   rÔ   rÕ   rÖ   r×   rˆ   r‘   )z%(py10)s > %(py13)srØ   rÙ   r˜   rÚ   rš   rÛ   rÜ   s                   r)   Ú1test_f02_progression_benchmarks_cumulative_columnzJTestTier1FeatureCoverage.test_f02_progression_benchmarks_cumulative_column¤   sì  € à×$Ò$Ð%jÑkÔk×tÒtÑvÔvˆØ:Ð:˜$Ð:ˆs˜$ˆÐ:Ð:Ð:Ð:Ð: 3 q¤6Ð:¨NÐ: 6¨NÒ#:Ð:Ð:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:ˆs˜$Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆsÑ:Ô:Ð:Õ:Ô:ˆsÑ:Ô:Ð:Ð:Õ:Ô:˜$Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð: 6¨NÐ:Ñ:Ô:Õ:Ô: 6Ñ:Ô:Õ:Ô:¨NÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Õ:Ô:Ð:Ð:Ñ:Ô:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:r,   c           
      óP  — t          dd¦  «        D �]“}d}||z   }d}t          ||¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}x}x}x}}d}d}
|
|z   }t          ||¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |
¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d
d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}
x}x}x}}�Œ•dS )z/Level gap <= 5 gives 100% EXP efficiency (1.0).r   é   r   r>   r®   )zF%(py8)s
{%(py8)s = %(py0)s((%(py2)s + %(py3)s), %(py6)s)
} == %(py11)srE   rC   )rn   ro   rÂ   r“   rÄ   r–   úassert %(py13)sr—   N)zF%(py8)s
{%(py8)s = %(py0)s(%(py2)s, (%(py4)s + %(py5)s))
} == %(py11)s)rn   ro   rp   r†   rÄ   r–   )
r3   rE   rt   r‰   rr   rs   ru   rv   rw   rx   )ry   rC   rz   r‹   rŸ   r    rê   rÝ   Ú@py_format12rÞ   r{   r¶   s               r)   Ú&test_f03_level_gap_safe_range_full_expz?TestTier1FeatureCoverage.test_f03_level_gap_safe_range_full_expª   sò  € å˜˜A‘;”;ð 	=ñ 	=ˆCØ(*Ð<¨¨S©Ð<°"Ð<Õ'¨°"Ñ5Ô5Ð<¸Ð<Ð5¸Ò<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<Ð5¸Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<Õ'Ñ<Ô<Ð<Õ<Ô<Õ'Ñ<Ô<Ð<Ð<Õ<Ô<¨Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¨SÑ<Ô<Ð<Õ<Ô<¨SÑ<Ô<Ð<Ð<Õ<Ô<°"Ñ<Ô<Õ<Ô<Ð5Ñ<Ô<Õ<Ô<¸Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø(*Ð<¨BÐ<¨B°©HÐ<Õ'¨¨HÑ5Ô5Ð<¸Ð<Ð5¸Ò<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<Ð5¸Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<Õ'Ñ<Ô<Ð<Õ<Ô<Õ'Ñ<Ô<Ð<Ð<Õ<Ô<¨Ñ<Ô<Õ<Ô<¨BÑ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<°Ñ<Ô<Ð<Õ<Ô<°Ñ<Ô<Ð<Ð<Õ<Ô<Ð5Ñ<Ô<Õ<Ô<¸Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ñ<ð	=ð 	=r,   c                 ó¢  — t          dd¦  «        }t          j        }d}| } ||¦  «        }||z
  }t          |¦  «        }d}||k     }	|	�sst	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndd	t          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        d
œz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	}dS )z8Level gap == 6 starts exponential decay (approx 54.88%).éV   r   ç333333ã?rç   r�   )zv%(py12)s
{%(py12)s = %(py0)s((%(py1)s - %(py9)s
{%(py9)s = %(py4)s
{%(py4)s = %(py2)s.exp
}(-%(py6)s)
}))
} < %(py15)srA   Úeffr/   )rn   r…   ro   rp   r“   r•   râ   r˜   úassert %(py17)sÚpy17N)rE   r/   r1   rA   rt   r‰   rr   rs   ru   rv   rw   rx   )ry   rù   r{   rŸ   r    r·   rê   r¸   r¢   rä   rß   Ú@py_format18s               r)   Ú)test_f03_level_gap_decay_starts_at_diff_6zBTestTier1FeatureCoverage.test_f03_level_gap_decay_starts_at_diff_6°   sä  € å" 2 rÑ*Ô*ˆÝœÐ0 4Ð0 4 %Ð0˜˜ %™œÐ0�3˜Ñ(Ð0�sÐ(Ñ)Ô)Ð0¨DÐ0Ð)¨DÒ0Ð0Ð0Ñ0Õ0Ô0Ð0Ð0Ð0Ð0Ð)¨DÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�sÑ0Ô0Ð0Õ0Ô0�sÑ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�3Ñ0Ô0Ð0Õ0Ô0�3Ñ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�Ñ0Ô0Ð0Õ0Ô0�Ñ0Ô0Ð0Ð0Õ0Ô0˜Ñ0Ô0Õ0Ô0 4Ñ0Ô0Õ0Ô0˜Ñ0Ô0Õ0Ô0Ð)Ñ0Ô0Õ0Ô0¨DÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r,   c                 óV  — t          dd¦  «        }g }d}||k    }|}|r:t          j        }d}| } ||¦  «        }	||	z
  }
t          |
¦  «        }d}||k     }|}|�s5t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d	œz  }d
d|iz  }| 
                    |¦  «         |�rgt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |	¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }| 
                    |¦  «         t	          j        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}	x}
x}x}}dS )z8Monster 10 levels lower gives <= 5% EXP (decay <= 0.05).r   r   r@   r�   rç   ©rÃ   )z%(py2)s <= %(py5)srù   rÖ   r×   rˆ   r�   )z}%(py21)s
{%(py21)s = %(py9)s((%(py10)s - %(py18)s
{%(py18)s = %(py13)s
{%(py13)s = %(py11)s.exp
}(-%(py15)s)
}))
} < %(py24)srA   r/   )r•   r±   r–   r—   r˜   rš   rœ   ré   z%(py26)sÚpy26r   zassert %(py29)sÚpy29N)rE   r/   r1   rA   rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rù   rz   r‹   r{   r¡   r¤   r¢   r£   rº   Ú@py_assert19Ú@py_assert20Ú@py_assert23Ú@py_assert22rŒ   r�   rí   Ú@py_format27Ú@py_format28Ú@py_format30s                       r)   Ú0test_f03_level_gap_decay_diff_10_under_5_percentzITestTier1FeatureCoverage.test_f03_level_gap_decay_diff_10_under_5_percentµ   s  € å" 2 rÑ*Ô*ˆØ?Ð?�dÐ?ˆs�dŠ{Ð?Ð?Ð?Ð?Ð?­¬Ð?°3Ð?°3°$Ð?¨¨°$©¬Ð? 3¨Ñ#7Ð?�sÐ#7Ñ8Ô8Ð?¸4Ð?Ð8¸4Ò?Ð?Ð?Ð?Ð?Ñ?Õ?Ô?Ð?Ð?Ð?Ð?ˆs�dÐ?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆsÑ?Ô?Ð?Õ?Ô?ˆsÑ?Ô?Ð?Ð?Õ?Ô?�dÑ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Ð?×?Ò?Ð?Ñ?Ô?Ð?Ð?Ñ?Õ?Ô?Ð?Ð?Ð?Ð?Ð8¸4Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?�sÑ?Ô?Ð?Õ?Ô?�sÑ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô? 3Ñ?Ô?Ð?Õ?Ô? 3Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?­Ñ?Ô?Ð?Õ?Ô?­Ñ?Ô?Ð?Ð?Õ?Ô?¨Ñ?Ô?Õ?Ô?°3Ñ?Ô?Õ?Ô?¨Ñ?Ô?Õ?Ô?Ð8Ñ?Ô?Õ?Ô?¸4Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Ð?×?Ò?Ð?Ñ?Ô?Ð?Õ?Ô?Ð?Ð?Ñ?Ô?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?r,   c                 óp  — t          dd¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d
S )z.Extreme gap clamps to minimum floor 0.01 (1%).r´   r   r?   r®   rÉ   rù   rË   rÌ   r†   N©	rE   rt   r‰   rr   rs   ru   rv   rw   rx   ©ry   rù   rŠ   rz   rÏ   rŒ   s         r)   Ú$test_f03_level_gap_extreme_gap_floorz=TestTier1FeatureCoverage.test_f03_level_gap_extreme_gap_floorº   óØ   € å" 2 rÑ*Ô*ˆØÐˆs�dŠ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   c                 óp  — t          dd¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d
S )zDUnderleveled player has exponential decay to prevent power-leveling.r   r   r@   r®   rÉ   rù   rË   rÌ   r†   Nr  r  s         r)   Ú-test_f03_level_gap_underleveled_anti_boostingzFTestTier1FeatureCoverage.test_f03_level_gap_underleveled_anti_boosting¿   r  r,   zlevel,expected_ratio))r   rG   )é   rG   )r   rG   )r   r@   )éK   r@   )r   r@   )r   rI   )éU   rI   )rH   rI   )r   rJ   )r´   rJ   )r    rJ   )r!   rK   r   Úexpected_ratioc                 óx  — t          |¦  «        }||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}d	S )
zMTiered death penalty matches 0%, 5%, 10%, 15%, 25% across all level brackets.r®   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)srM   r   r  )rn   r…   rÂ   r†   r‡   rˆ   N)	rM   rt   r‰   rr   rs   ru   rv   rw   rx   )ry   r   r  rŠ   r‹   rŒ   r�   s          r)   Ú$test_f04_death_penalty_tiered_ratiosz=TestTier1FeatureCoverage.test_f04_death_penalty_tiered_ratiosÅ   sM  € õ (¨Ñ.Ô.Ð@Ð.°.Ò@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@Ð.°.Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@Õ'Ñ@Ô@Ð@Õ@Ô@Õ'Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨Ñ@Ô@Ð@Õ@Ô@¨Ñ@Ô@Ð@Ð@Õ@Ô@Ð.Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@°.Ñ@Ô@Ð@Õ@Ô@°.Ñ@Ô@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r,   c                 óú  — d}t          d¦  «        }t          t          j        |t	          d¦  «        z  ¦  «        ¦  «        }t          d||z
  ¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}d	S )
zCDying at 0% progress results in 0% progress; level never decreases.r   r´   r®   rÉ   Únew_exprË   rÌ   r†   N)r%   r.   r/   r0   rM   rB   rt   r‰   rr   rs   ru   rv   rw   rx   )	ry   Úcurr_expÚdeltaÚlossr  rŠ   rz   rÏ   rŒ   s	            r)   Ú)test_f04_death_penalty_safe_floor_at_zerozBTestTier1FeatureCoverage.test_f04_death_penalty_safe_floor_at_zeroÐ   s  € àˆÝ˜rÑ"Ô"ˆÝ•4”:˜eÕ&>¸rÑ&BÔ&BÑBÑCÔCÑDÔDˆÝ�a˜ D™Ñ)Ô)ˆØÐˆw˜!Š|ÐÐÐÕÔÐÐÐÐˆw˜!ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜!ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   c                 óÀ  — ddl m}  |¦   «         }|                     dddd¦  «        }g }|j        }d}||k    }|}|r|j        }	d}
|	|
u }|}|�s~t          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd	t          j
        |¦  «        t          j
        |¦  «        d
œz  }dd|iz  }|                     |¦  «         |ržt          j        d|fd|	|
f¦  «        d	t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd	t          j
        |	¦  «        t          j
        |
¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}}
dS )zLLevelProgressionService.award_monster_exp credits EXP and handles gap decay.r   ©ÚLevelProgressionServiceÚp1r   éè  Fr®   )z5%(py4)s
{%(py4)s = %(py2)s.effective_exp
} == %(py7)sÚres©ro   rp   rˆ   r”   r•   ©Úis)z=%(py13)s
{%(py13)s = %(py11)s.level_up_occurred
} is %(py16)s©r–   r—   r²   r™   rš   r›   rœ   N)Ú&server.world.level_progression_servicer  Úaward_monster_expÚeffective_expÚlevel_up_occurredrt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   ©ry   r  Úservicer"  rz   r{   r¶   rŸ   r¡   r¤   r¹   r¢   r�   r¥   r¦   r§   r¨   r©   s                     r)   Ú#test_f05_award_monster_exp_contractz<TestTier1FeatureCoverage.test_f05_award_monster_exp_contractÙ   sa  € àRÐRÐRÐRÐRÐRØ)Ð)Ñ+Ô+ˆØ×'Ò'¨¨b°"°dÑ;Ô;ˆØKÐKˆsÔ ÐK DÐKÐ  DÒ(ÐKÐKÐKÐKÐK¨SÔ-BÐKÀeÐKÐ-BÀeÐ-KÐKÐKÐKÐKÑKÕKÔKÐKÐKÐKÐKÐ  DÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆsÑKÔKÐKÕKÔKˆsÑKÔKÐKÐKÕKÔKÐ ÑKÔKÕKÔK DÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÐK×KÒKÐKÑKÔKÐKÐKÐKÕKÔKÐKÐKÐKÐKÐ-BÀeÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK¨SÑKÔKÐKÕKÔK¨SÑKÔKÐKÐKÕKÔKÐ-BÑKÔKÕKÔKÀeÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÐK×KÒKÐKÑKÔKÐKÕKÔKÐKÐKÑKÔKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKr,   c                 óð  — ddl m}  |¦   «         }|                     d¦  «        }|                     ddd|dz   ¦  «        }g }|j        }d}||u }|}	|r|j        }
d}|
|k    }|}	|	�s~t          j        d|fd	||f¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |ržt          j        d|fd|
|f¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}
x}}dS )z4Level up awards +5 stat points and +1 passive point.r   r  r   Úp2r­   TrZ   r$  )z9%(py4)s
{%(py4)s = %(py2)s.level_up_occurred
} is %(py7)sr"  r#  r”   r•   r®   )z5%(py13)s
{%(py13)s = %(py11)s.new_level
} == %(py16)sr&  r™   rš   r›   rœ   N)r'  r  Úget_delta_expr(  r*  Ú	new_levelrt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   r  r,  Úd1r"  rz   r{   r¶   rŸ   r¡   r¤   r¹   r¢   r�   r¥   r¦   r§   r¨   r©   s                      r)   Ú+test_f05_level_up_awards_stats_and_passiveszDTestTier1FeatureCoverage.test_f05_level_up_awards_stats_and_passivesà   st  € àRÐRÐRÐRÐRÐRØ)Ð)Ñ+Ô+ˆØ×"Ò" 1Ñ%Ô%ˆØ×'Ò'¨¨a°°B¸±GÑ<Ô<ˆØCÐCˆsÔ$ÐC¨ÐCÐ$¨Ð,ÐCÐCÐCÐCÐC°´ÐCÀ!ÐC°À!Ò1CÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCÐ$¨ÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔCˆsÑCÔCÐCÕCÔCˆsÑCÔCÐCÐCÕCÔCÐ$ÑCÔCÕCÔC¨ÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐC°À!ÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC°ÑCÔCÐCÕCÔC°ÑCÔCÐCÐCÕCÔC°ÑCÔCÕCÔCÀ!ÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCr,   c                 ó¾  — ddl m}  |¦   «         }|                     d¦  «        }g }|j        }d}||k    }|}|r|j        }	d}
|	|
k    }|}|�s~t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd	|iz  }|                     |¦  «         |ržt          j        d|fd
|	|
f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |	¦  «        t          j
        |
¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}}
dS )z@apply_death_penalty subtracts tiered percentage with safe floor.r   r  Úp3r¿   )z0%(py4)s
{%(py4)s = %(py2)s.exp_lost
} >= %(py7)sr"  r#  r”   r•   )z3%(py13)s
{%(py13)s = %(py11)s.new_exp
} >= %(py16)sr&  r™   rš   r›   rœ   N)r'  r  Úapply_death_penaltyÚexp_lostr  rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   r+  s                     r)   Ú%test_f05_apply_death_penalty_contractz>TestTier1FeatureCoverage.test_f05_apply_death_penalty_contractè   sS  € àRÐRÐRÐRÐRÐRØ)Ð)Ñ+Ô+ˆØ×)Ò)¨$Ñ/Ô/ˆØ5Ð5ˆsŒ|Ð5˜qÐ5ˆ|˜qÒ Ð5Ð5Ð5Ð5Ð5 S¤[Ð5°AÐ5 [°AÒ%5Ð5Ð5Ð5Ð5Ñ5Õ5Ô5Ð5Ð5Ð5Ð5ˆ|˜qÐ5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5ˆsÑ5Ô5Ð5Õ5Ô5ˆsÑ5Ô5Ð5Ð5Õ5Ô5ˆ|Ñ5Ô5Õ5Ô5˜qÑ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Ð5×5Ò5Ð5Ñ5Ô5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5 [°AÐ5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5 SÑ5Ô5Ð5Õ5Ô5 SÑ5Ô5Ð5Ð5Õ5Ô5 [Ñ5Ô5Õ5Ô5°AÑ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Ð5×5Ò5Ð5Ñ5Ô5Ð5Õ5Ô5Ð5Ð5Ñ5Ô5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5r,   c                 ó,  — d„ t          ¦   «         D ¦   «         }|                     d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|j
        }d
}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}dS )zYTRIAL_10_GODHOOD_TRANSCENDENCE is registered with required_level=100 and 3 reward points.c                 ó   — i | ]
}|j         |“ŒS rL   )Útrial_index)r'   Úts     r)   ú
<dictcomp>zSTestTier1FeatureCoverage.test_f06_trial_10_catalog_registration.<locals>.<dictcomp>ò   s   € ÐCÐCÐC q�!”- ÐCÐCÐCr,   r­   NrÒ   )z%(py0)s is not %(py3)sÚtrial_10rË   rÌ   r†   ÚTRIAL_10_GODHOOD_TRANSCENDENCEr®   )z0%(py2)s
{%(py2)s = %(py0)s.trial_id
} == %(py5)s©rn   ro   r†   r‡   rˆ   r   )z6%(py2)s
{%(py2)s = %(py0)s.required_level
} == %(py5)sé   )z5%(py2)s
{%(py2)s = %(py0)s.reward_points
} == %(py5)s)r   Úgetrt   r‰   rr   rs   ru   rv   rw   rx   Útrial_idÚrequired_levelÚreward_points)
ry   Útrialsr>  rŠ   rz   rÏ   rŒ   r‹   r{   r�   s
             r)   Ú&test_f06_trial_10_catalog_registrationz?TestTier1FeatureCoverage.test_f06_trial_10_catalog_registrationð   sš  € àCÐCÕ,@Ñ,BÔ,BÐCÑCÔCˆØ—:’:˜b‘>”>ˆØ#Ð#ˆx˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆx˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#ØÔ ÐDÐ$DÐDÐ Ð$DÒDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ Ð$DÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDˆxÑDÔDÐDÕDÔDˆxÑDÔDÐDÐDÕDÔDÐ ÑDÔDÕDÔDÐ$DÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDØÔ&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Ð-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÔ%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*r,   c                 óT  — ddl m}  |¦   «         }|                     ddd¬¦  «        \  }}}g }d}||u }|}	|rd}
|
|v }|}	|	�sXt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         |r‹t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}
}dS )z9Character at level 99 is strictly rejected from Trial 10.r   ©ÚAscendancyEnginer   r­   r!   ©r:   FÚ100r$  ©z%(py2)s is %(py5)sÚsuccessrÖ   r×   rˆ   )Úin)z%(py10)s in %(py12)sÚmsg)r±   râ   ú%(py14)srã   rú   rû   N)Úserver.world.ascendancy_enginerJ  Úcomplete_trialrt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rJ  r`   rN  rP  Ú_rz   r‹   r{   r¡   rÝ   r¸   rŒ   r�   Ú@py_format13Ú@py_format15rß   rü   s                     r)   Ú&test_f06_trial_10_rejected_at_level_99z?TestTier1FeatureCoverage.test_f06_trial_10_rejected_at_level_99ù   s)  € àCÐCÐCÐCÐCÐCØ!Ð!Ñ#Ô#ˆØ ×/Ò/°°2ÀBÐ/ÑGÔG‰ˆ��aØ0Ð0˜%Ð0ˆw˜%ÐÐ0Ð0Ð0Ð0Ð0 EÐ0 E¨S LÐ0Ð0Ð0Ð0Ñ0Õ0Ô0Ð0Ð0Ð0Ð0ˆw˜%Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆwÑ0Ô0Ð0Õ0Ô0ˆwÑ0Ô0Ð0Ð0Õ0Ô0˜%Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0×0Ò0Ð0Ñ0Ô0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0 E¨SÐ0Ñ0Ô0Õ0Ô0 EÑ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¨SÑ0Ô0Ð0Õ0Ô0¨SÑ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0×0Ò0Ð0Ñ0Ô0Ð0Õ0Ô0Ð0Ð0Ñ0Ô0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r,   c                 ó®  — ddl m}  |¦   «         }t          dd¦  «        D ]}|                     d|d¬¦  «         Œ|                     ddd¬¦  «        \  }}}g }d}||u }	|	}
|	r
d	}||k    }|}
|
�sXt	          j        d
|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }| 
                    |¦  «         |	r‹t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }| 
                    |¦  «         t	          j        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
x}x}	x}x}}dS )z0Character at level 100 is accepted for Trial 10.r   rI  r   r­   rZ   r   rK  TrA  r$  rM  rN  rÖ   r×   rˆ   r®   )z%(py9)s == %(py12)sÚpts)r•   râ   rQ  rã   rú   rû   N)rR  rJ  r3   rS  rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rJ  r`   r<  rN  rT  rY  rz   r‹   r{   r¡   r¸   rê   rŒ   r�   rU  rV  rß   rü   s                      r)   Ú'test_f06_trial_10_accepted_at_level_100z@TestTier1FeatureCoverage.test_f06_trial_10_accepted_at_level_100   s]  € àCÐCÐCÐCÐCÐCØ!Ð!Ñ#Ô#ˆÝ�q˜"‘”ð 	:ð 	:ˆAØ×!Ò! ! Q°SÐ!Ñ9Ô9Ð9Ð9Ø ×/Ò/°°2ÀCÐ/ÑHÔH‰ˆ��CØ+Ð+˜$Ð+ˆw˜$ˆÐ+Ð+Ð+Ð+Ð+¨!Ð+ 3¨!¢8Ð+Ð+Ð+Ð+Ñ+Õ+Ô+Ð+Ð+Ð+Ð+ˆw˜$Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+˜$Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+×+Ò+Ð+Ñ+Ô+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ 3¨!Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ 3Ñ+Ô+Ð+Õ+Ô+ 3Ñ+Ô+Ð+Ð+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+×+Ò+Ð+Ñ+Ô+Ð+Õ+Ô+Ð+Ð+Ñ+Ô+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r,   c                 ó¨  — t          ddd¬¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )zEAscendancyAppliedEffects contains avatar_metamorphosis_active = True.Tçffffffö?r@   )Úavatar_metamorphosis_activeÚdamage_multiplierÚmax_resists_bonusr$  )zC%(py2)s
{%(py2)s = %(py0)s.avatar_metamorphosis_active
} is %(py5)sÚeffectsr@  r‡   rˆ   N)
r   r]  rt   r‰   rr   rs   ru   rv   rw   rx   )ry   r`  rz   r‹   r{   rŒ   r�   s          r)   Ú,test_f07_godhood_keystone_metamorphosis_flagzETestTier1FeatureCoverage.test_f07_godhood_keystone_metamorphosis_flag
  sÿ   € å*ÀtÐ_cÐw{Ð|Ñ|Ô|ˆØÔ2Ð:°dÐ:Ð2°dÐ:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð2°dÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆwÑ:Ô:Ð:Õ:Ô:ˆwÑ:Ô:Ð:Ð:Õ:Ô:Ð2Ñ:Ô:Õ:Ô:°dÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:r,   rc   c                 ó  — |\  }}}d|j         t          j        <   |                     |j        |j        dt          j        d¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }	d
d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}dS )zPCombatEngine resistance mitigation caps at 80% when max resist bonus is applied.ç333333ë?ç      Y@r!  ©Úcurrent_timestamp_msg      9@r®   )z4%(py2)s
{%(py2)s = %(py0)s.final_damage
} == %(py5)sr"  r@  r‡   rˆ   N)Úresistancesr   r^   Úcalculate_damageÚactor_idÚfinal_damagert   r‰   rr   rs   ru   rv   rw   rx   )ry   rc   r`   ra   rb   r"  rz   r‹   r{   rŒ   r�   s              r)   Ú1test_f07_godhood_combat_mitigation_80_percent_capzJTestTier1FeatureCoverage.test_f07_godhood_combat_mitigation_80_percent_cap  s.  € à%0Ñ"ˆ�˜(Ø15ˆÔ�\Ô-Ñ.à×%Ò% hÔ&7¸Ô9JÈEÕS_ÔScÐz~Ð%ÑÔˆØÔÐ' 4Ð'Ð 4Ò'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r,   c                 ó   — d}t          d¦  «        }t          j        ||z  ¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}}d
S )z0Zero death rate guarantees completion in season.éà-r!   r   rÿ   )z%(py0)s <= %(py3)sÚdays_neededrË   rÌ   r†   N)r%   r/   Úceilrt   r‰   rr   rs   ru   rv   rw   rx   )ry   Ú	daily_exprÁ   rn  rŠ   rz   rÏ   rŒ   s           r)   Ú2test_f08_simulation_zero_death_100_percent_successzKTestTier1FeatureCoverage.test_f08_simulation_zero_death_100_percent_success  sò   € ð  ˆ	Ý! "Ñ%Ô%ˆÝ”i ¨9Ñ 4Ñ5Ô5ˆØ Ð ˆ{˜bÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ{˜bÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Ð Õ Ô ˆ{Ñ Ô Ð Ð Õ Ô ˜bÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð r,   c                 ó†  — d}t          d¦  «        }|dz  }||z  }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )z8At 25% death penalty, 1 death wipes ~8 days of progress.rm  r!   rK   g      @r¿   )z%(py0)s >= %(py3)sÚ	lost_daysrË   rÌ   r†   N©	r%   rt   r‰   rr   rs   ru   rv   rw   rx   )	ry   rp  rÁ   Úloss_per_deathrs  rŠ   rz   rÏ   rŒ   s	            r)   Ú8test_f08_simulation_high_death_rate_catastrophic_setbackzQTestTier1FeatureCoverage.test_f08_simulation_high_death_rate_catastrophic_setback   sï   € àˆ	Ý! "Ñ%Ô%ˆØ! D™ˆØ" YÑ.ˆ	ØÐˆy˜CÒÐÐÐÕÔÐÐÐÐˆy˜CÐÑÔÐÕÔÑÔÐÐÕÔˆyÑÔÐÕÔˆyÑÔÐÐÕÔ˜CÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   ©r   N))Ú__name__Ú
__module__Ú__qualname__Ú__doc__r}   rŽ   rª   r¼   rÇ   rO   Ú
ConnectionrÐ   rà   rå   rî   rð   rõ   rý   r	  r  r  ÚpytestÚmarkÚparametrizer.   Úfloatr  r  r-  r3  r8  rG  rW  rZ  ra  r   r	   r
   rk  rq  rv  rL   r,   r)   re   re   l   s  € € € € € ØPÐPðMð Mð Mð Mð
5ð 5ð 5ð 5ð3ð 3ð 3ð 3ð
ð ð ð ð;ð ;ð ;ð ;ðÈÔHZð Ð_cð ð ð ð ð
/ÐX_ÔXjð /Ðosð /ð /ð /ð /ð
?È7ÔK]ð ?Ðbfð ?ð ?ð ?ð ?ð
=ÐSZÔSeð =Ðjnð =ð =ð =ð =ð
;ÐPWÔPbð ;Ðgkð ;ð ;ð ;ð ;ð=ð =ð =ð =ð1ð 1ð 1ð 1ð
@ð @ð @ð @ð
ð ð ð ð
ð ð ð ð „[×ÒÐ3ð 6ð 6ð 6ñ ô ðA¸#ð AÈuð AÐY]ð Að Að Añô ðAðð ð ð ðLð Lð Lð LðDð Dð Dð Dð6ð 6ð 6ð 6ð+ð +ð +ð +ð1ð 1ð 1ð 1ð,ð ,ð ,ð ,ð;ð ;ð ;ð ;ð
(ÈUÐS_ÐalÐnyÐSyÔMzð (ð  @Dð (ð (ð (ð (ð!ð !ð !ð !ð ð  ð  ð  ð  ð  r,   re   c                   ó:   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„Zd	d„ZdS )
ÚTestTier2BoundaryAndCornerCasesz Tier 2: Boundary & Corner Cases.r   Nc                 óÚ  — d}t          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}}d	S )
zCLevel 1 character starts with 0 EXP and delta is calc_delta_exp(1).r   iX  r®   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr%   ©rn   ro   rp   rˆ   úassert %(py9)sr•   Nrt  ©ry   rz   r{   r¶   rŸ   r�   r¥   s          r)   Ú(test_b01_level_boundary_level_1_zero_expzHTestTier2BoundaryAndCornerCases.test_b01_level_boundary_level_1_zero_exp.  s  € àÐ'�~˜aÑ Ô Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�~Ñ'Ô'Ð'Õ'Ô'�~Ñ'Ô'Ð'Ð'Õ'Ô'˜aÑ'Ô'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r,   c                 óÚ  — d}t          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}}d	S )
z,Level 100 has 0 delta exp (max cap reached).r   r   r®   r„  r%   r…  r†  r•   Nrt  r‡  s          r)   Ú,test_b02_level_boundary_level_100_zero_deltazLTestTier2BoundaryAndCornerCases.test_b02_level_boundary_level_100_zero_delta2  s  € à!Ð'�~˜cÑ"Ô"Ð' aÐ'Ð" aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð" aÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�~Ñ'Ô'Ð'Õ'Ô'�~Ñ'Ô'Ð'Ð'Õ'Ô'˜cÑ'Ô'Õ'Ô'Ð"Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r,   c                 ó  — d}d}t          ||¦  «        }d}||k    }|sÚt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}}d}d}t          ||¦  «        }d}||k     }|sÚt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}}d
S )z5Gap 5 is exactly 1.0; Gap 6 begins exponential decay.r  r   r>   r®   ©z9%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
} == %(py9)srE   ©rn   ro   rp   r“   r•   úassert %(py11)sr–   Nr÷   r�   ©z8%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
} < %(py9)sr  ©ry   rz   r{   rŸ   r·   r    r¥   rô   s           r)   Ú(test_b03_level_gap_boundary_exact_5_vs_6zHTestTier2BoundaryAndCornerCases.test_b03_level_gap_boundary_exact_5_vs_66  sB  € à$&Ð2¨Ð2Õ# B¨Ñ+Ô+Ð2¨sÐ2Ð+¨sÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð+¨sÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Ð2Õ2Ô2 BÑ2Ô2Õ2Ô2¨Ñ2Ô2Õ2Ô2Ð+Ñ2Ô2Õ2Ô2¨sÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø$&Ð1¨Ð1Õ# B¨Ñ+Ô+Ð1¨cÐ1Ð+¨cÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð+¨cÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1Õ#Ñ1Ô1Ð1Õ1Ô1Õ#Ñ1Ô1Ð1Ð1Õ1Ô1 BÑ1Ô1Õ1Ô1¨Ñ1Ô1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1¨cÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r,   c                 ó<  — g }d}t          |¦  «        }d}||k    }|}|rd}t          |¦  «        }d}	||	k    }
|
}|�s¸t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }|                     |¦  «         |r»t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}
}	g }d}t          |¦  «        }d}||k    }|}|rd}t          |¦  «        }d}	||	k    }
|
}|�s¸t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }|                     |¦  «         |r»t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}
}	g }d}t          |¦  «        }d}||k    }|}|rd}t          |¦  «        }d}	||	k    }
|
}|�s¸t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }|                     |¦  «         |r»t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}
}	dS )zELevel 60 is 0% vs Level 61 is 5%; Level 89 is 10% vs Level 90 is 15%.r   rG   r   r@   r®   )z0%(py6)s
{%(py6)s = %(py2)s(%(py4)s)
} == %(py9)srM   )ro   rp   r“   r•   z%(py11)sr–   )z5%(py17)s
{%(py17)s = %(py13)s(%(py15)s)
} == %(py20)s)r—   r˜   rû   r³   z%(py22)sÚpy22r   zassert %(py25)sÚpy25NrH   rI   r   rJ   r    r!   rK   )rM   rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   )ry   rz   r{   rŸ   r·   r    r¡   r¢   r£   r  rë   r¥   rô   r»   rì   Ú@py_format24Ú@py_format26s                    r)   Ú)test_b04_death_penalty_bracket_boundarieszITestTier2BoundaryAndCornerCases.test_b04_death_penalty_bracket_boundaries;  sC  € à[Ð[¨Ð[Õ'¨Ñ+Ô+Ð[¨sÐ[Ð+¨sÒ2Ð[Ð[Ð[Ð[Ð[ÐPRÐ[Õ7OÐPRÑ7SÔ7SÐ[ÐW[Ð[Ð7SÐW[Ò7[Ð[Ð[Ð[Ð[Ñ[Õ[Ô[Ð[Ð[Ð[Ð[Ð+¨sÐ[Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[Õ'Ñ[Ô[Ð[Õ[Ô[Õ'Ñ[Ô[Ð[Ð[Õ[Ô[¨Ñ[Ô[Õ[Ô[Ð+Ñ[Ô[Õ[Ô[¨sÑ[Ô[Ð[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[×[Ò[Ð[Ñ[Ô[Ð[Ð[Ð[Õ[Ô[Ð[Ð[Ð[Ð[Ð7SÐW[Ð[Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[Õ7OÑ[Ô[Ð[Õ[Ô[Õ7OÑ[Ô[Ð[Ð[Õ[Ô[ÐPRÑ[Ô[Õ[Ô[Ð7SÑ[Ô[Õ[Ô[ÐW[Ñ[Ô[Ð[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[×[Ò[Ð[Ñ[Ô[Ð[Õ[Ô[Ð[Ð[Ñ[Ô[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ø\Ð\¨Ð\Õ'¨Ñ+Ô+Ð\¨tÐ\Ð+¨tÒ3Ð\Ð\Ð\Ð\Ð\ÐQSÐ\Õ8PÐQSÑ8TÔ8TÐ\ÐX\Ð\Ð8TÐX\Ò8\Ð\Ð\Ð\Ð\Ñ\Õ\Ô\Ð\Ð\Ð\Ð\Ð+¨tÐ\Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\Õ'Ñ\Ô\Ð\Õ\Ô\Õ'Ñ\Ô\Ð\Ð\Õ\Ô\¨Ñ\Ô\Õ\Ô\Ð+Ñ\Ô\Õ\Ô\¨tÑ\Ô\Ð\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Ð\×\Ò\Ð\Ñ\Ô\Ð\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\Ð8TÐX\Ð\Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\Õ8PÑ\Ô\Ð\Õ\Ô\Õ8PÑ\Ô\Ð\Ð\Õ\Ô\ÐQSÑ\Ô\Õ\Ô\Ð8TÑ\Ô\Õ\Ô\ÐX\Ñ\Ô\Ð\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Ð\×\Ò\Ð\Ñ\Ô\Ð\Õ\Ô\Ð\Ð\Ñ\Ô\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø\Ð\¨Ð\Õ'¨Ñ+Ô+Ð\¨tÐ\Ð+¨tÒ3Ð\Ð\Ð\Ð\Ð\ÐQSÐ\Õ8PÐQSÑ8TÔ8TÐ\ÐX\Ð\Ð8TÐX\Ò8\Ð\Ð\Ð\Ð\Ñ\Õ\Ô\Ð\Ð\Ð\Ð\Ð+¨tÐ\Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\Õ'Ñ\Ô\Ð\Õ\Ô\Õ'Ñ\Ô\Ð\Ð\Õ\Ô\¨Ñ\Ô\Õ\Ô\Ð+Ñ\Ô\Õ\Ô\¨tÑ\Ô\Ð\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Ð\×\Ò\Ð\Ñ\Ô\Ð\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\Ð8TÐX\Ð\Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\Õ8PÑ\Ô\Ð\Õ\Ô\Õ8PÑ\Ô\Ð\Ð\Õ\Ô\ÐQSÑ\Ô\Õ\Ô\Ð8TÑ\Ô\Õ\Ô\ÐX\Ñ\Ô\Ð\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Ð\×\Ò\Ð\Ñ\Ô\Ð\Õ\Ô\Ð\Ð\Ñ\Ô\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\r,   c                 óÜ  — t          d¦  «        }t          |dz  ¦  «        }t          |dz  ¦  «        }t          d||z
  ¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}dS )zFCharacter at 10% progress losing 25% clamps at 0% without de-leveling.r!   rI   rK   r   r®   rÉ   r  rË   rÌ   r†   N)r%   r.   rB   rt   r‰   rr   rs   ru   rv   rw   rx   )	ry   r  ÚcurrÚpenaltyr  rŠ   rz   rÏ   rŒ   s	            r)   Ú6test_b05_death_penalty_clamped_from_10_percent_to_zerozVTestTier2BoundaryAndCornerCases.test_b05_death_penalty_clamped_from_10_percent_to_zeroA  s  € å˜rÑ"Ô"ˆÝ�5˜4‘<Ñ Ô ˆÝ�e˜d‘lÑ#Ô#ˆÝ�a˜ ™Ñ(Ô(ˆØÐˆw˜!Š|ÐÐÐÕÔÐÐÐÐˆw˜!ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜!ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   rw  )	rx  ry  rz  r{  rˆ  rŠ  r‘  r—  r›  rL   r,   r)   r‚  r‚  +  s‚   € € € € € Ø*Ð*ð(ð (ð (ð (ð(ð (ð (ð (ð2ð 2ð 2ð 2ð
]ð ]ð ]ð ]ðð ð ð ð ð r,   r‚  c                   ó^   — e Zd ZdZdd„Zdeeeef         ddfd„Zdeeeef         ddfd„Z	dS )	Ú!TestTier3CrossFeatureCombinationsz;Tier 3: Cross-Feature Combinations (Pairwise interactions).r   Nc                 ó  — d}d}t          ||¦  «        }d}||k    }|sÚt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}}d}d}t          ||¦  «        }d}||k     }|sÚt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}}d
S )zAAdvancing level shifts level gap from full 100% to decayed yield.r  r   r>   r®   rŒ  rE   r�  rŽ  r–   Nr÷   rø   r�   r�  r  r�  s           r)   Ú*test_c01_level_up_shifts_level_gap_penaltyzLTestTier3CrossFeatureCombinations.test_c01_level_up_shifts_level_gap_penaltyO  sD  € ð %'Ð2¨Ð2Õ# B¨Ñ+Ô+Ð2¨sÐ2Ð+¨sÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð+¨sÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Ð2Õ2Ô2 BÑ2Ô2Õ2Ô2¨Ñ2Ô2Õ2Ô2Ð+Ñ2Ô2Õ2Ô2¨sÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2à$&Ð2¨Ð2Õ# B¨Ñ+Ô+Ð2¨dÐ2Ð+¨dÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð+¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Õ2Ô2Õ#Ñ2Ô2Ð2Ð2Õ2Ô2 BÑ2Ô2Õ2Ô2¨Ñ2Ô2Õ2Ô2Ð+Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r,   rc   c                 óR  — |\  }}}d|_         |                     |j        |j        dt          j        d¬¦  «        }g }|j        }d}||k    }	|	}
|	r|j        }d}||k    }|}
|
�s~t          j        d|	fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }|                     |¦  «         |	ržt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}	x}x}x}}t#          d¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )zCCombat fatal blow reduces player HP to 0 and invokes death penalty.g     ˆ³@r!  re  rG   r[   r®   )z2%(py4)s
{%(py4)s = %(py2)s.current_hp
} == %(py7)srb   r#  r”   r•   r¿   )z8%(py13)s
{%(py13)s = %(py11)s.final_damage
} >= %(py16)sr"  r&  r™   rš   r   r›   rœ   Né\   rJ   rÉ   ÚratiorË   rÌ   r†   )rY   rh  ri  r   r^   r\   rj  rt   r‰   rr   rs   ru   rv   r�   rž   rw   rx   rM   )ry   rc   r`   ra   rb   r"  rz   r{   r¶   rŸ   r¡   r¤   r¹   r¢   r�   r¥   r¦   r§   r¨   r©   r¢  rŠ   rÏ   rŒ   s                           r)   Ú5test_c02_combat_lethal_damage_triggers_tiered_penaltyzWTestTier3CrossFeatureCombinations.test_c02_combat_lethal_damage_triggers_tiered_penaltyV  s9  € à%0Ñ"ˆ�˜(Ø%ˆÔØ×%Ò% hÔ&7¸Ô9JÈFÕT`ÔTdÐ{Ð%ñ  Aô  AˆØHÐHˆxÔ"ÐH cÐHÐ" cÒ)ÐHÐHÐHÐHÐH¨cÔ.>ÐHÀ&ÐHÐ.>À&Ò.HÐHÐHÐHÐHÑHÕHÔHÐHÐHÐHÐHÐ" cÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔHˆxÑHÔHÐHÕHÔHˆxÑHÔHÐHÐHÕHÔHÐ"ÑHÔHÕHÔH cÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÐHÐHÕHÔHÐHÐHÐHÐHÐ.>À&ÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH¨cÑHÔHÐHÕHÔH¨cÑHÔHÐHÐHÕHÔHÐ.>ÑHÔHÕHÔHÀ&ÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÕHÔHÐHÐHÑHÔHÐHÑHÐHÐHÐHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHå(¨Ñ,Ô,ˆØÐˆu˜Š}ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr,   c                 óþ  — |\  }}}d}|dz  }|                      |j        |j        |t          j        d¬¦  «        }|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |	¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	dS )zEMetamorphosis +40% More Damage scales raw damage from 100.0 to 140.0.rd  r\  r!  re  g     €a@r®   )z2%(py2)s
{%(py2)s = %(py0)s.raw_damage
} == %(py5)sr"  r@  r‡   rˆ   N)rh  ri  r   r^   Ú
raw_damagert   r‰   rr   rs   ru   rv   rw   rx   )ry   rc   r`   ra   rb   Úbase_dmgÚboosted_dmgr"  rz   r‹   r{   rŒ   r�   s                r)   Ú7test_c03_metamorphosis_power_spike_damage_amplificationzYTestTier3CrossFeatureCombinations.test_c03_metamorphosis_power_spike_damage_amplification`  s2  € à%0Ñ"ˆ�˜(ØˆØ ‘oˆØ×%Ò% hÔ&7¸Ô9JÈKÕYeÔYið  AEÐ%ñ  Fô  FˆØŒ~Ð& Ð&ˆ~ Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r,   rw  )
rx  ry  rz  r{  rŸ  r   r	   r
   r£  r¨  rL   r,   r)   r�  r�  L  s    € € € € € ØEÐEð3ð 3ð 3ð 3ðÐQVÐWcÐepÐr}ÐW}ÔQ~ð ð  DHð ð ð ð ð'ÐSXÐYeÐgrÐtÐYô  TAð 'ð  FJð 'ð 'ð 'ð 'ð 'ð 'r,   r�  c                   ó*   — e Zd ZdZdd„Zdd„Zdd„ZdS )ÚTestTier4RealWorldScenariosz)Tier 4: Real-World Application Scenarios.r   Nc                 ó  — d}d}d}|dk     r&t          |¦  «        }||z  }||z  }|dz  }d}|dk     °&d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d„ t          dd¦  «        D ¦   «         }	t          |	¦  «        }
||
k    }|sòt          j        d|fd||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}	}
d
S )z=Simulates full progression journey from Level 1 to Level 100.r   r   r   r®   rÉ   Úcurrent_levelrË   rÌ   r†   Nc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r#   r$   r&   s     r)   r*   z[TestTier4RealWorldScenarios.test_r01_full_progression_journey_simulation.<locals>.<genexpr>z  s*   è è € Ð&PÐ&P¸Q¥~°aÑ'8Ô'8Ð&PÐ&PÐ&PÐ&PÐ&PÐ&Pr,   )z0%(py0)s == %(py6)s
{%(py6)s = %(py2)s(%(py4)s)
}Útotal_exp_earnedr2   )rn   ro   rp   r“   zassert %(py8)srÄ   )r%   rt   r‰   rr   rs   ru   rv   rw   rx   r3   r2   )ry   r¬  Úcurrent_expr®  r  rŠ   rz   rÏ   rŒ   r{   rŸ   Ú@py_format7rÅ   s                r)   Ú,test_r01_full_progression_journey_simulationzHTestTier4RealWorldScenarios.test_r01_full_progression_journey_simulationn  sa  € àˆØˆØÐØ˜cÒ!Ð!Ý" =Ñ1Ô1ˆEØ˜5Ñ ˆKØ Ñ%ÐØ˜QÑˆMØˆKð ˜cÒ!Ð!ð !$Ð#ˆ} Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ} Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆ}Ñ#Ô#Ð#Õ#Ô#ˆ}Ñ#Ô#Ð#Ð#Õ#Ô# Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ø&PÐ&PÅ%ÈÈ3Á-Ä-Ð&PÑ&PÔ&PÐP¥3Ð&PÑ#PÔ#PÐPÐÐ#PÒPÐPÐPÐPÕPÔPÐPÐPÐPÐPÐÐ#PÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPÐÑPÔPÐPÕPÔPÐÑPÔPÐPÐPÐPÕPÔPÑPÔPÐPÐPÕPÔP¥3ÑPÔPÐPÕPÔP¥3ÑPÔPÐPÐPÕPÔPÐ&PÑPÔPÕPÔPÐ#PÑPÔPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPr,   c                 óÎ  — t          d¦  «        }t          |dz  ¦  «        }t          |dz  ¦  «        }g }t          d¦  «        D ]*}t          d||z
  ¦  «        }|                     |¦  «         Œ+|d         }d}||z  }t          |¦  «        }	|	|z
  }
||
k    }|�sCt          j        d|fd||
f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |	¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	}
|d         }d}||z  }t          |¦  «        }	d}||z  }|	|z
  }||k    }|�sVt          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |	¦  «        t          j        |¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}x}}|d         }d}||z  }t          |¦  «        }	d}||z  }|	|z
  }||k    }|�sVt          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |	¦  «        t          j        |¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||z  }t          |¦  «        }	||	z
  }t          |¦  «        }
d}|
|k    }|�sst          j        d|fd|
|f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }d d!|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}x}
x}}dS )"zPSimulates 5 consecutive deaths at Level 99 losing 25% each time with safe floor.r!   rc  rK   r=   r   r®   )zI%(py1)s == (%(py9)s
{%(py9)s = %(py3)s((%(py4)s * %(py6)s))
} - %(py10)s)r.   r  ru  )r…   rÂ   rp   r“   r•   r±   ró   r—   Nr   rZ   )zV%(py1)s == (%(py9)s
{%(py9)s = %(py3)s((%(py4)s * %(py6)s))
} - (%(py11)s * %(py12)s)))r…   rÂ   rp   r“   r•   r–   râ   zassert %(py16)sr²   rA  )z%(py1)s == %(py4)s)r…   rp   zassert %(py6)sr“   é   r-   rÿ   )zi%(py12)s
{%(py12)s = %(py0)s((%(py2)s - %(py9)s
{%(py9)s = %(py3)s((%(py4)s * %(py6)s))
}))
} <= %(py15)srA   )rn   ro   rÂ   rp   r“   r•   râ   r˜   rú   rû   )r%   r.   r3   rB   r�   rt   r‰   rv   rr   rs   ru   rw   rx   rA   )ry   r  r¯  ru  Úprogression_tracerT  r¡   rŸ   r    r·   r¸   rŠ   rô   rÞ   rê   rä   r¢   rV  r¦   r{   r|   r°  rz   rß   rü   s                            r)   Ú*test_r02_hardcore_death_streak_at_level_99zFTestTier4RealWorldScenarios.test_r02_hardcore_death_streak_at_level_99|  sÊ  € å˜rÑ"Ô"ˆÝ˜% $™,Ñ'Ô'ˆÝ˜U T™\Ñ*Ô*ˆØÐÝ�q‘”ð 	2ð 	2ˆAÝ˜a ¨~Ñ!=Ñ>Ô>ˆKØ×$Ò$ [Ñ1Ô1Ð1Ð1à  Ô#ÐI°4ÐI¨5°4©<ÐI¥s¨<Ñ'8Ô'8ÐIÐ'8¸>Ñ'IÐIÐ#Ð'IÒIÐIÐIÑIÕIÔIÐIÐIÐIÐIÐ#Ð'IÐIÑIÔIÕIÔIÐ#ÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI¥sÑIÔIÐIÕIÔI¥sÑIÔIÐIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔI¨5ÑIÔIÐIÕIÔI¨5ÑIÔIÐIÐIÕIÔI°4ÑIÔIÕIÔIÐ'8ÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI¸>ÑIÔIÐIÕIÔI¸>ÑIÔIÐIÐIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIØ  Ô#ÐM°4ÐM¨5°4©<ÐM¥s¨<Ñ'8Ô'8ÐM¸1ÐM¸1¸~Ñ;MÐMÐ'8Ð;MÑ'MÐMÐ#Ð'MÒMÐMÐMÑMÕMÔMÐMÐMÐMÐMÐ#Ð'MÐMÑMÔMÕMÔMÐ#ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM¥sÑMÔMÐMÕMÔM¥sÑMÔMÐMÐMÐMÕMÔMÑMÔMÐMÐMÕMÔM¨5ÑMÔMÐMÕMÔM¨5ÑMÔMÐMÐMÕMÔM°4ÑMÔMÕMÔMÐ'8ÑMÔMÕMÔM¸1ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM¸~ÑMÔMÐMÕMÔM¸~ÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMØ  Ô#ÐM°4ÐM¨5°4©<ÐM¥s¨<Ñ'8Ô'8ÐM¸1ÐM¸1¸~Ñ;MÐMÐ'8Ð;MÑ'MÐMÐ#Ð'MÒMÐMÐMÑMÕMÔMÐMÐMÐMÐMÐ#Ð'MÐMÑMÔMÕMÔMÐ#ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM¥sÑMÔMÐMÕMÔM¥sÑMÔMÐMÐMÐMÕMÔMÑMÔMÐMÐMÕMÔM¨5ÑMÔMÐMÕMÔM¨5ÑMÔMÐMÐMÕMÔM°4ÑMÔMÕMÔMÐ'8ÑMÔMÕMÔM¸1ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM¸~ÑMÔMÐMÕMÔM¸~ÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMØ  Ô#Ð( qÐ(Ð# qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð# qÐ(Ñ(Ô(Õ(Ô(Ð#Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø  Ô#Ð( qÐ(Ð# qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð# qÐ(Ñ(Ô(Õ(Ô(Ð#Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø$ QÔ'ÐA°dÐA¨e°d©lÐA­#¨lÑ*;Ô*;ÐAÐ'Ð*;Ñ;ÐA�sÐ;Ñ<Ô<ÐAÀÐAÐ<ÀÒAÐAÐAÑAÕAÔAÐAÐAÐAÐAÐ<ÀÐAÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA�sÑAÔAÐAÕAÔA�sÑAÔAÐAÐAÕAÔAÐ'ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA­#ÑAÔAÐAÕAÔA­#ÑAÔAÐAÐAÐAÕAÔAÑAÔAÐAÐAÕAÔA¨eÑAÔAÐAÕAÔA¨eÑAÔAÐAÐAÕAÔA°dÑAÔAÕAÔAÐ*;ÑAÔAÕAÔAÐ<ÑAÔAÕAÔAÀÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAr,   c                 óp  — t          dd¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d
S )z8Level 95 bot farming level 20 mobs receives only 1% EXP.r´   r   r?   r®   rÉ   rù   rË   rÌ   r†   Nr  r  s         r)   Ú*test_r03_anti_bot_farm_deterrence_scenariozFTestTier4RealWorldScenarios.test_r03_anti_bot_farm_deterrence_scenario�  r  r,   rw  )rx  ry  rz  r{  r±  rµ  r·  rL   r,   r)   rª  rª  k  s^   € € € € € Ø3Ð3ðQð Qð Qð QðBð Bð Bð Bð"ð ð ð ð ð r,   rª  )3r{  Úbuiltinsrr   Ú_pytest.assertion.rewriteÚ	assertionÚrewritert   r/   ÚosrO   ÚsysÚpathlibr   Útypingr   r   r   r   r   r}  ÚpathÚabspathÚjoinÚdirnameÚ__file__Ú
SERVER_DIRÚinsertÚserver.world.combat_enginer	   r
   Úserver.world.martial_matrixr   Úserver.world.ascendancy_catalogr   r   Úserver.world.ascendancy_typesr   r   r.   r%   r€  rE   rM   Úfixturer|  rW   rc   re   r‚  r�  rª  rL   r,   r)   ú<module>rÌ     sÄ  ðð	ð 	ð € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø €€€àŒW�_Š_˜RœWŸ\š\¨"¬'¯/ª/¸(Ñ*CÔ*CÀ^ÑTÔTÑUÔU€
Ø�S”XÐÐØ„H‡O‚O�A�zÑ"Ô"Ð"à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ SÐ SÐ SÐ SÐ SÐ SÐ SÐ Sð˜#ð  #ð ð ð ð ð6	* sð 	*¸3ð 	*À5ð 	*ð 	*ð 	*ð 	*ð Cð ¨Eð ð ð ð ð" „ð˜Ô*ð ð ð ñ „ðð „ð&�U˜<¨°kÐAÔBð &ð &ð &ñ „ð&ðz ð z ð z ð z ð z ñ z ô z ð z ð~ð ð ð ð ñ ô ð ðB'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð>%ð %ð %ð %ð %ñ %ô %ð %ð %ð %r,   