§
    Gi½jŽ!  ã                  ó   — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZ ej                             ej                             ej                             e¦  «        dd¦  «        ¦  «        Zej                             de¦  «          eej        d¦  «        rej                             d	¬
¦  «         ddlmZmZ  G d„ de¦  «        Z edd¬¦  «         G d„ d¦  «        ¦   «         Z  ed¬¦  «         G d„ d¦  «        ¦   «         Z! G d„ d¦  «        Z"dd„Z#e$dk    r ej%         e#¦   «         ¦  «         dS dS )uÈ  
ARPG Crafting & Economy Monte Carlo Simulator for FreeExile.
Simulates item crafting odds, 15-tier affix distributions, and barter currency sinks:
- Huyáº¿t Há»“n Tháº¡ch (Chaos Reroll 3-6 mods)
- Háº¯c SÆ¡ Tháº¡ch / Cá»• Cá»‘t áº¤n (Alt / Regal)
- U Minh Cá»‘t Ä�inh (Exalted Slam) / Cá»‘t Ä�ao TÆ°á»›c Ä�oáº¡t (Annul)
- TÃ  Huyáº¿t Dá»‹ Biáº¿n Tháº¡ch (25% Annihilation/Brick)
Strictly adheres to Clean Architecture, Zero-Drift, and <= 350 lines limit.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚDictÚListÚOptionalÚTupleÚSetz..Úreconfigurezutf-8)Úencoding)ÚSTANDARD_ILVLSÚSTANDARD_WEIGHTSc                  ó   — e Zd ZdZdZdZdS )ÚCraftingMethodÚ
CHAOS_SPAMÚALT_REGAL_EXALTÚCORRUPTION_GAMBLEN)Ú__name__Ú
__module__Ú__qualname__r   r   r   © ó    ú;C:\Projects\FreeExile\tools\math\arpg_crafting_simulator.pyr   r      s    € € € € € Ø€JØ'€OØ+ÐÐÐr   r   T)ÚslotsÚfrozenc                  ó:   — e Zd ZU dZded<   dZded<   dZded<   dS )	ÚCraftingTargeté   ÚintÚtarget_tieré   Úmin_matching_modséU   Ú
item_levelN)r   r   r   r!   Ú__annotations__r#   r%   r   r   r   r   r   %   sF   € € € € € € à€KÐÐÐÑØÐÐÐÐÑØ€JÐÐÐÑÐÐr   r   )r   c                  ó‚   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<    ee¬¦  «        Zded<   dS )ÚSimulationResultr   Úmethodr    Útotal_trialsÚsuccessful_craftsÚbricked_itemsÚfloatÚavg_attempts_per_successÚp50_attemptsÚp95_attemptsÚp99_attempts)Údefault_factoryzDict[str, int]Útotal_currency_spentN)r   r   r   r&   r   Údictr3   r   r   r   r(   r(   ,   s‘   € € € € € € àÐÐÑØÐÐÑØÐÐÑØÐÐÑØ#Ð#Ð#Ñ#ØÐÐÑØÐÐÑØÐÐÑØ+0¨5ÀÐ+FÑ+FÔ+FÐÐFÐFÐFÑFÐFÐFr   r(   c                  óB   — e Zd ZdZddd„Zdd„Zddd„Zddd„Zddd„ZdS ) ÚArpgCraftingSimulatorz?Monte Carlo engine for evaluating ARPG item crafting economics.r$   Úilvl_filterr    c                ó‚  — || _         g | _        t          t          ¦  «        D ]P\  }}|dz   }||k    r&| j                             t
          |         ¦  «         Œ6| j                             d¦  «         ŒQt          | j        ¦  «        | _        g | _        d}| j        D ]!}||z  }| j                             |¦  «         Œ"d S )Nr   r   )	r7   Útier_weightsÚ	enumerater   Úappendr   ÚsumÚtotal_weightÚcumulative_weights)Úselfr7   ÚidxÚilvlÚtierÚcÚws          r   Ú__init__zArpgCraftingSimulator.__init__<   sÚ   € Ø&ˆÔà')ˆÔÝ"¥>Ñ2Ô2ð 	,ð 	,‰IˆC�Ø˜‘7ˆDØ˜dÒ"Ð"ØÔ!×(Ò(Õ)9¸#Ô)>Ñ?Ô?Ð?Ð?àÔ!×(Ò(¨Ñ+Ô+Ð+Ð+å Ô 1Ñ2Ô2ˆÔØ-/ˆÔØˆØÔ"ð 	.ð 	.ˆAØ�‰FˆAØÔ#×*Ò*¨1Ñ-Ô-Ð-Ð-ð	.ð 	.r   Úreturnc                óˆ   — t          j        d| j        ¦  «        }t          | j        ¦  «        D ]\  }}||k    r|dz   c S ŒdS )z<Rolls a random affix tier (1-15) based on canonical weights.r   é   )ÚrandomÚrandintr=   r:   r>   )r?   Úrr@   Úcws       r   Úroll_random_tierz&ArpgCraftingSimulator.roll_random_tierN   sT   € åŒN˜1˜dÔ/Ñ0Ô0ˆÝ  Ô!8Ñ9Ô9ð 	ð 	‰GˆC�Ø�BŠwˆwØ˜Q‘w���ð àˆrr   é N  Útargetr   Úmax_attemptsúTuple[bool, int]c                óò   — t          d|dz   ¦  «        D ]`}t          j        dd¦  «        }d}t          |¦  «        D ]&}|                      ¦   «         }||j        k    r|dz  }Œ'||j        k    rd|fc S Œad|fS )uH   Simulates Chaos Spam (Huyáº¿t Há»“n Tháº¡ch reroll) until target is hit.r   é   é   r   TF)ÚrangerI   rJ   rM   r!   r#   )r?   rO   rP   ÚattemptÚnum_modsÚmatching_modsÚ_Úrolled_tiers           r   Úsimulate_chaos_craftz*ArpgCraftingSimulator.simulate_chaos_craftV   s£   € å˜Q ¨qÑ 0Ñ1Ô1ð 	%ð 	%ˆGÝ”~ a¨Ñ+Ô+ˆHØˆMÝ˜8‘_”_ð 'ð '�Ø"×3Ò3Ñ5Ô5�Ø &Ô"4Ò4Ð4Ø! QÑ&�MøØ Ô 8Ò8Ð8Ø˜W�}Ð$Ð$Ð$ð 9à�lÐ"Ð"r   éè  ÚtrialsúTuple[int, int, int]c                óœ   — d}d}d}t          |¦  «        D ]2}t          j        ¦   «         }|dk     r|dz  }Œ!|dk     r|dz  }Œ-|dz  }Œ3|||fS )uÎ   
        Simulates Vaal Corruption (TÃ  Huyáº¿t Dá»‹ Biáº¿n Tháº¡ch):
        25% Brick (Destroyed), 25% God-tier T0 Impl, 25% Scramble, 25% Locked.
        Returns: (successes, bricks, no_changes)
        r   g      Ð?r   ç      à?)rU   rI   )r?   rO   r]   ÚbricksÚ	successesÚ
no_changesrY   Úrolls           r   Úsimulate_corruption_gamblez0ArpgCraftingSimulator.simulate_corruption_gamblec   ss   € ð ˆØˆ	Øˆ
Ý�v‘”ð 	 ð 	 ˆAÝ”=‘?”?ˆDØ�dŠ{ˆ{Ø˜!‘��Ø˜’�Ø˜Q‘�	�	à˜a‘�
�
Ø˜& *Ð,Ð,r   r)   r   Ú
iterationsr(   c                óè  — g }d}i }|t           j        k    �ret          |¦  «        D ]6}|                      |¦  «        \  }}	|r|dz  }|                     |	¦  «         Œ7|                     ¦   «          |rt          |¦  «        t          |¦  «        z  nd}
|r%|t          t          |¦  «        dz  ¦  «                 nd}|r%|t          t          |¦  «        dz  ¦  «                 nd}|r%|t          t          |¦  «        dz  ¦  «                 nd}t          |¦  «        |d<   t          dd|j	        d	z  z   d
z  z  ¦  «        }t          |¦  «        |z  |d<   t          |||dt          |
d¦  «        ||||¬¦	  «	        S |t           j        k    rQ|                      ||¬¦  «        \  }}}||d<   t          |||||dk    rt          ||z  d¦  «        ndddd|¬¦	  «	        S t          ||dddddd¦  «        S )zGRuns batch Monte Carlo simulations and returns statistical percentiles.r   r   g        r`   gffffffî?g®Gáz®ï?ÚHUYET_HON_THACHé2   g      9@gš™™™™™ù?ÚGOLD_FEE)	r)   r*   r+   r,   r.   r/   r0   r1   r3   )r]   ÚTA_HUYET_DI_BIEN_THACHr"   é   é   é   )r   r   rU   r[   r;   Úsortr<   Úlenr    r%   r(   Úroundr   re   )r?   r)   rO   rf   Úattempts_listÚsuccess_countÚtotal_spentrY   ÚsuccessÚattemptsÚavg_attÚp50Úp95Úp99Úgold_per_clickÚsuccra   Ú	unchangeds                     r   Úrun_monte_carloz%ArpgCraftingSimulator.run_monte_carlov   s\  € à#%ˆØˆØ&(ˆà•^Ô.Ò.Ñ.Ý˜:Ñ&Ô&ð 3ð 3�Ø$(×$=Ò$=¸fÑ$EÔ$EÑ!�˜Øð 3Ø! QÑ&�MØ!×(Ò(¨Ñ2Ô2Ð2øà×ÒÑ Ô Ð ØANÐW•c˜-Ñ(Ô(­3¨}Ñ+=Ô+=Ñ=Ð=ÐTWˆGØCPÐW�-¥¥C¨Ñ$6Ô$6¸Ñ$=Ñ >Ô >Ô?Ð?ÐVWˆCØCPÐW�-¥¥C¨Ñ$6Ô$6¸Ñ$=Ñ >Ô >Ô?Ð?ÐVWˆCØCPÐW�-¥¥C¨Ñ$6Ô$6¸Ñ$=Ñ >Ô >Ô?Ð?ÐVWˆCå-0°Ñ-?Ô-?ˆKÐ)Ñ*å  ¨¨FÔ,=ÀÑ,DÑ(DÈÑ'LÑ!MÑNÔNˆNÝ&)¨-Ñ&8Ô&8¸>Ñ&IˆK˜
Ñ#å#ØØ'Ø"/ØÝ).¨w¸Ñ):Ô):Ø Ø Ø Ø%0ð
ñ 
ô 
ð 
ð •~Ô7Ò7Ð7Ø&*×&EÒ&EÀfÐU_Ð&EÑ&`Ô&`Ñ#ˆD�&˜)Ø4>ˆKÐ0Ñ1Ý#ØØ'Ø"&Ø$ØHLÈqÊÈ­¨z¸DÑ/@À!Ñ)DÔ)DÐ)DÐVYØØØØ%0ð
ñ 
ô 
ð 
õ   ¨
°A°q¸#¸qÀ!ÀQÑGÔGÐGr   N)r$   )r7   r    ©rF   r    )rN   )rO   r   rP   r    rF   rQ   )r\   )rO   r   r]   r    rF   r^   )r)   r   rO   r   rf   r    rF   r(   )	r   r   r   Ú__doc__rE   rM   r[   re   r~   r   r   r   r6   r6   9   s™   € € € € € ØIÐIð.ð .ð .ð .ð .ð$ð ð ð ð#ð #ð #ð #ð #ð-ð -ð -ð -ð -ð&4Hð 4Hð 4Hð 4Hð 4Hð 4Hð 4Hr   r6   rF   r    c                 ó  — t          j        d¬¦  «        } |                      dt          dd¬¦  «         |                      dt          dd	¬¦  «         |                      d
t          dd¬¦  «         |                      dt          dd¬¦  «         |                      dddgdd¬¦  «         |                      ¦   «         }t          |j        ¬¦  «        }t          |j        |j	        |j        ¬¦  «        }|j
        dk    rt          j        nt          j        }|                     |||j        ¬¦  «        }t!          d¦  «         t!          d¦  «         t!          d¦  «         t!          d|j
        j        › �¦  «         t!          d|j        › �¦  «         t!          d|j	        › d|j        › �¦  «         t!          d|j        d›�¦  «         t!          d |j        d›d!|j        |j        z  d"z  d#›d$�¦  «         |j        d%k    r-t!          d&|j        d›d!|j        |j        z  d"z  d#›d$�¦  «         t!          d'¦  «         t!          d(|j        d)›d*�¦  «         t!          d+|j        d›d*�¦  «         t!          d,|j        d›d*�¦  «         t!          d-|j        d›d*�¦  «         t!          d'¦  «         t!          d.¦  «         |j                             ¦   «         D ]\  }}t!          d/|d0›d1|d›�¦  «         Œt!          d¦  «         d%S )2Nz$Monte Carlo ARPG Crafting Simulator.)Údescriptionz--iterationsr\   zNumber of Monte Carlo trials.)ÚtypeÚdefaultÚhelpz--target-tierr   z Desired affix tier (1=God-tier).z
--min-modsr"   z#Minimum number of target tier mods.z--ilvlr$   zItem Level (iLvl).z--methodÚchaosÚcorruptzCrafting method.)Úchoicesr„   r…   )r7   )r!   r#   r%   )rf   zA=================================================================z9 FREEEXILE MONTE CARLO ARPG CRAFTING & ECONOMY BENCHMARK zMethod:               zItem Level (iLvl):    zTarget Criteria:      >=zx Affix <= Tier zTotal Trials:         ú,zSuccessful Crafts:    z (éd   z.1fz%)r   zBricked/Deleted Items:zA-----------------------------------------------------------------zAverage Attempts:     z,.1fz rollszPercentile p50 (Med): zPercentile p95 (95%): zPercentile p99 (99%): zTOTAL BARTER CURRENCY SUNK:u      â€¢ z<22z: )ÚargparseÚArgumentParserÚadd_argumentr    Ú
parse_argsr6   rA   r   r!   Úmin_modsr)   r   r   r   r~   rf   ÚprintÚvaluer*   r+   r,   r.   r/   r0   r1   r3   Úitems)ÚparserÚargsÚ	simulatorrO   r)   ÚresÚcurrÚamts           r   Úmainr™   ­   sK  € ÝÔ$Ð1WÐXÑXÔX€FØ
×Ò˜­S¸$ÐEdÐÑeÔeÐeØ
×Ò˜­c¸1ÐCeÐÑfÔfÐfØ
×Ò˜­3¸Ð@eÐÑfÔfÐfØ
×Ò˜¥s°BÐ=QÐÑRÔRÐRØ
×Ò˜
¨W°iÐ,@È'ÐXjÐÑkÔkÐkØ×ÒÑÔ€Då%°$´)Ð<Ñ<Ô<€IÝ¨Ô(8ÈDÌMÐfjÔfoÐpÑpÔp€Fà*.¬+¸Ò*@Ð*@�^Ô&Ð&ÅnÔFf€FØ
×
#Ò
# F¨F¸t¼Ð
#Ñ
OÔ
O€Cå	ˆ(�O„O€OÝ	Ð
EÑFÔFÐFÝ	ˆ(�O„O€OÝ	Ð
5 3¤:Ô#3Ð
5Ð
5Ñ6Ô6Ð6Ý	Ð
. 4¤9Ð
.Ð
.Ñ/Ô/Ð/Ý	Ð
V T¤]Ð
VÐ
VÀDÔDTÐ
VÐ
VÑWÔWÐWÝ	Ð
7 3Ô#3Ð
7Ð
7Ð
7Ñ8Ô8Ð8Ý	Ð
t 3Ô#8Ð
tÐ
tÐ
t¸sÔ?TÐWZÔWgÑ?gÐilÑ>lÐ
tÐ
tÐ
tÐ
tÑuÔuÐuØ
Ô˜1ÒÐÝÐp sÔ'8ÐpÐpÐp¸sÔ?PÐSVÔScÑ?cÐehÑ>hÐpÐpÐpÐpÑqÔqÐqÝ	ˆ(�O„O€OÝ	Ð
L 3Ô#?Ð
LÐ
LÐ
LÐ
LÑMÔMÐMÝ	Ð
= 3Ô#3Ð
=Ð
=Ð
=Ð
=Ñ>Ô>Ð>Ý	Ð
= 3Ô#3Ð
=Ð
=Ð
=Ð
=Ñ>Ô>Ð>Ý	Ð
= 3Ô#3Ð
=Ð
=Ð
=Ð
=Ñ>Ô>Ð>Ý	ˆ(�O„O€OÝ	Ð
'Ñ(Ô(Ð(ØÔ-×3Ò3Ñ5Ô5ð -ð -‰	ˆˆcÝÐ+˜Ð+Ð+Ð+ CÐ+Ð+Ð+Ñ,Ô,Ð,Ð,Ý	ˆ(�O„O€OØˆ1r   Ú__main__r   )&r€   Ú
__future__r   ÚsysÚosr‹   rI   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r   ÚpathÚabspathÚjoinÚdirnameÚ__file__ÚPROJECT_ROOTÚinsertÚhasattrÚstdoutr   Úserver.world.item_affix_catalogr   r   r   r   r(   r6   r™   r   Úexitr   r   r   ú<module>r¬      sf  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð Œw�Š˜rœwŸ|š|¨B¬G¯OªO¸HÑ,EÔ,EÀtÈTÑRÔRÑSÔS€Ø „‡‚��<Ñ  Ô  Ð  à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,à LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lð,ð ,ð ,ð ,ð ,�Tñ ,ô ,ð ,ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�ÐÑÔð	Gð 	Gð 	Gð 	Gð 	Gñ 	Gô 	Gñ Ôð	GðqHð qHð qHð qHð qHñ qHô qHð qHðh#ð #ð #ð #ðL ˆzÒÐØ€C„HˆTˆT‰VŒVÑÔÐÐÐð Ðr   