
    UHj%                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddgZdZd	Zi 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$d%d&d'd(d)d*d+d,d-d.Zd/d0d1d2d3Zd:d4Zd;d5Zd<d6Zd=d7Zd>d8Zed9k(  r e        yy)?z;Summarize original keyboard action tables from Hwanse2.exe.    )annotationsN)Path)read_sectionsva_to_offset)primaryiXmR )	alternateiXnR          ESCAPE   BACK   RETURN,   Z-   X.   C9   SPACEH   	NUMPAD_UPK   NUMPAD_LEFTM   NUMPAD_RIGHTP   NUMPAD_DOWNR   NUMPAD_INSERT   NUMPAD_ENTER   UP   PRIOR   LEFT   RIGHTDOWNNEXT)      leftrightupdown)r   r         c                    | d| dd}| dk  r$d|d<   t         j                  | d| d      |d	<   |S d
|d<   d| d|d	<   |S )N0x04x)offsethex   dikkindDIK_0x02xnamezbuffer-offsetzstate+0x03x)	DIK_NAMESget)valueentrys     3/home/exedev/hwanse/tools/summarize_input_keymap.py	key_entryrH   2   sk    r%%56Eu}f!eveC[-ABf L (f"5+.fL    c           	        t        ||      }|t        d|dd      g }t        t              D ]  }g }||t        z  dz  z   }t        t              D ]C  }	t        j                  d| ||	dz  z         d   }
|
dk(  r n|j                  t        |
             E |j                  |d|z  dd|z  d	t        j                  |      |d
        ||d|dt        t        |dS )NzVA 0x08xz is outside known sectionsr5   z<Hr   r   r8   r9   )indexbitbitHexhintkeys)rA   vavaHexgroupsslotsPerGroupactions)r   
ValueErrorrangeGROUPSSLOTSstructunpack_fromappendrH   ACTION_HINTSrD   )exesectionsrA   rQ   r:   rU   actionslotsbaseslotrE   s              rG   
read_tablerd   =   s   (B'F~5C(BCDDG- 
**%L 	+D&&tS$/B1EEzLL5)*		+
 	F{qF{3/0$((0	

& bX rI   c                    | j                         }t        |      }t        |       ddt        D cg c]  \  }}t	        ||||       c}}g ddS c c}}w )NihU 
0x0055b868)zqEach table has 16 action groups; the original routine ORs bit N when any nonzero key entry in group N is pressed.zWValues below 0x100 are DirectInput keyboard DIK offsets into the 256-byte state buffer.zValues at or above 0x100 are retained as raw offsets into the same combined input state area until their producer is fully named.)r^   keyboardStateVakeyboardStateVaHextablesnotes)
read_bytesr   strTABLESrd   )exe_pathr^   r_   rA   rQ   s        rG   build_summaryro   _   sb    



CS!H8}%* #
b sHdB/

 
s   Ac                6   ddd| d    dd| d    dddd	d
dg	}| d   D ]  }|j                  d|d   j                          ddd|d    ddddg       |d   D ]X  }dj                  d |d   D              xs d}|j                  d|d    d|d    d|j	                  d      xs d d| d	       Z |j                  d        |j                  d dg       | d!   D ]  }|j                  d"|         d#j                  |      j                         d#z   S )$Nz# Original Input Keymap zExecutable: `r^   `zKeyboard state buffer: `rh   zLThe action packer at `0x0042f6d2` scans one of these tables. Each row is onezLaction bit; if any listed key/state offset is pressed, that bit is ORed intozthe returned 16-bit mask.ri   z## rA   z TablezTable VA: `rR   z| action | bit | hint | keys |z| ---: | --- | --- | --- |rU   z, c              3  :   K   | ]  }d |d    d|d    d  yw)rr   rA   z` (r;   )N ).0keys     rG   	<genexpr>zmarkdown.<locals>.<genexpr>   s/       CK=CJ<q1s   rP   -z| rL   z | `rN   z` | rO   z | z |z## Notesrj   z- 
)extendtitlejoinr\   rD   rstrip)summarylinestabler`   rP   notes         rG   markdownr   r   s   !

'q)
"7+?#@"AC
VV#

E " eFm))+,F3eGn-Q/0,		
 I& 	F99 !&>     LLVG_%T&*:);4::f%,-Sb:	 	R)* 
LL*b!"  "r$[!"99U""$t++rI   c                 ~   t        j                  t              } | j                  dt        t	        d             | j                  dt        t	        d             | j                  dt        t	        d             | j                         }t        |j                        }|j                  j                  j                  d	d	
       |j                  j                  t        j                  |dd      dz   d       |j                  j                  t        |      d       t!        d|j                          y )N)descriptionz--exezHwanse2.exe)typedefaultz
--json-outzout/input_keymap.jsonz--outzout/input_keymap.mdT)parentsexist_okFr5   )ensure_asciiindentrz   zutf-8)encodingzwrote original input keymap -> )argparseArgumentParser__doc__add_argumentr   
parse_argsro   r^   json_outparentmkdir
write_textjsondumpsoutr   print)parserargsr   s      rG   mainr      s    $$9F
dD4GH
4>U9VW
dD9N4OPDDHH%GMMtd;MMTZZeANQUU`ghHH)G<	+DHH:
67rI   __main__)rE   intreturndict)
r^   bytesr_   z
list[dict]rA   rl   rQ   r   r   r   )rn   r   r   r   )r   r   r   rl   )r   None)r   
__future__r   r   r   rZ   pathlibr   probe_exe_scene_tablesr   r   rm   rX   rY   rC   r]   rH   rd   ro   r   r   __name__ru   rI   rG   <module>r      sU   A "     > 
 
	(& 	( 	#	
 	# 	# 	' 	+ 	- 	. 	- 	/ 	. 	$ 	'  	&!" 	'#$ 
'	. 	D&$,N8 zF rI   