§
    ~±¼jE'  ã                  ó˜   — d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZmZmZmZmZmZ ddlmZmZmZ ddgZ G d	„ d¦  «        Zdd„ZdS )zÇ
Storyline and Beggar's Chronicle Engine for FreeExile.
Manages narrative progression, journal unlocks, cutscene triggers,
and evolution from a destitute mendicant to the sovereign of the deadlands.
é    )ÚannotationsN)ÚDictÚListÚOptionalÚAnyÚTuple)ÚStoryActÚBeggarAscentStageÚJournalEntryÚStoryActDefinitionÚStoryCutsceneÚPlayerStoryState)Úget_canonical_actsÚget_canonical_journalsÚget_canonical_cutscenesÚStorylineEngineÚcreate_default_storyline_enginec                  ó‚   — 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-d„Z
d-d„Zd.d„Zd/d„Zd0d!„Zd1d"„Zd2d$„Zd3d%„Zd&S )4r   zHServer-Authoritative engine for the Beggar's Chronicle narrative system.ÚreturnÚNonec                óZ   — i | _         i | _        i | _        i | _        i | _        i | _        d S ©N)Ú_actsÚ	_journalsÚ
_cutscenesÚ_quest_to_journalÚ_quest_to_cutsceneÚ_player_states)Úselfs    ú6C:\Projects\FreeExile\server\world\storyline_engine.pyÚ__init__zStorylineEngine.__init__"   s5   € Ø9;ˆŒ
Ø24ˆŒØ46ˆŒØ79ˆÔØ8:ˆÔØ;=ˆÔÐÐó    Úact_defr   c                ó$   — || j         |j        <   d S r   )r   Úact)r   r#   s     r    Úregister_actzStorylineEngine.register_act*   s   € Ø")ˆŒ
�7”;ÑÐÐr"   Úentryr   c                ó²   — || j         |j        <   |j        | j        vrg | j        |j        <   | j        |j                                      |j        ¦  «         d S r   )r   Ú
journal_idÚunlock_quest_idr   Úappend)r   r'   s     r    Úregister_journalz StorylineEngine.register_journal-   sZ   € Ø+0ˆŒ�uÔ'Ñ(ØÔ ¨Ô(>Ð>Ð>Ø<>ˆDÔ" 5Ô#8Ñ9ØÔ˜uÔ4Ô5×<Ò<¸UÔ=MÑNÔNÐNÐNÐNr"   Úcutscener   c                ó²   — || j         |j        <   |j        | j        vrg | j        |j        <   | j        |j                                      |j        ¦  «         d S r   )r   Úcutscene_idÚtrigger_quest_idr   r+   )r   r-   s     r    Úregister_cutscenez!StorylineEngine.register_cutscene3   sZ   € Ø08ˆŒ˜Ô,Ñ-ØÔ$¨DÔ,CÐCÐCØACˆDÔ# HÔ$=Ñ>ØÔ Ô 9Ô:×AÒAÀ(ÔBVÑWÔWÐWÐWÐWr"   r%   r	   úOptional[StoryActDefinition]c                ó6   — | j                              |¦  «        S r   )r   Úget)r   r%   s     r    Úget_actzStorylineEngine.get_act9   s   € ØŒz�~Š~˜cÑ"Ô"Ð"r"   r)   ÚstrúOptional[JournalEntry]c                ó6   — | j                              |¦  «        S r   )r   r4   )r   r)   s     r    Úget_journalzStorylineEngine.get_journal<   s   € ØŒ~×!Ò! *Ñ-Ô-Ð-r"   Ú	player_idr   c                óÆ   — || j         v r| j         |         S t          j        ¦   «         }t          |t          j        t
          j        g g g g d||¬¦
  «
        }|| j         |<   |S )Nõ   Káº» Ä‚n MÃ y RÃ¡ch RÆ°á»›i)
r:   Úcurrent_actÚcurrent_stageÚcompleted_actsÚunlocked_journal_idsÚread_journal_idsÚcompleted_quest_idsÚreputation_titleÚ
started_atÚ
updated_at)r   Útimer   r	   ÚACT_I_HUNGERr
   Ú	MENDICANT)r   r:   ÚnowÚinitial_states       r    Úinitialize_player_storyz'StorylineEngine.initialize_player_story?   sv   € Ø˜Ô+Ð+Ð+ØÔ& yÔ1Ð1åŒi‰kŒkˆÝ(ØÝ Ô-Ý+Ô5ØØ!#ØØ "Ø:ØØð
ñ 
ô 
ˆð *7ˆÔ˜IÑ&ØÐr"   c                ó,   — |                       |¦  «        S r   )rK   )r   r:   s     r    Úget_player_story_statez&StorylineEngine.get_player_story_stateS   s   € Ø×+Ò+¨IÑ6Ô6Ð6r"   Úquest_idúDict[str, Any]c           
     óà  — |                       |¦  «        }||j        vr|j                             |¦  «         g }| j                             |g ¦  «        D ]Q}||j        vrF|j                             |¦  «         |                      |¦  «        }|r|                     |¦  «         ŒRg }| j                             |g ¦  «        D ]3}| j                             |¦  «        }	|	r|                     |	¦  «         Œ4|  	                    |¦  «        \  }
}|  
                    |¦  «        \  }}t          j        ¦   «         |_        ||d„ |D ¦   «         d„ |D ¦   «         |
|j        ||j        |j        dœ	S )z:Invoked when a quest or milestone is completed or claimed.c                ó   — g | ]	}|j         ‘Œ
S © )r)   )Ú.0Újs     r    ú
<listcomp>z6StorylineEngine.on_quest_completed.<locals>.<listcomp>q   s   € Ð!EÐ!EÐ!E°1 !¤,Ð!EÐ!EÐ!Er"   c                ó   — g | ]	}|j         ‘Œ
S rR   )r/   )rS   Úcs     r    rU   z6StorylineEngine.on_quest_completed.<locals>.<listcomp>r   s   € Ð#OÐ#OÐ#O°a A¤MÐ#OÐ#OÐ#Or"   )	r:   rN   Úunlocked_journalsÚtriggered_cutscenesÚstage_changedr>   Úact_changedr=   rC   )rK   rB   r+   r   r4   r@   r9   r   r   Ú_evaluate_stage_progressionÚ_evaluate_act_progressionrF   rE   ÚvaluerC   )r   r:   rN   ÚstateÚnew_journalsÚj_idr'   rY   Úc_idr-   rZ   Ú	new_stager[   Únew_acts                 r    Úon_quest_completedz"StorylineEngine.on_quest_completedV   sž  € à×,Ò,¨YÑ7Ô7ˆØ˜5Ô4Ð4Ð4ØÔ%×,Ò,¨XÑ6Ô6Ð6à+-ˆØÔ*×.Ò.¨x¸Ñ<Ô<ð 	/ð 	/ˆDØ˜5Ô5Ð5Ð5ØÔ*×1Ò1°$Ñ7Ô7Ð7Ø×(Ò(¨Ñ.Ô.�Øð /Ø ×'Ò'¨Ñ.Ô.Ð.øà35ÐØÔ+×/Ò/°¸"Ñ=Ô=ð 	5ð 	5ˆDØ”×*Ò*¨4Ñ0Ô0ˆHØð 5Ø#×*Ò*¨8Ñ4Ô4Ð4øà#'×#CÒ#CÀEÑ#JÔ#JÑ ˆ�yØ#×=Ò=¸eÑDÔDÑˆ�WÝœ9™;œ;ˆÔð #Ø Ø!EÐ!E¸Ð!EÑ!EÔ!EØ#OÐ#OÐ;NÐ#OÑ#OÔ#OØ*Ø&œ_Ø&Ø"œ=Ø %Ô 6ð

ð 

ð 
	
r"   r_   úTuple[bool, BeggarAscentStage]c                ó6  — t          |j        ¦  «        }|j        }t          j        }d}d|v sd|v rt          j        }d}nDd|v sd|v rt          j        }d}n-d|v sd	|v rt          j        }d
}nd|v sd|v rt          j        }d}||_        ||_	        ||k    |fS )z7Calculates stage advancement based on completed quests.r<   Úms_tier_5_van_gioi_chi_tonÚ'quest_epic_04_van_gioi_than_ma_tranh_bau#   BÃ¡ Chá»§ Tá»‘i Cao CÃµi LÆ°u Ä�Ã yÚ#quest_epic_02_nghich_menh_dai_huyetÚquest_hidden_04_u_hon_oan_kiemu    Thá»£ SÄƒn Cá»± ThÃº Cá»• Ä�áº¡iÚquest_epic_01_phong_ma_co_tranÚ!quest_hidden_02_tan_bi_than_tuongu   Cuá»“ng Cá»‘t Chiáº¿n Giáº£Ú quest_norm_04_diet_u_hon_kiem_noÚquest_hidden_01_huyen_anh_to_suu   Káº» MÃ³t XÆ°Æ¡ng BÃ¹n Ä�á»™c)
ÚsetrB   r>   r
   rH   ÚSOVEREIGN_OUTCASTÚPRIMAL_HUNTERÚBONE_WARRIORÚ	SCAVENGERrC   )r   r_   Ú	completedÚ
prev_stageÚtarget_stageÚtitles         r    r\   z+StorylineEngine._evaluate_stage_progressionz   sÝ   € å˜Ô1Ñ2Ô2ˆ	ØÔ(ˆ
Ý(Ô2ˆØ-ˆà'¨9Ð4Ð4Ð8aÐenÐ8nÐ8nÝ,Ô>ˆLØ9ˆEˆEØ2°iÐ?Ð?ÐCcÐgpÐCpÐCpÝ,Ô:ˆLØ6ˆEˆEØ-°Ð:Ð:Ð>aÐenÐ>nÐ>nÝ,Ô9ˆLØ1ˆEˆEØ/°9Ð<Ð<Ð@aÐenÐ@nÐ@nÝ,Ô6ˆLØ3ˆEà*ˆÔØ!&ˆÔØ 
Ò*¨LÐ9Ð9r"   úTuple[bool, StoryAct]c                óÖ  ‡— t          |j        ¦  «        Š|j        }t          j        }t          ˆfd„dD ¦   «         ¦  «        rt          j        }nwt          ˆfd„dD ¦   «         ¦  «        rt          j        }nOt          ˆfd„dD ¦   «         ¦  «        rt          j        }n't          ˆfd„dD ¦   «         ¦  «        rt          j	        }||_        t          j        t          j	        t          j        t          j        t          j        f}| 
                    |¦  «        }t          |d	d
…         ¦  «        D ].\  }}||k    r#||j        vr|j                             |¦  «         Œ/||k    |fS )zICalculates current narrative act based on journal entries and milestones.c              3  ó    •K  — | ]}|‰v V — Œ	d S r   rR   ©rS   rT   Úunlockeds     €r    ú	<genexpr>z<StorylineEngine._evaluate_act_progression.<locals>.<genexpr>˜   s?   øè è € ð  Qð  Q ˆq�Hˆ}ð  Qð  Qð  Qð  Qð  Qð  Qr"   )Ú!journal_13_sau_canh_cong_hu_khongÚjournal_14_chua_te_quy_vuongÚ journal_15_vinh_quang_dinh_phongc              3  ó    •K  — | ]}|‰v V — Œ	d S r   rR   r|   s     €r    r~   z<StorylineEngine._evaluate_act_progression.<locals>.<genexpr>š   s?   øè è € ð  Mð  M 1��h�ð  Mð  Mð  Mð  Mð  Mð  Mr"   )Újournal_10_dau_truong_xe_thitÚjournal_11_ha_guc_cuong_vienÚjournal_12_khac_an_nghich_menhc              3  ó    •K  — | ]}|‰v V — Œ	d S r   rR   r|   s     €r    r~   z<StorylineEngine._evaluate_act_progression.<locals>.<genexpr>œ   s?   øè è € ð  Fð  F 1��h�ð  Fð  Fð  Fð  Fð  Fð  Fr"   )Újournal_07_con_khat_sa_macÚjournal_08_bo_cap_khong_loÚjournal_09_nhung_ke_cung_khoc              3  ó    •K  — | ]}|‰v V — Œ	d S r   rR   r|   s     €r    r~   z<StorylineEngine._evaluate_act_progression.<locals>.<genexpr>ž   s?   øè è € ð  Jð  J 1��h�ð  Jð  Jð  Jð  Jð  Jð  Jr"   )Újournal_04_bun_ngap_ngang_ngucÚjournal_05_gap_lai_cai_ngucÚjournal_06_doan_truy_co_thiNéÿÿÿÿ)rp   r@   r=   r	   rG   ÚanyÚACT_V_SOVEREIGNÚACT_IV_TITAN_HUNTÚACT_III_CRUCIBLEÚACT_II_MIASMAÚindexÚ	enumerater?   r+   )	r   r_   Úprev_actÚ
target_actÚact_sequenceÚ
target_idxÚidxr%   r}   s	           @r    r]   z)StorylineEngine._evaluate_act_progression’   sÿ  ø€ å�uÔ1Ñ2Ô2ˆØÔ$ˆÝÔ*ˆ
åð  Qð  Qð  Qð  Qð  'Pð  Qñ  Qô  Qñ  Qô  Qð 	0Ý!Ô1ˆJˆJÝð  Mð  Mð  Mð  Mð  )Lð  Mñ  Mô  Mñ  Mô  Mð 	0Ý!Ô3ˆJˆJÝð  Fð  Fð  Fð  Fð  )Eð  Fñ  Fô  Fñ  Fô  Fð 	0Ý!Ô2ˆJˆJÝð  Jð  Jð  Jð  Jð  )Ið  Jñ  Jô  Jñ  Jô  Jð 	0Ý!Ô/ˆJà&ˆÔåÔ!ÝÔ"ÝÔ%ÝÔ&ÝÔ$ð
ˆð "×'Ò'¨
Ñ3Ô3ˆ
Ý! ,¨s°¨sÔ"3Ñ4Ô4ð 	1ð 	1‰HˆC�Ø˜CÒÐ C¨uÔ/CÐ$CÐ$CØÔ$×+Ò+¨CÑ0Ô0Ð0øà˜hÒ&¨
Ð3Ð3r"   c                óâ   — |                       |¦  «        }||j        vrdS ||j        vr2|j                             |¦  «         t	          j        ¦   «         |_        |                      |¦  «        S )z3Marks a journal entry as read and returns its data.N)rK   r@   rA   r+   rF   rE   r9   )r   r:   r)   r_   s       r    Úread_journalzStorylineEngine.read_journal°   so   € à×,Ò,¨YÑ7Ô7ˆØ˜UÔ7Ð7Ð7Ø�4Ø˜UÔ3Ð3Ð3ØÔ"×)Ò)¨*Ñ5Ô5Ð5Ý#œy™{œ{ˆEÔØ×Ò 
Ñ+Ô+Ð+r"   úList[JournalEntry]c                óÎ   — |                       |¦  «        }g }|j        D ].}|                      |¦  «        }|r|                     |¦  «         Œ/|                     d„ ¬¦  «         |S )Nc                ó   — | j         S r   )Úchapter_index)Úxs    r    ú<lambda>z7StorylineEngine.get_unlocked_journals.<locals>.<lambda>Á   s   €  1¤?€ r"   )Úkey)rK   r@   r9   r+   Úsort)r   r:   r_   Úresultsra   r'   s         r    Úget_unlocked_journalsz%StorylineEngine.get_unlocked_journalsº   sw   € Ø×,Ò,¨YÑ7Ô7ˆØ&(ˆØÔ.ð 	&ð 	&ˆDØ×$Ò$ TÑ*Ô*ˆEØð &Ø—’˜uÑ%Ô%Ð%øØ�ŠÐ2Ð2ˆÑ3Ô3Ð3Øˆr"   c                ó¬  — |                       |¦  «        }|                      |j        ¦  «        }||j        j        |r|j        nd|r|j        nd|j        j        |j        t          |j	        ¦  «        t          | j
        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j	        ¦  «        t          |j        ¦  «        dœS )zCProvides a comprehensive overview of the player's Beggar's Journey.Ú )r:   r=   Úcurrent_act_titleÚcurrent_act_subtitler>   rC   Útotal_journals_unlockedÚtotal_journals_availableÚtotal_acts_completedÚcompleted_quests_countr@   rA   )rK   r5   r=   r^   rx   Úsubtitler>   rC   Úlenr@   r   r?   rB   ÚlistrA   )r   r:   r_   Úcurrent_act_defs       r    Úget_chronicle_summaryz%StorylineEngine.get_chronicle_summaryÄ   sÉ   € à×,Ò,¨YÑ7Ô7ˆØŸ,š, uÔ'8Ñ9Ô9ˆð #Ø Ô,Ô2Ø:IÐ!Q Ô!6Ð!6ÈrØ@OÐ$W OÔ$<Ð$<ÐUWØ"Ô0Ô6Ø %Ô 6Ý'*¨5Ô+EÑ'FÔ'FÝ(+¨D¬NÑ(;Ô(;Ý$'¨Ô(<Ñ$=Ô$=Ý&)¨%Ô*CÑ&DÔ&DÝ$(¨Ô)CÑ$DÔ$DÝ $ UÔ%;Ñ <Ô <ð
ð 
ð 	
r"   N)r   r   )r#   r   r   r   )r'   r   r   r   )r-   r   r   r   )r%   r	   r   r2   )r)   r6   r   r7   )r:   r6   r   r   )r:   r6   rN   r6   r   rO   )r_   r   r   rf   )r_   r   r   ry   )r:   r6   r)   r6   r   r7   )r:   r6   r   r�   )r:   r6   r   rO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r&   r,   r1   r5   r9   rK   rM   re   r\   r]   rœ   r¦   r³   rR   r"   r    r   r      s;  € € € € € ØRÐRð>ð >ð >ð >ð*ð *ð *ð *ðOð Oð Oð OðXð Xð Xð Xð#ð #ð #ð #ð.ð .ð .ð .ðð ð ð ð(7ð 7ð 7ð 7ð"
ð "
ð "
ð "
ðH:ð :ð :ð :ð04ð 4ð 4ð 4ð<,ð ,ð ,ð ,ðð ð ð ð
ð 
ð 
ð 
ð 
ð 
r"   r   c                 ór  — t          ¦   «         } t          ¦   «                              ¦   «         D ]}|                      |¦  «         Œt	          ¦   «                              ¦   «         D ]}|                      |¦  «         Œt          ¦   «                              ¦   «         D ]}|                      |¦  «         Œ| S )zTFactory creating a StorylineEngine populated with canonical Beggar's Chronicle data.)r   r   Úvaluesr&   r   r,   r   r1   )Úenginer#   Újournal_defÚcutscene_defs       r    r   r   Ù   sº   € åÑÔ€FÝ%Ñ'Ô'×.Ò.Ñ0Ô0ð %ð %ˆØ×Ò˜GÑ$Ô$Ð$Ð$Ý-Ñ/Ô/×6Ò6Ñ8Ô8ð -ð -ˆØ×Ò Ñ,Ô,Ð,Ð,Ý/Ñ1Ô1×8Ò8Ñ:Ô:ð /ð /ˆØ× Ò  Ñ.Ô.Ð.Ð.Ø€Mr"   )r   r   )r·   Ú
__future__r   rF   Útypingr   r   r   r   r   Úserver.world.storyline_typesr	   r
   r   r   r   r   Úserver.world.storyline_catalogr   r   r   Ú__all__r   r   rR   r"   r    ú<module>rÂ      s6  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð Ø%ð€ðw
ð w
ð w
ð w
ð w
ñ w
ô w
ð w
ðt	ð 	ð 	ð 	ð 	ð 	r"   