
    UHj7                    J   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
 ddlmZ ddlmZ ej                  j!                  d e ee      j'                         j(                               ddlmZmZmZmZ  ee      j'                         j4                  d   Zed	z  Z ej:                  d
      Z ej:                  d      Z ej:                  d      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(d$dZ)d%dZ*d&dZ+d&dZ,efd'dZ-d(dZ.e/dk(  r e.        yy))a  Summarize original EXE battle resource descriptor evidence.

This deliberately stops at resource descriptors. The goal is to separate
proven EXE-backed battle/background/sprite load records from still-missing
enemy stat, formation, encounter, reward, and combat formula tables.
    )annotationsN)Counter)Path)Any)find_cns_stringsoffset_to_varead_sectionsva_to_offset   outz^btl_[a-z]\d\.cns$z^btl_.*\.cns$z^(?:z|boss).*\.cns$c                p    	 t        j                  | j                  d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError)pathfallbacks     K/home/exedev/hwanse/tools/summarize_original_battle_resource_descriptors.py	load_jsonr   !   s5    zz$..'.:;; s   $' 55c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r
   lenstructunpack_from)datasectionsvaoffsets       r   dword_at_var#   (   s?    (B'F~!c$i/dD&1!44    c                    t        j                  d|      }g }d}	 | j                  ||      }|dk  r	 |S |dz   }t        ||      }|/|j	                  ||d       C)Nr   r   r   )
fileOffsetrefVa)r   packfindr   append)r   r    valueneedlerefssearchhitref_vas           r   find_value_refsr1   /   su    [[u%FDF
ii'7 K qh,>389 r$   c                    | D ci c]/  }|j                  d      st        |j                  d            |1 c}S c c}w )Nname)getstr)cns_payloadsrows     r   payload_indexr8   ?   s2    1=Q#C #%QQQs   <<c                    |r|j                  d      nd}t        j                  |       r|dk(  ryt        j                  |       r|dk(  ryt        j                  |       r|dk(  ryy)Nkind tilemapbattle-background-tilemapimagebattle-sprite-imageenemy-object-sprite-image)r4   BATTLE_TILEMAP_RE	fullmatchBATTLE_RESOURCE_REENEMY_RESOURCE_RE)r3   payloadr:   s      r   resource_classrF   C   s]    ")7;;vrD""4(TY->*##D)dgo$""4(TW_*r$   c                   |dk(  r=| j                  d      dk(  r)| j                  d      dk(  r| j                  d      dk(  ry|d	k(  rP| j                  d      d
k(  r<| j                  d      dv r)| j                  d      dk(  r| j                  d      dk(  ry|dk(  r)| j                  d      d
k(  r| j                  d      dk(  ryy)Nr=   minus4   minus8i0 minus12i  tileset-pair-background-loadr@   r   >     plus8i plus12r   sprite-resource-loadr?   zbattle-sprite-resource-loadzmixed-resource-script)r4   )valuesclss     r   classify_shaperT   N   s    
))JJx D(

8$
2

9%31
))JJx D(

8$(@@

7#z1

8$,)
##::h4'FJJx,@D,H0"r$   c                   g }t        |j                         d       D ],  \  }}|j                  |      }t        ||      }|s't	        | ||      D ]  }	|	d   }
t        | ||
dz
        t        | ||
dz
        t        | ||
dz
        t        | ||
dz
        t        | ||
dz         t        | ||
dz         t        | ||
dz         t        | ||
dz         d}|j                  |||r|j                  d	      nd
|r|j                  d      nd |r|j                  d      nd |d|d|
d|
d|	d   d|	d   d|t        ||      d        / |S )Nc                    | d   | d   fS )Nr   r    )items    r   <lambda>z(collect_reference_rows.<locals>.<lambda>f   s    T!WdSTgDV r$   )keyr'   rI         r   )minus16rK   rJ   rH   plus4rO   rP   plus16r:   r;   widthheight0x08xr&   06x)r3   classpayloadKindr`   ra   stringVastringVaHexr'   refVaHexr&   fileOffsetHexrR   shape)sorteditemsr4   rF   r1   r#   r*   rT   )r   r    stringspayloadsrows	string_var3   rE   rS   refr0   rR   s               r   collect_reference_rowsrs   d   s   D!'--/7VW !	4,,t$T7+"49= 	C\F&tXv{C&tXv{C%dHfqjA%dHfqjA$T8VaZ@$T8VaZ@%dHfrkB%dHfrkB	F KK  :A7;;v#6r5<W[[1$7>gkk(3D )%'	##7#"$VCL 1"%l"3')#l*;C)@%A$+FC8	!D Kr$   c                8   t        fd|j                         D              }| D cg c]  }|d   |k(  s| }}t        |D ch c]  }|d   	 c}      }t        d |D              }t        d |D              }	t        |      t        |      t        |      |D 
cg c]	  }
|
|vs|
 c}
t        |	j                               D 
ci c]  \  }
}|dkD  r|
| c}}
t	        t        |j                                     |d d dS c c}w c c}w c c}
w c c}}
w )	Nc              3  <   K   | ]  \  }} ||      s|  y w)NrW   ).0r3   r7   payload_predicates      r   	<genexpr>z class_summary.<locals>.<genexpr>   s!     bID#EVW[]`Ea4bs   re   r3   c              3  &   K   | ]	  }|d      yw)rk   NrW   rv   r7   s     r   rx   z class_summary.<locals>.<genexpr>   s     >C3w<>   c              3  &   K   | ]	  }|d      yw)r3   NrW   rz   s     r   rx   z class_summary.<locals>.<genexpr>   s      CV Cr{   r   r[   )payloadCountreferencedPayloadCountreferenceCountmissingExeRefNamesmultiRefNamesshapeCounts
sampleRows)rl   rm   r   r   dict)rp   ro   rS   rw   payload_namesr7   
class_rowsreferenced_namesshape_countsref_counts_by_namer3   counts      `        r   class_summaryr      s   b1AbbM!%=#W)<#=J=jAss6{AB>:>>L  C
 CCM*"%&6"7j/0=^M]A]t^  &&8&>&>&@A
eqy %K

 F<#5#5#789 "o 	 >A _
s"   DDD	D
(D

Dc           	        t        | |      }t        |      }t        | |||      }t        ||dd       t        ||dd       t        ||dd       d}|d   d   }|d   d   }|d   d	   d
kD  |j	                  dd
      |d   d	   k(  |d   d	   d
kD  |j	                  dd
      |d   d	   k(  dddd}	dddgd||	t        |      |ddS )Nr=   c                X    t         j                  |       xr |j                  d      dk(  S )Nr:   r<   )rA   rB   r4   r3   r7   s     r   rY   zbuild_summary.<locals>.<lambda>   s%    /99$?`CGGFOW`D` r$   r?   c                X    t         j                  |       xr |j                  d      dk(  S Nr:   r>   )rC   rB   r4   r   s     r   rY   zbuild_summary.<locals>.<lambda>   s%    0::4@_SWWV_X_E_ r$   r@   c                X    t         j                  |       xr |j                  d      dk(  S r   )rD   rB   r4   r   s     r   rY   zbuild_summary.<locals>.<lambda>   s%    /99$?^CGGFOW^D^ r$   )r=   r?   r@   r   r   r   rL   rQ   F) battleBackgroundDescriptorsFound#battleBackgroundDescriptorsStandardenemySpriteDescriptorsFound$enemySpriteDescriptorsMostlyStandardresourceDescriptorsAreEnemyRows(resourceDescriptorsContainStatsOrRewards#resourceDescriptorsProveBattleEntryz@EXE-backed battle/background/enemy resource descriptor evidence.Hwanse2.exezout/cns_payloads.jsonz.resource-descriptors-grounded-data-gap-remainsa  Battle background and enemy/object sprite CNS resources are backed by EXE resource-load descriptor rows. These descriptors prove resource binding shape, but they are not enemy stat rows, formations, encounter dispatch, reward tables, combat formulas, or battle-entry event execution.)scopesourcepromotionStatusclassSummarychecksresourceDescriptorRowCountresourceDescriptorRows
conclusion)r   r8   rs   r   r4   r   )
r   r    r6   rn   ro   rp   by_classbackground_shapesenemy_shapesr   s
             r   build_summaryr      sL   tX.G\*H!$'8DD%2'`	&
  -!_	 
 &3'^	&
H( !!<=mL78GL,45P,QRb,cfg,g/@/D/DEcef/g/01AB0C'/0K'LM]'^ab'b0<0@0@AWYZ0[/01AB1C+049/4
F T "9:K &)$i"&O r$   c                   | j                  d      xs i }dj                  d d|j                  d      fd|j                  d      fd|j                  d      fd|j                  d      fd|j                  d      ffD              S )	NrR    c              3  \   K   | ]$  \  }}t        |t              r| d |dn| d & yw)z=0xrc   z=-N)
isinstanceintrv   rZ   r+   s      r   rx   z"sample_row_text.<locals>.<genexpr>   s=      	C #-UC"83%s5+RjH	s   *,rK   rJ   rH   rO   rP   )r4   join)r7   rR   s     r   sample_row_textr      s    WWX$"F88 	 

9-.vzz(+,vzz(+,fjj)*vzz(+,
	 	 	r$   c                   dd| d   dd| d    dd| d    dd	dd
dg}| d   j                         D ]  \  }}dj                  d |j                  d      xs i j                         D              xs d}dj                  |j                  d      xs g       xs d}dj                  d |j                  d      xs i j                         D              xs d}|j                  d| d|d    d|d    d|d    d| d| d| d        |j	                  g d       | d   j                         D ]  \  }}|j                  d| d| d        |j	                  g d       | d   j                         D ]U  \  }}	|	j                  d      xs g d d D ]5  }|j                  d| d|d     d!|d"    d#|d$    dt        |       d       7 W d%j                  |      d%z   S )&Nz&# Original Battle Resource Descriptorsr;   r   z- promotion status: `r   `z- descriptor rows: r   z## Class Summaryz_| class | payloads | referenced payloads | refs | shapes | missing EXE refs | multi-ref names |z.| --- | ---: | ---: | ---: | --- | --- | --- |r   , c              3  0   K   | ]  \  }}| d |   yw=NrW   r   s      r   rx   zmarkdown.<locals>.<genexpr>        e
UcU!E7+e   r   -r   c              3  0   K   | ]  \  }}| d |   yw:NrW   r   s      r   rx   zmarkdown.<locals>.<genexpr>        fzsESE5'*fr   r   z| z | r}   r~   r   z |)r;   z	## Checksr;   z| check | value |z| --- | --- |r   )r;   z
## Samplesr;   z'| class | name | ref | shape | values |z| --- | --- | --- | --- | --- |r   r   z | `r3   z` | `ri   z` | rk   
)rm   r   r4   r*   extendr   )
summarylinesrS   r7   shapesmissingmultirZ   r+   	class_rows
             r   markdownr      sO   0


(9 :;1=
g&BCDE

i8E N+113 
Sesww}?U?[Y[>b>b>deelil))CGG$89?R@GC		fcggo>V>\Z\=c=c=effmjmS^,-S5M1N0Os#$%SG9CwbJ	
	
 
LL   h'--/ -
Ur#c%+,-	LL   ".1779 YMM,/52r: 	CLLSEc&k]%J/@w<.OC$8#9=	 99Ud""r$   c                   g }| d   j                         D ]$  \  }}dj                  d |j                  d      xs i j                         D              xs d}dj                  |j                  d      xs g       xs d}dj                  d |j                  d      xs i j                         D              xs d}|j                  d	t	        j
                  |       d
|d    d
|d    d
|d    d
t	        j
                  |       d
t	        j
                  |       d
t	        j
                  |       d       ' dj                  d | d   j                         D              }g }| d   j                         D ]  \  }}	|	j                  d      xs g d d D ]  }|j                  d	t	        j
                  |       dt	        j
                  |d          dt	        j
                  |d          dt	        j
                  |d          d
t	        j
                  t        |             d         dt	        j
                  | d          dt	        j
                  | d          ddj                  |       d| d dj                  |       d!S )"Nr   r   c              3  0   K   | ]  \  }}| d |   ywr   rW   r   s      r   rx   zhtml_page.<locals>.<genexpr>  r   r   r   r   r   c              3  0   K   | ]  \  }}| d |   ywr   rW   r   s      r   rx   zhtml_page.<locals>.<genexpr>  r   r   r   <tr><td>	</td><td>r}   r~   r   
</td></tr>r;   c           	   3     K   | ]?  \  }}d t        j                  |       dt        j                  t        |             d A yw)r   r   r   N)htmlescaper5   r   s      r   rx   zhtml_page.<locals>.<genexpr>#  sC      C 4;;s#$Idkk#e*.E-FjQs   AAr   r   r   z</td><td><code>r3   z</code></td><td><code>ri   z</code></td><td>rk   a  <!doctype html>
<meta charset="utf-8">
<title>Original Battle Resource Descriptors</title>
<style>
body { font-family: system-ui, sans-serif; margin: 24px; background: #101418; color: #e8edf2; }
table { border-collapse: collapse; width: 100%; margin: 16px 0; }
td, th { border: 1px solid #39424c; padding: 6px 8px; vertical-align: top; }
th { background: #202832; }
code { color: #9bd4ff; }
</style>
<h1>Original Battle Resource Descriptors</h1>
<p>r   z </p>
<p>Promotion status: <code>r   z</code></p>
<h2>Class Summary</h2>
<table><thead><tr><th>class</th><th>payloads</th><th>referenced</th><th>refs</th><th>shapes</th><th>missing</th><th>multi-ref</th></tr></thead><tbody>z/</tbody></table>
<h2>Checks</h2>
<table><tbody>z</tbody></table>
<h2>Samples</h2>
<table><thead><tr><th>class</th><th>name</th><th>ref</th><th>shape</th><th>values</th></tr></thead><tbody>z</tbody></table>
)rm   r   r4   r*   r   r   r   )
r   r   rS   r7   r   r   r   
check_rowssample_rowsr   s
             r   	html_pager     s   JN+113 
Sesww}?U?[Y[>b>b>deelil))CGG$89?R@GC		fcggo>V>\Z\=c=c=effmjm;;s#$ %~&' (/01 2'() *;;v&' (;;w'( );;u%& '
	
	
  !(+113 J K!.1779 
YMM,/52r: 		C{{3'( )![[V56 7![[Z9: ;{{3w<01 2{{?3#789 :		
 	KK%&' ( KK0A(BCD EW XZ  X_  X_  `j  Xk  Wl ll kkmkrkrs~k  kA A% r$   c                   |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       |dz  j                  t        |       d	       y )NT)parentsexist_okz)original_battle_resource_descriptors.jsonF   )ensure_asciiindentr   r   r   z'original_battle_resource_descriptors.mdz)original_battle_resource_descriptors.html)mkdir
write_textr   dumpsr   r   )r   out_dirs     r   write_outputsr   I  s    MM$M.::FF

7q9D@ G  88DDXgEVahDi::FFyQXGYdkFlr$   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }|j                  j                         }t        |      }t        |j                  dz  g       }t        |||      }t        ||j                         y )N)descriptionz--exer   )typedefaultz	--out-dirzcns_payloads.json)argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsexe
read_bytesr	   r   r   r   r   )parserargsr   r    r6   r   s         r   mainr   S  s    $$9F
dD=4HI
$<D88 DT"HT\\,??DLD(L9G'4<<(r$   __main__)r   r   r   r   returnr   )r   bytesr    
list[dict]r!   r   r   z
int | None)r   r   r    r   r+   r   r   r   )r6   r   r   dict[str, dict])r3   r5   rE   zdict | Noner   r5   )rR   zdict[str, int | None]rS   r5   r   r5   )
r   r   r    r   rn   zdict[int, str]ro   r   r   r   )rp   r   ro   r   rS   r5   r   r   )r   r   r    r   r6   r   r   r   )r7   r   r   r5   )r   r   r   r5   )r   r   r   r   r   None)r   r   )0r   
__future__r   r   r   r   rer   syscollectionsr   pathlibr   typingr   r   insertr5   __file__resolveparentprobe_exe_scene_tablesr   r   r	   r
   r   r   r   compilerA   rC   rD   r   r#   r1   r8   rF   rT   rs   r   r   r   r   r   r   r   __name__rW   r$   r   <module>r      s   #    	  
    3tH~--/667 8 ^ ^ H~''*
UlBJJ45 RZZ 01 BJJ56 5 R#,$N*2j,#^4n 25 m
) zF r$   