
    UHj.                       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Zddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZ ddlmZmZmZmZmZ  ej0                  d      ZddZdd	Z	 d	 	 	 	 	 	 	 	 	 dd
ZddZddZddZddZ dddZ!d dZ"d!dZ#d"dZ$d#dZ%d$dZ&e'dk(  r e&        yy)%zBExtract probable scene hotspot coordinate tables from Hwanse2.exe.    )annotationsN)Path)decompress_cns)c_stringfind_cns_stringsoffset_to_varead_sectionsva_to_offsetzmap\d+_\d+[a-z]\.cns$c                6    t        j                  d| |      d   S )N<Ir   )structunpack_from)dataoffsets     1/home/exedev/hwanse/tools/extract_scene_events.pydword_atr      s    dD&1!44    c                T    | D ]#  }|d   }|d   |d   z   }||cxk  r	|k  s|c S  % y )Nrawraw_size )sectionsr   sectionstartends        r   section_for_offsetr      sI     enwz22F S N !
 r   c                2   t        j                  d|      }g }d}	 | j                  ||      }|dk  r	 |S |dz   }t        ||      }|/||d   |vr9t	        ||      }	|	H|d   |	||d}
|dk\  rt        | |dz
        }||
d<   d|d	|
d
<   d|cxk  rdk  rmn nj||
d<   t        | ||d      }||
d<   t        |      dkD  rC|d   j                  d      r/|d   d   }t        | ||d      }||
d<   ||
d<   t        |      |
d<   |j                  |
       )Nr   r      name)r   refVarefFileOffsettargetVa   previousValue0x08xpreviousValueHex  @   ` conditionVa   countconditionFirstDwordspointervalue   conditionPayloadVaconditionPayloadDwordsconditionLinkedStrings)r   packfindr   r   r   read_tail_dwordslengetlinked_strings_from_dwordsappend)r   r   r0   section_namesneedlerefssearchhitr   ref_vaitemprevious_valuecondition_dwords
payload_vapayload_dwordss                  r   find_pointer_refsrG   "   s    [[u%FDF
ii'7> K= q$Xs3?$)Mh,>v 	
 !8%dC!G4N$2D!)+N3+?'@D#$^9z9&4]##3D(NZ[#\ /?+,'(1,1A!1D1H1H1S!1!!4W!=J%5dHjXZ%[N1;D-.5CD125OP^5_D12DC r   c                   i }| j                  d      D ]  }t        j                  d|j                        s$t	        |j                               }t        |      dk  rLt        j                  |dd d      }t        j                  |dd d      }t        |      d||z  dz  z   k7  r3t        |      dk\  r%|d   }|d   }t        |      d||z  dz  z   k(  r|}|}||f||j                  <    |S )Nzmap*.cnszmap\d+_\d+[a-z]\.cnsr#   r      littler   )
globre	fullmatchr   r   
read_bytesr8   int
from_bytesstem)extract_dirsizespathdecodedwidthheightcompact_widthcompact_heights           r   load_map_sizesrZ   P   s    E  , +||3TYY? !23w<!wq|X6!h7w<1uv~111c'la6G#AJM$QZN7|q=>#AA#EEE%'!6?dii+ Lr   c                V   t        ||      }|g g fS g }g }t        d      D ]  }||dz  z   }	|	dz   t        |       kD  r ||fS t        | |	      }
|
dk(  r ||fS |
dz  }|
dz	  }|dk\  s|dk\  r ||fS ||d}|j	                  |       ||k  sl||k  sr|j	                  |        ||fS )Ni   r#   r        )xy)r
   ranger8   r   r;   )r   r   ptr_varV   rW   r   
raw_points	in_boundsindexoffr0   r^   r_   points                 r   read_point_tablerg   d   s    (F+F~2vJIs $uqy 7SY y   s#A: y   FNRK8qCx
 y  	 a % u9VU#$ y  r   c                    |dk  s|t        |       kD  r| }n| d | }|D cg c]  }|d   |k  r
|d   |k  r| c}S c c}w )Nr   r^   r_   )r8   )rb   rV   rW   point_count_hint
candidatesrf   s         r   active_points_from_hintrk   }   sb    1 03z? B
 1!12
  :%*v"5 	  s   <c                <    | sy | d d }t        d |D              r|S y )N    c              3  N   K   | ]  }d t        |      cxk  xr dk  nc   yw)rm      N)ord).0chars     r   	<genexpr>z#printable_prefix.<locals>.<genexpr>   s!     
4T2T S  
4s   #%)all)textprefixs     r   printable_prefixrw      s)    #2YF

4V
44r   c                f   t        ||      }|g S g }t        |      D ]  }||dz  z   }|dz   t        |       kD  r |S t        | |      }||dz  z   |d|d|dz  |dz	  d}	d|cxk  rdk  r2n n/d	|	d
<   t        ||      }
|
t	        t        | |
            }|r||	d<   |j                  |	        |S )Nr#   r%   r&   r\   r]   )var0   hexlohir(   r)   Tr/   string)r
   r`   r8   r   rw   r   r;   )r   r   start_var-   r   valuesrd   re   r0   rB   
ptr_offsetru   s               r   r7   r7      s    (H-F~	Fu uqy 7SY" M! s#UQY&c{#&.2+
 ,*,"DO%h6J%'z(BC%)DNd'( Mr   c                   g }|D ]  }|j                  d      s|d   }t        | ||d      }|r|d   d   nd }t        d |D              }|D 	cg c]  }	|	j                  d      s|	d    }
}	|dk(  rd	}n)|d
k(  rd}n!|dk(  rd}n|dk(  rd}n|dk(  rd}n	|dv rd}nd}|j                  ||d   ||||
|d        |S c c}	w )Nr/   r0   r]   r,   r   c              3  D   K   | ]  }|j                  d       sd  yw)r/   r   N)r9   )rq   r0   s     r   rs   z&read_pointer_blocks.<locals>.<genexpr>   s     J%UYYy5IAJs     r}   ?   selectorB   pointerTabler+   scriptHeaderr   scriptEntry   prefixedSelector>   m     
scriptLikeunknownry   )	pointerVasourceVa	blockKind
firstValuepointerCountstringsfirstDwords)r9   r7   sumr;   )r   r   tail_dwordsblocksrB   ra   r   first_valuepointer_countr0   r   
block_kinds               r   read_pointer_blocksr      s   F  
xx	"g!$&C,2fQi(J6JJ06Nu%))H:M5?NN$#JD 'JD 'JD &JD +JM)%J"J# J') -"%
	
- 
B M5 Os   C'Cc                    t               }g }| D ]3  }|d   D ])  }||v r|j                  |       |j                  |       + 5 |S )Nr   )setaddr;   )r   seenlinkedblockru   s        r   collect_linked_stringsr      sY    5DF  )$ 	 Dt|HHTNMM$		   Mr   c                    t               }g }| D ]<  }|j                  d      }|r||v r|j                  |       |j                  |       > |S )Nr}   )r   r9   r   r;   )r   r   r   rB   ru   s        r   r:   r:      sU    5DF xx!tt|d Mr   c           
     ~   t        |       }t        | |      }t        |      }g }|j                         D ]  \  }}t        j                  |      s|d d }|j                  |      }	|	s6d}
t        j                  d|      }	 | j                  ||
      }|dk  rg|dz   }
|dz   t        |       kD  r0t        | |dz         }t        | |dz         }t        | |dz         }t        | |d	z         }t        | |d
z         }t        | |dz         }|dk7  s|dk7  rd|cxk  rdk  sn |	\  }}t        | ||||      \  }}t        ||||      }|st        ||      }||t        |      dz  z   }t        | ||      }t!        | ||      }t#        | ||dz   ddh      }|j%                  i d|d|dd|dd|d|d|d|dz   d|d|d|d|d|dt        |      d |d!t        |      d"t        |      d#t        |      t        |      k(  ||t'        |      ||d$        |j)                  d% &       |S )'Nr   r   r      r#   r+      r]      r1   r   r(   r)   z.dataz.rdatamapsceneId
sceneIdHexr%   04xrecordVarecordFileOffset	eventKindeventDispatchVaeventDispatchRefspointTableVapointTableEndVapointCountHint	rawPointsrawPointCountinBoundsPointsinBoundsPointCountactivePointCountallRawPointsInBounds)pointsactivePointslinkedStrings
tailDwordstailPointerBlocksc                    | d   | d   fS )Nr   r   r   )rB   s    r   <lambda>z extract_events.<locals>.<lambda>7  s    4
#3T%["A r   )key)r	   r   rZ   itemsMAP_RErM   r9   r   r5   r6   r8   r   rg   rk   r   r7   r   rG   r;   r   sort)r   rR   r   r   	map_sizesrecordsmap_vafilenamer   sizer?   r=   r@   scene_idzero
event_kindsentinel	point_ptrri   rV   rW   rb   in_bounds_pointsactive_points	record_vapoint_table_end_var   tail_pointer_blocksdispatch_refss                                r   extract_eventsr      s   T"HtX.G{+IG#MMO B)}}}T"T6*))FF+CQw1WFRx#d)#cAg.HD#'*D!$b1JcBh/H sRx0I'cBh7qyH,)9z9 ME6+;D(IW\^d+e(J(3JvO_`M#$Xs3I !*S_q-@!@*4;MNK"5dHk"R-dHi"nwX`NabMNN4x !Bxn"5 		
 '   &y2~ ( #I &'9 %&6   $S_ %&6 )#.>*?  'M(:!" +C
OsCS?T,T#$ /$1%;<O%P"-)<-? BH LLALBNr   c                    t        j                  t              } | j                  dt        t	        d             | j                  dt        t	        d             | j                  dt        t	        d             | j                  d	d
d       | j                         }t        |j                  j                         |j                        }|j                  j                  j                  dd       |j                  j                  t        j                  |dd      dz   d       |D cg c]#  }|j                   r|d   |j                   k(  s"|% }}t#        dt%        |       d|j                          |d d D ]S  }t#        |d    d|d    d|d    dt%        |j'                  d|d                d t%        |d          d!|d"   d#       U t%        |      dkD  rt#        d$t%        |      dz
   d%       y y c c}w )&N)descriptionz--exezHwanse2.exe)typedefaultz--extract-dirextract_fldz--outzout/scene_events.jsonz--map
map_filterz#only print records for one map stem)desthelpT)parentsexist_okFrI   )ensure_asciiindent
zutf-8)encodingr   zwrote z scene event records -> d   r    z kind=r   z active=r   r   z points=z
 record=0xr   r&   z... z more)argparseArgumentParser__doc__add_argumentr   
parse_argsr   exerN   rR   outparentmkdir
write_textjsondumpsr   printr8   r9   )parserargseventsrB   showns        r   mainr   ;  s   $$9F
dD4GH
dD<OP
dD9P4QR
l9^_DDHH//143C3CDFHHOO$6HH

6aH4OZab$^dDOOtE{doo?]T^E^	F3v;-7z
BCds 
L!"!DK= 1%&hs488NDQYN3[/\.] ^$x.)* +Z(-/	

 5zCSZ#%&e,-  _s   1#HH__main__)r   bytesr   rO   returnrO   )r   
list[dict]r   rO   r   zdict | None)N)
r   r   r   r   r0   rO   r<   zset[str] | Noner   r   )rR   r   r   zdict[str, tuple[int, int]])r   r   r   r   ra   rO   rV   rO   rW   rO   r   ztuple[list[dict], list[dict]])
rb   r   rV   rO   rW   rO   ri   rO   r   r   )ru   strr   z
str | None)r   )
r   r   r   r   r~   rO   r-   rO   r   r   )r   r   r   r   r   r   r   r   )r   r   r   	list[str])r   r   r   r   )r   r   rR   r   r   r   )r   None)(r   
__future__r   r   r   rL   r   syspathlibr   rT   insertr   __file__resolver   
decode_cnsr   probe_exe_scene_tablesr   r   r   r	   r
   compiler   r   r   rG   rZ   rg   rk   rw   r7   r   r   r:   r   r   __name__r   r   r   <module>r     s    H "   	  
  3tH~--/667 8 % h h 
,	-5 &*	+
++ + #	+
 +\(!2	:#L		K\.2 zF r   