§
    ÎÐ½jiS  ã                  óB  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZddlmZmZmZ ddlmZ ddlmZ ddlmZ ej        dd„¦   «         Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )zÞ
Unit Test Suite for FreeExile Level Progression Service & Death Penalty Engine.
Verifies LevelProgressionService, Piecewise EXP Curve, Level Gap Decay,
and Tiered Death Penalty Safe Floor adhering to PoE2 2026 Standards.
é    )ÚannotationsN)Ú	Generator)ÚCombatActorÚCombatEngineÚDamageEventResult©ÚLevelProgressionService)ÚDeathPenaltyResult)ÚFiveElementsÚreturnú.Generator[LevelProgressionService, None, None]c               #  ó.   K  — t          ¦   «         } | V — dS )z)Provides a fresh LevelProgressionService.Nr   )Úservices    úBC:\Projects\FreeExile\tests\unit\test_level_progression_service.pyÚprogression_servicer      s    è è € õ &Ñ'Ô'€GØ
€M€M€M€M€Mó    c                  óB   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Z	dS )ÚTestLevelGapDecayFormulazJVerifies exponential decay formula: eta(Delta) = exp(-0.60 * (Delta - 5)).r   r	   r   ÚNonec           	     ó&  — |j         }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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d	x}x}x}x}x}}d	S )
z;Player level == Monster level yields 100% (1.0) multiplier.éP   ç      ð?©ú==)zn%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.calculate_level_gap_multiplier
}(%(py4)s, %(py6)s)
} == %(py11)sr   ©Úpy0Úpy2Úpy4Úpy6Úpy8Úpy11úassert %(py13)sÚpy13N©	Úcalculate_level_gap_multiplierÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)
Úselfr   Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_assert7Ú@py_assert10Ú@py_assert9Ú@py_format12Ú@py_format14s
             r   Ú#test_level_gap_exact_match_full_expz<TestLevelGapDecayFormula.test_level_gap_exact_match_full_exp   sG  € ð #ÔAÐPÀ"ÐPÀbÐPÐAÐAÀ"ÀbÑIÔIÐPÈSÐPÐIÈSÒPÐPÐPÐPÕPÔPÐPÐPÐPÐPÐIÈSÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPÐ"ÑPÔPÐPÕPÔPÐ"ÑPÔPÐPÐPÕPÔPÐAÑPÔPÕPÔPÀ"ÑPÔPÕPÔPÀbÑPÔPÕPÔPÐIÑPÔPÕPÔPÈSÑ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d¦  «        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t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}ŒÁdS )z8Level differences within [-5, +5] receive 100% full EXP.éûÿÿÿé   r   r   r   ©z%(py0)s == %(py3)sÚmult©r   Úpy3úassert %(py5)sÚpy5N)
Úranger%   r&   r'   r(   r)   r*   r+   r,   r-   )r.   r   Údiffr<   Ú@py_assert2r/   Ú@py_format4Ú@py_format6s           r   Ú)test_level_gap_safe_range_within_5_levelszBTestLevelGapDecayFormula.test_level_gap_safe_range_within_5_levels"   s  € õ ˜"˜a‘L”Lð 	ð 	ˆDØ&×EÒEÀbÈ"ÈtÉ)ÑTÔTˆDØÐ�4˜3’;ÐÐÐÕÔÐÐÐÐ�4˜3ÐÑÔÐÕÔÑÔÐÐÕÔ�4ÑÔÐÕÔ�4ÑÔÐÐÕÔ˜3ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐð	ð 	r   c                ó®  — |                      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 )zAGap of 6 levels triggers exponential decay: exp(-0.60) ~= 0.5488.éV   r   g333333ã?ç-Cëâ6?©ú<©zv%(py12)s
{%(py12)s = %(py0)s((%(py1)s - %(py9)s
{%(py9)s = %(py4)s
{%(py4)s = %(py2)s.exp
}(-%(py6)s)
}))
} < %(py15)sÚabsr<   Úmath©r   Úpy1r   r   r   Úpy9Úpy12Úpy15úassert %(py17)sÚpy17N)r%   rN   ÚexprM   r&   r'   r(   r)   r*   r+   r,   r-   )r.   r   r<   r0   r1   r2   Ú@py_assert8r3   Ú@py_assert11Ú@py_assert14Ú@py_assert13Ú@py_format16Ú@py_format18s                r   Ú&test_level_gap_decay_boundary_6_levelsz?TestLevelGapDecayFormula.test_level_gap_decay_boundary_6_levels*   sì  € ð #×AÒAÀ"ÀbÑIÔIˆÝœ(Ð1 DÐ1 D 5Ð1˜(˜( 5™/œ/Ð1�4˜/Ñ)Ð1�sÐ)Ñ*Ô*Ð1¨TÐ1Ð*¨TÒ1Ð1Ð1Ñ1Õ1Ô1Ð1Ð1Ð1Ð1Ð*¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�sÑ1Ô1Ð1Õ1Ô1�sÑ1Ô1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�4Ñ1Ô1Ð1Õ1Ô1�4Ñ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 DÑ1Ô1Õ1Ô1˜/Ñ1Ô1Õ1Ô1Ð*Ñ1Ô1Õ1Ô1¨TÑ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Ð1Ð1Ð1Ð1Ð1Ð1Ð1r   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}}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 )zHMonster 10 levels lower yields <= 5% EXP (exp(-3.0) ~= 0.04978 <= 0.05).éZ   r   çš™™™™™©?)ú<=)z%(py0)s <= %(py3)sr<   r=   r?   r@   Ng      @rI   rJ   rL   rM   rN   rO   rT   rU   )r%   r&   r'   r(   r)   r*   r+   r,   r-   rN   rV   rM   )r.   r   r<   rC   r/   rD   rE   r0   r1   r2   rW   r3   rX   rY   rZ   r[   r\   s                    r   Ú7test_level_gap_decay_10_levels_lower_under_five_percentzPTestLevelGapDecayFormula.test_level_gap_decay_10_levels_lower_under_five_percent1   s­  € ð #×AÒAÀ"ÀbÑIÔIˆØÐˆt�tŠ|ÐÐÐÕÔÐÐÐÐˆt�tÐÑÔÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÕÔ�tÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÝœ(Ð0 CÐ0 C 4Ð0˜(˜( 4™.œ.Ð0�4˜.Ñ(Ð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�4Ñ0Ô0Ð0Õ0Ô0�4Ñ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 CÑ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                ó|  — |                      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 )z5Extreme level gap clamps to absolute floor 0.01 (1%).é_   é   g{®Gáz„?r   r;   r<   r=   r?   r@   Nr$   )r.   r   r<   rC   r/   rD   rE   s          r   Ú&test_level_gap_extreme_overlevel_clampz?TestLevelGapDecayFormula.test_level_gap_extreme_overlevel_clamp9   sà   € ð #×AÒAÀ"ÀbÑIÔIˆØÐˆt�tŠ|ÐÐÐÕÔÐÐÐÐˆt�tÐÑÔÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÕÔ�tÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr   c                óÂ  — |                      dd¦  «        }d}||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t          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zDUnderleveled player decay prevents power-leveling (clamped to 0.05).re   r   r`   çš™™™™™¹?)ra   ra   )z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sr<   )rP   r   r   úassert %(py8)sr    N)	r%   r&   r'   r+   r(   r)   r*   r,   r-   )	r.   r   r<   Ú@py_assert0rC   r1   r0   Ú@py_format7Ú@py_format9s	            r   Ú)test_level_gap_underleveled_anti_boostingzBTestLevelGapDecayFormula.test_level_gap_underleveled_anti_boosting@   s  € ð #×AÒAÀ"ÀbÑIÔIˆØÐ#ˆt�tÒ#Ð#˜tÐ#�t˜tÒ#Ð#Ð#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#Ð#ˆt�t˜tÐ#Ñ#Ô#Õ#Ô#ˆtÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�tÑ#Ô#Ð#Õ#Ô#�tÑ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r   N©r   r	   r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   rF   r]   rb   rf   rm   © r   r   r   r      s–   € € € € € ØTÐTðQð Qð Qð Qðð ð ð ð2ð 2ð 2ð 2ð1ð 1ð 1ð 1ðð ð ð ð$ð $ð $ð $ð $ð $r   r   c                  ó‚  — e Zd ZdZej                             dg d¢¦  «        dd	„¦   «         Zej                             dg d
¢¦  «        dd„¦   «         Zej                             dg d¢¦  «        dd„¦   «         Z	ej                             dg d¢¦  «        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S )ÚTestTieredDeathPenaltyzNVerifies tiered percentage penalties and absolute safe floor (never de-level).Úlevel)é   re   é-   é<   r   r	   Úintr   r   c                ó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        |¦  «        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}}d	S )
z4Levels 1 to 60 have 0% death penalty (grace period).ç        r   ©z]%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_death_penalty_ratio
}(%(py3)s)
} == %(py8)sr   rv   ©r   r   r>   r@   r    úassert %(py10)sÚpy10N©	Úget_death_penalty_ratior&   r'   r(   r)   r*   r+   r,   r-   ©	r.   r   rv   r/   Ú@py_assert4r2   Ú@py_assert6rl   Ú@py_format11s	            r   Ú-test_death_penalty_grace_period_level_1_to_60zDTestTieredDeathPenalty.test_death_penalty_grace_period_level_1_to_60K   sM  € ð
 #Ô:ÐHÐ:Ð:¸5ÑAÔAÐHÀSÐHÐAÀSÒHÐHÐHÐHÕHÔHÐHÐHÐHÐHÐAÀSÐ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¸5ÑHÔHÐHÕHÔH¸5ÑHÔHÐHÐHÕHÔHÐAÑHÔHÕHÔHÀSÑ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ÐHr   )é=   éF   r   c                ó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        |¦  «        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}}d	S )
z1Levels 61 to 80 lose 5% of current level EXP bar.r`   r   r}   r   rv   r~   r   r€   Nr�   rƒ   s	            r   Ú$test_death_penalty_mid_tier_61_to_80z;TestTieredDeathPenalty.test_death_penalty_mid_tier_61_to_80R   óM  € ð
 #Ô:ÐIÐ:Ð:¸5ÑAÔAÐIÀTÐIÐAÀTÒIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐAÀTÐ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¸5ÑIÔIÐIÕIÔI¸5ÑIÔIÐIÐIÕIÔIÐAÑIÔIÕIÔIÀTÑ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ÐIr   )éQ   éU   éY   c                ó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        |¦  «        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}}d	S )
z2Levels 81 to 89 lose 10% of current level EXP bar.rh   r   r}   r   rv   r~   r   r€   Nr�   rƒ   s	            r   Ú%test_death_penalty_high_tier_81_to_89z<TestTieredDeathPenalty.test_death_penalty_high_tier_81_to_89Y   rŒ   r   )r_   rd   éb   c                ó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        |¦  «        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}}d	S )
z2Levels 90 to 98 lose 15% of current level EXP bar.ç333333Ã?r   r}   r   rv   r~   r   r€   Nr�   rƒ   s	            r   Ú(test_death_penalty_endgame_tier_90_to_98z?TestTieredDeathPenalty.test_death_penalty_endgame_tier_90_to_98`   rŒ   r   c                óö  — |j         }d} ||¦  «        }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        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z,Level 99 loses 25% of current level EXP bar.éc   g      Ð?r   ©z]%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_death_penalty_ratio
}(%(py4)s)
} == %(py9)sr   ©r   r   r   r   rQ   úassert %(py11)sr!   Nr�   ©	r.   r   r/   r0   r1   rW   r2   Ú@py_format10r5   s	            r   Ú#test_death_penalty_pinnacle_tier_99z:TestTieredDeathPenalty.test_death_penalty_pinnacle_tier_99g   s,  € ð #Ô:ÐF¸2ÐFÐ:Ð:¸2Ñ>Ô>ÐFÀ$ÐFÐ>À$ÒFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ>À$ÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFÐ"ÑFÔFÐFÕFÔFÐ"ÑFÔFÐFÐFÕFÔFÐ:ÑFÔFÕFÔF¸2ÑFÔFÕFÔFÐ>ÑFÔFÕFÔFÀ$ÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFr   c                óö  — |j         }d} ||¦  «        }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        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z.Level 100 has 0% death penalty (immortal cap).éd   r|   r   r˜   r   r™   rš   r!   Nr�   r›   s	            r   Ú#test_death_penalty_godhood_tier_100z:TestTieredDeathPenalty.test_death_penalty_godhood_tier_100m   s,  € ð #Ô:ÐF¸3ÐFÐ:Ð:¸3Ñ?Ô?ÐFÀ3ÐFÐ?À3ÒFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ?À3ÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFÐ"ÑFÔFÐFÕFÔFÐ"ÑFÔFÐFÐFÕFÔFÐ:ÑFÔFÕFÔF¸3ÑFÔFÕFÔFÐ?ÑFÔFÕFÔFÀ3ÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFr   c           	     ó^  — d}|                      |d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}}|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}||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}}|j        } ||¦  «        }|j        }	d}
|	|
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t          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}	x}}
dS )zFDying at 0% EXP results in 0 lost EXP; player never drops below level.Úplayer_zero_exprd   r   ©rv   Úcurrent_expr   ©z0%(py2)s
{%(py2)s = %(py0)s.exp_lost
} == %(py5)sÚres©r   r   r@   úassert %(py7)sÚpy7N©z/%(py2)s
{%(py2)s = %(py0)s.new_exp
} == %(py5)sF©Úis©z2%(py2)s
{%(py2)s = %(py0)s.de_leveled
} is %(py5)s©zp%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.level
} == %(py10)sr   Úpid©r   r   r>   r@   r©   r€   úassert %(py12)srR   )Úset_player_stateÚapply_death_penaltyÚexp_lostr&   r'   r(   r)   r*   r+   r,   r-   Únew_expÚ
de_leveledÚget_level_inforv   ©r.   r   r¯   r¦   r/   r„   r0   rE   Ú@py_format8r…   r4   rW   r†   Ú@py_format13s                 r   Ú)test_death_penalty_safe_floor_at_zero_expz@TestTieredDeathPenalty.test_death_penalty_safe_floor_at_zero_exps   s5  € ð  ˆØ×,Ò,¨S¸ÈÐ,ÑJÔJÐJØ!×5Ò5°cÑ:Ô:ˆØŒ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆsÑ Ô Ð Õ Ô ˆsÑ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ØŒ{Ð˜aÐˆ{˜aÒÐÐÐÕÔÐÐÐÐˆ{˜aÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆ{ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒ~Ð& Ð&ˆ~ Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø"Ô1ÐBÐ1Ð1°#Ñ6Ô6ÐBÐ6Ô<ÐBÀÐBÐ<ÀÒBÐBÐBÑBÕBÔBÐBÐBÐBÐBÐ<ÀÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBÐ"ÑBÔBÐBÕBÔBÐ"ÑBÔBÐBÐBÕBÔBÐ1ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB°#ÑBÔBÐBÕBÔB°#ÑBÔBÐBÐBÕBÔBÐ6ÑBÔBÕBÔBÐ<ÑBÔBÕBÔBÀÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBr   c           	     óú  — d}|                      d¦  «        }t          |dz  ¦  «        }|                     |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}}|j        }||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}}|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}}|j        } ||¦  «        }|j        }d}||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t          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )zLDying at 10% EXP at Level 99 (25% penalty) clamps to 0% without de-leveling.Úplayer_clamp_testr—   rh   r£   r   r   rª   r¦   r§   r¨   r©   N)z0%(py2)s
{%(py2)s = %(py0)s.exp_lost
} == %(py4)sÚinitial_exp©r   r   r   úassert %(py6)sr   Fr«   r­   r®   r   r¯   r°   r±   rR   )Úget_delta_exprz   r²   r³   rµ   r&   r'   r(   r)   r*   r+   r,   r-   r´   r¶   r·   rv   )r.   r   r¯   Úd99r¾   r¦   r/   r„   r0   rE   r¹   Ú@py_format5rk   r…   r4   rW   r†   rº   s                     r   Ú&test_death_penalty_safe_floor_clampingz=TestTieredDeathPenalty.test_death_penalty_safe_floor_clamping   sx  € ð "ˆØ!×/Ò/°Ñ3Ô3ˆÝ˜# ™*‘o”oˆØ×,Ò,¨S¸ÈÐ,ÑTÔTÐTØ!×5Ò5°cÑ:Ô:ˆØŒ{Ð˜aÐˆ{˜aÒÐÐÐÕÔÐÐÐÐˆ{˜aÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆ{ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒ|Ð*ˆ|˜{Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ|˜{Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Ð*Õ*Ô*ˆ|Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*˜{Ñ*Ô*Ð*Õ*Ô*˜{Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*ØŒ~Ð& Ð&ˆ~ Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø"Ô1ÐBÐ1Ð1°#Ñ6Ô6ÐBÐ6Ô<ÐBÀÐBÐ<ÀÒBÐBÐBÑBÕBÔBÐBÐBÐBÐBÐ<ÀÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBÐ"ÑBÔBÐBÕBÔBÐ"ÑBÔBÐBÐBÕBÔBÐ1ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB°#ÑBÔBÐBÕBÔB°#ÑBÔBÐBÐBÕBÔBÐ6ÑBÔBÕBÔBÐ<ÑBÔBÕBÔBÀÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBr   c                ó‚  — d}|                      d¦  «        }|                     |dt          |dz  ¦  «        ¬¦  «         t          d¦  «        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}}|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 )zD5 consecutive deaths at Level 99 clamp at 0% and track deaths_count.Úplayer_streakr—   ç      à?r£   é   r   )z-%(py2)s
{%(py2)s = %(py0)s.level
} == %(py5)sÚstater§   r¨   r©   Nr   ©z3%(py2)s
{%(py2)s = %(py0)s.current_exp
} == %(py5)s©z4%(py2)s
{%(py2)s = %(py0)s.deaths_count
} == %(py5)s)rÁ   r²   rz   rA   r³   r·   rv   r&   r'   r(   r)   r*   r+   r,   r-   r¤   Údeaths_count)r.   r   r¯   rÂ   Ú_rÉ   r/   r„   r0   rE   r¹   s              r   Ú+test_death_penalty_consecutive_death_streakzBTestTieredDeathPenalty.test_death_penalty_consecutive_death_streak�   s&  € ð ˆØ!×/Ò/°Ñ3Ô3ˆØ×,Ò,¨S¸ÍÈCÐRVÉJÉÌÐ,ÑXÔXÐXÝ�q‘”ð 	9ð 	9ˆAØ×3Ò3°CÑ8Ô8Ð8Ð8Ø#×2Ò2°3Ñ7Ô7ˆØŒ{Ð ˜bÐ ˆ{˜bÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ{˜bÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˆ{Ñ Ô Õ Ô ˜bÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ØÔ Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆuÑ%Ô%Ð%Õ%Ô%ˆuÑ%Ô%Ð%Ð%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Ð&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r   c                óÎ  ‡%— d}|                      d¦  «        }|                     |ddd¬¦  «         g Š%|                     ˆ%fd„¦  «         |                     |¦  «        }g }|j        }||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        |¦  «        d	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	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}}
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}
}g }|j        }d}||k    }|}|r|j        }d}||k    }
|
}|
r|j        }| }|}|�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  }|                     |¦  «         |
rld!dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d"œz  }|                     |¦  «         t          j        |d¦  «        i z  }d#d$|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}
x}x}}|                     |¦  «        }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}
}g }|j        }d}||k    }|}|r|j        }|j        } || 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        |¦  «        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/d0|iz  }!t          t          j        |!¦  «        ¦  «        ‚dx}x}x}x}x}x}x}
} g }t3          ‰%¦  «        }"d%}#|"|#k    }|}|r‰%d         }||k    }
|
}|�s³t          j        d|fd1|"|#f¦  «        d2t          j	        ¦   «         v st          j
        t2          ¦  «        rt          j        t2          ¦  «        nd2d3t          j	        ¦   «         v st          j
        ‰%¦  «        rt          j        ‰%¦  «        nd3t          j        |"¦  «        t          j        |#¦  «        d4œz  }d5d6|iz  }$|                     |$¦  «         |r‹t          j        d|
fd7||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndd8œ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 )9zMLevel 100 death increments deaths_count, loses 0 EXP, and notifies listeners.Úplayer_lv100_death_telemetryrŸ   r   ©rv   r¤   rÌ   c                ó.   •— ‰                      | ¦  «        S ©N©Úappend©ÚrÚeventss    €r   ú<lambda>z]TestTieredDeathPenalty.test_level_100_death_handling_telemetry_and_listener.<locals>.<lambda>£   ó   ø€ ÀÇÂÈqÑAQÔAQ€ r   r   )z1%(py4)s
{%(py4)s = %(py2)s.player_id
} == %(py6)sr¦   r¯   ©r   r   r   ú%(py8)sr    )z1%(py12)s
{%(py12)s = %(py10)s.level
} == %(py15)s)r€   rR   rS   z%(py17)srU   úassert %(py20)sÚpy20Nr|   )z0%(py4)s
{%(py4)s = %(py2)s.exp_lost
} == %(py7)s©r   r   r©   ú%(py9)srQ   )z9%(py13)s
{%(py13)s = %(py11)s.penalty_ratio
} == %(py16)s©r!   r#   Úpy16ú%(py18)sÚpy18úassert %(py21)sÚpy21)z:%(py4)s
{%(py4)s = %(py2)s.current_exp_before
} == %(py7)s)z=%(py13)s
{%(py13)s = %(py11)s.current_exp_after
} == %(py16)sz.not %(py22)s
{%(py22)s = %(py20)s.de_leveled
})rÞ   Úpy22zassert %(py26)sÚpy26rw   )z4%(py4)s
{%(py4)s = %(py2)s.deaths_count
} == %(py7)srÉ   )z1%(py13)s
{%(py13)s = %(py11)s.level
} == %(py16)s)z3%(py4)s
{%(py4)s = %(py2)s.current_exp
} == %(py7)s)z`%(py13)s
{%(py13)s = %(py11)s.cumulative_exp
} == %(py17)s
{%(py17)s = %(py15)s.cumulative_exp
}Úb100)r!   r#   rS   rU   ú%(py19)sÚpy19úassert %(py22)srç   )z0%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
} == %(py8)sÚlenrØ   )r   r>   r@   r    z%(py10)sr€   )z%(py13)s == %(py15)s)r#   rS   )Úget_canonical_benchmarkr²   Úadd_death_penalty_listenerr³   Ú	player_idrv   r&   r'   r(   r)   r*   r+   rÕ   Ú_format_boolopr,   r-   r´   Úpenalty_ratioÚcurrent_exp_beforeÚcurrent_exp_afterr¶   r·   rÌ   r¤   Úcumulative_exprí   )&r.   r   r¯   ré   r¦   r/   r0   r1   rj   rX   rY   rZ   rk   rl   r[   r\   Ú@py_format19Ú@py_format21r…   Ú@py_assert12Ú@py_assert15r¹   rœ   Ú@py_format17Ú@py_format20Ú@py_format22Ú@py_assert21Ú@py_assert23Ú@py_format24Ú@py_format25Ú@py_format27rÉ   Ú@py_assert16Ú@py_format23r„   r2   r†   rØ   s&                                        @r   Ú4test_level_100_death_handling_telemetry_and_listenerzKTestTieredDeathPenalty.test_level_100_death_handling_telemetry_and_listener›   sY  ø€ ð -ˆØ"×:Ò:¸3Ñ?Ô?ˆØ×,Ò,¨S¸ÈÐYZÐ,Ñ[Ô[Ð[Ø+-ˆØ×6Ò6Ð7QÐ7QÐ7QÐ7QÑRÔRÐRà!×5Ò5°cÑ:Ô:ˆØ8Ð8ˆsŒ}Ð8ˆ} Ò#Ð8Ð8Ð8Ð8Ð8¨¬	Ð8°SÐ8¨	°SÒ(8Ð8Ð8Ð8Ð8Ñ8Õ8Ô8Ð8Ð8Ð8Ð8ˆ} Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆsÑ8Ô8Ð8Õ8Ô8ˆsÑ8Ô8Ð8Ð8Õ8Ô8ˆ}Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 Ñ8Ô8Ð8Õ8Ô8 Ñ8Ô8Ð8Ð8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Ð8×8Ò8Ð8Ñ8Ô8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8¨	°SÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8¨Ñ8Ô8Ð8Õ8Ô8¨Ñ8Ô8Ð8Ð8Õ8Ô8¨	Ñ8Ô8Õ8Ô8°SÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Ð8×8Ò8Ð8Ñ8Ô8Ð8Õ8Ô8Ð8Ð8Ñ8Ô8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø=Ð=ˆsŒ|Ð=˜qÐ=ˆ|˜qÒ Ð=Ð=Ð=Ð=Ð= SÔ%6Ð=¸#Ð=Ð%6¸#Ò%=Ð=Ð=Ð=Ð=Ñ=Õ=Ô=Ð=Ð=Ð=Ð=ˆ|˜qÐ=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=ˆsÑ=Ô=Ð=Õ=Ô=ˆsÑ=Ô=Ð=Ð=Õ=Ô=ˆ|Ñ=Ô=Õ=Ô=˜qÑ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=×=Ò=Ð=Ñ=Ô=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð%6¸#Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô= SÑ=Ô=Ð=Õ=Ô= SÑ=Ô=Ð=Ð=Õ=Ô=Ð%6Ñ=Ô=Õ=Ô=¸#Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=×=Ò=Ð=Ñ=Ô=Ð=Õ=Ô=Ð=Ð=Ñ=Ô=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø`Ð`ˆsÔ%Ð`¨Ð`Ð%¨Ò*Ð`Ð`Ð`Ð`Ð`¨sÔ/DÐ`ÈÐ`Ð/DÈÒ/IÐ`Ð`Ð`Ð`Ð`ÐRUÔR`Ð`ÐR`ÐN`Ð`ÐN`Ð`Ð`Ñ`Õ`Ô`Ð`Ð`Ð`Ð`Ð%¨Ð`Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`ˆsÑ`Ô`Ð`Õ`Ô`ˆsÑ`Ô`Ð`Ð`Õ`Ô`Ð%Ñ`Ô`Õ`Ô`¨Ñ`Ô`Ð`Ð`Ñ`Ð`Ð`Ð`Ð`Ð`Ñ`Ð`Ð`×`Ò`Ð`Ñ`Ô`Ð`Ð`Ñ`Õ`Ô`Ð`Ð`Ð`Ð`Ð/DÈÐ`Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`¨sÑ`Ô`Ð`Õ`Ô`¨sÑ`Ô`Ð`Ð`Õ`Ô`Ð/DÑ`Ô`Õ`Ô`ÈÑ`Ô`Ð`Ð`Ñ`Ð`Ð`Ð`Ð`Ð`Ñ`Ð`Ð`×`Ò`Ð`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`ÐRUÑ`Ô`Ð`Õ`Ô`ÐRUÑ`Ô`Ð`Ð`Õ`Ô`ÐR`Ñ`Ô`Ð`Ð`Ñ`Ð`Ð`×`Ò`Ð`Ñ`Ô`Ð`Õ`Ô`Ð`Ð`Ñ`Ô`Ð`Ñ`Ð`Ð`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`à#×2Ò2°3Ñ7Ô7ˆØ=Ð=ˆuÔ!Ð= QÐ=Ð! QÒ&Ð=Ð=Ð=Ð=Ð=¨5¬;Ð=¸#Ð=¨;¸#Ò+=Ð=Ð=Ð=Ð=Ñ=Õ=Ô=Ð=Ð=Ð=Ð=Ð! QÐ=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=ˆuÑ=Ô=Ð=Õ=Ô=ˆuÑ=Ô=Ð=Ð=Õ=Ô=Ð!Ñ=Ô=Õ=Ô= QÑ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=×=Ò=Ð=Ñ=Ô=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=¨;¸#Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=¨5Ñ=Ô=Ð=Õ=Ô=¨5Ñ=Ô=Ð=Ð=Õ=Ô=¨;Ñ=Ô=Õ=Ô=¸#Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=×=Ò=Ð=Ñ=Ô=Ð=Õ=Ô=Ð=Ð=Ñ=Ô=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØUÐUˆuÔ ÐU AÐUÐ  AÒ%ÐUÐUÐUÐUÐU¨%Ô*>ÐUÀ$ÔBUÐUÐ*>ÐBUÒ*UÐUÐUÐUÐUÑUÕUÔUÐUÐUÐUÐUÐ  AÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆuÑUÔUÐUÕUÔUˆuÑUÔUÐUÐUÕUÔUÐ ÑUÔUÕUÔU AÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÐUÐUÕUÔUÐUÐUÐUÐUÐ*>ÐBUÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU¨%ÑUÔUÐUÕUÔU¨%ÑUÔUÐUÐUÕUÔUÐ*>ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUÀ$ÑUÔUÐUÕUÔUÀ$ÑUÔUÐUÐUÕUÔUÐBUÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÕUÔUÐUÐUÑUÔUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUØ4Ð4�s�6‰{Œ{Ð4˜aÐ4ˆ{˜aÒÐ4Ð4Ð4Ð4Ð4 F¨1¤IÐ4 I°Ò$4Ð4Ð4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4ˆ{˜aÐ4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�sÑ4Ô4Ð4Õ4Ô4�sÑ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�6Ñ4Ô4Ð4Õ4Ô4�6Ñ4Ô4Ð4Ð4Õ4Ô4ˆ{Ñ4Ô4Õ4Ô4˜aÑ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 I°Ð4Ñ4Ô4Õ4Ô4 IÑ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Ñ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Ð4r   c           
     ó0  ‡— d}|                      |ddd¬¦  «         g Š|                     ˆfd„¦  «         t          dd¦  «        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}}|j        } ||¦  «        }|j        }
|
|k    }|�s9t          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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}
}�Œ>t          ‰¦  «        }d}||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
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )zPConsecutive deaths at Level 100 increment deaths_count and dispatch every event.Úplayer_lv100_streakrŸ   r   rÑ   c                ó.   •— ‰                      | ¦  «        S rÓ   rÔ   rÖ   s    €r   rÙ   zhTestTieredDeathPenalty.test_level_100_consecutive_death_streak_increments_deaths_count.<locals>.<lambda>¶   rÚ   r   rw   é   r   r¥   r¦   r§   r¨   r©   N)zv%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.deaths_count
} == %(py9)sr   r¯   Úi©r   r   r>   r@   r©   rQ   rš   r!   é   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srí   rØ   )r   rP   r>   r   ri   r    )r²   rï   rA   r³   r´   r&   r'   r(   r)   r*   r+   r,   r-   r·   rÌ   rí   )r.   r   r¯   r	  r¦   r/   r„   r0   rE   r¹   r…   rW   rœ   r5   rC   r1   rk   rl   rØ   s                     @r   Ú?test_level_100_consecutive_death_streak_increments_deaths_countzVTestTieredDeathPenalty.test_level_100_consecutive_death_streak_increments_deaths_count¯   sú  ø€ ð $ˆØ×,Ò,¨S¸ÈÐYZÐ,Ñ[Ô[Ð[Ø+-ˆØ×6Ò6Ð7QÐ7QÐ7QÐ7QÑRÔRÐRå�q˜!‘”ð 	Mñ 	MˆAØ%×9Ò9¸#Ñ>Ô>ˆCØ”<Ð$ 1Ð$�< 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�< 1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�3Ñ$Ô$Ð$Õ$Ô$�3Ñ$Ô$Ð$Ð$Õ$Ô$�<Ñ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø&Ô5ÐLÐ5Ð5°cÑ:Ô:ÐLÐ:ÔGÐLÐGÈ1ÒLÐLÐLÑLÕLÔLÐLÐLÐLÐLÐGÈ1ÐLÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLÐ&ÑLÔLÐLÕLÔLÐ&ÑLÔLÐLÐLÕLÔLÐ5ÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔL°cÑLÔLÐLÕLÔL°cÑLÔLÐLÐLÕLÔLÐ:ÑLÔLÕLÔLÐGÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLÈ1ÑLÔLÐLÕLÔLÈ1Ñ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Ý�6‰{Œ{Ð˜aÐˆ{˜aÒÐÐÐÕÔÐÐÐÐˆ{˜aÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�6ÑÔÐÕÔ�6ÑÔÐÐÕÔˆ{ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr   N)r   r	   rv   rz   r   r   rn   )ro   rp   rq   rr   ÚpytestÚmarkÚparametrizer‡   r‹   r‘   r•   r�   r    r»   rÄ   rÎ   r  r  rs   r   r   ru   ru   H   s   € € € € € ØXÐXà„[×Ò˜W o o oÑ6Ô6ðIð Ið Iñ 7Ô6ðIð „[×Ò˜W l l lÑ3Ô3ðJð Jð Jñ 4Ô3ðJð „[×Ò˜W l l lÑ3Ô3ðJð Jð Jñ 4Ô3ðJð „[×Ò˜W l l lÑ3Ô3ðJð Jð Jñ 4Ô3ðJðGð Gð Gð GðGð Gð Gð Gð
Cð 
Cð 
Cð 
CðCð Cð Cð Cð'ð 'ð 'ð 'ð5ð 5ð 5ð 5ð( ð  ð  ð  ð  ð  r   ru   c                  ó2   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zd
S )ÚTestLevelUpTransitionszBVerifies level advancement, rollover EXP, and passive/stat grants.r   r	   r   r   c                ó¼  — d}|                      |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}}|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 )zEAwarding exactly 600 EXP advances Level 1 to Level 2 with 0 rollover.Úplayer_exactrw   éX  Tr«   ©z9%(py2)s
{%(py2)s = %(py0)s.level_up_occurred
} is %(py5)sr¦   r§   r¨   r©   Né   r   ©z1%(py2)s
{%(py2)s = %(py0)s.new_level
} == %(py5)sr   rÊ   ©Úaward_monster_expÚlevel_up_occurredr&   r'   r(   r)   r*   r+   r,   r-   Ú	new_levelr¤   ©	r.   r   r¯   r¦   r/   r„   r0   rE   r¹   s	            r   Útest_level_up_1_to_2_exact_expz5TestLevelUpTransitions.test_level_up_1_to_2_exact_expÂ   sÃ  € ð ˆØ!×3Ò3°C¸¸A¸sÑCÔCˆØÔ$Ð,¨Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Ð,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØŒ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒÐ# !Ð#ˆ !Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ !Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆsÑ#Ô#Ð#Õ#Ô#ˆsÑ#Ô#Ð#Ð#Õ#Ô#ˆÑ#Ô#Õ#Ô# !Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r   c                ó¼  — d}|                      |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}}|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 )zBAwarding 650 EXP advances Level 1 to Level 2 with 50 rollover EXP.Úplayer_rolloverrw   iŠ  Tr«   r  r¦   r§   r¨   r©   Nr  r   r  é2   rÊ   r  r  s	            r   Ú"test_level_up_1_to_2_with_rolloverz9TestLevelUpTransitions.test_level_up_1_to_2_with_rolloverÌ   sÃ  € ð  ˆØ!×3Ò3°C¸¸A¸sÑCÔCˆØÔ$Ð,¨Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Ð,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØŒ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒÐ$ "Ð$ˆ "Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ "Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆsÑ$Ô$Ð$Õ$Ô$ˆsÑ$Ô$Ð$Ð$Õ$Ô$ˆÑ$Ô$Õ$Ô$ "Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r   c                óh  — d}|                      |dd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}}|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 )z;Level up grants +5 stat points and +1 unspent talent point.Úplayer_statsrw   r  r   )z=%(py2)s
{%(py2)s = %(py0)s.unspent_talent_points
} == %(py5)srÉ   r§   r¨   r©   N)z;%(py2)s
{%(py2)s = %(py0)s.total_talent_points
} == %(py5)s)r  r·   Úunspent_talent_pointsr&   r'   r(   r)   r*   r+   r,   r-   Útotal_talent_points)	r.   r   r¯   rÉ   r/   r„   r0   rE   r¹   s	            r   Ú%test_level_up_stats_and_talent_pointsz<TestLevelUpTransitions.test_level_up_stats_and_talent_pointsÖ   sþ  € ð ˆØ×-Ò-¨c°1°a¸Ñ=Ô=Ð=Ø#×2Ò2°3Ñ7Ô7ˆØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆuÑ/Ô/Ð/Õ/Ô/ˆuÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÔ(Ð-¨AÐ-Ð(¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆuÑ-Ô-Ð-Õ-Ô-ˆuÑ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r   c                ó   — d}|                      d¦  «        }|                      d¦  «        }|                     |dd||z   dz   ¦  «        }|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 )z<Large EXP award cascades through multiple levels accurately.Úplayer_multirw   r  rŸ   r  r   r  r¦   r§   r¨   r©   NrÊ   )z5%(py2)s
{%(py2)s = %(py0)s.levels_gained
} == %(py5)s)rÁ   r  r  r&   r'   r(   r)   r*   r+   r,   r-   r¤   Úlevels_gained)r.   r   r¯   Úd1Úd2r¦   r/   r„   r0   rE   r¹   s              r   Útest_multi_level_jumpz,TestLevelUpTransitions.test_multi_level_jumpà   sñ  € ð ˆØ ×.Ò.¨qÑ1Ô1ˆØ ×.Ò.¨qÑ1Ô1ˆØ!×3Ò3°C¸¸A¸rÀB¹wÈ¹}ÑMÔMˆØŒ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒÐ% #Ð%ˆ #Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ #Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Ð%Õ%Ô%ˆÑ%Ô%Õ%Ô% #Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Ð%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r   Nrn   )ro   rp   rq   rr   r  r!  r&  r,  rs   r   r   r  r  ¿   sj   € € € € € ØLÐLð$ð $ð $ð $ð%ð %ð %ð %ð.ð .ð .ð .ð
&ð 
&ð 
&ð 
&ð 
&ð 
&r   r  c                  ó:   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zdd
„ZdS )ÚTestLevelCapAndTerminalStatez0Verifies strict Level 100 cap and zero overflow.r   r	   r   r   c                óì  — d}|                      |dd¬¦  «         |                     |dd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}}|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}}|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 )z)Kills at Level 100 award 0 effective EXP.Úplayer_lv100rŸ   r   r£   i † r   )z5%(py2)s
{%(py2)s = %(py0)s.effective_exp
} == %(py5)sr¦   r§   r¨   r©   NFr«   r  r  )r²   r  Úeffective_expr&   r'   r(   r)   r*   r+   r,   r-   r  r  r  s	            r   Ú&test_level_100_cap_no_further_exp_gainzCTestLevelCapAndTerminalState.test_level_100_cap_no_further_exp_gainð   sâ  € ð ˆØ×,Ò,¨S¸ÈÐ,ÑKÔKÐKØ!×3Ò3°C¸¸cÀ6ÑJÔJˆØÔ Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Õ%Ô%ˆsÑ%Ô%Ð%Ð%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ$Ð-¨Ð-Ð$¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆsÑ-Ô-Ð-Õ-Ô-ˆsÑ-Ô-Ð-Ð-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØŒ}Ð# Ð#ˆ} Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ} Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆsÑ#Ô#Ð#Õ#Ô#ˆsÑ#Ô#Ð#Ð#Õ#Ô#ˆ}Ñ#Ô#Õ#Ô# Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r   c           	     óà  — d}|                      |d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}}|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        } ||¦  «        }|j        }	d}
|	|
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t          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}	x}}
dS )z.Level 100 player suffers 0 penalty upon death.Úplayer_lv100_deathrŸ   r   r£   r   r¥   r¦   r§   r¨   r©   Nrª   r®   r   r¯   r°   r±   rR   )r²   r³   r´   r&   r'   r(   r)   r*   r+   r,   r-   rµ   r·   rv   r¸   s                 r   Ú%test_level_100_death_penalty_immunityzBTestLevelCapAndTerminalState.test_level_100_death_penalty_immunityû   sX  € ð #ˆØ×,Ò,¨S¸ÈÐ,ÑKÔKÐKØ!×5Ò5°cÑ:Ô:ˆØŒ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆsÑ Ô Ð Õ Ô ˆsÑ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ØŒ{Ð˜aÐˆ{˜aÒÐÐÐÕÔÐÐÐÐˆ{˜aÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆ{ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ"Ô1ÐCÐ1Ð1°#Ñ6Ô6ÐCÐ6Ô<Ð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Ð1ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC°#ÑCÔCÐCÕCÔC°#ÑCÔCÐCÐCÕCÔCÐ6Ñ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¦  «        j        }|                     d¦  «        }|                     |d|dz
  ¬¦  «         |j        } ||¦  «        }|j        }d}||z
  }	||	k    }
|
�sLt          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	t          j
        |¦  «        t          j
        |¦  «        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}
x}}	|                     |dd¬¦  «        }g }|j        }d}||k    }|}|r|j        }	|	}|	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ddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |	¦  «        dœ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}x}}|                     |¦  «        }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}}g }|j        }||k    }|}|r|j        }"|"|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  }%|                     |%¦  «         |rÉ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          j        |d¦  «        i z  }&d/d0|&iz  } t          t          j        | ¦  «        ¦  «        ‚dx}x}x}x}x}"}#dS )1zNLevel 99 with surplus EXP clamps exactly to 24,285,477,315 with zero overflow.Úplayer_lv99_clamp_testrŸ   r—   rw   r£   r   )z…%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.cumulative_exp
} == (%(py9)s - %(py11)s)r   r¯   Úexpected_cap)r   r   r>   r@   r©   rQ   r!   zassert %(py14)sÚpy14Ni@B ©Úmonster_levelÚbase_expr   )z1%(py4)s
{%(py4)s = %(py2)s.new_level
} == %(py7)sr¦   rß   rà   rQ   z*%(py13)s
{%(py13)s = %(py11)s.leveled_up
}©r!   r#   )z7%(py17)s
{%(py17)s = %(py15)s.current_exp
} == %(py20)s)rS   rU   rÞ   z%(py22)srç   zassert %(py25)sÚpy25©z-%(py4)s
{%(py4)s = %(py2)s.level
} == %(py7)sÚinfo©z7%(py13)s
{%(py13)s = %(py11)s.current_exp
} == %(py16)srá   rã   rä   rå   ræ   )z6%(py4)s
{%(py4)s = %(py2)s.cumulative_exp
} == %(py6)srÛ   rÜ   r    )z8%(py12)s
{%(py12)s = %(py10)s.lifetime_exp
} == %(py14)s)r€   rR   r9  z%(py16)srâ   zassert %(py19)srë   )rî   rõ   rÁ   r²   r·   r&   r'   r(   r)   r*   r+   r,   r-   r  r  Ú
leveled_upr¤   rÕ   rñ   rv   Úlifetime_exp)'r.   r   r¯   r8  rÂ   r/   r„   r…   r3   rø   rW   rº   Ú@py_format15r¦   r0   r1   rj   r  Ú@py_assert19Ú@py_assert18r¹   rœ   r6   r÷   r  rÿ   Ú@py_format26r@  rù   rY   rú   rö   rû   rü   rX   rZ   rk   rl   r\   s'                                          r   Ú2test_level_100_cumulative_exp_clamping_on_level_upzOTestLevelCapAndTerminalState.test_level_100_cumulative_exp_clamping_on_level_up  sS	  € ð 'ˆØ*×BÒBÀ3ÑGÔGÔVˆØ!×/Ò/°Ñ3Ô3ˆà×,Ò,¨S¸ÈÈaÉÐ,ÑPÔPÐPØ"Ô1ÐYÐ1Ð1°#Ñ6Ô6ÐYÐ6ÔEÐYÐXYÐYÈÐXYÑIYÐYÐEÐIYÒYÐYÐYÑYÕYÔYÐYÐYÐYÐYÐEÐIYÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYÐ"ÑYÔYÐYÕYÔYÐ"ÑYÔYÐYÐYÕYÔYÐ1ÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔY°#ÑYÔYÐYÕYÔY°#ÑYÔYÐYÐYÕYÔYÐ6ÑYÔYÕYÔYÐEÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYÈÑYÔYÐYÕYÔYÈÑYÔYÐYÐYÕYÔYÐXYÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYà!×3Ò3°CÀsÐU^Ð3Ñ_Ô_ˆØOÐOˆsŒ}ÐO ÐOˆ} Ò#ÐOÐOÐOÐOÐO¨¬ÐO¨ÐO¨ÐO¸3¼?ÐOÈaÐO¸?ÈaÒ;OÐOÐOÐOÐOÑOÕOÔOÐOÐOÐOÐOˆ} ÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔOˆsÑOÔOÐOÕOÔOˆsÑOÔOÐOÐOÕOÔOˆ}ÑOÔOÕOÔO ÑOÔOÐOÐOÑOÐOÐOÐOÐOÐOÑOÐOÐO×OÒOÐOÑOÔOÐOÐOÑOÐOÐOÕOÔOÑOÔOÐOÐOÕOÔO¨ÑOÔOÐOÕOÔO¨ÑOÔOÐOÐOÕOÔO¨ÑOÔOÐOÐOÑOÐOÐO×OÒOÐOÑOÔOÐO¨ÐOÕOÔOÐOÐOÐOÐO¸?ÈaÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO¸3ÑOÔOÐOÕOÔO¸3ÑOÔOÐOÐOÕOÔO¸?ÑOÔOÕOÔOÈaÑOÔOÐOÐOÑOÐOÐOÐOÐOÐOÑOÐOÐO×OÒOÐOÑOÔOÐOÕOÔOÐOÐOÑOÔOÐOÑOÐOÐOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOà"×1Ò1°#Ñ6Ô6ˆØ:Ð:ˆtŒzÐ:˜SÐ:ˆz˜SÒ Ð:Ð:Ð:Ð:Ð: TÔ%5Ð:¸Ð:Ð%5¸Ò%:Ð:Ð:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:ˆz˜SÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆtÑ:Ô:Ð:Õ:Ô:ˆtÑ:Ô:Ð:Ð:Õ:Ô:ˆzÑ:Ô:Õ:Ô:˜SÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð%5¸Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô: TÑ:Ô:Ð:Õ:Ô: TÑ:Ô:Ð:Ð:Õ:Ô:Ð%5Ñ:Ô:Õ:Ô:¸Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Õ:Ô:Ð:Ð:Ñ:Ô:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ØXÐXˆtÔ"ÐXÐ" lÒ2ÐXÐXÐXÐXÐX°tÔ7HÐXÐ7HÈLÒ7XÐXÐXÐXÐXÑXÕXÔXÐXÐXÐXÐXÐ" lÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXˆtÑXÔXÐXÕXÔXˆtÑXÔXÐXÐXÕXÔXÐ"ÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX lÑXÔXÐXÕXÔX lÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÐXÐXÕXÔXÐXÐXÐXÐXÐ7HÈLÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX°tÑXÔXÐXÕXÔX°tÑXÔXÐXÐXÕXÔXÐ7HÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXÈLÑXÔXÐXÕXÔXÈLÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÕXÔXÐXÐXÑXÔXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXr   c                óÖ  — d}|                      d¦  «        j        }|                     |d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}}|j        }||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}}dS )zLDirect set_player_state at Level 100 clamps cumulative_exp to benchmark cap.Úplayer_direct_100rŸ   iˆ  r£   r   r   r?  r@  rß   rà   rQ   rA  rá   rã   rä   rå   ræ   N)z6%(py2)s
{%(py2)s = %(py0)s.cumulative_exp
} == %(py4)sr8  r¿   rÀ   r   )rî   rõ   r²   r·   rv   r¤   r&   r'   r(   r)   r*   r+   rÕ   rñ   r,   r-   )r.   r   r¯   r8  r@  r/   r0   r…   r1   rj   rø   rù   rY   r¹   rœ   rú   rö   rû   rü   rÃ   rk   s                        r   Ú7test_level_100_set_player_state_cumulative_exp_clampingzTTestLevelCapAndTerminalState.test_level_100_set_player_state_cumulative_exp_clamping  sq  € ð "ˆØ*×BÒBÀ3ÑGÔGÔVˆØ×,Ò,¨S¸ÈÐ,ÑNÔNÐNØ"×1Ò1°#Ñ6Ô6ˆØ:Ð:ˆtŒzÐ:˜SÐ:ˆz˜SÒ Ð:Ð:Ð:Ð:Ð: TÔ%5Ð:¸Ð:Ð%5¸Ò%:Ð:Ð:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:ˆz˜SÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆtÑ:Ô:Ð:Õ:Ô:ˆtÑ:Ô:Ð:Ð:Õ:Ô:ˆzÑ:Ô:Õ:Ô:˜SÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð%5¸Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô: TÑ:Ô:Ð:Õ:Ô: TÑ:Ô:Ð:Ð:Õ:Ô:Ð%5Ñ:Ô:Õ:Ô:¸Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Õ:Ô:Ð:Ð:Ñ:Ô:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ØÔ"Ð2Ð" lÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð" lÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆtÑ2Ô2Ð2Õ2Ô2ˆtÑ2Ô2Ð2Ð2Õ2Ô2Ð"Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2 lÑ2Ô2Ð2Õ2Ô2 lÑ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           	     óˆ  — d}|                      d¦  «        j        }|                     |dd¬¦  «         t          d¦  «        D �]™}|                     |dd¬¦  «        }g }|j        }d}||k    }	|	}
|	r|j        }| }|}
|
�sLt          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  }|                     |¦  «         |	rldd
t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}	x}x}}�Œ›|j        } ||¦  «        }|j        }||k    }|�s9t          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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}}dS )zNSubsequent monster kills at Level 100 award 0 EXP and maintain cumulative cap.Úplayer_100_grindrŸ   r   r£   rÈ   i ¡ r:  r   ©z5%(py4)s
{%(py4)s = %(py2)s.effective_exp
} == %(py7)sr¦   rß   rà   rQ   z.not %(py13)s
{%(py13)s = %(py11)s.leveled_up
}r=  rT   rU   N)zx%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.cumulative_exp
} == %(py9)sr   r¯   r8  r
  rš   r!   )rî   rõ   r²   rA   r  r1  rB  r&   r'   r(   r)   r*   r+   rÕ   rñ   r,   r-   r·   )r.   r   r¯   r8  rÍ   r¦   r/   r0   r…   r1   rj   rø   rY   r¹   rœ   rD  r[   r\   r„   rW   r5   s                        r   Ú@test_level_100_further_monster_kills_maintain_cumulative_exp_capz]TestLevelCapAndTerminalState.test_level_100_further_monster_kills_maintain_cumulative_exp_cap#  sÊ  € ð !ˆØ*×BÒBÀ3ÑGÔGÔVˆØ×,Ò,¨S¸ÈÐ,ÑKÔKÐKÝ�q‘”ð 	Añ 	AˆAØ%×7Ò7¸È3ÐY`Ð7ÑaÔaˆCØ@Ð@�3Ô$Ð@¨Ð@Ð$¨Ò)Ð@Ð@Ð@Ð@Ð@°#´.Ð@°.Ð.@Ð@Ð.@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@Ð$¨Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�3Ñ@Ô@Ð@Õ@Ô@�3Ñ@Ô@Ð@Ð@Õ@Ô@Ð$Ñ@Ô@Õ@Ô@¨Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@°#Ñ@Ô@Ð@Õ@Ô@°#Ñ@Ô@Ð@Ð@Õ@Ô@°.Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Õ@Ô@Ð@Ð@Ñ@Ô@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ñ@Ø"Ô1ÐUÐ1Ð1°#Ñ6Ô6ÐUÐ6ÔEÐUÐEÈÒUÐUÐUÑUÕUÔUÐUÐUÐUÐUÐEÈÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUÐ"ÑUÔUÐUÕUÔUÐ"ÑUÔUÐUÐUÕUÔUÐ1ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU°#ÑUÔUÐUÕUÔU°#ÑUÔUÐUÐUÕUÔUÐ6ÑUÔUÕUÔUÐEÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUÈÑUÔUÐUÕUÔUÈÑUÔUÐUÐUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUr   Nrn   )	ro   rp   rq   rr   r2  r5  rH  rK  rO  rs   r   r   r.  r.  í   sŒ   € € € € € Ø:Ð:ð	$ð 	$ð 	$ð 	$ð	Dð 	Dð 	Dð 	DðYð Yð Yð Yð$	3ð 	3ð 	3ð 	3ð
Vð 
Vð 
Vð 
Vð 
Vð 
Vr   r.  c                  ó"   — e Zd ZdZd	d„Zd	d„ZdS )
ÚTestServiceStateAndPersistencezBVerifies DTO properties, aliases, and polymorphic call signatures.r   r	   r   r   c                ó  — d}|                      |ddd¦  «        }|j        }|j        }||k    }d}||k    }|r|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t          j        |¦  «        t          j        |¦  «        dœz  }	dd	|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d
x}x}x}x}}|j        }|j        }||k    }d}||u }|r|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t          j        |¦  «        t          j        |¦  «        dœz  }	dd	|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d
x}x}x}x}}|                     |¦  «        }|j        }|j        }||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t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}}|j        }|j        }||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t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}}|j        }|j        }||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t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}}d
S )z@Verifies compatibility with E2E signatures and alias properties.Úplayer_aliasr   éè  )r   r   )zV%(py2)s
{%(py2)s = %(py0)s.effective_exp
} == %(py7)s
{%(py7)s = %(py5)s.exp_awarded
}z3%(py7)s
{%(py7)s = %(py5)s.exp_awarded
} == %(py9)sr¦   )r   r   r@   r©   rQ   rš   r!   NF)r   r¬   )zY%(py2)s
{%(py2)s = %(py0)s.level_up_occurred
} == %(py7)s
{%(py7)s = %(py5)s.leveled_up
}z2%(py7)s
{%(py7)s = %(py5)s.leveled_up
} is %(py9)sr   )zV%(py2)s
{%(py2)s = %(py0)s.new_exp
} == %(py6)s
{%(py6)s = %(py4)s.current_exp_after
}Ú	death_res)r   r   r   r   ri   r    )zV%(py2)s
{%(py2)s = %(py0)s.penalty_exp_lost
} == %(py6)s
{%(py6)s = %(py4)s.exp_lost
})z]%(py2)s
{%(py2)s = %(py0)s.penalty_percentage
} == %(py6)s
{%(py6)s = %(py4)s.penalty_ratio
})r  r1  Úexp_awardedr&   r'   r(   r)   r*   r+   r,   r-   r  rB  r³   rµ   rô   Úpenalty_exp_lostr´   Úpenalty_percentagerò   )r.   r   r¯   r¦   r/   r…   r0   rW   r„   rœ   r5   rU  r1   rk   rl   s                  r   Ú'test_interface_polymorphism_and_aliaseszFTestServiceStateAndPersistence.test_interface_polymorphism_and_aliases3  s@  € ð ˆØ!×3Ò3°C¸¸RÀÑFÔFˆØÔ Ð; C¤OÐ;Ð  OÒ;Ð;°tÐ; O°tÒ;Ð;Ð;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð;Ð  O°tÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆsÑ;Ô;Ð;Õ;Ô;ˆsÑ;Ô;Ð;Ð;Õ;Ô;Ð Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô; CÑ;Ô;Ð;Õ;Ô; CÑ;Ô;Ð;Ð;Õ;Ô; OÑ;Ô;Õ;Ô;°tÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØÔ$Ð?¨¬Ð?Ð$¨Ò?Ð?¸%Ð?¨¸%Ð?Ð?Ð?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð?Ð$¨¸%Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆsÑ?Ô?Ð?Õ?Ô?ˆsÑ?Ô?Ð?Ð?Õ?Ô?Ð$Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?¨Ñ?Ô?Ð?Õ?Ô?¨Ñ?Ô?Ð?Ð?Õ?Ô?¨Ñ?Ô?Õ?Ô?¸%Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à'×;Ò;¸CÑ@Ô@ˆ	ØÔ Ð? IÔ$?Ð?Ð Ð$?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð Ð$?Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆyÑ?Ô?Ð?Õ?Ô?ˆyÑ?Ô?Ð?Ð?Õ?Ô?Ð Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô? IÑ?Ô?Ð?Õ?Ô? IÑ?Ô?Ð?Ð?Õ?Ô?Ð$?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÔ)Ð?¨YÔ-?Ð?Ð)Ð-?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð)Ð-?Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆyÑ?Ô?Ð?Õ?Ô?ˆyÑ?Ô?Ð?Ð?Õ?Ô?Ð)Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?¨YÑ?Ô?Ð?Õ?Ô?¨YÑ?Ô?Ð?Ð?Õ?Ô?Ð-?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÔ+ÐF¨yÔ/FÐFÐ+Ð/FÒFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ+Ð/FÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFˆyÑFÔFÐFÕFÔFˆyÑFÔFÐFÐFÕFÔFÐ+ÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF¨yÑFÔFÐFÕFÔF¨yÑFÔFÐFÐFÕFÔFÐ/FÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFr   c           	     óP  — d}|                      |dd¬¦  «         |                     |d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}}
|j        } ||¦  «        }|j        }d}||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t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )zKNegative base_exp argument is clamped to 0, preventing unintended EXP loss.Úplayer_neg_expé
   rŸ   r£   iœÿÿÿr:  r   r   rN  r¦   rß   rà   rQ   )z7%(py13)s
{%(py13)s = %(py11)s.exp_awarded
} == %(py16)srá   rã   rä   rå   ræ   N)zv%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.current_exp
} == %(py10)sr   r¯   r°   r±   rR   )r²   r  r1  rV  r&   r'   r(   r)   r*   r+   rÕ   rñ   r,   r-   r·   r¤   )r.   r   r¯   r¦   r/   r0   r…   r1   rj   rø   rù   rY   r¹   rœ   rú   rö   rû   rü   r„   r4   rW   r†   rº   s                          r   Ú:test_award_monster_exp_negative_base_exp_sanitized_to_zerozYTestServiceStateAndPersistence.test_award_monster_exp_negative_base_exp_sanitized_to_zeroA  sÂ  € ð ˆØ×,Ò,¨S¸ÈÐ,ÑLÔLÐLØ!×3Ò3°CÀrÐTXÐ3ÑYÔYˆØ>Ð>ˆsÔ Ð> AÐ>Ð  AÒ%Ð>Ð>Ð>Ð>Ð>¨#¬/Ð>¸QÐ>¨/¸QÒ*>Ð>Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>Ð  AÐ>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆsÑ>Ô>Ð>Õ>Ô>ˆsÑ>Ô>Ð>Ð>Õ>Ô>Ð Ñ>Ô>Õ>Ô> AÑ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>¨/¸QÐ>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨#Ñ>Ô>Ð>Õ>Ô>¨#Ñ>Ô>Ð>Ð>Õ>Ô>¨/Ñ>Ô>Õ>Ô>¸QÑ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Õ>Ô>Ð>Ð>Ñ>Ô>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ø"Ô1ÐIÐ1Ð1°#Ñ6Ô6ÐIÐ6ÔBÐIÀcÐIÐBÀcÒIÐIÐIÑIÕIÔIÐIÐIÐIÐIÐBÀcÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔIÐ"ÑIÔIÐIÕIÔIÐ"ÑIÔIÐIÐIÕIÔIÐ1ÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI°#ÑIÔIÐIÕIÔI°#ÑIÔIÐIÐIÕIÔIÐ6ÑIÔIÕIÔIÐBÑIÔIÕIÔIÀcÑ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ÐIr   Nrn   )ro   rp   rq   rr   rY  r]  rs   r   r   rQ  rQ  0  sL   € € € € € ØLÐLðGð Gð Gð GðJð Jð Jð Jð Jð Jr   rQ  c                  ó:   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zdd
„ZdS )ÚTestCombatEngineIntegrationzAVerifies CombatEngine fatal damage callback and progression hook.r   r	   r   r   c                ó  — t          ¦   «         }|                     |¦  «         |                     d¦  «        }|                     ddt	          |dz  ¦  «        ¬¦  «         t          ddt          j        d¬¦  «        }t          d	d
t          j        dddd¬¦  «        }|                     |¦  «         |                     |¦  «         | 	                    dd	dt          j        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}	}|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¦  «        }|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}||z  }t	          |¦  «        }d}||z  }t	          |¦  «        }||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        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        t          ¦  «        rt          j        t          ¦  «        nd 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}x}x}x}}dS )%zQWhen player suffers lethal damage, attached progression service penalizes player.rŽ   Úp_combat_dierÇ   r£   r\  u   Boss Tháº§n Maç    €‡Ã@©Úbase_attacké   zPlayer In Perilg     @@T©Ú
current_hpÚmax_hpÚ	is_playerrð   rT  ©Úcurrent_timestamp_msr«   ©z0%(py2)s
{%(py2)s = %(py0)s.is_fatal
} is %(py5)sÚdmg_resr§   r¨   r©   Nr|   r   ©z2%(py2)s
{%(py2)s = %(py0)s.current_hp
} == %(py5)sÚdefenderrw   rË   rÉ   rh   )zš%(py2)s
{%(py2)s = %(py0)s.current_exp
} == (%(py10)s
{%(py10)s = %(py4)s((%(py5)s * %(py7)s))
} - %(py17)s
{%(py17)s = %(py11)s((%(py12)s * %(py14)s))
})rz   Úd85)
r   r   r   r@   r©   r€   r!   rR   r9  rU   rÝ   rÞ   )r   Úattach_progression_servicerÁ   r²   rz   r   r   ÚHOAÚregister_actorÚcalculate_damageÚis_fatalr&   r'   r(   r)   r*   r+   r,   r-   rg  r·   rÌ   r¤   )r.   r   Úenginerp  Úattackerro  rm  r/   r„   r0   rE   r¹   rÉ   r…   rW   r4   rZ   rù   r  rF  rö   r÷   s                         r   Ú/test_combat_fatal_damage_triggers_death_penaltyzKTestCombatEngineIntegration.test_combat_fatal_damage_triggers_death_penaltyO  sû  € õ ‘”ˆØ×)Ò)Ð*=Ñ>Ô>Ð>à!×/Ò/°Ñ3Ô3ˆØ×,Ò,¨^À2ÕSVÐWZÐ]aÑWaÑSbÔSbÐ,ÑcÔcÐcå˜rÐ#3µ\Ô5EÐSYÐZÑZÔZˆÝØÐ!¥<Ô#3ÀØ D°Nð
ñ 
ô 
ˆð 	×Ò˜hÑ'Ô'Ð'Ø×Ò˜hÑ'Ô'Ð'à×)Ò)¨"¨b°&½,Ô:JÐaeÐ)ÑfÔfˆØÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆxÑ)Ô)Ð)Õ)Ô)ˆxÑ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)à#×2Ò2°>ÑBÔBˆØÔ!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Ð&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ ÐE¨dÐE¨¨d©
ÐE¥C¨
¡O¤OÐEÀÐE¸#À¹*ÐEµc¸*±o´oÐE O°oÑ$EÐEÐ Ð$EÒEÐEÐEÑEÕEÔEÐEÐEÐEÐEÐ Ð$EÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEˆuÑEÔEÐEÕEÔEˆuÑEÔEÐEÐEÕEÔEÐ ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¥CÑEÔEÐEÕEÔE¥CÑEÔEÐEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE¨ÑEÔEÐEÕEÔE¨ÑEÔEÐEÐEÕEÔE¨dÑEÔEÕEÔE OÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEµcÑEÔEÐEÕEÔEµcÑEÔEÐEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE¸#ÑEÔEÐEÕEÔE¸#ÑEÔEÐEÐEÕEÔEÀÑEÔEÕEÔE°oÑEÔEÐEÐEÑEÐEÐEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEr   c           	     ó¾  — t          ¦   «         }|                     |¦  «         |                     ddd¬¦  «         t          ddt          j        ddd¬	¦  «        }t          d
dt          j        dddd¬¦  «        }|                     |¦  «         |                     |¦  «         |                     dd
dt          j        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}}|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} ||¦  «        }|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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d d!|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )"zLWhen monster is defeated by player, attached progression service awards EXP.Úp_combat_slayerrw   r   r£   re   zSlayer Playerç      Y@T©rd  ri  rð   é   zWild Skeletonç      I@F©rg  rh  ri  rv   éÐ  rj  r«   rl  rm  r§   r¨   r©   Nr|   r   rn  ro  ©ú>)zu%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py4)s)
}.current_exp
} > %(py11)sr   r   r"   r#   )r   rq  r²   r   r   ÚKIMÚMOCrs  rt  ru  r&   r'   r(   r)   r*   r+   r,   r-   rg  r·   r¤   )r.   r   rv  rw  ro  rm  r/   r„   r0   rE   r¹   r1   r2   r3   r4   r5   r6   s                    r   Ú,test_combat_monster_defeat_awards_player_expzHTestCombatEngineIntegration.test_combat_monster_defeat_awards_player_expi  sé  € õ ‘”ˆØ×)Ò)Ð*=Ñ>Ô>Ð>à×,Ò,Ð->ÀaÐUVÐ,ÑWÔWÐWåØ�¥Ô!1¸uØÐ&7ð
ñ 
ô 
ˆõ Ø�¥Ô!1¸dØ 5°ð
ñ 
ô 
ˆð 	×Ò˜hÑ'Ô'Ð'Ø×Ò˜hÑ'Ô'Ð'à×)Ò)¨"¨b°%½Ô9IÐ`dÐ)ÑeÔeˆØÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆxÑ)Ô)Ð)Õ)Ô)ˆxÑ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø"Ô1ÐTÐ2CÐTÐ1Ð1Ð2CÑDÔDÐTÐDÔPÐTÐSTÐTÐPÐSTÒTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐPÐSTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTÐ"ÑTÔTÐTÕTÔTÐ"ÑTÔTÐTÐTÕTÔTÐ1ÑTÔTÕTÔTÐ2CÑTÔTÕTÔTÐDÑTÔTÕTÔTÐPÑTÔTÕTÔTÐSTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTr   c                ó   ‡ — t          ¦   «         }g Š |                     ˆ fd„¦  «         t          ddt          j        d¬¦  «        }t          ddt          j        dd¬	¦  «        }|                     |¦  «         |                     |¦  «         |                     dddt          j        d
¬¦  «        }g }|j        }d}||u }|}	|r,|j	        }
d}|
|k    }|}	|rt          ‰ ¦  «        }d}||k    }|}	|	�sgt          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  }|                     |¦  «         |ræ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        |¦  «        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}}|                     dddt          j        d$¬¦  «        }g }|j        }d%}||u }|}	|r,|j	        }
d}|
|k    }|}	|rt          ‰ ¦  «        }d}||k    }|}	|	�sgt          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  }|                     |¦  «         |ræ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        |¦  «        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}}|                     ddd't          j        d(¬¦  «        }g }|j        }d%}||u }|}	|rt          ‰ ¦  «        }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        t          ¦  «        rt          j        t          ¦  «        nd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 )0zKStriking dead defender (HP=0.0) produces is_fatal=False and skips callback.c                ó.   •— ‰                      | ¦  «        S rÓ   rÔ   )r¦   ÚatkÚdfnÚfatal_eventss      €r   rÙ   zlTestCombatEngineIntegration.test_combat_corpse_overkill_produces_not_fatal_and_no_callback.<locals>.<lambda>†  s   ø€ ¸<×;NÒ;NÈsÑ;SÔ;S€ r   rw   ÚAttackerr{  rc  r  ÚDefenderr~  )rg  rh  rT  rj  Tr|   r«   ©z0%(py4)s
{%(py4)s = %(py2)s.is_fatal
} is %(py7)sÚres1rß   rà   rQ   r   )z6%(py13)s
{%(py13)s = %(py11)s.current_hp
} == %(py16)sro  rá   rã   rä   )z5%(py23)s
{%(py23)s = %(py20)s(%(py21)s)
} == %(py26)srí   rŠ  )rÞ   ræ   Úpy23rè   z%(py28)sÚpy28r   zassert %(py31)sÚpy31Néò  FÚres2rb  iü  Úres3)z5%(py14)s
{%(py14)s = %(py11)s(%(py12)s)
} == %(py17)s)r!   rR   r9  rU   rê   rë   rì   rç   )r   Úset_fatal_damage_hookr   r   rƒ  r„  rs  rt  ru  rg  rí   r&   r'   r(   r)   r*   r+   rÕ   rñ   r,   r-   )!r.   rv  rw  ro  rŽ  r/   r0   r…   r1   rj   rø   rù   rY   Ú@py_assert22Ú@py_assert25Ú@py_assert24r¹   rœ   rú   rö   r  Ú@py_format29Ú@py_format30Ú@py_format32r“  r”  rZ   r  r\   rû   r÷   r  rŠ  s!                                   @r   Ú>test_combat_corpse_overkill_produces_not_fatal_and_no_callbackzZTestCombatEngineIntegration.test_combat_corpse_overkill_produces_not_fatal_and_no_callback‚  sã	  ø€ å‘”ˆØ02ˆØ×$Ò$Ð%SÐ%SÐ%SÐ%SÑTÔTÐTå˜q *­lÔ.>ÈEÐRÑRÔRˆÝ˜q *­lÔ.>È4ÐX\Ð]Ñ]Ô]ˆØ×Ò˜hÑ'Ô'Ð'Ø×Ò˜hÑ'Ô'Ð'ð ×&Ò& q¨!¨UµLÔ4DÐ[_Ð&Ñ`Ô`ˆØ^Ð^ˆtŒ}Ð^ Ð^ˆ} Ð$Ð^Ð^Ð^Ð^Ð^¨Ô)<Ð^ÀÐ^Ð)<ÀÒ)CÐ^Ð^Ð^Ð^Ð^ÍÈLÑHYÔHYÐ^Ð]^Ð^ÐHYÐ]^ÒH^Ð^Ð^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^ˆ} Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ˆtÑ^Ô^Ð^Õ^Ô^ˆtÑ^Ô^Ð^Ð^Õ^Ô^ˆ}Ñ^Ô^Õ^Ô^ Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^Ð)<ÀÐ^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^¨Ñ^Ô^Ð^Õ^Ô^¨Ñ^Ô^Ð^Ð^Õ^Ô^Ð)<Ñ^Ô^Õ^Ô^ÀÑ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^ÐHYÐ]^Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ÍÑ^Ô^Ð^Õ^Ô^ÍÑ^Ô^Ð^Ð^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ÈLÑ^Ô^Ð^Õ^Ô^ÈLÑ^Ô^Ð^Ð^Õ^Ô^ÐHYÑ^Ô^Õ^Ô^Ð]^Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Õ^Ô^Ð^Ð^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^ð ×&Ò& q¨!¨UµLÔ4DÐ[_Ð&Ñ`Ô`ˆØ_Ð_ˆtŒ}Ð_ Ð_ˆ} Ð%Ð_Ð_Ð_Ð_Ð_¨(Ô*=Ð_ÀÐ_Ð*=ÀÒ*DÐ_Ð_Ð_Ð_Ð_ÍÈ\ÑIZÔIZÐ_Ð^_Ð_ÐIZÐ^_ÒI_Ð_Ð_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_ˆ} Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ˆtÑ_Ô_Ð_Õ_Ô_ˆtÑ_Ô_Ð_Ð_Õ_Ô_ˆ}Ñ_Ô_Õ_Ô_ Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_Ð*=ÀÐ_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_¨(Ñ_Ô_Ð_Õ_Ô_¨(Ñ_Ô_Ð_Ð_Õ_Ô_Ð*=Ñ_Ô_Õ_Ô_ÀÑ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_ÐIZÐ^_Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ÍÑ_Ô_Ð_Õ_Ô_ÍÑ_Ô_Ð_Ð_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_È\Ñ_Ô_Ð_Õ_Ô_È\Ñ_Ô_Ð_Ð_Õ_Ô_ÐIZÑ_Ô_Õ_Ô_Ð^_Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Õ_Ô_Ð_Ð_Ñ_Ô_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_ð ×&Ò& q¨!¨Vµ\Ô5EÐ\`Ð&ÑaÔaˆØ@Ð@ˆtŒ}Ð@ Ð@ˆ} Ð%Ð@Ð@Ð@Ð@Ð@­#¨lÑ*;Ô*;Ð@¸qÐ@Ð*;¸qÒ*@Ð@Ð@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@ˆ} Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆtÑ@Ô@Ð@Õ@Ô@ˆtÑ@Ô@Ð@Ð@Õ@Ô@ˆ}Ñ@Ô@Õ@Ô@ Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð*;¸qÐ@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@­#Ñ@Ô@Ð@Õ@Ô@­#Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨lÑ@Ô@Ð@Õ@Ô@¨lÑ@Ô@Ð@Ð@Õ@Ô@Ð*;Ñ@Ô@Õ@Ô@¸qÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Õ@Ô@Ð@Ð@Ñ@Ô@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   c           	     ó"	  — t          ¦   «         }|                     |¦  «         d}|                     |dd¬¦  «         t          ddt          j        dd|¬	¦  «        }t          d
dt          j        dddd¬¦  «        }|                     |¦  «         |                     |¦  «         |                     dd
dt          j        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}	}|                     |¦  «        j        }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d
dt          j        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}	}|j        } ||¦  «        }|j        }||k    }|�s9t          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#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}}dS )'zHStriking a dead monster corpse does not award duplicate progression EXP.Úp_corpse_slayerr   r   r£   r\  ÚHerog      i@Tr|  re   ÚGobling      4@Fr  rT  rj  r«   rl  rŽ  r§   r¨   r©   Nr�  )z%(py0)s > %(py3)sÚexp_after_killr=   r?   r@   r’  r“  r   )zu%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_level_info
}(%(py3)s)
}.current_exp
} == %(py9)sr   r¯   r
  rš   r!   )r   rq  r²   r   r   rƒ  r„  rs  rt  ru  r&   r'   r(   r)   r*   r+   r,   r-   r·   r¤   )r.   r   rv  r¯   ÚheroÚgoblinrŽ  r/   r„   r0   rE   r¹   r¡  rC   rD   r“  r…   rW   rœ   r5   s                       r   Ú:test_combat_corpse_overkill_does_not_duplicate_monster_expzVTestCombatEngineIntegration.test_combat_corpse_overkill_does_not_duplicate_monster_exp™  s	  € õ ‘”ˆØ×)Ò)Ð*=Ñ>Ô>Ð>àˆØ×,Ò,¨S¸ÈÐ,ÑJÔJÐJÝ˜2˜v¥|Ô'7ÀUÐVZÐfiÐjÑjÔjˆÝ˜R ­<Ô+;ÈÐUYÐejÐrtÐuÑuÔuˆØ×Ò˜dÑ#Ô#Ð#Ø×Ò˜fÑ%Ô%Ð%à×&Ò& r¨2¨uµlÔ6FÐ]aÐ&ÑbÔbˆØŒ}Ð$ Ð$ˆ} Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ} Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆtÑ$Ô$Ð$Õ$Ô$ˆtÑ$Ô$Ð$Ð$Õ$Ô$ˆ}Ñ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø,×;Ò;¸CÑ@Ô@ÔLˆØ !Ð!ˆ~ Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ~ Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ~Ñ!Ô!Ð!Õ!Ô!ˆ~Ñ!Ô!Ð!Ð!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!à×&Ò& r¨2¨uµlÔ6FÐ]aÐ&ÑbÔbˆØŒ}Ð% Ð%ˆ} Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ} Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø"Ô1ÐTÐ1Ð1°#Ñ6Ô6ÐTÐ6ÔBÐTÐBÀnÒTÐTÐTÑTÕTÔTÐTÐTÐTÐTÐBÀnÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTÐ"ÑTÔTÐTÕTÔTÐ"ÑTÔTÐTÐTÕTÔTÐ1ÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔT°#ÑTÔTÐTÕTÔT°#ÑTÔTÐTÐTÕTÔTÐ6ÑTÔTÕTÔTÐBÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTÀnÑTÔTÐTÕTÔTÀnÑTÔTÐTÐTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTr   c           	     óž
  — t          ¦   «         }|                     |¦  «         d}|                     d¦  «        }|                     |d|d¬¦  «         t	          ddt
          j        ddd¬	¦  «        }t	          d
dt
          j        ddd|¬¦  «        }|                     |¦  «         |                     |¦  «         | 	                    dd
dt
          j        d¬¦  «        }| 	                    dd
dt
          j        d¬¦  «        }| 	                    dd
dt
          j        d¬¦  «        }	g }
|j
        }d}||u }|}|r|j
        }| }|}|r|	j
        }| }|}|�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Úddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }|
                     |¦  «         |rlddt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        dœz  }|
                     |¦  «         t          j        |
d¦  «        i z  }dd |iz  }t'          t          j        |¦  «        ¦  «        ‚d!x}x}
x}x}x}x}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}}t/          t1          j        |d)z  ¦  «        ¦  «        }|j        }
||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,t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd,d-œz  }d.d/|iz  }t'          t          j        |¦  «        ¦  «        ‚d!x}
x}}d!S )0zSMulti-hit barrage on player applies death penalty exactly once, not per projectile.Úp_victim_barragerd   r   rÑ   é   ÚBossrb  F)rd  ri  rv   é   ÚVictimr{  Trf  r€  rj  iÚ  iä  r«   r�  Úr1rß   rà   rQ   z,not %(py13)s
{%(py13)s = %(py11)s.is_fatal
}Úr2r=  z,not %(py18)s
{%(py18)s = %(py16)s.is_fatal
}Úr3)râ   rä   rì   rç   Nrw   r   rË   rÉ   r§   r¨   r©   r”   )z?%(py2)s
{%(py2)s = %(py0)s.current_exp
} == (%(py4)s - %(py5)s)Úd95Úexpected_penalty)r   r   r   r@   ri   r    )r   rq  rÁ   r²   r   r   rr  rƒ  rs  rt  ru  r&   r'   r(   r)   r*   r+   rÕ   rñ   r,   r-   r·   rÌ   rz   rN   Úfloorr¤   )r.   r   rv  r¯   r®  ÚbossÚplayerr«  r¬  r­  r/   r0   r…   r1   rj   rø   rY   Ú@py_assert17rE  r¹   rœ   rD  rû   r÷   r  rÉ   r„   rE   r¯  rk   rl   s                                  r   ÚLtest_combat_channeled_barrage_on_dead_player_does_not_multiply_death_penaltyzhTestCombatEngineIntegration.test_combat_channeled_barrage_on_dead_player_does_not_multiply_death_penalty°  sð  € õ ‘”ˆØ×)Ò)Ð*=Ñ>Ô>Ð>à ˆØ!×/Ò/°Ñ3Ô3ˆØ×,Ò,¨S¸ÈÐZ[Ð,Ñ\Ô\Ð\å˜2˜v¥|Ô'7ÀVÐW\ÐdfÐgÑgÔgˆÝ˜R ­<Ô+;ÈÐV[ÐgkÐwzÐ{Ñ{Ô{ˆØ×Ò˜dÑ#Ô#Ð#Ø×Ò˜fÑ%Ô%Ð%à×$Ò$ R¨¨Vµ\Ô5EÐ\`Ð$ÑaÔaˆØ×$Ò$ R¨¨Vµ\Ô5EÐ\`Ð$ÑaÔaˆØ×$Ò$ R¨¨Vµ\Ô5EÐ\`Ð$ÑaÔaˆàJÐJˆrŒ{ÐJ˜dÐJˆ{˜dÐ"ÐJÐJÐJÐJÐJ¨2¬;ÐJ¨; ÐJ ÐJ ÐJ¸r¼{ÐJ¸{¸?ÐJ¸?ÐJÐJÑJÕJÔJÐJÐJÐJÐJˆ{˜dÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJˆrÑJÔJÐJÕJÔJˆrÑJÔJÐJÐJÕJÔJˆ{ÑJÔJÕJÔJ˜dÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÐJ×JÒJÐJÑJÔJÐJÐJÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJ¨2ÑJÔJÐJÕJÔJ¨2ÑJÔJÐJÐJÕJÔJ¨;ÑJÔJÐJÐJÑJÐJÐJ×JÒJÐJÑJÔJÐJ ÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJ¸rÑJÔJÐJÕJÔJ¸rÑJÔJÐJÐJÕJÔJ¸{ÑJÔJÐJÐJÑJÐJÐJ×JÒJÐJÑJÔJÐJÕJÔJÐJÐJÑJÔJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJØ#×2Ò2°3Ñ7Ô7ˆØÔ!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Ð&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ý�tœz¨#°©*Ñ5Ô5Ñ6Ô6ÐØÔ Ð: CÐ*:Ñ$:Ð:Ð Ð$:Ò:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:Ð Ð$:Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆuÑ:Ô:Ð:Õ:Ô:ˆuÑ:Ô:Ð:Ð:Õ:Ô:Ð Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô: CÑ:Ô:Ð:Õ:Ô: CÑ:Ô:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:Ð*:Ñ:Ô:Ð:Õ:Ô:Ð*:Ñ:Ô:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:r   Nrn   )r   r   )	ro   rp   rq   rr   rx  r…  rœ  r¤  r´  rs   r   r   r_  r_  L  sŽ   € € € € € ØKÐKðFð Fð Fð Fð4Uð Uð Uð Uð2Að Að Að Að.Uð Uð Uð Uð.;ð ;ð ;ð ;ð ;ð ;r   r_  )r   r   )rr   Ú
__future__r   Úbuiltinsr(   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter&   rN   Útypingr   r  Úserver.world.combat_enginer   r   r   Ú&server.world.level_progression_servicer	   Ú$server.world.level_progression_typesr
   Úserver.world.martial_matrixr   Úfixturer   r   ru   r  r.  rQ  r_  rs   r   r   ú<module>rÀ     sÿ  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð Ø €€€à SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SØ JÐ JÐ JÐ JÐ JÐ JØ CÐ CÐ CÐ CÐ CÐ CØ 4Ð 4Ð 4Ð 4Ð 4Ð 4ð „ðð ð ñ „ðð,$ð ,$ð ,$ð ,$ð ,$ñ ,$ô ,$ð ,$ð^t ð t ð t ð t ð t ñ t ô t ð t ðn+&ð +&ð +&ð +&ð +&ñ +&ô +&ð +&ð\@Vð @Vð @Vð @Vð @Vñ @Vô @Vð @VðFJð Jð Jð Jð Jñ Jô Jð Jð8|;ð |;ð |;ð |;ð |;ñ |;ô |;ð |;ð |;ð |;r   