U
    ^'^=                     @   s   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mZm	Z	 d dl
Zd dlmZ d dlmZ d dl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edkreejdd   dS )    N)Image
ImageChops	ImageStat)partial)get_terminal_sizez.pngz.jpgc                 C   s   t j| d ddd}t j| d ddd}d|jd d  }|jd d |jd d f}||t j ||t j t||}tt	
|j|kS )	Nr   r)modeRGB   gQ?      )r   openconvertsize	thumbnailBILINEARr   
differencesumr   ZStatZsum2)pathsnewImgZoldImgZtresholdr   Zdiff r   FD:\Dropbox\games\factorio\mods-live\L0laapk3_FactorioMaps_3.5.5\ref.pytest   s    r   c              
   C   s   d}zjz>ttjj||f| dd   tjj|f|  ttf}W n&   td t	
  td  Y nX W 5 | dd X || dd  fS )NFTr
   
)putr   ospathjoinreplaceextoutextprint	traceback	print_exc)r   basePathnewprogressQueue
testResultr   r   r   compare   s    >r)   c                 C   sp   t j||| d t }d}z(t|t j|| d | d t f}W n   td  Y nX ||| d | d fS )Nr   Fr
   r   r   )r   r   r   r    r   r!   r"   )Z	renderboxr%   r&   ZnewPathr(   r   r   r   compare_renderbox(   s    (r*   c                 C   sv  | dd \}}}t | d t tj| d d  }}|||t|d t|d t f|kr|||||d |d fdd@ pp|||t|d t|d t f|kr|||||d |d fdd@ pp|||t|d t|d t f|kr|||||d |d fdd@ pp|||t|d t|d t f|krd|||||d |d fdd@ pp|||t|d t|t f|kr|||||d |fdd@ pp|||t|d t|t f|kr|||||d |fdd@ pp|||t|t|d t f|kr0||||||d fdd	@ pp|||t|t|d t f|kop||||||d fdd
@ | fS )z8
		x+ = UP, y+ = RIGHT
		corners:
		2   1
		X
		4   3
		N      r   r
   r   r      
      )intr   r   splitextstrr    get)coordkeepListcropListsurfaceNamedaytimezxyr   r   r   neighbourScan3   s$    &JFHH@@@@ r<   c                 C   s`   | dkr| dk st | dkr dS | dkr,dS | dkr@t| d S | d	krTt| d
 S t| d S )Nr   @   ?   />   +3   r,      G   A   )AssertionErrorchr)ir   r   r   
base64CharL   s    rI   c                 C   sH   t | |rdnd } t| d tt | d d  tt | d d  S )Ni   i   r=   )r0   rI   )numberZisNightr   r   r   	getBase64W   s    rK   c            ?         sF  t t tjdkrt jnd tjt	| dkr>| d nd| d }tj|d}t
||d rhdnd }tj|d	}t|d
dd}t|}W 5 Q R X tj|d d d rt|d d d d
dd}t|}W 5 Q R X ni }t	| dkr2t|d D ]&\}	}
|
d | d kr|	} qBqnt	|d d }d}d|krXi |d< t||d kr~di i|d t|< |d | }i }i }dD ]rg }g }g }g }i  d}t	| dksЈ| d kr:|d  D ]Z\}t	| dks| d kr܈|krt| rt	| dks6| d krd}|d d g }|f g }t|D ]&}|d | d krd|| qd fdd}|D ].}|tj|d|d | d dd q|tj|d|d dd i }|D ]}|d | d kr|kr|d d kr|krBi |< tj|d|d | d t}t|D ]B}ttj||D ]&}|d | d |||ttf< qqrqdkr`tjtj|d|d ddstd  nf|d! rtd" ttj|d|d ddd
.}|D ]"}|t|d#d$d q*W 5 Q R X ||< tj|d|d t}t|D ]}ttj||D ]}|tj|d f|ks||ttf|kr|t||f n@||ttf|kr||||ttf t||f qqq|sDq|d! r^td%t	|  t	|dkr|d! rtd&t	|  t }|  } |!t"t#tj|dt|d | d'|d(}!d}"td)$dd$t% d d*  d+d, tt	|D ]r}	| &d |"d7 }"t'|"t	| }#t% d d* }$td-$t(|#d. dd/t
|#|$  d$|$t
|#|$   d+d, q|!)  |!& }%d0d1 d2d1 |%D D }&|d3d1 d4d1 |%D D 7 }|d! rtd5t	|&t	|f  ||&7 }td6$d.d/t% d d*   |d! rtd7t	|  |*t"t+| d8|d9}%d:d1 d;d1 |%D D }'d<d1 d=d1 |%D D }(|d! rptd>t	|'  |d! rtd?t	|(t	|t	|' t	|t	|' t	|( f  |d! rtd@ |(D ]&}t,tjj|d|d f|  q|d! r tdA |D ]\|d d ttj|d|d ddBv}||'fD ]f})|)D ]Z}*|*d krJ|*d krJ|*d tkrJ|-dC|*d tj|*d d f  qJqBW 5 Q R X q|d! rtdD ||'fD ]})|)D ]}*t
|*d }t
tj|*d d }|*d |k	ri ||*d < |*d ||*d  k	rFi ||*d  |*d < |||*d  |*d  k	r||g||*d  |*d  |< n<|||*d  |*d  | kr||*d  |*d  | | qڐq|d! 	rtdE dF|d t| krd}d|d t| dF< i }d}+|d  D ]8\}i },t|dG D ]\}-}.|d t| d k
rndGg i|d t| d < |d t| d  dG d|d i dD ]|.dH dIk
r|.dJ 
sdk
rtj|.dK |.dJ 
r܈nddLt|d d |.dM }||,kr|-fg|,|< n|,| |-f |+d7 }+
q
q.t|d dNdND ]}|d | d krDt|d | d  dG D ]\}-}.dD ]|.dH dIkr|.dJ sdkrtj|.dK |.dJ rȈnddLt|d d |.dM }||,kr||krd|.kr
|.d n"|d t| d  dG |- d }/||/|,| f||< qq|qD
q|. }|*t"t/tj|dt|d dO|dP}%d}0|%D ]\\}1}}/}2|1st,| |2D ].\}-d|/i|d t| d  dG |-< qn|0d7 }0q|d! rtdQ|0t	||+f  q| D ]\}3g }4dR|3krd|d | d  rdt|d | d  dR rddRnd|3krvq|3 }5|5 D ]\}}6t0|d}7d}8d}9tt1|6t2|6d D ]j}||6k}:dRkot|t|f| k};|8|:ks|:r|9|;kr|7t0||:r|;n|97 }7|:}8|;}9q|4|7 q|d t| d krbi |d t| d < d/|4|d t| d  dS< t	|4dkrd}q|rB|d! rtdT t|d d d dUdd}t3|| W 5 Q R X |d! rtdV tj4|f| dd  D ]2\}<}=}>t	|=dkrt	|>dkrt5|< qd S )WNntr.   r,   z ../../script-output/FactorioMapsr   zmapInfo.json
refthreads
maxthreads)	processesr   zutf-8)encodingz	.out.jsonr
   mapsr   Fsurfaces)daynightr+   r   Tzoommaxc           	         s&  t | d}| ddkr$dnd}|D ]}|dkr|ddd}tt|d ttj|d d f}|d	 }nj|ddd}|d d
d}|d tkrq,tt|d ttj|d d f}|d }|rt|d 	|dB nt|d |< q,W 5 Q R X d S )Nr   r   v2r   r
    r/   r   r,   r?      )
r   readlinerstripsplitr2   r0   r   r   r1   r3   )	r   ZcombinePreviousfversionliner]   keyvalueZ	pathSplitr6   r8   r7   r9   r   r   readCropList   s    .
.zref.<locals>.readCropListImageszcrop.txtrT   zref.txtzuWARNING: cannot find day surface to copy non-day surface from. running ref.py on night surfaces is not very accurate.verbosez7found day surface, reuse results from ref.py from therer   rY   zfound %s new imageszcomparing %s existing images)r%   r&   r'      zref  {:5.1f}% [{}]    )endzref  {:5.1f}% [{}{}]d   =c                 S   s   g | ]}|d  qS r
   r   .0r:   r   r   r   
<listcomp>   s     zref.<locals>.<listcomp>c                 S   s   g | ]}|d  r|qS r   r   rn   r   r   r   rp      s      c                 S   s   g | ]}|d  qS rm   r   rn   r   r   r   rp      s     c                 S   s   g | ]}|d  s|qS rq   r   rn   r   r   r   rp      s      zfound %s changed in %s imageszref  {:5.1f}% [{}]z)scanning %s chunks for neighbour cropping)r5   r6   r=   c                 S   s   g | ]}|d  qS rm   r   rn   r   r   r   rp     s     c                 S   s   g | ]}|d  r|qS rq   r   rn   r   r   r   rp     s      c                 S   s   g | ]}|d  qS rm   r   rn   r   r   r   rp     s     c                 S   s   g | ]}|d  s|qS rq   r   rn   r   r   r   rp     s      zkeeping %s neighbouring imagesz-deleting %s, keeping %s of %s existing imageszremoving identical imageszcreating render indexwz%s %s
zcreating client indexzcomparing renderboxesZrenderboxesComparedlinkstypeZlink_renderbox_areaZdaynightZ	toSurfaceZrenderboxesfilename)r%   r&   rZ   z3removed %s of %s compared renderboxes, found %s newrU   chunkszwriting mapInfo.out.jsonzw+zdeleting empty folders)6psutilProcessr   getpidnicenameBELOW_NORMAL_PRIORITY_CLASSr   r   lenr0   mpPoolr   jsonloadisfile	enumerater2   itemsappendrangelistdirr   r    r!   r"   tupler\   r]   r1   ManagerQueue	map_asyncr   r)   formattsizer3   floatroundwaitmapr<   removewritevaluesr*   rK   minrW   dumpwalkrmdir)?argskwargstoppathdatapathrN   poolr^   dataZoutdatarH   ZmapObjr&   changedZnewMapZallImageIndexZallDayImagesZnewComparedSurfacesZcompareListr5   ZfirstRemoveListZdidAnythingsurfaceZ	dayImagesZoldMapsListoldrd   Z	oldImagesr   r:   r;   r`   mr'   workersdoneSizeprogresstsizZ
resultListZnewListZneighbourListZ
removeListZaListr4   Z
totalCountZlinksByPath	linkIndexlinkZoldPathcountZisDifferentrs   ZdaytimeImageIndexZ	indexListZsurfaceImageIndexZxListstringZisLastChangedImageZisLastNightImageZisChangedImageZisNightImagecurdirZsubdirsfilesr   rc   r   refc   s   $&

P, 2
&,
$

 "*06
 
 ,"
@
 
 
 
 6
 $
 ".<
 &
 *"6
$"66"*
*
 F

""
 
 "r   __main__r
   )r   sysmathtimer   rx   PILr   r   r   multiprocessingr   	functoolsr   shutilr   r   r#   r    r!   r   r)   r*   r<   rI   rK   r   __name__argvr   r   r   r   <module>   s$   0  B