a
    VŸ$c¸U  ã                   @   s  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mZ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mZ d dlZd dlZd dlZd dlZd dlZd dl Z d dl!Z!d dl"m#Z# d dl$Z$e ¡ a%dd„ Z&dd„ Z'd	d
„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dS )é    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicode)ÚTupleÚListÚDictÚSetÚOptionalÚIterableÚAnyNc                 C   sP   t   ¡ }d | |t ¡} tjj | ¡ tjr<tjj	s<t
| ƒ tjj ¡  |ad S )Nz{} took {:.2f}s)ÚtimeÚformatÚ
last_clockÚrenpyÚdisplayÚlogÚwriteÚandroidÚconfigÚlog_to_stdoutÚprintÚ	presplashÚpump_window)ÚsÚnow© r)   úrenpy/main.pyÚ	log_clock*   s    r+   c                   C   s   t   ¡ ad S )N)r   r   r)   r)   r)   r*   Úreset_clock:   s    r,   c                 C   sœ  t ƒ  tj ¡  tdƒ tj ¡  tdƒ tj ¡  tdƒ tj	j
 ¡  tdƒ tjj ¡  tdƒ | s|tj	j
 ¡  tdƒ tjj ¡  tdƒ | sºtj ¡  tdƒ tjj ¡  td	ƒ tj ¡ sÎtj ¡ ‚tjjrâtjj ¡  tjj ¡  tj ¡ t_ tj! "d
¡gt_#tj $d¡rd}nd}t %¡  &|¡ z$tj'  dt( )¡  ¡ tj'  d¡ W n t*yh   Y n0 | tj+_,tjj- .¡  td /|¡ƒ tj! 0d
¡ dS )zp
    This is called during a single run of the script. Restarting the script
    will cause this to change.
    zCleaning storeszInit translationzBuild styleszLoad screen analysiszAnalyze screenszSave screen analysiszPrepare screenszSave pyanalysis.zSave bytecode.TÚ_startÚstartz--- Ú z
Running {}N)1r,   r   ÚpythonÚclean_storesr+   ÚtranslationÚinit_translationÚstyleÚbuild_stylesÚsl2ÚslastÚ
load_cacher   ÚscreenÚanalyze_screensÚ
save_cacheÚprepare_screensÚ
pyanalysisÚgameÚscriptÚsave_bytecodeÚ	argumentsÚ	post_initÚQuitExceptionr"   Úclear_linesÚ
scripteditÚlinesÚclearr%   ÚsleepÚRollbackLogr   Ú	executionÚContextÚcontextsÚ	has_labelÚcontextÚ
goto_labelÚexportsr   ÚctimeÚ	ExceptionÚstoreÚ_restartÚ	interfaceÚenter_contextr   Úrun_context)ÚrestartÚstart_labelr)   r)   r*   Úrun?   sR    





rZ   c                 C   sR   t  | ¡}| d¡}W d   ƒ n1 s*0    Y  tj d| ¡ t|tƒ ƒ d S )Nz
autorun.pyr   )ÚzipfileÚZipFileÚreadÚsysÚpathÚinsertÚexecÚdict)ÚfnÚzfnÚautorunr)   r)   r*   Úload_rpe•   s    (rf   c                  C   sä  dt jv r6tt jd  ¡ ƒd g tj_tjj 	¡  d S d gtj_tj
rtjj dd¡ tjj dd¡ dd l
} dd l}dd l}ddlm} zP|dƒ}|j}|j}td|d|ƒ |d	krÚ| d
¡rÚtdƒ tjj dd¡ W n tyî   Y n0 | j ¡ }| d¡r2tdƒ tjj dd¡ tjj dd¡ d S z.|dƒ}| ¡ r^tdƒ tjj dd¡ W n tyt   Y n0 tjj dd¡ |j ¡  tj ¡ }	| |	j|	j¡|  ¡  }
td|
dƒ |
dkrêtjj dd¡ tjj dd¡ n tjj dd¡ tjj dd¡ nÒtjr¾tjj dd¡ tjj dd¡ tjj dd¡ ddl m} |dƒ}| !¡ j"}td|ƒ |dkrštjj dd¡ tjj dd¡ n tjj dd¡ tjj dd¡ n"tj#rÀdd l#}dd l$}tjj dd¡ | %d ¡}| &d!|¡}|rtjj dd¡ | 'd"¡}|dkr<|r<tjj dd¡ | 'd#¡}| 'd$¡}|r®|d%k sj|d%k rŒtjj dd¡ tjj dd¡ n tjj dd¡ tjj dd¡ ntjj dd&¡ n tjj dd'¡ tjj dd&¡ d S )(NÚRENPY_VARIANTr   Úmobiler!   )Ú	autoclasszandroid.os.BuildÚManufacturerÚmodelÚAmazonÚAFTzRunning on a Fire TV.Úfiretvz android.hardware.type.televisionzRunning on a television.ÚtvÚsmallz#org.renpy.android.PythonSDLActivityzRunning on ChromeOS.ÚchromeosÚtouchzScreen diagonal iszinches.é   ÚtabletÚmediumÚphoneÚiosÚUIDeviceziOS device idiomé   Úwebznavigator.userAgentzMobile|Android|iPad|iPhonezƒ
          ('ontouchstart' in window) ||
            (navigator.maxTouchPoints > 0) ||
            (navigator.msMaxTouchPoints > 0)zscreen.widthzscreen.heighti   ÚlargeÚpc)(ÚosÚenvironÚlistÚsplitr   r"   Úvariantsr   ÚemulatorÚearly_init_emulatorr!   r`   ÚmathÚpygame_sdl2Újniusri   ÚMANUFACTURERÚMODELr$   Ú
startswithrR   ÚactivityÚgetPackageManagerÚhasSystemFeatureÚisChromebookÚinitÚget_infoÚhypotÚ	current_wÚ	current_hÚget_dpirw   ÚpyobjusÚcurrentDeviceÚuserInterfaceIdiomÚ
emscriptenÚreÚrun_script_stringÚsearchÚrun_script_int)r!   r„   Úpygameri   ÚBuildÚmanufacturerrk   Úpackage_managerÚPythonSDLActivityÚinfoÚdiagrx   Úidiomr—   r˜   Ú	userAgentrh   rr   Ú	ref_widthÚ
ref_heightr)   r)   r*   Úchoose_variantsž   s¢    















r§   c                  C   sº   t jjgt j_dtjv rHtj tjd d¡} tj | ¡rHt jj 	d| ¡ g d¢}|D ]L}|tjvrdqTtj| }dD ],}tj ||¡}tj 
|¡rrt jj |¡ qrqTtdd t jj¡ƒ dS )	z/
    Determines the searchpath on Android.
    ÚANDROID_PUBLICr>   r   )ÚANDROID_PACK_FF1ÚANDROID_PACK_FF2ÚANDROID_PACK_FF3ÚANDROID_PACK_FF4)zrenpy/commonr>   zAndroid search paths:ú N)r   r"   ÚgamedirÚ
searchpathr}   r~   r_   ÚjoinÚexistsr`   ÚisdirÚappendr$   )Úandroid_gameÚpacksÚiÚassetsÚdnr)   r)   r*   Úandroid_searchpath/  s    


r¹   c                  C   sz	  t jtjjŽ  tdƒ dtj_t 	¡  tj
 ¡  tjj ¡  tj ¡  ztjj ¡  W n tyh   Y n0 tƒ  dtjjv tj_tdƒ tjjt_tjjgtj_t tjj¡} tj | ¡rÒtjj  | ¡ | tj_!nd tj_!dtj"v rþtjj #tj"d  $d¡¡ tj%rd tj_!t&ƒ  tjjD ]8}t '|¡D ]&}| (¡  )d¡r*t*|d | ƒ q*qg }tj+j,D ]*}| -¡ D ]}||vrn|  |¡ qnqbtjjD ]Z}tj |¡s¬q–t.t '|¡ƒD ]2}tj /|¡\}}||vrÜqºtjj0  |¡ qºq–tjj0 1¡  tj+ 2¡  tj+ 3¡  td	ƒ tj4 5¡ t_6t7j8d
 tj9_9tj: ;¡ t_:tj:tj9_:tj< =d¡gt_>dtj>d _?tj< @d¡ dtj_tjA B¡ tj_AtjC Ddd¡r¢dtjjE_FtjG Hd¡ tjG Id¡sÊtjG Id¡rÖtjG Hd¡ tj J¡  tj: K¡  tdƒ tjjEjLdkr tjjEjMs tjjAjND ]p\}}|d u r.qtj Otj P||d ¡¡sz&tj P||d ¡}	t Q|	|	d ¡ W n tRy„   Y n0 qtj+ S¡  tjjA T¡  tjjA U¡  tdƒ tjjEjLdkrtV V¡ }
tWdƒD ](}tX|ƒ tjA B¡ tj_AtjjA U¡  qÔtXtV V¡ |
 ƒ t7 Yd¡ dtj_tjjZd u r@t [tjj¡tj_ZtjjEjZrZtjjEjZtj_Ztj\ ¡ t_\tj\j]t_^tjj\j_D ](}|tjjAj`jav rztj jbd7  _bqztj\jcrÂtj\jc\tj_dtj_etjf ¡  zNtjg ¡  tdƒ tj\ h¡  tj\j]t_^tdƒ i t_itj\tj9_\tj^tj9_]tjjjkjltj9_ltjm n¡ r<tj o¡ ‚d tj_tjAjpD ]l\}}tq|tjrjsƒr°tV V¡ }tj t¡  u|¡ tV V¡ | }|tjjvkr¶tjj6 wd!|jx|jy|¡ n|ƒ  qLd"tj_tj%pÐtjjzt_%tj6 {¡  tjj{D ]}|ƒ  qætjjA |¡  tjj}j~ ¡  tjjdtjjeftj\_ctd#ƒ tj€ ¡  td$ƒ tjjA ‚¡  tjƒ „¡  td%ƒ tj+ 2¡  td&ƒ d'tj"v tj_…d(tj"v tj_†d)tj"v tj_‡tjˆ ˆd¡ tjjA ‰¡  td*ƒ tjjŠj‹ ¡  td+ƒ tj4 Œ¡  td,ƒ t  d-¡ t jŽrüt jŽd d …= tjjrFt jtjjŽ  ttj" Dd.d¡ƒ}tjj‘r:|t j’O }t  “|¡ nt  d/d0d0¡ td1ƒ tj” •¡  tj–s‚tjj— ˜¡  td2ƒ d }|r˜tjj™ š¡  zæz\z0tu|ƒ W tjj›d3d4f}tj\ hd¡ tj\ œ¡  n&tjj›d3d4f}tj\ hd¡ tj\ œ¡  0 W n. tjy$ } z|jž}W Y d }~n
d }~0 0 W ztjj Ÿ¡  W n tyL   Y n0 tjj–  ¡  tjgj¡ ¢d5¡ tjj£D ]}|ƒ  qpnXztjj Ÿ¡  W n ty¤   Y n0 tjj–  ¡  tjgj¡ ¢d5¡ tjj£D ]}|ƒ  qÈ0 q†W t  “d¡ tjj¤D ]}|ƒ  qðtj+ ¥¡  tjf ¦¡  tj§ ¨¡  n@t  “d¡ tjj¤D ]}|ƒ  	q0tj+ ¥¡  tjf ¦¡  tj§ ¨¡  0 tjj©jª	svtjj« ¬¡  d S )6Nz#Bootstrap to the start of init.initzBefore loading the script.rr   z
Early initÚRENPY_SEARCHPATHz::z.rpeú/zLoader initrS   FTr   é<   zWhile loading the script.ÚcompileÚ_errorhandlingztl/None/common.rpymztl/None/common.rpymcztl/None/commonzLoading error handlingz.rpyz.rpycz.bakzLoading scriptz	load-testé   zAfter loading the script.ry   zLoading save slot metadata.zLoading persistentzWhile executing init code:z - Init at %s:%d took %.5f s.z,After initialization, but before game start.zRunning init codezLoading analysis datazAnalyze and compile ATLzIndex archivesÚRENPY_LESS_MEMORYÚRENPY_LESS_MOUSEÚRENPY_LESS_UPDATESzDump and make backups.zCleaning cachezMaking clean storesé   ÚRENPY_GC_DEBUGi¼  é
   zInitial gc.zCreating interface objectÚ_invoke_main_menuÚ
_main_menug      @)­ÚgcÚset_thresholdr   r"   Úgc_thresholdsr+   r>   Úexception_infoÚ	linecacheÚ
clearcacherA   Úpre_initr6   ÚslparserrŽ   Úgl2Úlive2dÚresetrR   r§   r   r   rr   r®   Úbasepathr¯   Ú__main__Úpath_to_commonÚ
renpy_baser}   r_   r²   r³   Ú	commondirr~   Úextendr€   r!   r¹   ÚlistdirÚlowerÚendswithrf   ÚloaderÚarchive_handlersÚget_supported_extensionsÚsortedÚsplitextÚarchivesÚreverseÚindex_archivesÚ	auto_initr0   rI   r   r^   ÚmodulesrS   r4   ÚStyleManagerrJ   rK   rL   Ú
init_phaseÚnot_infinite_loopr?   ÚScriptÚsessionÚgetÚargsr½   rP   Úload_moduleÚloadableÚinit_system_stylesr5   ÚcommandÚkeep_orphan_rpycÚscript_filesÚisfiler°   ÚrenameÚOSErrorÚcleardirfilesÚscan_script_filesÚload_scriptr   r   r$   ÚexitÚsavedirÚpath_to_savesÚ
persistentÚ_preferencesÚpreferencesÚ_seen_translatesÚ
translatorÚdefault_translatesÚseen_translates_countÚ_virtual_sizeÚscreen_widthÚscreen_heightÚsavelocationÚloadsaveÚupdateÚseen_sessionÚtestÚtestastÚ_testÚparserÚreport_parse_errorsÚParseErrorExceptionÚinitcodeÚ
isinstanceÚastÚNoderN   rZ   Úprofile_initr    ÚfilenameÚ
linenumberÚsimulate_androidrB   Úreport_duplicate_labelsÚimageÚimage_namesÚsortr=   r8   ÚanalyzeÚatlÚcompile_allÚless_memoryÚ
less_mouseÚless_updatesÚdumpÚmake_backupsÚimÚcacheÚmake_clean_storesÚcollectÚgarbageÚ	manage_gcÚintÚgc_print_unreachableÚDEBUG_SAVEALLÚ	set_debugÚdebugÚinit_main_thread_openrU   ÚcoreÚ	Interfacer9   Úbefore_restartÚend_game_transitionÚsave_MPÚFullRestartExceptionÚreasonÚreset_statesÚfinish_pendingÚautosave_not_runningÚwaitÚat_exit_callbacksÚquit_callbacksÚ	auto_quitÚquitr2   Úwrite_updated_stringsÚerrorÚerror_handledÚrenderÚcheck_at_shutdown)r×   Údirrc   Úarchive_extensionsÚhandlerÚextr¸   r¶   ÚbaseÚnamer.   Ú_prioÚnodeÚ
node_startÚnode_durationÚgc_debugrX   ÚeÚcbr)   r)   r*   ÚmainT  sš   






































þó



ù



rQ  )-Ú
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Útypingr   r   r   r   r   r   r   r}   r^   r   r[   rÈ   rÌ   r   Ú
renpy.gamer>   rÔ   r   r+   r,   rZ   rf   r§   r¹   rQ  r)   r)   r)   r*   Ú<module>   s(   8$V	 %