
    UHjG                       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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  e
e      j                         j.                  d   Zedz  Zd	Zd
ZdZdZdZdZdhZ ddh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*	 d1	 	 	 	 	 	 	 	 	 	 	 d2dZ+	 d1	 	 	 	 	 	 	 	 	 	 	 	 	 d3dZ,d4dZ-d5dZ.	 	 d6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7dZ/d8d Z0d9d!Z1	 	 	 	 	 	 	 	 	 	 	 	 d:d"Z2d;d#Z3d;d$Z4efd<d%Z5d=d&Z6e7d'k(  r e6        yy)>z?Summarize scene payload context for the blocked map1_01a route.    )annotationsN)Path)read_point_table)find_cns_stringsread_sectionsva_to_offset   outmap1_01amap2_02diD+T i+T i S i  T z.textz.rdataz.datac                    d| dS )N0x08x )values    E/home/exedev/hwanse/tools/summarize_map1_01a_scene_payload_context.pyva_hexr      s    c{    c                6    t        j                  d| |      d   S )N<Ir   )structunpack_from)dataoffsets     r   dword_atr   #   s    dD&1!44r   c                    t        ||      }||dz   t        |       kD  rt        dt        |       d      t	        | |      S )N   zVA z is not readable)r   len
ValueErrorr   r   )r   sectionsvar   s       r   dword_at_var"   '   sH    (B'F~!c$i/3vbzl*:;<<D&!!r   c                T    | D ]#  }|d   }|d   |d   z   }||cxk  r	|k  s|c S  % y )Nrawraw_sizer   r    r   sectionstartends        r   section_for_offsetr*   .   sI     enwz22F S N !
 r   c                h    | D ]-  }|d   }|d   |d   z   }||cxk  r|k  sn "|d   |z   |z
  c S  y )Nr$   r%   r!   r   r&   s        r   offset_to_var,   7   sS     2enwz22F S 4=6)E11	2
 r   c                J    t        | |      }|y t        | |      }|r|d   S d S )Nname)r   r*   )r    r!   r   r'   s       r   section_for_var/   @   s3    (B'F~ 62G%76?/4/r   c                    t        j                  d|       ryt        j                  d|       ry| j                  d      s| j                  d      ryy)	Nzmap_[a-z][123]\.cnstilesetzmap\d+_\d+[a-z]\.cnsmapcara_face_spriteother)re	fullmatch
startswith)r.   s    r   classify_cnsr:   H   sC    	||*D1	||+T2w4??7#;r   c                0   | dz  }| dz	  }| |v rd||    t        ||          dS | dk(  rdddS |dk(  r| d	k  rd
t        |       dS ||d   k  r||d   k  r
d| d| dS t        ||       }|d| cxk  rdk  rn nd| d| dz
  ddS dt        |       dS )N     cns)kindlabelcnsKindr   zero0)r?   r@   i   small-scalarwidthheightzpacked-pair,i  @ i  ` pointer+z#xdword)r:   strr/   r   )r   stringsr    map_sizelohipointed_sections          r   
value_kindrQ   R   s    	B	"BU^#GEN3
 	

 z--	Qw5E>&U<<	HW"x'9"9%2$at==$Xu5O"zU'Hj'H!.?qASTV@W,XYYfUm44r   c                H   g }t        |      D ]  }||dz  z   }t        ||      }	|	|	dz   t        |       kD  r |S t        | |	      }
|
dz  }|
dz	  }t	        |
|||      }|j                  ||t        |      |
t        |
      ||g|d   |d   dd|v rd|d   ini         |S )Nr   r<   r=   r?   r@   )indexr!   vaHexr   valueHexu16r?   r@   rA   )ranger   r   r   rQ   appendr   )r   r    rL   start_vacountrM   rowsrS   r!   r   r   rN   rO   r?   s                 r   read_dword_rowsr\   g   s     Du 	!h+>VaZ#d)3  K v&V^b[%(H=BZu8L']

 09D/@	4	?+b

 
	( Kr   c           	     @   t        j                  d|      }d}g }d}	 | j                  ||      }	|	dk  rne|	dz   }t        ||	      }
|
|
d   |vr4t	        ||	      }|C|dz  }t        |      |k  r'|j                  |
d   |t        |      |	d|	dd       }||dS )	Nr   r   r	   r.   r   06x)r'   refVarefVaHex
fileOffsetfileOffsetHexrZ   samples)r   packfindr*   r,   r   rX   r   )r   r    r   section_namessample_limitneedlerZ   rd   searchhitr'   ref_vas               r   scan_refs_to_valuerm      s     [[u%FEGF
ii'7q$Xs3?gfo]Bh,>
w<,&NN"6?"6N!#%c#Y  ( w//r   c                   d}g }|D ]  }|d   |vr|d   }	|d   |d   z   }
| |	|
 }t        dt        dt        |      dz
              D ]~  }t        j                  d||      d   }||cxk  r|k  sn +|dz  }t        |      |k\  r?|d   |z   }|j                  |d   |t        |      |	|z   d	|	|z   d
|t        |      d         ||dS )Nr   r.   r$   r%      r   r	   r!   r   r^   )r'   r_   r`   ra   rb   r   rU   rc   )rW   maxr   r   r   rX   r   )r   r    rY   end_varg   rh   rZ   rd   r'   	raw_startraw_endr$   rS   r   rl   s                  r   scan_refs_to_rangert      s    EG 6?-/EN	%.7:#669W%1c!SX\23 	E&&tS%8;E..QJE7||+T]U*FNN"6?"6N'%/#%i%&7%<!="5M 	. w//r   c                ^    | d   }||v ryt         |cxk  r	t        k  sy yt        ||      d uS )Nr   F)LOCAL_SCENE_DATA_STARTLOCAL_SCENE_DATA_ENDr   )rowrL   r    r   s       r   is_scene_local_payload_pointerry      sB    LE"eB.BB C%(44r   c                    t        d | D              }t        d | D              }|d   dk(  r|d   dk(  r|dk\  ry||kD  r	|d   dk(  ryy	)
Nc              3  B   K   | ]  }|d    dk(  s	|d    dk(  sd  yw)r?   rD   rB   r	   Nr   .0rx   s     r   	<genexpr>z*classify_payload_sample.<locals>.<genexpr>   s(     eSc&k^.KsSY{^dOdqe   c              3  B   K   | ]  }|d    dk(  s	|d    dk(  sd  yw)r?   rH   r>   r	   Nr   r|   s     r   r~   z*classify_payload_sample.<locals>.<genexpr>   s'     `cs6{i/G3v;Z_K_`r   inBoundsPointCountr   rZ      zsprite-or-rect-payload-likezresource-pointer-table-likezunclassified-resource-payload)sum)sample
point_scanrange_text_refsscalar_countpointer_counts        r   classify_payload_sampler      sb    eFeeL`V``M&'1,1IQ1NS_cdSd,|#(@A(E,*r   c                P   |d   }t        | |||||      }t        | |||d   |d         \  }	}
t        | ||t              }t        | ||t              }t        | ||||z   t              }t        | ||||z   t              }t        |	      t        |
      |	d d |
d d d}t        |||      }i d|d   d|d	   d
|d   d|dt        |      dt        |       dt        ||z          d|d|d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|dddS ) Nr   rE   rF   r   )rawPointCountr   firstRawPointsfirstInBoundsPoints
fieldIndexrS   fieldVar!   
fieldVaHexrT   	payloadVapayloadVaHexrefWindowHexz..sampleDwords	pointScanexactTextRefCountrZ   exactDataRefCountrangeTextRefCountrangeDataRefCountexactTextRefsrd   exactDataRefsrangeTextRefsrangeDataRefsclassificationFzThis scene-local payload has no in-bounds map1_01a coordinate table and no .text reference to the sampled payload window. It is resource/rect-like context, not transition evidence.)promotionEvidencereason)	r\   r   rm   REF_TEXT_SECTIONSREF_DATA_SECTIONSrt   r   r   r   )r   r    rL   	field_rowrM   sample_countref_window_sizeptr_var   
raw_points	in_boundsexact_text_refsexact_data_refsr   range_data_refsr   r   s                    r   payload_summaryr      s    wFT8WflHUF,T8VXgEVX`aiXjkJ	(xARSO(xARSO(x/AY[lmO(x/AY[lmOZ!)n$Ra.(!}	J -VZQNi(9T? 	i( 	V	
 	v 	6&>*"VF_4L-M,NO 	 	Z 	_W5 	_W5 	_W5 	_W5 	3 	3 	3  	3!" 	.#$ #h) r   c                   | j                  d      }d}|j                  |      r|j                         j                  d      st	        |  d      t        j                  |t        |      d  j                  d            S )Nutf-8encodingzwindow.HWANSE_MAPS = ;z. does not contain the expected maps.js wrapperz;
)	read_textr9   rstripendswithr   jsonloadsr   )pathtextprefixs      r   load_map_data_from_jsr     sn    >>7>+D$F??6"$++-*@*@*ED6!OPQQ::d3v;<(//677r   c                .   | D cg c]  }|j                  d      t        k(  s| }}|D cg c]   }t        |j                  d      xs g v s|" }}t        |      t        |      t	        d |D              t	        d |D              dS c c}w c c}w )Nr2   targetsc              3  R   K   | ]  }|j                  d       t        k(  sd ! ywr2   r	   NgetSOURCEr|   s     r   r~   z!scene_evidence.<locals>.<genexpr>  s!     'gccggV[n`fNf'g   ''c              3  R   K   | ]  }|j                  d       t        k(  sd ! ywr   r   r|   s     r   r~   z!scene_evidence.<locals>.<genexpr>   s     !Pswwu~7O!!Pr   )eventTransitionCountsourceEventRecordCountcoordinateCandidateCountextractionGapCount)r   r   TARGETr   r   )event_transitionscoordinate_candidatesgapsrx   source_eventstarget_eventss         r   scene_evidencer     s    $5RS69QSRMR$1ZSV	@R@XVX5YSZMZ #M 2"%m"4$''g5J'g$g!!Pt!PP	  SZs   BB BBc           
     ~   t        |       }t        | |      }|t           }|d   |d   d}t        t        z
  dz  dz   }	t        | ||t        |	|      }
t        | |t        dz         }t        | |t        dz         }|
D cg c]  }|d   t        k  rt        |||      r| }}|D cg c]  }t        | ||||       }}t        |||      }d}i dt        d	t        d
|dt        dt        t              d|dd|ddt        dt        t              d|dd|dd|
d|d|ddddd|S c c}w c c}w )NrE   rF   )rE   rF   r   ro   r!   aB  The current map1_01a selector-only scene cluster still looks like resource/scene-list payload context. The scene-local payload pointers near 0x00542b44 do not decode as in-bounds map1_01a coordinate tables and their sampled windows have no .text refs, so they do not prove map1_01a -> map2_02d as a normal tile transition.sourcetargetsourceMapSizesourceRecordVasourceRecordVaHexsourceSceneIdsourceSceneIdHexr   04xtargetRecordVatargetRecordVaHextargetSceneIdtargetSceneIdHexsceneWindowpayloadssceneEvidencestrictHotspotFoundFpromotionStatusblocked
conclusion)r   r   r   TARGET_RECORD_VASOURCE_RECORD_VAr\   r"   ry   r   r   r   r   )exemap_datar   r   transition_gapsr    rL   
source_maprM   window_countscene_windowsource_scene_idtarget_scene_idrx   payload_fieldsr   evidencer   s                     r   build_summaryr   $  s    S!HsH-G&!J#G,
88LMH$'77A=AL"3';K\[cdL!#x1AA1EFO!#x1AA1EFO  t9'',J3PWYa,b 	N  " 	XwX>H  /1FXH	 
&& 	 	*	
 	V$45 	 	b 56 	* 	V$45 	 	b 56 	| 	H 	 	e  	9!" 	j# 
s   ?"D5'D:c                   ddd| d    d| d    dd| d	    d
| d    dd| d    d
| d    dd| d    dd| d   dddddg}| d   D ]S  }|d   }d|d    d|d    }d|d    d|d    }|j                  d|d     d!|d"    d#|d$    d%| d%| d%|d&    d'       U |j                  g d(       | d)   D ]2  }|j                  d|d*    d!|d+    d,|d-    d#|d.    d%|d/    d'       4 |j                  d       d0j                  |      S )1Nz # map1_01a Scene Payload Context z
- route: `r   z -> r   `z- source record: `r   z	` scene `r   z- target record: `r   r   z- promotion status: `r   r   z## Payload Pointersz8| field | payload | class | point scan | refs | reason |z&| ---: | --- | --- | --- | --- | --- |r   r   text=r   , data=r   raw=r   , inBounds=r   z| r   z | `r   z` | r   z | r   z |)r   z## Scene Windowr   z%| index | VA | value | kind | label |z | ---: | --- | --- | --- | --- |r   rS   rT   z` | `rU   r?   r@   
)rX   extendjoin)summarylinespayloadr   refspointsrx   s          r   markdownr   W  s   *

WX&'tGH,=+>a@
W%89:)GL^D_C``ab
W%89:)GL^D_C``ab
(9 :;1=


B0E :& 
[)
w234GGDW<X;YZ
?34K
K_@`?ab&'tGN,C+DDQaIbHccfhc$s78#4"5R9	
	
 
LL   }% 
Wd3w<.c*o5Fd3v;-WZ[^_f[gZhhjk	

 
LL99Ur   c                T   g }| d   D ]  }|d   }d|d    d|d    }d|d    d	|d
    }|j                  d|d    dt        j                  |d          dt        j                  |d          dt        j                  |       dt        j                  |       dt        j                  |d          d        | d   D cg c]o  }d|d    dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dq }}dj                  g ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0t        j                  | d1          d2t        j                  | d3          d4t        j                  | d5          d6t        j                  | d7          d8t        j                  | d9          d:d;t        j                  | d<          d=d>d?|d@dAdB|d@dCdDdE      S c c}w )FNr   r   r   r   r   r   r   r   r   r   z<tr><td>r   z</td><td><code>r   z</code></td><td>r   z	</td><td>r   z
</td></tr>r   rS   rT   z</code></td><td><code>rU   r?   r@   r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z/  <title>map1_01a Scene Payload Context</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z,    h1 { margin: 0 0 8px; font-size: 24px; }z/    h2 { margin: 24px 0 8px; font-size: 18px; }z<    p { max-width: 1100px; color: #bbb; line-height: 1.45; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z)  <h1>map1_01a Scene Payload Context</h1>z  <p>route <code>r   z -&gt; r   z</code>; source record <code>r   z</code>; target record <code>r   z </code>; promotion status <code>r   z</code></p>z  <p>r   z</p>z  <h2>Payload Pointers</h2>z  <table><thead><tr><th>field</th><th>payload</th><th>class</th><th>point scan</th><th>refs</th><th>reason</th></tr></thead><tbody>z  </tbody></table>z  <h2>Scene Window</h2>zj  <table><thead><tr><th>index</th><th>VA</th><th>value</th><th>kind</th><th>label</th></tr></thead><tbody>z</body>z</html>r   )rX   htmlescaper   )r   payload_rowsr   r   r   r   rx   
scene_rowss           r   	html_pager  ~  s   L:& 
[)
w234GGDW<X;YZ
?34K
K_@`?ab<() *W^%<=> ?;;w'789: ;;;v&' (;;t$% &;;wx012 3		
	
, =)	 	7|n [[W./ 0[[Z12 3{{3v;'( ){{3w<() *		J 	 99 %%% 	% 	#	%
 	Q% 	:% 	% 	r% 	1% 	7% 	:% 	G% 	f% 	t% 	Q%  	'!%" 	#%$ 	%%& 	'%( 	4)%* DKK(9:;74;;wW_O`CaBb c#{{73F+GHI J#{{73F+GHI J""&++g6G.H"I!J+	W+%2 GL123483%4 	&5%6 	N7%8 
9%: 	;%< 	"=%> 	u?%@ 
A%B 	C%D 	E%F 	G%H 	I% % %	s   A4H%c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok#map1_01a_scene_payload_context.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)r   out_dirs     r   write_outputsr    sD    MM$M.44@@

7q9D@ A r   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t        d
z         | j                  dt        t        dz         | j                  dt        t               | j                         }t        |j                  j                         t        |j                        t        j                  |j                  j!                  d            t        j                  |j"                  j!                  d            t        j                  |j$                  j!                  d                  }t'        ||j(                         t+        d|j(                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--mapszmaps.jsz--event-transitionszevent_transitions.jsonz--coordinate-candidatesz scene_coordinate_candidates.jsonz--transition-gapsztransition_extraction_gaps.jsonz	--out-dirr   r   z(wrote map1_01a scene payload context -> r	  )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r   
read_bytesr   mapsr   r   r   r   r   r   r  r  print)parserargsr   s      r   mainr"    sm   $$9F
dD=4HI
tS9_E
-D#H`B`a
1cLnFno
+$Fg@gh
$<Ddii(

4))33W3EF

4--777IJ

4''1171CDG '4<<(	4T\\Di5i4j
klr   __main__)r   intreturnrK   )r   bytesr   r$  r%  r$  )r   r&  r    
list[dict]r!   r$  r%  r$  )r    r'  r   r$  r%  zdict | None)r    r'  r   r$  r%  z
int | None)r    r'  r!   r$  r%  z
str | None)r.   rK   r%  rK   )
r   r$  rL   dict[int, str]r    r'  rM   dictr%  r)  )r   r&  r    r'  rL   r(  rY   r$  rZ   r$  rM   r)  r%  r'  )r=   )r   r&  r    r'  r   r$  rg   set[str]rh   r$  r%  r)  )r   r&  r    r'  rY   r$  rq   r$  rg   r*  rh   r$  r%  r)  )rx   r)  rL   r(  r    r'  r%  bool)r   r'  r   r)  r   r)  r%  rK   )   `   )r   r&  r    r'  rL   r(  r   r)  rM   r)  r   r$  r   r$  r%  r)  )r   r   r%  r)  )r   r'  r   r'  r   r'  r%  r)  )r   r&  r   r)  r   r'  r   r'  r   r'  r%  r)  )r   r)  r%  rK   )r   r)  r  r   r%  None)r%  r.  )8r  
__future__r   r  r  r   r7   r   syspathlibr   r   insertrK   __file__resolveparentextract_scene_eventsr   probe_exe_scene_tablesr   r   r   r  r  r  r   r   r   r   rv   rw   r   r   r   r   r"   r*   r,   r/   r:   rQ   r\   rm   rt   ry   r   r   r   r   r   r   r  r  r"  __name__r   r   r   <module>r9     s   E "    	  
  3tH~--/667 8 1 P P H~''*
Ul		  # ! I w' 5"05*
  	
   J 0
00 0 	0
 0 
0P !0
!0!0 !0 	!0
 !0 !0 
!0H5+  .
.. . 	.
 . . . 
.b80	00 "0 &	0
  0 
0f$N?D 25 m( zF r   