o
    zj*                  	   @   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zd dlZW n ey/   ed e	d Y nw e
  dZdZe dZe dZdZd	Zd
d Zdd Zdd Zdd ZdddddddddZdd Zdd Zdd  Zd!d" Zd#d$ Zed%kr~e  dS dS )&    Nz,[!] Zainstaluj msgpack: pip3 install msgpack   z/app/webz_/var/lib/pterodactyl/volumes/8637552f-2ce1-4a2c-b74a-9ed953b4d762/world/mtr/minecraft/overworldz/stations.jsonz/final_map_data.jsonz?https://mtr.ciapongi.szablix.pl/mtr/api/map/stations-and-routesz1https://mtr.ciapongi.szablix.pl/mtr/api/map/railsc                 C   s   t |   ddS )N  )strstriplowerreplace)s r
   /app/generate_map_v7.py	normalize   s    r   c                 C   s.   t | d |d  d | d |d  d  S )Nr      r   )mathsqrt)p1p2r
   r
   r   dist_2d   s   . r   c                 C   s8   zt j| ddd}|jdkr| W S W i S    Y i S )NF   )verifytimeout   )requestsgetstatus_codejson)urlrr
   r
   r   
fetch_json   s   r   c                 C   sN  i }t jt| }t j|s|S t |D ]\}}}|D ]}|dr%qzytt j||de}tj	|dd}|D ]S}	t
|	tsBq:|	di |	di }
}|	dd}|
r|rt
|
trt
|trtt|
d	d
|
dd
|
dd
f|d	d
|dd
|dd
fg}|||< q:W d    n1 sw   Y  W q   Y qq|S )N.rbFraw	position1	position2nameZNieznanyxr   yz)ospathjoinMTR_SAVES_PATHexistswalk
startswithopenmsgpackUnpacker
isinstancedictr   tuplesorted)Zfolder_namemapping	full_pathroot_filesfilefunpackerdatar   r   r$   kr
   r
   r   load_msgpack_data   s2   $ 

r@   )r   )r   r   )r   r   )rA   r   )r   rA   )r   r   )rA   r   )rA   rA   )NSEWZNEZSEZSWZNWc                 C   s   |d |d   |d |d    }|dkrd S |d | d  |d | d  }}||d   ||d    | }| d ||d   | d ||d   fS )Nr   r   r
   )r   d1r   d2ZdetdxZdyt1r
   r
   r   get_intersection2   s
   $" (rJ   c                 C   s  | d d | d d f}| d d | d d f}|  ddkr3|d |d dd	|d |d dd	gS |  d
|  d}}t |dt |d}}t||||}|sh|d |d dd	|d |d dd	gS g }d}	t|	d D ]K}
|
|	 }d| d |d  dd|  | |d   |d |d   }d| d |d  dd|  | |d   |d |d   }||||d	 qr|S )Nr"   r%   r'   r#   shapeZSTRAIGHTr   r   )r%   r'   progressZangle1Zangle2)r   r   
   r   )r   DIRrJ   rangeappend)Zrailr   r   Za1Za2rF   rG   CptsZSTEPSitr%   r'   r
   r
   r   get_curve_points9   s"   ((<<rU   c                  C   s^  t jtd} g }t j| sg S t | D ]\}}}|D ]}}|dszptt j||d\}tj	|dd}|D ]J}t
|trKd|vsKt
|d tsLq9t|}	|d |d }
}|
d  d	|
d
  d	|
d  d	|d  d	|d
  d	|d  }|||
||	g d q9W d    n1 sw   Y  W q   Y qqqi }t|D ]H\}}|d d |d d
 |d d f}|d d |d d
 |d d f}||vrg ||< ||vrg ||< || |d  || |d  q|D ]?}|d d |d d
 |d d f}|d d |d d
 |d d f}t||g ||g  }||d  t||d< q|S )Nrailsr   r   Fr    r"   r#   r%   r9   r&   r'   )idr"   r#   curvePointsconnectedRailsrW   rY   )r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   rU   rP   	enumeratesetr   discardlist)r)   Z	rails_outr   dr<   r;   Zf_inr=   r>   rR   r   r   ridZnode_maprS   Zc1c2	connectedr
   r
   r   load_msgpack_railsL   sT   
">

""""rb   c                 C   s   ||kr|gS d|fg}|d i}|di}|rWt |\}}||kr"n5||g D ],}	| |	i dd}
|| |
 }|	|vsD|||	 k rT|||	< t |||	f |||	< q(|s||vr]d S g }|}|d urr|| || }|d use|  |S )Nr   lengthrM   )heapqheappopr   heappushrP   reverse)	rail_dictadjZ	start_ridZend_ridqueueZ	came_fromZcost_so_farZcurrent_costcurrZnxtdistZnew_costr)   cr
   r
   r   dijkstra_on_railsw   s2   


rn   c            &   
      sz  t d td} td}ttdi dg }dd |D }ttdi dg }i i i }d	 g g g }}}t }	|D ]}
|
d
 }|
|< t|
dg ||< dd t|
dg dd dD }|sjqB|	t	|d d dt	|d d df |	t	|d d dt	|d d df |D ])}t
|d   t
|d   }}||fvrt ||f< ||f | q|
di |
di }}tt|dd|dd|ddf|dd|dd|ddfg}|| v r||| | d qB||v r|||| d qB|| qB|D ]}
|
dg D ]}||v r3|| |
d
  q#q fdd}zttd}t|}W d    n	1 sVw   Y  W n tyg   Y d S w g }|dg D ]}t|dd |ptfd!d"| D d }|r~|d
|d
< |d#g |d#< |d# }g }t|dkr	tt|d D ]R}|| ||d  }}||d |d f\}} ||d |d f\}!}"|r|!rt|||!}#|#r|r|d |#d kr||#dd   q||# q|rpg }$d }%|D ]X}|}
d$d t|
dg d%d dD }|s/q|%d urGt|%|d t|%|d k rG|  |$r`t|$d |d d&k r`|$|dd   n|$| |d }%q|$|d'< nd(d |d'g D |d'< n	d#|vrg |d#< || qpttd)}t|d#g ||||t|	d*| W d    n	1 sw   Y  t d+ d S ),Nz==== GENERATOR V20 (ZOPTYMALIZOWANE PERONY I CZYSTE TRASY) ===	platformssidingsr>   routesc                 S   s   i | ]}t |d d|qS )r$   r   )r   r   ).0r   r
   r
   r   
<dictcomp>   s    zmain.<locals>.<dictcomp>rV       rW   rY   c                 S      g | ]
}|d  |d gqS r%   r'   r
   rr   rm   r
   r
   r   
<listcomp>       zmain.<locals>.<listcomp>rX   c                 S      | d S NrL   r
   r%   r
   r
   r   <lambda>       zmain.<locals>.<lambda>)keyr   r   r   rA   r"   r#   r%   r&   r'   )r)   r$   c              	      s   t | d   t | d   }}t }dD ]}dD ]}||| || fg  qqd td}}|D ] }| dg D ]}	t| |	d |	d f}
|
|k rU|
}|}q@q6||fS )Nr   r   )rA   r   r   infrX   r%   r'   )intr[   updater   floatr   )ptgxgzZcandsrH   ZdzZ	best_railZmin_dr_   rm   r^   )	GRID_SIZEgridrh   r
   r   find_closest_rail   s   "*zmain.<locals>.find_closest_railr   r$   r   c                 3   s     | ]\}} |v r|V  qd S )Nr
   )rr   r?   v)	norm_namer
   r   	<genexpr>   s    zmain.<locals>.<genexpr>stationsc                 S   ru   rv   r
   rw   r
   r
   r   rx      ry   c                 S   rz   r{   r
   r|   r
   r
   r   r}      r~   g       @r)   c                 S   ru   rv   r
   )rr   pr
   r
   r   rx      ry   w)r   rq   ro   rp   ZinfrastructureZnodesu@   ✅ GOTOWE! Wyeksportowano zaktualizowane perony i czyste trasy.)printr@   r   API_ROUTES_URLr   API_RAILS_URLr[   r5   addroundr   r4   rP   r/   STATIONS_FILEr   load	Exceptionr   nextitemslenrO   rn   extendr   rg   OUTPUT_FILEdumpr]   )&Zplatform_dataZsiding_dataZ
api_routesZapi_routes_mapZ
rails_listri   Zplatforms_outZsidings_outZ	infra_outZ	nodes_setr   r_   rR   r   r   r   r   r   r?   ra   r   r<   r>   final_routesZrouteZapi_datar   Z
route_ridsrS   s1s2Zr1rF   Zr2rG   Zsub_pathZdetailed_pathZlast_ptr
   )r   r   r   rh   r   main   s   "**"$   6(.

"

&2



r   __main__)r(   r   r   rd   r   urllib3r0   ImportErrorr   exitdisable_warningsZ	BASE_PATHr+   r   r   r   r   r   r   r   r@   rN   rJ   rU   rb   rn   r   __name__r
   r
   r
   r   <module>   s2   0 

+y