
    UHj                   6   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	 ddl
mZmZmZ  e	e      j                         j                   d   Zedz  Zedz  Zed	z  d
z  Zedz  ZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)d Z*d!Z+d"Z,d#Z-d$Z.d%Z/d&Z0d'Z1d(Z2d)Z3d*Z4d+Z5d,Z6d-Z7d.Z8d/Z9d0Z:d1Z;d2Z<d3Z=d4Z>d5Z?d6Z@d7ZAd8ZBd9ZCg d:ZDd9ZEd;ZFd<ZGd=ZHd>ZId?ZJd@ZKdAZLdBZMdCZNdDZOdEZPdFZQdGZRdHZSdIZTdJZUdKdLdMdNdOdPdQdRdSdTdUdVdWdQdXdYdZd[d\d]dQgZVd^d_d`dadbdcdddedfdg	ZWdhdidjddkdldmeJdndodp
dqdrdsdmdtdudeJdvdwdp
dxd8dyd9dzd{d|eJd}d~dp
dddd|dddeKdddp
gZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcddZdddZeddZfefddZgddZhddZi	 d	 	 	 	 	 	 	 	 	 	 	 ddZj	 d	 	 	 	 	 	 	 	 	 	 	 ddZkddZl	 d	 	 	 	 	 	 	 	 	 	 	 ddZm	 d	 	 	 	 	 	 	 	 	 ddZn	 d	 	 	 	 	 	 	 	 	 ddZoddZpddZqddZrddZsddZtddZueefddZvddZwddZxefddZyddZze{dk(  r ez        yy)zASummarize original runtime input/update/tile projection evidence.    )annotationsN)Path)find_cns_stringsread_sectionsva_to_offset   outzHwanse2.exewebz	game.htmlz1save_selector_opcode20_runtime_materializers.jsonivA iA iA iA iA it-B i\C /C i!#@ i8D iU i*JB iEKB iLB iMB ilA iD@ !   iD@     i@@    iثU i-B iB ihU iY iY iU iXmR ivE ivE iU    i-C i{C iC ivE i8EW ipY i@EW iPEW iREW iTEW       )r      r   i3EW iZY iZY iZY iX iX iDB iDB iGEB iEB i`nC iX@ i AW iAW i-D    Atahozcara_at1.cnsi|O    iO ihO )nameresourcedescriptorVasurfaceIndexframeScriptVastateTableVaRinshanzcara_rs1.cnsiuN    ixyN ixN Smashuzcara_sm1.cnsi`T    idT icT zstate0/bootstrap duplicatez	idle downzidle upz	idle leftz
idle rightzmoving downz	moving upzmoving leftzmoving right)	r   r      r   r         r      downr!   i C iHC C r    z-horizontal footprint width at bottom edge rowz$mapHeight - footprintHeight == tileY)
	direction
inputLatchcaseVaedgeBlockedLatchedgeCheckVa
flagTestVaflagBitflagGrid	scanShapeboundaryRuleupr"   iC iC XC z+horizontal footprint width at top/block rowz
tileY == 0leftiqC iC C r   z(left footprint edge sample at bottom rowz
tileX == 0rightr#   iC iC eC z@right footprint edge sample through edge-shifted collision tablez"mapWidth - footprintWidth == tileXc                    | y d| dS )N0x08x )values    7/home/exedev/hwanse/tools/summarize_runtime_movement.pyhex32r<      s    }c{    c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r;   	load_jsonrH      s*    ;;=::dnngn677r=   c                ^    t        ||      }|t        dt        |       d      | |||z    S )NzVA  is outside raw sections)r   
ValueErrorr<   )exesectionsvasizeoffsets        r;   read_atrQ      s=    (B'F~3uRyk)ABCCvv}%%r=   c                $    t        | ||d      d   S )Nr   r   )rQ   rL   rM   rN   s      r;   read_u8rT      s    3"a(++r=   c           	     L    t        j                  dt        | ||d            d   S )Nz<Hr    r   structunpackrQ   rS   s      r;   read_u16rY      #    ==wsHb!<=a@@r=   c           	     L    t        j                  dt        | ||d            d   S )N<Ir   r   rV   rS   s      r;   read_u32r]      rZ   r=   c           	         t        | ||      }|dk7  rt        dt        |             t        j                  dt        | ||dz   d            d   }|dz   |z   S )N   zexpected near call at z<ir   r   r   r!   )rT   rK   r<   rW   rX   rQ   )rL   rM   rN   opcoderels        r;   rel32_targetrb      s`    S(B'F~1%)=>>
--gc8R!VQ?
@
CC6C<r=   c                L    t        | ||      }|t        |      t        |      dS )N)label	callVaHextargetVaHex)rb   r<   )rL   rM   rN   rd   targets        r;   direct_callrh      s+    #x,F2YV} r=   c                <    t        | |||      j                  d      S )N )rQ   hex)rL   rM   rN   rO   s       r;   	bytes_hexrl      s    3"d+//44r=   c                    t        ||      }t        ||      }||$t        dt        |       dt        |       d      | || j                  |      S )Nz	VA range ..rJ   )r   rK   r<   count)rL   rM   start_vaend_vaneedlestartends          r;   count_bytesru      s^    8,E
x
(C}9U8_$5RfF^_``uS>''r=   c                8     t         fd|D              S )Nc              3  <   K   | ]  }t        |        y wN)ru   ).0rr   rq   rL   rM   rp   s     r;   	<genexpr>z"count_any_bytes.<locals>.<genexpr>   s     Z{3(FFCZs   )sum)rL   rM   rp   rq   needless   ```` r;   count_any_bytesr}      s    ZRYZZZr=   c                `    t         j                  |      }t        | ||t        |            |k(  S rx   )bytesfromhexrQ   len)rL   rM   rN   expected_hexexpecteds        r;   snippet_matchesr      s*    }}\*H3"c(m4@@r=   c                    t        j                  dt        j                  |       d|       }|rt        |j	                  d            S d S )N
\bconst\s+z\s*=\s*(\d+)\s*;r   )researchescapeintgroup)sourcer   matchs      r;   js_const_intr      s?    IIBIIdO#44DEvNE"'3u{{1~1T1r=   c                >   t        j                  dt        j                  |       d|       }|sy g }|j                  d      j	                  d      D ]G  }|j                         }|st        j                  d|      s y |j                  t        |             I |S )Nr   z\s*=\s*\[([^\]]*)\]\s*;r   ,z\d+)	r   r   r   r   splitstrip	fullmatchappendr   )r   r   r   valuesitems        r;   js_const_int_arrayr      s    IIBIIdO#44KLfUEFA$$S) !zz|||FD)c$i ! Mr=   c           	       # | j                  d      #t        #d      }t        #d      }t        #d      }t        #d      }t        #d      }t        #d      }t        #d	      }t        #d
      }t        #d      }	t        #d      }
d}|d#v r|nd }t        j                  d#      }|r5t        |j                  d            }t        |j                  d            }n:t        j                  d#      }|r|nd }|rt        |j                  d            nd }||d}t        j                  d#      }|st        j                  d#      }t        #fddD              }t        #fddD              }t        #fddD              }t        #fddD              }t        #fddD              }t        #fdd D              }t        #fd!d"D              }t        #fd#d$D              }t        #fd%d&D              }t        #fd'd(D              }t        #fd)d*D              }t        #fd+d,D              }t        #fd-d.D              }t        #fd/d0D              } t        #fd1d2D              }!|r|j                  d      nd }"i d3t        |       d4|d5d#v r|nd d6|d7|d8|d9|d:|d;|d<|d=|d>|d?|d@|dA|r|rdBn|rdCnd dD|dE|i dF|dG|dH|dI|rdJdKdLnd dM|dN|dO|dP|rdQnd dR|rdSnd dT|dU|rdVnd dW|dX|	dY|
dZ|d[|
t        k(  d\d]#v |d^u xr	 |t        k(  | | |!|"d_#v rd`ndadb#v rdcddS d ddS )eNr?   r@   ORIGINAL_FRAME_MSPLAYER_WALK_FRAMESPLAYER_IDLE_FRAMEPLAYER_FIRST_WALK_FRAME%PLAYER_ORIGINAL_WALK_CADENCE_COMMANDSPLAYER_FRAME_WIDTHPLAYER_FRAME_HEIGHTPARTY_TRAIL_RING_SLOTSPARTY_TRAIL_ACTOR_SLOTSPARTY_TRAIL_INITIAL_CURSORSz(DEFAULT_TILE_STEP_MS = ORIGINAL_FRAME_MSz*clamp\(requestedMoveMs,\s*(\d+),\s*(\d+)\)r   r    z6clamp\(requestedMoveMs,\s*ORIGINAL_FRAME_MS,\s*(\d+)\))minmaxz4\bconst\s+DEFAULT_COLLISION_MODE\s*=\s*"([^"]+)"\s*;z*:\s*"([^"]+)";\s*const requestedVisualModec              3  &   K   | ]  }|v  
 y wrx   r9   ry   snippetr   s     r;   rz   z web_alignment.<locals>.<genexpr>(  s      'V+    )zWconst frameStep = Math.min(PLAYER_WALK_FRAMES - 1, Math.floor(t * PLAYER_WALK_FRAMES));z3const tileT = frameStep / (PLAYER_WALK_FRAMES - 1);z'player.frame = walkingFrame(frameStep);c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>-  s      'Ww&'8 'r   )z0const PLAYER_ORIGINAL_WALK_CADENCE_COMMANDS = 8;zTconst PLAYER_ORIGINAL_TILE_STEP_COMMANDS = DEFAULT_TILE_STEP_MS / ORIGINAL_FRAME_MS;z(const PLAYER_ORIGINAL_IDLE_SELECTORS = {z/const PLAYER_ORIGINAL_WALK_SCRIPT_SELECTORS = {z0: [4, 5, 4, 0, 6, 7, 6, 0],z"1: [12, 13, 12, 2, 14, 15, 14, 2],z"2: [16, 17, 16, 3, 18, 19, 18, 3],z3: [8, 9, 8, 1, 10, 11, 10, 1],z&const PLAYER_ORIGINAL_SOURCE_RECTS = {zWfunction originalPartyFrameSelector(dir, frame = 0, moving = false, scriptPhase = null)z'return sequence[phase] ?? idleSelector;zQreturn PLAYER_ORIGINAL_SOURCE_RECTS[selector] || PLAYER_ORIGINAL_SOURCE_RECTS[0];c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>;  s      'Ww&'8 'r   )zwalkScriptPhase: 0,z#function wrapWalkScriptPhase(value)z!const scriptPhaseStep = Math.min(z2Math.floor(step.elapsed / ORIGINAL_FRAME_SECONDS),zZplayer.walkScriptPhase = wrapWalkScriptPhase(step.walkScriptStartPhase + scriptPhaseStep);zOstep.walkScriptStartPhase + Math.round(step.duration / ORIGINAL_FRAME_SECONDS),z-walkScriptStartPhase: player.walkScriptPhase,c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>D  s      g6) r   )zif (player.step) {z(const [dx, dy] = activeMovementVector();zplayer.step = {zduration: TILE_STEP_SECONDSc              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>J  s      7W& r   )z+const wallSlidePreference = { x: 1, y: 1 };z+function chooseMovementStep(tile, dx, dy) {z#wallSlidePreference.x = -preferred;z#wallSlidePreference.y = -preferred;c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>P  s      &Gg&7 &r   )z:function directionForVector(dx, dy, fallback = player.dir)z,const inputDir = directionForVector(dx, dy);zKconst movementDir = directionForVector(movement.dx, movement.dy, inputDir);zplayer.dir = movementDir;zXmovementAction: movementActionForVector(movement.dx, movement.dy) ?? lastMovementAction,c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>W  s      'Ww&'8 'r   )z#let wallSlideFollowupAction = null;z0let activeMovementFromWallSlideFollowup = false;z7function chooseMovementStepForActiveInput(tile, dx, dy)zAfunction updateWallSlideFollowupAction(inputAction, actualAction)z>const alternateActions = heldKeyboardMovementActions(heldMask)c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>^  s      'V+ r   )z"const CAMERA_DEADZONE_TILES_X = 6;z"const CAMERA_DEADZONE_TILES_Y = 5;z-function updateCamera({ force = false } = {})zUconst deadzoneWidth = Math.min(canvas.width, CAMERA_DEADZONE_TILES_X * map.tileSize);zZconst deadzoneHeight = Math.min(PLAYFIELD_HEIGHT, CAMERA_DEADZONE_TILES_Y * map.tileSize);c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>e  s      "'V"3 "r   )z'const MAP_QUERY_SYNC_THROTTLE_MS = 240;z let pendingMapQuerySync = false;zfunction requestMapQuerySync()z9function flushPendingMapQuerySync({ force = false } = {})zrequestMapQuerySync();z*flushPendingMapQuerySync({ force: true });c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>m  s      )wF): )r   )z"originalLayer1Flags"z.const ORIGINAL_LAYER1_DIRECTION_BLOCK_BITS = {z?function originalLayer1FlagPasses(tileX, tileY, dx = 0, dy = 0)z&function canMoveToTarget(x, y, dx, dy)z'collisionMode === "originalLayer1Flags"c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>t  s      "'V"3 "r   )zBconst actorCollisionEnabled = query.get("actorCollision") === "1";zquery.has("actorCollision")z!function actorFootprintKeys(x, y)zfunction partyCollisionActors()z)function activeActorCollisionBlocks(x, y)zereturn tileFlagsPass && !activeActorCollisionBlocks(x, y) && !activeEventObjectCollisionBlocks(x, y);z'actorCollision=${actorCollisionEnabled}c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>}  s      
Gg/ 
r   )	z!const PARTY_TRAIL_RING_SLOTS = 7;z:let partyTrail = Array(PARTY_TRAIL_RING_SLOTS).fill(null);zlet partyFollowerSteps = [];z?function recordPartyTrailPosition(target = player, detail = {})zNpartyTrail[partyTrailCursors[0]] = partyTrailEntryForMovement(target, detail);+recordPartyTrailPosition(movement.target, {z'function partyTrailEntryForActor(index)z:return partyTrail[cursor] || partyFallbackPosition(index);z.function interpolatedPartyActor(member, index)c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>  s      
#7f#4 
#r   )	z"const PARTY_TRAIL_ACTOR_SLOTS = 3;z.const PARTY_TRAIL_INITIAL_CURSORS = [0, 4, 1];z9let partyTrailCursors = [...PARTY_TRAIL_INITIAL_CURSORS];zfunction resetPartyTrail()z"function normalizePartyTrailRing()z#function advancePartyTrailCursors()z7partyTrailCursors = partyTrailCursors.map((cursor) => {z1return next >= PARTY_TRAIL_RING_SLOTS ? 0 : next;z1const cursor = partyTrailCursors[index + 1] ?? 0;c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>  s      (g6(9 (r   )zconst interpolationOffset = {z%const interpolatedProjectedScreen = {z5x: adjustedProjectedScreen.x + interpolationOffset.x,z5y: adjustedProjectedScreen.y + interpolationOffset.y,zfixedPoint: {z<x: projectedScreen.x * ORIGINAL_DRAW_PROJECTION_FIXED_SCALE,z<y: projectedScreen.y * ORIGINAL_DRAW_PROJECTION_FIXED_SCALE,c              3  &   K   | ]  }|v  
 y wrx   r9   r   s     r;   rz   z web_alignment.<locals>.<genexpr>  s      'Gv- r   )z#checkMapExitTrialTransition(dx, dy)z'checkConfirmedTransitionAttempt(dx, dy)z2const movement = chooseMovementStep(tile, dx, dy);r   originalFrameMsdefaultTileStepMsExpressiondefaultTileStepMsmoveMsClampwalkFramesPerDirection	idleFramefirstWalkFramewalkCadenceCommandCount
frameWidthframeHeightframeQuantizedInterpolationsourceRectSelectorMappingsourceRectSelectorCadencesourceRectSelectorMappingModelzweb character source rects use original party actor +0x28 frame selector indices for idle states and the full 8-command timer=1 walking selector cadencezzweb character source rects use original party actor +0x28 frame selector indices for idle states and walking script phasesheldInputTileChainingwallSlideFallbackPresentwallSlideActualDirectionwallSlideDiagonalFollowupcameraDeadzonePresentcameraDeadzoneTilesr"   r!   )xydeferredMapQuerySync&originalLayer1FlagCollisionModePresent actorOverlapCollisionModePresent#actorOverlapCollisionDefaultEnabledFactorOverlapCollisionModeQueryz3actorCollision=1 enables review-only party blockingpartyTrailHistoryPresentpartyTrailHistoryModelzT7-slot move-start tile/direction cursor ring plus per-follower segment interpolationpartyTrailRingSlotCountpartyTrailActorSlotCountpartyTrailInitialCursorspartyTrailCursorModelPresent%partyTrailInitialCursorsMatchOriginal#partyTrailRecordsAcceptedMoveTargetr   Tzconst DEFAULT_COLLISION_MODEDEFAULT_COLLISION_MODEzinline fallbackz-collision: local tile class + layer0 fallbackz"local tile class + layer0 fallback)partyTrailRingBounded#browserInterpolationOverlayDetected'browserInterpolationFixedPointPreservedtransitionChecksBeforeMovementdefaultCollisionModedefaultCollisionModeSourcecollisionFallbackClass)rE   r   r   r   r   r   r   allstrACTOR_HISTORY_INITIAL_CURSORSACTOR_HISTORY_SLOT_COUNT)$web_pathoriginal_frame_mswalk_frames
idle_framefirst_walk_framewalk_cadence_commandsframe_widthframe_heightparty_trail_ring_slotsparty_trail_actor_slotsparty_trail_initial_cursorstile_step_exprdefault_stepclamp_match	clamp_min	clamp_maxsymbolic_clamp_matchmove_ms_clampdefault_collision_matchframe_quantizedsource_rect_selector_mappingsource_rect_selector_cadencetile_chaining
wall_slidewall_slide_actual_directionwall_slide_diagonal_followupcamera_deadzonedeferred_map_query_syncoriginal_layer1_flag_collisionactor_overlap_collisionparty_trail_historyparty_trail_cursor_modelbrowser_interpolation_overlaytransition_checksdefault_collision_moder   s$                                      @r;   web_alignmentr
    s   1F$V-@Av';<Kf&9:J#F,EF(1XYv';<K(=>L)&2JK*63LM"4V=Z"[(N(9(EJtx~J~$  EIL))I6RK))!,-	))!,-	!yy)bdjk)=%4	:NC,22156TX	M !ii(_agh""$)),Y[a"b  <  O
 $' ' I ' $  $' ' I ' $    :  M   7  J #& & H & # $' ' I ' $    <  O " " D "  &) ) K ) &" " " D "   
 
@ 
 
  # 
# 
E 
# 
  %( ( J ( %!   >  
 BY4::1=^b3#h-3,3 	&9cgm9m~sw3 	\	3
 	}3 	!+3 	Z3 	*3 	"#83 	k3 	|3 	&3 	$%A3 	$%A3 	)+0L g , I15'3* 	 +3, 	#J-3. 	#$?/30 	$%A132 	 334 	?QQ/536 	 7738 	12P93: 	+,C;3< 	.8OuUY=3> 	)cz*_  AE?3@ 	#$7A3B 	! #y$(E3F 	"#9G3H 	#$;I3J 	#$?K3L 	'(@M3N 	01LPm1mO3P 	./\`f/fQ3T  4'^,BF^,^/L3P*; 6B`djBj&>  qB:fD #Gc3 3d KOe3 3r=   c                h    t         df}t        df}t        df}t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d	       t         g|t        j                  d
       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       d}t         g|t        j                  d       t         g|t        j                  d       z   t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       d}t         g|t        j                  d	       t         g|t        j                  d
       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       t         g|t        j                  d       d}i dt         t         d      dt         dd      dt         dd       d!t         d"d      xr t         d#d      d$t         fd%d&D              d't         fd(d)D              d*t         t              t        k(  d+t         t        d,      d-t         fd.d/D              d0t         fd1t        D              d2t         d3d4      xrn t         d5d6      xr^ t         d7d8      xrN t         d9d:      xr> t         d;d<      xr. t         d=d<      xr t         d>d<      xr t         d?d<      d@t        dA |dB   |dC   |dD   |dE   fD              dFt         fdGdHD              dIt         fdJdKD              dLt         fdMdND              dOt         fdPdQD              dRt         fdSdTD              dUt         fdVdWD              i}t        t               t        t              t        t              t        t              t        t              t        t               t        t"              t        t$              t        t              t&        t(        t*        t,        t        t               t        t"              t        t$              dXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldbdmdcdddedndhdodpdidjdqdrdsdtt        t.              dudvdwdxdydzd{d|d}d~dhdoddpddidjdddudvdwdxdydddddyddt1         t        d      |dt        t              t        t2              t        t4              t        t6              t        t8              ddgddddxdydddddyt        D 	cg c]]  }	|	d   d|	d   dt        |	d         d|	d   dt        |	d         t        |	d         d|	d   dt        |	d         |	d   |	d   d
_ c}	t        t:              t        t<              ddddddd|dt        t              d|d|ddS c c}	w )NC i C i@ z10 e3 59 00ze8 00 00 00zea 00 00 0066 89 81 e8 00 00 0066 89 81 ea 00 00 00z66 ff 80 e8 00 00 00z66 ff 88 e8 00 00 00z66 ff 80 ea 00 00 00z66 ff 88 ea 00 00 00zfe 80 40 45 57 00zc6 80 40 45 57 00 0066 89 04 4d 50 45 57 0066 89 04 4d 52 45 57 0066 89 04 4d 54 45 57 00)currentInputMaskRefCountobjectTileXFieldRefCountobjectTileYFieldRefCountobjectTileXSeedWriteCountobjectTileYSeedWriteCountobjectTileXIncrementCountobjectTileXDecrementCountobjectTileYIncrementCountobjectTileYDecrementCounthistoryIndexIncrementCounthistoryIndexResetCounthistoryTileXStoreCounthistoryTileYStoreCounthistoryDirectionStoreCountz66 8b 04 4d d0 d7 58 00z66 8b 04 4d ce d7 58 00zda 5a 59 00zdc 5a 59 00)collisionFlagTableReadCountmapWidthRefCountmapHeightRefCountr  r  )r  r  r  r  r  r  &actorControllerPrologueMatchesExpectedz55 8b ec 83 ec 34"activeActorGateReadMatchesExpectedi8C za0 e8 76 45 00%activeActorPointerLoadMatchesExpectediC z8b 04 8d 70 dd 59 00 actorTileSeedWritesMatchExpectedigC iC &inputMaskConflictFilterMatchesExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r   ry   rN   r   rL   rM   s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>  s(      6
H C2x86
   ))iC 66 a3 10 e3 59 00)iC r,  )iC r,  )iC r,  !directionLatchStoresMatchExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>  s(      1
H C2x81
r+  ))iC zc6 05 33 45 57 00 05)i5C zc6 05 33 45 57 00 06)iLC zc6 05 33 45 57 00 07)icC zc6 05 33 45 57 00 08"collisionHelperCallMatchesExpected&collisionHelperPrologueMatchesExpectedz55 8b ec 83 ec 14collisionFlagTestsMatchExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>  s(      /
H C2x8/
r+  ))r%   za8 02)r1   za8 01)r3   za8 04)r5   za8 08$collisionDirectionCasesMatchExpectedc           	   3     K   | ]6  }t        |d    d|d   d      xr t        |d   d|d   d       8 yw)r(   zc6 05 33 45 57 00 r'   02xr+   za8 r,   Nr)  )ry   rowrL   rM   s     r;   rz   z'actor_motion_summary.<locals>.<genexpr>#  sj      4
  C3x=<NsS_O`adNe:fg ^Xs</@CIWZG[B\]^4
s   <?&collisionObjectListWalkMatchesExpectediC za1 00 41 57 00iC zb8 40 3b 57 00iC z05 ac 06 00 00iC z8b 45 fciC zc6 05 33 45 57 00 00ieC iC isC scriptTileStepMutationsPresentc              3  &   K   | ]	  }|d k(    yw)r   Nr9   ry   r:   s     r;   rz   z'actor_motion_summary.<locals>.<genexpr>2  s      .Ueqj .   r  r  r  r  $partyTrailHistoryRingMatchesExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>8  s(      4
H C2x84
r+  )iBC z8b 45 f0 fe 80 40 45 57 00)i_C z8b 45 f0 c6 80 40 45 57 00 00iC r  )iC r  )iC r  iC z 8b 45 f0 33 c9 8a 88 40 45 57 00iC z66 8b 0c 45 50 45 57 00iC z66 8b 0c 45 52 45 57 00)iMC z66 8b 04 45 50 45 57 00iXC r  )imC z66 8b 04 45 52 45 57 00ixC r  )iC z66 8b 0c 45 54 45 57 00#partyTrailCallTimingMatchesExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>J  s(      3
H C2x83
r+  ))i[C z8b 45 fc 66 ff 80 ea 00 00 00)itC z8b 45 fc 66 ff 88 ea 00 00 00)iC z8b 45 fc 66 ff 88 e8 00 00 00)iC z8b 45 fc 66 ff 80 e8 00 00 00r>  r?  r@  %partyTrailInitialCursorsMatchExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>V  s(      
5
H C2x8
5
r+  ))iC zc6 05 40 45 57 00 00)iC z83 7d fc 03)iC zb8 07 00 00 00)iC z8d 0c 49)iC z2b c1)iC z88 81 40 45 57 00partyTrailHistoryTablesZeroedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>a  s(      -
H C2x8-
r+  ))iC z83 7d fc 07)iC z66 c7 04 45 50 45 57 00 00 00)i	C z66 c7 04 45 52 45 57 00 00 00)iC z66 c7 04 45 54 45 57 00 00 00#partyActorProjectionMatchesExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>j  s(      3
H C2x83
r+  ))i C 66 8b 88 e8 00 00 00)iC 89 48 1c)i%C 66 8b 88 ea 00 00 00)iBC 89 48 20r@  rA  )iC rN  rB  )iC rP  rC  rD  +partyActorAnimationStateStoresMatchExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z'actor_motion_summary.<locals>.<genexpr>z  s(      ;
H C2x8;
r+  ))iC zc7 40 68 05 00 00 00)iC zc7 40 68 01 00 00 00)i@C zc7 40 68 06 00 00 00)iOC zc7 40 68 02 00 00 00)iC zc7 40 68 07 00 00 00)iC zc7 40 68 03 00 00 00)iC zc7 40 68 08 00 00 00)iC zc7 40 68 04 00 00 00
0x0043019fz0x004301bf..0x004301cfz0x004301da..0x00430223)leaderCursorZerocursorFormulahistoryTableZeroLoopzleader tile mutation precedes cursor advance/history write; follower reads happen after the leader write in the same actor controller pass
0x00430b5b
0x00430b74
0x00430b8d
0x00430ba6)downYIncrementupYDecrementleftXDecrementrightXIncrement
0x00431042
0x00431083
0x004310a0
0x004310bb)cursorAdvance
tileXStore
tileYStoredirectionStore
0x00431173
0x004311be
0x00431258
0x00431278)	loopStart	indexRead
tileXApply
tileYApply)classificationtileMutationVasleaderWriteAfterMutationVasfollowerReadAfterLeaderWriteVas
0x0043105f)indexIncrement
indexResetrd  re  rf  
0x004311ce
0x004311ff
0x0043128f)rl  	tileXRead	tileYReadrm  rn  directionReadz>7-slot tile/direction trail ring for companion actor following)indexTableHex	slotCountactorSlotCountinitialCursorsslotStrideWordstileXTableHextileYTableHexdirectionTableHexinitializationVas
callTimingleaderHistoryWriteVasfollowerHistoryReadVasro  0x050x060x070x08r$   r0   r2   r4   
0x00431100
0x0043111d
0x00431125
0x00431142)ry  
drawXStorerz  
drawYStore
0x004311ec
0x0043121d)
cursorRead
trailXReadr  
trailYReadr  rm  rn  +0x680x010x020x030x04zparty actor draw coordinates are recomputed from tile/trail entries; +0x68 stores direction/animation state; party frame scripts provide the selector phase outside the actor controller)leaderTileProjectionVasfollowerTrailProjectionVasanimationStateFieldHexmovingStateValuesidleStateValuesro  z'input-driven direction/collision helper)functionVaHexactiveActorCountGlobalHexactiveActorSlotTableHexactiveActorPointerTableHexhistoryIndexTableHexseedTileXTableHexseedTileYTableHexhistoryDirectionTableHexpartyTrailHistorydirectionLatchGlobalHexdirectionLatchValuespartyActorScreenProjectioncollisionHelperCallcountsz+0xe6z+0xe7r&   r7   r'   r5  r(   r)   r*   r+   r,   r-   r.   r/   )
r&   inputLatchHex	caseVaHexblockedFallbackLatchHexedgeCheckVaHexflagTestVaHex
flagBitHexflagGridHexr.   r/   
0x00431ca60x0101z+0xecTz7actor-overlap collision response after tile-flag checks)listHeadGlobalHexsentinelHexloopStartVaHexactiveMaskTestHexcollisionPayloadFieldHexresponseFieldHexclearsDirectionLatchOnOverlapro  )r  mapWidthGlobalHexmapHeightGlobalHexcollisionFlagTableHexcollisionEdgeFlagTableHexobjectFootprintFieldsHexdirectionBlockFlagBitsblockedDirectionFallbackValuesdirectionCasesobjectOverlapResponser  z!script-command tile-field mutator)r  ro  r  z0actor-tile-mutation-and-collision-flags-grounded)actorControllercollisionHelperscriptTileStepHandlerverificationpromotionStatus)ACTOR_CONTROLLER_FUNCTIONACTOR_COLLISION_HELPER_FUNCTIONSCRIPT_TILE_STEP_HANDLERru   r   r   r   r   rb   ACTOR_COLLISION_HELPER_CALLCOLLISION_DIRECTION_CASESr<   ACTIVE_ACTOR_COUNTACTIVE_ACTOR_SLOT_TABLEACTIVE_ACTOR_POINTER_TABLEACTOR_HISTORY_INDEX_TABLEACTOR_SEED_X_TABLEACTOR_SEED_Y_TABLEACTOR_HISTORY_DIRECTION_TABLEr   ACTOR_HISTORY_ACTOR_SLOTSr   ACTOR_HISTORY_STRIDE_WORDSACTOR_DIRECTION_LATCHrh   MAP_WIDTH_TILESMAP_HEIGHT_TILESMAP_COLLISION_FLAGSMAP_COLLISION_EDGE_FLAGSCOLLISION_OBJECT_LIST_HEADCOLLISION_OBJECT_LIST_SENTINEL)
rL   rM   controller_rangehelper_rangescript_rangecontroller_countshelper_countsscript_countsr  r6  s
   ``        r;   actor_motion_summaryr    s	   1:>3Z@L,j9L$/X$o@P$oRWR_R_`mRn$o$/X$o@P$oRWR_R_`mRn$o$/X$o@P$oRWR_R_`mRn$o%0h%yAQ%ySXS`S`awSx%y%0h%yAQ%ySXS`S`awSx%y%0h%yAQ%ySXS`S`awSx%y%0h%yAQ%ySXS`S`awSx%y%0h%yAQ%ySXS`S`awSx%y%0h%yAQ%ySXS`S`awSx%y&1#x&wBR&wTYTaTabuTv&w"-c8"v>N"vPUP]P]^tPu"v"-c8"y>N"yPUP]P]^wPx"y"-c8"y>N"yPUP]P]^wPx"y&1#x&}BR&}TYTaTab{T|&}$ X__emmD]6^_#xa,aF_8`ab (XccemmTaFbc(hddu}}UbGcd$/X$k$kemm\iNj$k$/X$k$kemm\iNj$k	M &1h%u%uu}}]sOt%u%0h%u%uu}}]sOt%u%0h%u%uu}}]sOt%u%0h%u%uu}}]sOt%u$/X$k$kemm\iNj$k$/X$k$kemm\iNj$kMI0/#xQjl  3AI,oc8ZYi.jI 	0hPZ\r1sI 	+C:7MN SXz;QRI 	1# 6
!6
 3
I" 	,S 1
!1
 .
#I4 	-l3Je.f  kJ  /J5I6 	1/#xQp  sF  3G7I8 	*3 /
!/
 ,
9IJ 	/ 4
 14
 1
KIT 	1C:7GH SXz;KLSXz;KLS  Xz:FS  Xz;QR	S
  Xz;QRS  Xz;QRS  Xz;QReIh 	)# .56565656	G
 . +iIt 	/ 4
!4
 1
uIX 	.s 3
!3
 0
YIp 	0 
5
!
5
 
2
qIF 	( -
!-
 *
GIX 	.s 3
!3
 0
YIx 	6s ;
	!;
 8
yILX ##<=)./A)B',-D'E*/0J*K$)*C$D!&'9!:!&'9!:(-.K(L!&'@!A5";"?#=!&'9!:!&'9!:%*+H%I(4%=,D& 's*6(4*6+7	( *6&2&2*6	4 &2%1&2&2	8, '3".".".&2* ".!-!-".".%1+ #ce3"h (--B'C	% ".".!-".	, #/"."."."."."./ +2" "#	& # "#	$J=!+D $/sH>Y  \E  $F'Oh
T ##BC!&!7"'(8"9%*+>%?)./G)H)0'(:	' 	/& 5  "%[!1')#l*;C)@%A!&s8}!513C8J4KC3P/Q&+C,>&?%*3|+<%=$&s9~c&:";#(Z#9!$[!1$'$7  &++E%F$%CD".%-,3$+15"[	& $Y-
^ ##;<A#"

 %M}_ _zs   A"^/c           	     d    t         t        d      }t         t        d      }t         t        d      t         fddD              t         fddD              |d   t        t              k(  |d   t        t              k(  t         fd	d
D              d}||dddgddddddd|dS )Nz"projected object dirty-rect helperzprojected object bounds helper55 8b ec 83 ec 0cc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z*draw_projection_summary.<locals>.<genexpr>/  s(      ;
H C2x8;
r+  ))iJB rM  )JB 66 a1 dc 76 45 00)iJB c1 e1 04)iJB z83 c1 18)iJB c1 e1 10)iJB rN  )iJB rO  )JB 66 a1 de 76 45 00)iJB r  )iJB z83 c1 08)iJB r  )iJB rP  c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z*draw_projection_summary.<locals>.<genexpr>@  s(      3
H C2x83
r+  ))iKB z83 7d f4 01)i&KB z83 7d f4 02)i0KB z83 7d f4 04)i?KB z6a 02rf   c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z*draw_projection_summary.<locals>.<genexpr>K  s*      A
H C2x8A
r+  ))imA z8b 40 1c)i mA c1 f8 10)i+mA z8b 40 20)i7mA r  )drawPrepPrologueMatchesExpected+drawPrepDirectTileProjectionMatchesExpected#drawPrepModeDispatchMatchesExpected!drawRectHelperCallMatchesExpected!drawRectBoundsCallMatchesExpected1drawRectBoundsReadsProjectedCoordsMatchesExpectedzlow bits == 1zlow bits == 2zlow bits == 4)directTileProjectionModeexistingProjectedCoordModes+0x1c+0x20z+0x24+0x28)drawXdrawY	drawOrderframeSelectorzdraw prep either writes fixed-point draw coordinates directly from tile/camera fields or reuses existing projected coordinates for alternate object modes; the dirty-rect helper consumes +0x1c/+0x20 as projected coordinates)drawRectHelperCalldrawRectBoundsCalldrawPrepModesprojectedCoordFieldsHexro  r  )	rh   DRAW_RECT_HELPER_CALLDRAW_RECT_BOUNDS_CALLr   DRAW_PREP_FUNCTIONr   r<   DRAW_RECT_HELPER_FUNCTIONDRAW_RECT_BOUNDS_FUNCTION)rL   rM   helper_callbounds_callr  s   ``   r;   draw_projection_summaryr  *  s    c8-BDhiKc8-BDdeK+:3J\^q+r7: ;
!;
 8
" 03 3
!3
 0
 .9-G5QjKk-k-8-G5QjKk-k=@ A
!A
 >
='LR *)(7,;_+M

  $	$
C %% r=   c                    t        d|dz
  dz   d      D ]U  }||z   }t        | ||      t        k(  st        | ||dz         |k(  s1t        |      t	        | ||d      t        |      dc S  y Nr   r#   r   r   )commandVaHexr   frameScriptPointerVaHex)ranger]   "SPRITE_FRAME_POINTER_SCRIPT_OPCODEr<   rl   )rL   rM   	script_vaexpected_frame_script_va	scan_sizerP   
command_vas          r;   %find_frame_script_pointer_initializerr  k  s     9q=1,a0 
'
S(J/3UUh
Q7;SS !&j 1"3*a@+01I+J 
 r=   c                    t        d|dz
  dz         D ]d  }||z   }t        | ||d      t        t        dddg      k(  s+t	        | ||dz         |k(  s?t        |      t        | ||d      t        |      dd	c S  y )
Nr   r#   r   r      d   h   7object+0x64 = dword[stateTable + byte(object+0x68) * 4]r  r   stateTableVaHex	semantics)r  rQ   r   &SPRITE_FRAME_STATE_TABLE_SCRIPT_OPCODEr]   r<   rl   )rL   rM   r  expected_state_table_var  rP   r  s          r;   "find_animation_state_table_commandr&    s     9q=1,- '
C:q1U<bdhjnpt;u5vvh
Q7;RR !&j 1"3*a@#()@#AV	  r=   c                   g }|}t        d      D ]  }t        | ||      }|t        k7  r ntt        | ||dz         }t        | ||dz         }t	        | ||dz         }	|j                  |t        |      d|d||t        |	      d|	dz	  dz  d|	dz  d	       |d
z  } t        | ||      }
t        |      d|
dd}|
dk(  r0t	        | ||dz         }|j                  t        |      ||k(  d       t        |      t        |      |D cg c]  }|d   	 c}|D cg c]  }|d   	 c}|D cg c]  }|d   	 c}t        |D ch c]  }|d   	 c}      ||dS c c}w c c}w c c}w c c}w )Nr   r   r    r   r7   r5     i  )orderr  	opcodeHexmodetimerselectorHexsurfaceIndexHex
frameIndexr#   )r  r*  r   )rf   loopsToSequenceStartr-  r/  r,  r.  )scriptVaHexcommandCountselectorSequenceHexframeIndicestimerSequencesurfaceIndicesHexcommandstail)
r  rT   SPRITE_FRAME_SCRIPT_OPCODErY   r]   r   r<   updater   sorted)rL   rM   r  r7  cursorr)  r`   r+  r,  selectortail_opcoder8  rg   commands                 r;   parse_frame_selector_sequencer@    s   HFr h///sHfqj1h
3C6A:6!&MfS\* ?!#X^t$;C#@A"V+	
 		 	!#$ #x0Kf+c*+D d#x!4 =$*i$7
 	
 Y'HFNO7 6O>FG7.G:BCw''*C#x$XGW->%?$XY	 	  PGC$Xs   EE"
/E'E,c                    g }t        |      D ]R  }	 t        | |||dz  z         }|j	                  |      }|s+|j                  d      s=||vsB|j                  |       T |S # t        t        f$ r Y  |S w xY w)Nr   z.cns)r  r]   
IndexErrorrK   getendswithr   )	rL   rM   stringsr  scan_dwordsnamesindexr:   r   s	            r;   linked_cns_names_in_scriptrI    s     E{# 	S(I	,ABE {{5!DMM&)d%.?LL L J' 	 L	s   A%%A98A9c           
        g }t               }t        d|dz
  dz   d      D ]  }||z   }	 t        | ||      }t        | ||dz         }	|t
        k7  st        ||	      <||	f}
|
|v rE|j                  |
       |j                  t        |      t        | ||d      t        |	      d        |S # t        t        f$ r Y  |S w xY wr  )setr  r]   rB  rK   r  r   addr   r<   rl   )rL   rM   r  r  sitesseenrP   r  r`   rg   keys              r;   %valid_frame_pointer_initializer_sitesrP    s     E5D9q=1,a0 '
	c8Z8Fc8Z!^<F 77<RX;Y;a6"$;!*-sHj!<',V}
 	$ L J' 	 L	s   B--C Cc           
        g }t               }t        d|dz
  dz         D ]  }||z   }	 t        | ||d      }t        j                  d|dd       d   }	|d d t        t        dddg      k7  st        ||	      Y||	f}
|
|v rb|j                  |
       |j                  t        |      t        | ||d      t        |	      d	d
        |S # t        t        f$ r Y  |S w xY w)Nr   r#   r   r\   r   r  r  r  r   r!  )rK  r  rQ   rB  rK   rW   rX   r   r$  r   rL  r   r<   rl   )rL   rM   r  r  rM  rN  rP   r  r?  rg   rO  s              r;   #animation_state_table_command_sitesrR    s    E5D9q=1,- '
	c8Z;G tWQq\215BQK5"H$PTVZ![\\Hf-56"$;!*-sHj!<$V}R	
 	!, L% J' 	" L%	s   C

CCc                ^    | dv r|ryt        d |D              ryt        d |D              ryy)N   r   r   r    zparty-walking-state-tablec              3  >   K   | ]  }|j                  d         yw)btl_N
startswithry   r   s     r;   rz   z,descriptor_resource_class.<locals>.<genexpr>  s     
9t4??6"
9   zbattle/effect-resourcec              3  >   K   | ]  }|j                  d         yw))zsa_zsl_cara_NrW  rY  s     r;   rz   z,descriptor_resource_class.<locals>.<genexpr>  s     
L$4??45
LrZ  zobject-resourcezresource-or-script-descriptor)any)rH  	resourceshas_state_tables      r;   descriptor_resource_classrb    s4    	o*

9y
99'

L)
LL *r=   c                   t        | |      }g }t        t              D ]V  }t        |dz  z   }t	        | ||      }dD cg c]  }t	        | |||z          }}g }	g }
g }t        |      D ]  \  }}t        | |||      D ]  }||	vs|	j                  |        t        | ||      D ]F  t              |d<   t        |      d<   t        fd|
D              r6|
j                         H t        | ||      D ]F  t              |d<   t        |      d<   t        fd|D              r6|j                         H  g }|D ]  d   }||vs|j                  |        g }|rt        |d   d	      }t        d
      D ]j  }t	        | |||dz  z         }t        | ||      }|j                  ||d   |d   |d   |d   |j                  d      xs i j                  d      du d       l t!        |      }|j                  |t        |      t        |      |D cg c]  }t        |       c}|	t#        ||	|      t%        |
      |
t%        |      |||t'        d |	D              d       Y |D cg c]  }|d   s	|d    }}|D cg c]  }|d   dvs| }}i }|D ]   }|j                  |d   d      dz   ||d   <   " t%        |      t        k(  |g dk(  t)        d |D              t)        d |D              t)        d |d d D              d}t        t              t%        |      |t%        |      t'        d  |D              t'        d! |D              |||d"d#
S c c}w c c}w c c}w c c}w )$Nr   r   r   r#   descriptorScriptIndexdescriptorScriptVaHexc              3  N   K   | ]  }|d    d    k(  xr |d   d   k(    yw)r  r  Nr9   ry   r6  sites     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>/  sJ        '4+?? Z56$?X:YYZ   "%c              3  N   K   | ]  }|d    d    k(  xr |d   d   k(    yw)r  r"  Nr9   rh  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>9  sJ        '4+?? J-.$7H2IIJrj  r"  r   r   	   r1  r2  r6  r4  r8  r0  T)stater1  r2  r6  r4  loopsToSelfc              3  h   K   | ]*  }|j                  d       s|j                  d      r'd , yw)mapmap_r   NrW  rY  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>a  s,      '4??5+A$//Z`Ja's   222)rH  
entryVaHexdescriptorVaHexdescriptorScriptsHex	linkedCnsresourceClass!validFramePointerInitializerCount!validFramePointerInitializerSitesanimationStateTableCommandCountanimationStateTableTargetsHexusesActorAnimationStateTablestateEntriesfieldMapCnsRefCountr{  rH  rT  rv  r   )r   r   r    c              3  *   K   | ]  }|d    du   yw)r{  FNr9   ry   r6  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>n  s"      @
=@C./58@
s   c              3  ,   K   | ]  }|d    dk(    yw)r}  r   Nr9   r  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>q  s       ;
03C%&!+;
s   c              3  T   K   | ]   }|d    xr t        d |d    D               " yw)r|  c              3  :   K   | ]  }|d    dkD  xr |d     yw)r2  r   rn  Nr9   ry   entrys     r;   rz   z<object_descriptor_table_summary.<locals>.<genexpr>.<genexpr>v  s'     h5E.)A-F%2FFhs   Nr   r  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>t  s@      9
   ihTWXfTghhi9
s   &(r   )&descriptorTableRowCountMatchesExpected#stateTableRowsMatchPartyDescriptors0nonPartyDescriptorRowsHaveNoAnimationStateTables+nonPartyDescriptorRowsHaveNoFieldMapCnsRefs)partyStateTablesHaveLoopingFrameSelectorsc              3  ,   K   | ]  }|d    s	d  yw)r{  r   Nr9   r  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>  s      3
3/M+NA3
s   
c              3  &   K   | ]	  }|d      yw)r}  Nr9   r  s     r;   rz   z2object_descriptor_table_summary.<locals>.<genexpr>  s     *`#3/D+E*`r;  zthe 12-row descriptor table has +0x68 animation state-table selectors only in rows 0..2 for the party walking descriptors; rows 3..11 are battle/effect/object resource descriptors with no +0x68 state-table selector and no field-map CNS refs)
descriptorTableHexrowCountpartyStateTableRowIndicesnonPartyDescriptorRowCount#nonPartyAnimationStateTableRowCountnonPartyFieldMapCnsRefCountresourceClassCountsrowsr  ro  )r   r  *PARTY_CHARACTER_DESCRIPTOR_TABLE_ROW_COUNT PARTY_CHARACTER_DESCRIPTOR_TABLEr]   	enumeraterI  r   rP  dictr<   r_  rR  r   r@  rC  boolrb  r   r{   r   )rL   rM   rE  r  rH  entry_vadescriptor_varP   
script_vasr`  frame_initializer_sitesstate_table_sitesscript_indexr  r   state_table_targetsrg   state_entriesstate_table_varm  entry_script_vaparsedra  r:   r6  state_table_rowsnon_party_rowsclass_countsr  ri  s                                @r;   object_descriptor_table_summaryr    sV   sH-GDAB D3eai? h9T]^&hsHmf.DE^
^	"$'0'< 	3#L)23'9U +y($$T*+ >c8YW 	9Dz0<,-05i0@,-   7 
 ,2248	9 <C9U 	3Dz0<,-05i0@,-   1 
 &,,T2	3	32 !% 	3D+,F00#**62	3  !4Q!7<Nq 
"*3.5ST9:T"U6sHoV$$"#)-#8$*>$:)/0C)D$*>$:$*JJv$6$<"#A#ABX#Y]a#a& 
 23/$]3?I$JeU5\$J"6uiY145L1M1H/23D/E-@,;)#& ''' $
 	iDL 15\<Z8[G\\%)KcS\-JcKNK#%L [-9-=-=c/>RTU-VYZ-ZS)*[ 36d)?i2i/?9/L<? @
DR@
 =
 8; ;
7E;
 8
 69 9
 BQx9
 6
L  $$DEI%5&).&9/2 3
'3
 0
 (+*`Q_*`'`+$K o _j %K ]Ks$    M+%M0=
M5M5M:"M:c                   | xs i } | j                  d      xs i }| j                  d      xs i }| j                  d      xs i }|j                  d      xs g }|j                  d      xs g }| j                  d      xs g }t        t              }|D cg c]%  }|j                  d      s|j                  d      ' }	}d}
t        |       |j                  d	      d
u |j                  d      d
u |D ci c]#  }|j                  d      |j                  d      % c}dddk(  |D ci c]#  }|j                  d      |j                  d      % c}dddk(  | j                  d      d
u xr | j                  d      dk(  | j                  d      du d}i d|dt        |       d| j                  d      d| j                  d      d| j                  d      d|j                  d      d |j                  d!      d	|j                  d	      d|j                  d      d"|	d|d|d#| j                  d#      d$| j                  d$      d| j                  d      d| j                  d      d%|j                  d%      | j                  d&      | j                  d      |j                  d'      ||
d(S c c}w c c}w c c}w ))NloadRebuildEvidencesampleOrderSummaryhandlerTablesgeneralMutationHandlerssaveSelectorSameLowByteHandlersmaterializersr   a'  save load calls 0x00432323 after count/order and slot blocks are read and before selector pointer selection; later add/remove active descriptor mutations are general-table opcode 0x62/0x63 paths, while the current selector 2:0 active order remains unproven because public samples do not cover itrebuildAfterSaveReadBlocksT%rebuildBeforeSelectorPointerSelectionr*  handlerVaHex
0x00407cc1
0x00407ce5)0x620x63
0x0040239f
0x0041004f"opcode20SelfMutationPathEliminated descriptorScriptMutationRowCountr    currentFrontierActiveOrderProvenF)runtimeMaterializerReportLoadedloadRebuildAfterSaveReadBlocks)loadRebuildBeforeSelectorPointerSelection!generalMutationHandlersIdentified!saveSelectorSameLowBytesSeparatedr  'currentFrontierActiveOrderStillUnprovenr   materializerReportPresentcountRuntimeVaHexorderBytesVaHexslotBaseHexloadRebuildCallVaHexrebuildCallVaHexloadRebuildFunctionVaHexrebuildFunctionVaHexmaterializerNamescurrentRouteSameLowByteRowCount(currentRouteGeneralMutationEvidenceCountsampleActiveDescriptorSetscurrentFrontierSelectorcurrentFrontierSampleCovered)r  r  r  r  ro  )rC  r   RUNTIME_MATERIALIZERS_JSONr  )runtime_materializersloadsamplehandler_tablesgeneral_handlerssave_selector_handlersr  source_pathr6  materializer_namesro  r  s               r;   #descriptor_activation_order_summaryr    si   17R $$%:;ArD"&&';<BF*..?E2N%))*CDJ+//0QRXVX)--o>D"M01K5BVccggfo#''&/VV	n  ,00E+F*.((3O*PTX*XHH<=E GWWsSWW[!377>#::W$l;< G]]sSWW[!377>#::]$l;< "%%&JKtS S%))*LMQRR "%%&HIUR'L,+#T*?%@ 	2667JK 	0445FG	
 	,00? 	); < 	#DHH-C$D 	%dhh/K&L 	0:a1b 	/ 	"#3 	*+A 	*+@+D+DEf+g 	34I4M4MNx4y 	+,A,E,EFh,i  	-.C.G.GHl.m!" 	%fjj1M&N#$ $9#<#<=V#W,A,E,EFh,i(.

3Q(R$(- 9 W X ^s   K /K 8(K
,(K
c                    t         t        dz  z   }t         |      }t         t        dz  z   }t         |      }t	        t        t                    D cg c]  }t         t        |dz  z          }}t               }g }	t        t              D ]  \  }}
||   }dD cg c]  }t         ||z          }}g }g }dD ]v  }||   }t         ||
d         }|r$||d<   t        |      |d<   |j                  |       t         ||
d         }|sS||d<   t        |      |d<   |j                  |       x g }t	        d      D ]a  }t         |
d   |dz  z         }t         |      }|j                  |t         j#                  |d	|       d
       |j                  |       c |	j                  ||
d   |
d   t        t        |dz  z         t        |      t        |
d         |D cg c]  }t        |       c}d|
d   dt        |
d         t        |
d         |||d        |t$        k(  |t&        k(  t)         fddD              t)         fddD              |t        D cg c]  }|d   	 c}k(  t)        d |	D              t)        d |	D              t)        d |	D              t)        d |	D              t)        d |	D              d
|d   }t        t              |d   ddd dt        dt        |      t        |      t        t$              d!d"dt        dt        |      t        |      t        t&              d#d$d%|	||d&d'S c c}w c c}w c c}w c c}w )(Nr   rd  )r   r    r   re  rf  r   rl  zstate )rm  actorControllerMeaningr   r   r   r7   r   r5  )rH  r   r   descriptorTableEntryHexrs  expectedDescriptorVaHexrt  baseSurfaceIndexHexbaseFrameScriptVaHexanimationStatePointerTableHex"frameScriptPointerInitializerSites&animationStatePointerTableCommandSitesr|  c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>  s(      
=
H C2x8
=
r+  ))iD@ z8b 45 08 8b 40 40)iD@ z8b 40 04)iD@ z89 41 64)iD@ z81 08 00 00 00 04)iD@ z66 c7 40 62 01 00)iD@ z83 40 40 08c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>  s*      	O
H C2x8	O
r+  ))i@@ z 8b 45 08 8b 40 40 33 c9 8a 48 03)i@@ z8b 45 08 33 d2 8a 14 01)i@@ z#8b 45 08 8b 40 40 8b 40 04 8b 04 90)i-B@ z)8b 45 fc 8b 4d 08 8b 49 40 33 d2 8a 51 02)i;B@ z8b 4d 08 89 04 0ac              3  >   K   | ]  }t        |d          dk(    yw)r  r    Nr   ry   	characters     r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>*  s*      @
 	>?@AE@
rZ  c              3  >   K   | ]  }t        |d          dk(    yw)r  r    Nr  r  s     r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>.  s*      C
 	BCDIC
rZ  c              3     K   | ]5  t        d          dk\  xr t        fdt        dd      D               7 yw)r|  rl  c              3  :   K   | ]  }d    |   d   dkD    yw)r|  r2  r   Nr9   )ry   rm  r  s     r;   rz   z=party_actor_frame_script_summary.<locals>.<genexpr>.<genexpr>4  s-       .)%0@1Ds   r   N)r   r   r  r  s    @r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>2  sO      6
  	.)*a/  "1a[ 6
s   ;>c              3  R   K   | ]  t        fd d   dd D                 yw)c              3  6   K   | ]  }|d    d   gk(    yw)r6  r  Nr9   )ry   r  r  s     r;   rz   z=party_actor_frame_script_summary.<locals>.<genexpr>.<genexpr>;  s-       )*y9N/O.PPs   r|  Nrl  r  r  s    @r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>:  s;      @

 	  &~6r: @
s   $'c              3  L   K   | ]  }t        d  |d   dd D                yw)c              3     K   | ]S  }|j                  d       xs i j                  d      dk(  xr& |j                  d       xs i j                  d      du  U yw)r8  r*  r  r0  TNrC  r  s     r;   rz   z=party_actor_frame_script_summary.<locals>.<genexpr>.<genexpr>B  sf        6"(b--k:fD RYYv&,"112HITQRs   AAr|  Nrl  r  r  s     r;   rz   z3party_actor_frame_script_summary.<locals>.<genexpr>A  s:      3
    '~6r: 3
s   "$)
+framePointerOpcodeTableEntryMatchesExpected)stateTableOpcodeTableEntryMatchesExpected-framePointerInitializerHandlerMatchesExpected?stateTableCommandHandlerReadsObjectStateAndTableMatchesExpected(partyDescriptorTableEntriesMatchExpected0descriptorScriptsContainFramePointerInitializers3descriptorScriptsContainAnimationStatePointerTables&statePointerTablesCoverActorStates1To80statePointerTableSelectorsMatchCharacterSurfaces#statePointerTableBranchesLoopToSelfr  r  r  +0x64r   zopcode 0x20 stores dword [stream+4] into object+0x64, enables the script timer flag, reloads object+0x62 to 1, and advances object+0x40 by 8)r*  handlerEntryHexr  r  ro  z18 a0 64 68 <state-table-va>zoopcode 0x18 command bytes 18 a0 64 68 assign object+0x64 from a dword pointer table indexed by byte object+0x68)r*  r  r  r  commandBytesro  af  party actor descriptors initialize +0x64 with opcode 0x20, then use opcode 0x18 command bytes 18 a0 64 68 to select +0x64 = stateTable[object+0x68]; states 1..8 decode to opcode 0x21 +0x28 selector sequences that loop through opcode 0x03; the full 12-row descriptor table is classified so rows 3..11 stay separate as battle/effect/object resource descriptors)r  descriptorTableRowCountactorAnimationStateFieldHexframeScriptPointerFieldHexframeSelectorFieldHexframePointerInitializer!animationStatePointerTableCommand
charactersobjectDescriptorTabler  ro  )SCRIPT_HANDLER_TABLEr  r]   r$  r  r   !PARTY_CHARACTER_FRAME_DESCRIPTORSr  r  r  r  r<   r   r&  r@  r:  ACTOR_ANIMATION_STATE_LABELSrC  $SPRITE_FRAME_POINTER_SCRIPT_FUNCTION(SPRITE_FRAME_STATE_TABLE_SCRIPT_FUNCTIONr   )rL   rM   frame_pointer_handler_entryframe_pointer_handlerstate_table_handler_entrystate_table_handlerrH  descriptor_table_entriesdescriptor_table_summaryr  r   r  rP   r  initializer_sitesr  r  r  initializerstate_tabler  rm  r  r  r:   r6  r  s   ``                         r;    party_actor_frame_script_summaryr    s   "69[^_9_"_$S(4OP 47]`a7a a"32KL 3@AB  	h @519 LM     ?sHMJ$%FG 2x07T]^&hsHmf.DE^
^" 	6L"<0I?)	K 7C347<Y7G34!((5<(	K 7C347<Y7G34!((5+	6, 1X 	)E&sHh~6NQVYZQZ6Z[O23/RFMM*F*J*J5TZ[`ZaRb*c    (	) 	V$ ,',-MPUXYPY-Y'Z$]3',Xn-E'F?I$JeU5\$J%'(@'E#F$)(?*C$D-28N3K-L2C6G)
 	I2j "%II  #KK9< 
=
!
=
 
:
 LO 	O
!	O
 	L
 5M+LQ
$'CQ
 5
 =@ @
'@
 =
 @C C
'C
 @
 36 6
 (6
 3
 =@ @

 (@
 =
 03 3
 (3
 0
m?| #>
2}?LB $$DE#;J#G'.&-!(@EF$%@A!"78"#GH m$
 DSIJ$%>?!"56"#KL: P.
 !!9$k3 s  _R %KHQ
s   M$M0M$4M)c                &    t         df}t        df}t        t        dz  z   }t	        j
                  dt         |d            d   }t               }t        j                  d      t        j                  d      t        j                  d      t        j                  d	      t        j                  d
      t        j                  d      g}t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      g}t         g|| }	t         g|| }
t         fddD              t         fddD              xr t         d      t        k(  t         fddD              |t        k(  t         fddD              d}t         fddD              t         fddD              t         fdd D              t         fd!d"D              |	dk(  |
dk(  d#||d$   }t        t              t        t              d%d&t        t               d'd(d)d*d+d,d-d.d/d,d.gt        t              d0d1d2gd3d4d5i d6t        t"              d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEt        t              dFt        t              dGt        t$              dHdIt        dJdKt        |      dLt        |      dMddNdOdPd0dQdRdNdSdPdTdQdUd dVdd3dQgdWdX||	|
dYdZ|d[S )\Nr  isA r   r\   r   z89 40 2889 41 2889 48 28zc7 40 28z81 60 2809 48 28z8b 40 68z8a 40 68z8a 48 68z83 78 68z3b 48 68c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      .
H C2x8.
r+  ))r   r  )i0C z83 7d f4 05)i 0C z8b 04 c5 48 3b 57 00)iF0C z8d 04 c5 40 3b 57 00)i^0C zf6 40 03 20)ip0C zf6 40 03 04)iz0C z8b 45 f8 66 ff 48 62)i0C z8b 45 f8 0f bf 40 62c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      	5
H C2x8	5
r+  ))i0C z8b 45 f8 8b 40 40)i0C z#8b 45 f8 8b 40 64 8b 4d f8 89 41 40)0C ze8 73 f2 fc ff)i0C z#8b 45 f8 8b 40 40 8b 4d f8 89 41 64)i0C z8b 45 fc 8b 4d f8 89 41 40r  c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      :
H C2x8:
r+  ))i'#@ zc7 05 b8 a1 55 00 00 00 00 00)i1#@ z83 3d b8 a1 55 00 00)iE#@ z8b 40 40)iL#@ zff 14 8d 38 05 44 00c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      8
H C2x88
r+  ))iD@ z8a 48 01)ixE@ z83 7d fc 00)iE@ z83 7d fc 01)iE@ z83 7d fc 02scriptTimerLoopMatchesExpected%scriptTimerPointerSwapMatchesExpected*generalScriptRunnerDispatchMatchesExpected,frameSelectorOpcodeTableEntryMatchesExpected(frameSelectorModeDispatchMatchesExpectedc              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      
;
H C2x8
;
r+  ))ilA 8b 40 28)ilA z25 ff ff 00 00)ilA r%  )ilA zc1 e8 10)imA z25 ff 00 00 00)imA z8b 04 85 d8 ab 55 00c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      8
H C2x88
r+  ))imA z8b 45 ec)imA z8a 48 19)imA 0f bf 48 32)imA zf7 f1)imA z0f bf 49 2e)imA r'  )imA z0f bf 49 30c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s*      
A
H C2x8
A
r+  ))inA z8b 45 08)i
nA z8b 40 30)inA z8b 40 34)i(nA z0f af 45 f8)iPnA z29 08)inA z29 48 04c              3  @   K   | ]  \  }}t        ||        y wrx   r)  r*  s      r;   rz   z0sprite_frame_selector_summary.<locals>.<genexpr>  s(      	6
H C2x8	6
r+  ))iD@ r  )i#E@ z81 60 28 00 00 ff ff)i9E@ r  )i^E@ r  )idE@ r  )+boundsHelperFrameSelectorReadsMatchExpected(boundsHelperGridFrameMathMatchesExpected1boundsHelperObjectOffsetAdjustmentMatchesExpected&scriptFrameSelectorWritesMatchExpected(actorControllerFrameSelectorWritesAbsent%boundsHelperAnimationStateReadsAbsentr  r   r  zlow 16 bitsz'bits 16..23, indexed through 0x0055abd8)r/  surfaceTableIndexz+0x19z+0x2ez+0x30z+0x32z+0x34)
layoutModer   r   framesPerRowrectOrOffsetTable
0x004044f6
0x00404523
0x00404539
0x00404564zjobject script commands write +0x28 either as a full selector, low frame index, or high surface-table index)r  fullSelectorStoreVaHexlowFrameIndexStoreVassurfaceIndexStoreVaHexro  r  bucketCountr!   activeObjectListTableHexz0x00573b40/0x00573b48inactiveSkipFlagz+0x03 bit 0x20timerEnabledFlagz+0x03 bit 0x04frameTimerFieldHexz+0x62activeScriptPointerFieldHexz+0x40r   r  generalScriptRunnerHexhandlerTableHexstopFlagHexframeSelectorOpcodeHexr7   r5  frameSelectorHandlerEntryHexframeSelectorHandlerVaHex	modeCaseszword [stream+0x02]z"dword [stream+0x04] -> object+0x28r#   )r+  timerSourceselectorWriteadvanceBytes
storeVaHexr   z?word [stream+0x06] -> low object+0x28, preserving surface indexz0x00404523/0x00404539r    z5word [stream+0x02] << 16 -> object+0x28 surface indexro  zobject script/timer update decrements +0x62 and, when it reaches zero, runs the +0x64 frame script through the generic 0x00440538 handler table; opcode 0x21 writes +0x28 and reloads/advances the frame script)&actorControllerFrameSelectorWriteCount#boundsHelperAnimationStateReadCounta  +0x28 is the draw frame selector consumed by the bounds/source-rect helper; its low 16 bits select the frame and bits 16..23 select the 0x0055abd8 surface table. The helper also applies per-object +0x30/+0x34 sprite offsets when the object flags request it. The object script/timer path drives +0x28 through opcode 0x21 frame-script commands, while the actor controller writes +0x68 direction/animation state but does not write +0x28 in the identified controller range. Party actor descriptors ground the +0x68-to-+0x64 frame-script table and opcode 0x21 +0x28 selector sequences for Ataho/Rinshan/Smashu; the remaining descriptor rows are classified as battle/effect/object resources without +0x68 state-table selectors.)boundsFunctionHexscriptFrameSelectorFunctionHexselectorFieldHexr  surfaceTableHexselectorPackingsurfaceMetadataFieldsHexobjectOffsetFieldsHexscriptFrameSelectorWriterscriptFrameTimerpartyActorFrameScriptsr  ro  r  )r  r  r  r9  rW   rX   rQ   r  r   r   r}   r   rb   SCRIPT_RUNNER_FUNCTIONSPRITE_FRAME_SCRIPT_FUNCTIONr<   SPRITE_SURFACE_TABLESCRIPT_TIMER_STEP_FUNCTIONSCRIPT_STOP_FLAG)rL   rM   r  bounds_rangeframe_selector_handler_entryframe_selector_handlerparty_actor_frame_scriptsframe_selector_write_needlesanimation_state_read_needles+actor_controller_frame_selector_write_count(bounds_helper_animation_state_read_countframe_timer_verificationr  s   ``           r;   sprite_frame_selector_summaryrf  l  s<   1:>-z:L#7:TWX:X#X #]]4hHdfg1hijkl @h Oj!j!j!j!j!j!$  	j!j!j!j!j!$  3BX3(3*F3/ 0?X0$0&B0, +. .
	!.
 +
 25 	5
!	5
 	2
 	2P 3*59OO69 :
!:
 7
 9ORn8n47 8
!8
 5
E+ Z 8; 
;
!
;
 
8
 58 8
!8
 5
 >A 
A
!
A
 
>
 36 	6
!	6
 	3
 5`cd4d1Y]^1^]1^ #_1` $N
3a1Lf ##<=*/0L*M#") !56'!J

 "!"#!(%
 #*7!3"#?@&2&2L%A&2 K&
+
U#=>+
1+
 '(?+
  0	+

  0+
 !'+
 *7+
 )'+
 %e,B&C+
 u%9:+
 5!12+
 %+Ec*J&K+
 +E2N,O+
 (/E)F+
 #7%I$%". #7%f$%"9 #'%\$%".+
L 4O+
X #<6a3[

` %iU Ur=   c                L   t        | |t        d      t        | |t              dk(  t        | |dd      xr t        | |dd      t        | |dd      t        | |d	d
      t        | |t              t
        k(  xr t        | |t              t
        k(  d}t        t              t        | |t        d      t        t              t        t              t        t              t        t              dt        | |t        d      t        | |t        d      t        t
              g dddddd|ddS )Nr  i|/B iDB z66 a3 da 5a 59 00iDB z66 a3 dc 5a 59 00i?EB z8d 04 45 f0 5a 59 00iEB z8d 04 45 d0 d7 58 00) mapLoaderPrologueMatchesExpected!mapPayloadLoadCallMatchesExpected!mapWidthHeightWritesMatchExpected'mapLayer0CopyDestinationMatchesExpected0mapLayer1CollisionCopyDestinationMatchesExpectedmapLayerCopyCallsMatchExpectedzmap CNS payload loaderr    zCNS layer0 word grid copyz#CNS layer1 collision flag grid copy)zwidth/height wordsz"CNS layer0 word grid -> 0x00595af0z"CNS layer1 word grid -> 0x0058d7d0r  r  r  r  r  z(collision-flag-grid-mapped-to-cns-layer1)r  payloadLoadCallwidthGlobalHexheightGlobalHextileWordGridHexcollisionFlagGridHexlayerWordSizeByteslayer0CopyCalllayer1CollisionCopyCallcopyFunctionHex	copyOrdercollisionDirectionBitsr  r  )r   MAP_LOADER_FUNCTIONrb   MAP_PAYLOAD_LOAD_CALLMAP_LAYER0_COPY_CALLMAP_LAYER_COPY_FUNCTIONMAP_LAYER1_COLLISION_COPY_CALLr<   rh   r  r  MAP_TILE_WORD_GRIDr  )rL   rM   r  s      r;   map_collision_loader_summaryr  =  s8   ,;CK^`s,t-9#xI^-_cm-mC:7JK PXz;NO3B3R\^t3u<KCQY[eg}<~h(<=AXX gS(,JKOffL 23&sH6KMef0 !12 !34 %&9 :%c85IKfg#.sH>\  _D  $E !89
 	#
 %E/ r=   c                   | j                         }t        |      }t        t        i       }t	        |      }t        ||      }t        ||      }t        ||      }t        ||      d   }	|	d   }
t        |      }t        ||t        d      t        ||t        d      t        ||t        d      g}t        ||t        d      }t        ||t        d      }t!        ||d      }t!        ||d	      }t!        ||d
      }t!        ||d      }t!        ||d      }t!        ||d      }||k(  rd|z  nd }|D cg c]  }|d   	 }}i dt#        t$              dk(  d|t#        t&              t#        t(              t#        t*              gk(  d|d   t#        t,              k(  d|d   t#        t.              k(  dt1        ||dd      dk(  xr t1        ||dd      dk(  dt1        ||dd      dk(  xr t1        ||dd      dk(  d |d!k(  xr |d!k(  d"|d#k(  xr |d$k(  d%|d&k(  xr |d&k(  d'|t2        k(  d(|j5                  d)      d*k(  d+|j5                  d,      d*k(  d-|j5                  d.      d/k(  xrV |j5                  d0      d1k(  xr@ |j5                  d2      dk(  xr* |j5                  d3      d*k(  xr |j5                  d4      d5k(  d6|j5                  d7      d8u d9|j5                  d:      d8u d;|j5                  d<      d8u d=|j5                  d>      d8u i d?|j5                  d@      d8u dA|j5                  dB      dCk(  dD|j5                  dE      d8u dF|j5                  dG      d8u dH|j5                  dI      dJu dK|j5                  dL      d8u dM|j5                  dN      d8u dO|j5                  dP      d8u dQ|j5                  dR      d8u dS|j5                  dT      d8u dU|j5                  dT      d8u xr
 |dV   dW   d8u dXt7        |dV   j9                               dYt7        |dV   j9                               dZt7        dV   j9                               d[t7        |dV   j9                               d\|d]   d^   d_   d`k\  da|dV   db   d8u |dc   d^   dd   d!k(  t7        |dV   j9                               de}t;        |       t#        t$              dfdgd||t#        t<              dht#        t&              |t#        t>              t#        t@              t#        tB              t#        tD              t#        tF              didjdkdldmdndo	t#        t,              dpdqt#        tH              t#        tJ              |||||drdsdt|dui dvt2        dw|t2        k(  dxdydzd8d{t7        |dV   j9                               d||dV   d}   d8u d~|dV   d   d8u dt7        dV   j9                               dt7        fddD              dt7        fddD              ddV   j5                  d      d8u xr dV   j5                  d      d8u dt7        |	dV   j9                               dt7        |
dV   j9                               d|
d   d|
d   d|
d   d1k(  d|
d   d1k(  i dt7        |dV   j9                               d|d   d|d   d|d   d|d   d8u xr |d   d8u d|d   d8u d|d   dJu dd8ddd|j5                  d,      d|j5                  d,      d*k(  xr? |j5                  d.      d/k(  xr) |j5                  d2      dk(  xr |j5                  d7      d8u d|j5                  d:      d8u d|j5                  d<      d8u d|j5                  d:      d8u xr |j5                  d<      d8u  dd8dd8d|j5                  d7      d8u i ddddJdddg ddg dddddd|j5                  d      d|j5                  d      dd8d|j5                  d<      d8ud\d8dad8dd8ddJdd8dD|j5                  dE      i d|j5                  dB      dCk(  dF|j5                  dG      d|j5                  dI      d|j5                  dī      d|j5                  dI      dJu dK|j5                  dL      d|j5                  dǫ      dM|j5                  dN      d|j5                  dɫ      d|j5                  d˫      dO|j5                  dP      dQ|j5                  dR      dS|j5                  dT      dU|j5                  dT      d8u xr
 |dV   dW   d8u ddJd|j5                  dB      dk(  |||||dddќ}|S c c}w )NrW  r  zinput/action mask updatezactive object callback updatezobject script/timer updatez active draw-list tile projectionz!primary input table action packeriJB iJB iJB iJB iJB iJB r   rf   updateFunctionMatchesExpected
0x00411476perFrameCallsMatchExpecteddrawPrepCallMatchesExpectedactionPackerCallMatchesExpectedinputMaskStoresMatchExpectedi-B r"   r,  i-B z66 a3 12 e3 59 00cameraGlobalsMatchExpectedr  r  r  r  "tileProjectionShiftMatchesExpectedr   !tileProjectionBiasMatchesExpectedr   r#   fixedPointShiftMatchesExpectedr   #webTileSizeMatchesRuntimeProjection&webOriginalFrameMsMatchesRuntimeTimingr   0   &webDefaultTileStepMatchesOriginalFramer   %webWalkFrameConstantsMatchSpriteSheetr   r!   r   r   r   r   r   @   %webFrameQuantizedInterpolationPresentr   T#webSourceRectSelectorMappingPresentr   #webSourceRectSelectorCadencePresentr   webHeldInputTileChainingPresentr   webWallSlideFallbackPresentr   ,webDefaultCollisionModeIsOriginalLayer1Flagsr   originalLayer1Flags)webOriginalLayer1FlagCollisionModePresentr   #webActorOverlapCollisionModePresentr   'webActorOverlapCollisionDefaultDisabledr   FwebPartyTrailHistoryPresentr   )webPartyTrailRingMatchesOriginalSlotCountr   webPartyTrailCursorModelPresentr   (webPartyTrailInitialCursorsMatchOriginalr   &webPartyTrailRecordsAcceptedMoveTargetr   2webPartyTrailCallTimingMatchesOriginalTileMutationr  rE  actorControllerMatchesExpected"drawProjectionDetailsMatchExpected'spriteFrameSelectorDetailsMatchExpected,descriptorActivationOrderPathMatchesExpectedinputDrivenTileMutationGroundedr  r  r  r   originalPartyTrailRingGroundedr<  r  r   )"originalCollisionFlagTestsGrounded"collisionFlagGridMappedToCnsLayer1zarg+0x08r   )r  frameCountArgumentHexframeCountClamppausedFallbackFrameCountperFrameCallsdrawPrepCallactiveDrawListHex0x00010x00020x00040x0008)r2   r4   r0   r$   zicurrent mask is stored at 0x0059e310 every update; pressed-edge mask is computed separately at 0x0059e312)	r  actionPackerCallkeyboardStateVaHexprimaryKeyTableVaHexcurrentInputMaskVaHexpressedEdgeMaskVaHexpreviousInputMaskVaHexdirectionBitscontinuousMaskEvidencez+0xe8z+0xear  r  zdrawX = ((object[+0xe8] - word[0x004576dc]) << 4) + 0x18; drawY = ((object[+0xea] - word[0x004576de]) << 4) + 0x08; both are then shifted left by 16 before storing)r  objectTileXFieldHexobjectTileYFieldHexcameraTileXGlobalHexcameraTileYGlobalHextileShiftBitstileSizePixelsscreenBiasXscreenBiasYfixedPointShiftBitsdrawXFieldHexdrawYFieldHexprojectionFormuladrawProjectionDetailswebTileSizePixels tileSizeMatchesRuntimeProjectionmovementStepClasszRtile-grid movement with per-frame object/update callbacks and 16px tile projection!tileGridAndCameraConsumerGrounded"originalDrawPrepProjectionGrounded partyActorDrawProjectionGroundedrK  &partyActorAnimationStateValuesGroundedrQ  #originalSpriteFrameSelectorGrounded)originalFrameSelectorToSourceRectGroundedc              3  J   K   | ]  }d    j                  |      du   ywr  TNr  ry   rO  sprite_frame_selectors     r;   rz   z build_summary.<locals>.<genexpr>  s.      = &n599#>$F=    #)r*  r+  r,  &originalSpriteFrameScriptTimerGroundedc              3  J   K   | ]  }d    j                  |      du   ywr  r  r  s     r;   rz   z build_summary.<locals>.<genexpr>  s.      	: &n599#>$F	:r  r  /actorAnimationStateDirectFrameMappingEliminatedr.  r/  :actorAnimationStateToFrameSelectorPartyDescriptorsGroundedobjectDescriptorTableClassifiedobjectDescriptorTableRowCountr  #objectDescriptorPartyStateTableRowsr  ,nonPartyDescriptorAnimationStateTablesAbsentr  $nonPartyDescriptorFieldMapRefsAbsentr  %descriptorActivationOrderPathGrounded'descriptorActivationOrderCountRuntimeVar   descriptorActivationOrderBytesVar  descriptorActivationSlotBaseVar  'descriptorActivationLoadRebuildGroundedr  r  2descriptorActivationOpcode20SelfMutationEliminatedr  ;descriptorActivationCurrentSelectorActiveOrderStillUnprovenr  1actorAnimationStateToFrameSelectorStillUnresolved.actorAnimationStateToFrameSelectorRemainingGapa  the 12-row descriptor table is classified: rows 0..2 ground +0x68 -> +0x64 state-table frame scripts for Ataho/Rinshan/Smashu, while rows 3..11 are battle/effect/object resource descriptors without +0x68 state-table selectors or field-map refs; save-load active-order materialization is grounded, but current selector 2:0 active order and scripted behavior for non-player descriptors remain inferredwebDefaultTileStepMs!webFrameQuantizedTileStepGrounded$webSourceRectSelectorMappingGrounded$webSourceRectSelectorCadenceGroundedwebSourceRectPhaseStillInferred!webCollisionFallbackStillInferred(exactActorWalkInterpolationStillInferred0webPositionInterpolationStillVisualApproximationoriginalActorPositionModelz0tile-field-snap-plus-fixed-point-draw-projection.originalActorSubTileInterpolationEvidenceFound.originalActorSubTileInterpolationEvidenceScopez]identified actor controller tile mutations +0xe8/+0xea and draw projection writes +0x1c/+0x20originalActorTileMutationVas)rW  rX  rY  rZ  originalActorDrawProjectionVas)r  r  r  r  "browserInterpolationClassificationz)browser-visual-overlay-not-original-proofbrowserInterpolationOffsetFieldinterpolationOffsetr   r   /browserInterpolationOverlayNotPromotingOriginal'exactActorSpriteFramePhaseStillInferredr  -originalCollisionFlagTableNotMappedToCnsTiles*originalCollisionFlagGridMappedToCnsLayer1.webDefaultCollisionModeUsesOriginalLayer1Flags&webActorOverlapCollisionDefaultEnabled!webActorOverlapCollisionModeQueryr   "webActorOverlapCollisionStillOptInwebPartyTrailRingSlotCountr   webPartyTrailActorSlotCountr   webPartyTrailInitialCursorsr   webPartyTrailStillApproximate$webDefaultCollisionModeStillFallbacktileClassLayer0z$movement-consumer-partially-groundeda  The original per-frame update at 0x00411476 calls the input/action-mask step, active-object callback step, and object script/timer step once for each capped frame. The input step stores a continuous action mask separately from the new-press edge mask, which matches the browser's held-key walking behavior. The draw preparation path maps object tile fields +0xe8/+0xea against save/camera tile globals 0x004576dc/0x004576de, multiplies by 16 pixels, applies small screen biases, and stores fixed-point draw coordinates; the draw dirty-rect helper then consumes those projected +0x1c/+0x20 coordinates. The web runtime uses that actor-controller tile mutation evidence as a 48ms tile step, keeps the original party actor +0x28 idle source rects and full 8-command walking selector cadence for each facing direction, and keeps frame-quantized tile interpolation as a browser visual overlay rather than original sub-tile interpolation proof. The input-driven actor controller at 0x0043022d reads the continuous input mask, writes object tile fields +0xe8/+0xea, and calls the collision helper at 0x004319f8, which checks map collision flag bits from 0x0058d7d0/0x0058d7ce against object footprint fields +0xe6/+0xe7. The map loader at 0x0042449c copies the CNS layer0 word grid to 0x00595af0 and the CNS layer1 word grid directly to 0x0058d7d0, so the original collision flag grid is now mapped back to CNS layer1. The actor controller also maintains a 7-slot tile/direction history ring at 0x00574540/0x00574550/0x00574552/0x00574554 for companion actor following, seeded with per-actor cursors 0,4,1; in the same actor-controller pass it writes the mutated leader tile before follower reads. The browser has a partyTrail cursor-ring model for the same surface and records the accepted movement target into the ring. The actor controller also recomputes party actor draw coordinates from the leader tile or follower trail entry and uses object +0x68 for direction/animation state values 1-8. The object script/timer update at 0x00432ff0 drives +0x28 through +0x62/+0x64 and opcode 0x21 handler 0x004044bd. Party actor descriptors at 0x00442d95 initialize +0x64 through opcode 0x20 handler 0x0040448a, then use opcode 0x18 command bytes 18 a0 64 68 to select state-table frame scripts from object +0x68 for cara_at1/cara_rs1/cara_sm1. Those selected scripts contain opcode 0x21 selector sequences that loop via opcode 0x03. The same 12-row descriptor table is now classified: rows 0..2 are party walking descriptors, while rows 3..11 are battle/effect/object resource descriptors with no +0x68 state-table selector and no field-map CNS refs. Save-load active descriptor materialization is also separated: 0x00432323 rebuilds slot descriptor pointers from count/order after save blocks are read and before selector pointer selection, and later add/remove paths are general-table opcode 0x62/0x63 mutations. The draw helper's +0x28 frame selector, 0x0055abd8 surface-table lookup, source-rect math, and optional +0x30/+0x34 sprite offset path are identified, and the identified actor-controller range does not directly write +0x28, and no original sub-tile interpolation writer has been identified in the actor tile/projection path; current selector 2:0 active order and scripted behavior for non-player descriptors remain unresolved. The browser now keeps the same 8-command timer=1 selector cadence for party actor source rects while a held move chains from one original-frame tile step into the next. The browser uses originalLayer1Flags as the default collision mode for that grid, lets party actors overlap/pass through each other by default, and keeps actorCollision=1 only as a review switch for the old overlap-blocking behavior; tileClassLayer0 remains available as a local-review fallback. Full non-player descriptor behavior still requires more reconstruction.)r   
mainUpdateinputPollingtileProjection
webMappingactorMotionspriteFrameSelectordescriptorActivationOrdermapCollisionLoaderwebImplementationr  r  
conclusion)&
read_bytesr   rH   r  r
  r  r  r  rf  r  rh   INPUT_STEP_CALLOBJECT_CALLBACK_STEP_CALLSCRIPT_TIMER_STEP_CALLDRAW_PREP_CALLACTION_PACKER_CALLrT   r<   UPDATE_FUNCTIONINPUT_STEP_FUNCTIONOBJECT_CALLBACK_STEP_FUNCTIONr[  r  ACTION_PACKER_FUNCTIONrl   WEB_TILE_SIZErC  r   r   r   ACTIVE_DRAW_LISTKEYBOARD_STATEPRIMARY_KEY_TABLECURRENT_INPUT_MASKPRESSED_EDGE_MASKPREVIOUS_INPUT_MASKCAMERA_TILE_XCAMERA_TILE_Y)exe_pathr   rL   rM   r  r
   actor_motion
map_loaderdraw_projectionr`  object_descriptor_tabledescriptor_activation_orderper_frame_calls	draw_callaction_packerx_tile_shifty_tile_shiftx_screen_biasy_screen_biasx_fixed_shifty_fixed_shift	tile_sizer6  per_frame_targetsr  summaryr  s                             @r;   build_summaryr5  g  sM   



CS!H%&@"E

!C'X6L-c8<J-c8<O9#xH 56N O78OP"EF["\C?4NOC#<>]^C#9;WXO
 C>;]^IX/ACfgM3*5L3*5LC:6MC:6MC:6MC:6M%1\%A\!tI7FG]+GG:')?<)O:$&7%&/0,-<
 '
: 	&y'?5I[C\'\: 	*=+G5QgKh+h: 	'c8Z37JJ O#xQ7;NN: 	%c8Z37JJ O#xQ7;NN:" 	-la.?.ULTUDU#:$ 	,]d-B-\}X\G\%:& 	)-4*?*YMUYDY':( 	.yM/I):* 	1#'':K2LPR2R+:, 	1#'':M2NRT2T-:. 	0GG,-2 -$)-()Q.- %+- &",9:< 	09V1W[_1_=:> 	.sww7R/SW[/[?:@ 	.sww7R/SW[/[A:B 	*3773J+Kt+SC:D 	&sww/I'Jd'RE:F 	7@V8W[p8pG:H 	4SWW=e5fjn5nI:J 	.sww7Y/Z^b/bK:L 	2377;`3aej3jM:N 	&sww/I'Jd'RO:P 	4SWW=T5UY]5]Q:R 	*3773Q+RVZ+ZS:T 	3CGG<c4dhl4lU:V 	1#'':_2`dh2hW:X 	=GG9:dB \^,-RSW[[]:` 	)#l>.J.Q.Q.S*Ta:b 	-c/.2Q2X2X2Z.[c:d 	237L^7\7c7c7e3fe:f 	7'7>>@9
g:l 	*<8I+J8+TUo+ptv+vm:n 	),~*FGm*nrv*vo:p /;;L.Mh.WXu.vz{.{.1*^2L2S2S2U.Vs:Lx h-"?3%/ (),%!&'7!8
 ##67 -"'"7$)*;$<%*+=%>$)*;$<&+,?&@ ! 	 'R
" ##56#*#*$)-$8$)-$8)'((#0$$ "G%4
 I
I
.	]0JI
  !uI
 0	I

 1#on6U6\6\6^2_I
 /^,-RSW[[I
 5^,-Z[_ccI
 237L^7\7c7c7e3fI
 8 == :I
* 5c 	:	: 	7+I
> >%n599:deimm o).9==>efjnnCI
F I-n=DDFGII
L .+N;BBDEOI
R ,-DZ-PSI
T 23JKf3gUI
V ;'(MNRSSYI
\ 3'(EF!K_I
b 4/?FFHIeI
h 67RSf7giI
j /0KL]0^kI
l -.I-.XmI
n 6+,HITQ a/0WX\``sI
v A+,PQUYYyI
| J+,NOSXXI
B @CI
D =9GI
R #CGG,?$@SI
T 0+,2 CGG45:CGG,-2C GG9:dB]I
` 3CGG<W4X\`4`aI
b 3CGG<W4X\`4`cI
d .34< AGG78D@0eI
l 0mI
n 7oI
p ?He@fjn@nqI
r )*\sI
t =euI
v =oyI
| + -}I
H - /II
T 12]UI
V ./DWI
X 2377;`3aYI
Z 6sww?h7i[I
\ >t]I
^ 6sww?Z7[cg7g_I
` .taI
b -dcI
d 1$eI
f <UgI
h 9$iI
j 8Ai9jkI
l =cggF\>]av>vmI
n 2377;]3^oI
p 5cgg>c6dqI
r 09Y1ZsI
t 1#'':_2`di2iuI
v *3773M+NwI
x )#''2K*LyI
z 8AX9Y{I
| *3773M+N}I
~ *3773M+NI
@ .sww7U/VAI
B 7@g8hCI
D 5cgg>c6dEI
F A=>$F ` 01VW[__KI
N ,UOI
P 3CGG<R4SWh4hQI
T $4%@( $A)F{hGR NK	 Hs   4e-c                   | d   }| d   }| d   }| d   }| d   }| d   }| d   }|d   }|d	   }	|	d
   }
| d   }| d   d   }| d   d   d   }| d   d   d   }|d   }dj                  d |d   D              }g 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.    d/|d0    d1|d2    d3|d4    d1|d5    d	d6|d7    d8|d9    d:|d;    d<|d=    d>|d?    d@|dA    dB|dC    dD|dE    dF|dG    dH|d    d|dI    dJ|dK    dL|dM    dN|dO    dP|dQ    dR|dS    dT|dU    dV|	dW    dX|	dY   dZ    dL|	dY   d[    d\|	d]   dZ    dL|	d]   d[    d^|	d]   d_    d`|	da    db|dc    dd|de    df|dg    dh|di    dj|dk    dl|
da    dm|dn    do|dp    dq|dr    ds|dt    du|dv    d|dw    dx|dy    dz|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|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|d    d1|d    d1|d    d1|d    d|d    d|d   da    d|d    d|d    d|d    d|d    d| d   d   d    d1| d   d   d    d| d   d   d    dt        |d          d|da    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    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    dddddd}| d   j                         D ]   \  }}|j                  d| d| d       " |j	                  dddddd| d   d   d    dd| d   d   d   d     dd!|da    d"|d    d1|d    d1|d    d1|d    dd#|da    dd$| d   d   d%   d    d| d   d   d%   d    dd&| d   d   d    dd'| d   d   d   d(    dd)|da    dd*| d   d+   d    dd,|da    dd-|d.   da    d"|d.   d    dd/|da    d"|d    d0|dI    d1|dK    dL|dM    dd2|	da    d"|	dW    dd3|
da    d"|
dW    dd4|da    d5|d6    dd7|d    dd8|d    dd9|d    ddd:dd;d<g       |	d=   D ]  }|d>   d?   }|d>   d@   }|j                  d|dA    dB|dC    dD|dE    dD|dF    dGdj                  dH |dI   D               ddj                  dJ |dI   D               d        |j	                  g dK       |
dL   D ]}  }|j                  d|dM    dB|dC    dG|dN    ddj                  dO |dP   D              xs dQ ddj                  dR |dS   D              xs dQ d|dT    d        |j	                  g dU       |d   D ]M  }|j                  d|dV    dB|dW    dD|dX    dD|dY    dD|dZ    dG|d[    d|d\    d       O |j                  d       d]j                  |      S (^  Nr  r  r  r	  r  r  r  rV  rW  r  r  r
  r  r  r  r  r  , c              3  D   K   | ]  }d |d    d|d    d|d      yw)`re    -> rf   z` rd   Nr9   r  s     r;   rz   zmarkdown.<locals>.<genexpr>  s;        CT#m"4!5RG~F s    r  z# Runtime Movement z- update function: `r  r9  z- per-frame calls: z- draw prep call: `r  re   r:  rf   z- input action packer: `r  z- continuous input mask: `r  z`; pressed-edge mask: `r  z- direction bits: left r  r2   z, right r4   z, up r0   z, down r$   z- tile projection: object `r  z`/`r  z` minus camera `r  r  z- tile size: `r  z` px; web tile size matches: r  z!- draw projection grounded: prep r  ; party actors r  z); +0x68 animation state values grounded: r  z"- sprite frame selector grounded: r  z; selector `rP  z1` low 16 frame index, bits 16..23 surface table `rQ  z`; source-rect grounded: r  z; script timer `rA  z
`, opcode rD  z
 handler `rF  z`; script timer grounded: r  z#; direct +0x68 mapping eliminated: r  z(; party +0x68-to-frame-script grounded: r  z ; remaining +0x68-to-+0x28 gap: r  z/- party actor frame scripts: descriptor table `r  z`, frame pointer opcode r  r*  r  z`, state table opcode r  z`, command `r  z`; ro  z&- object descriptor table classified: r  ; rows r  ; party state-table rows r  z'; non-party +0x68 state tables absent: r  z'; non-party field-map CNS refs absent: r  z; z-- descriptor activation/order path grounded: r  z	; count `r  z	` order `r  z` slot base `r  z`; load rebuild `r  r  z` after save reads: r  z before selector selection: r  z(; opcode 0x20 self-mutation eliminated: r  z(; current selector active order proven: r  z- web tile step: `r   z` ms from `r   z	`; clamp r   r   rn   r   z msz- web walk frames: r   z per direction, idle r   z, moving starts at r   z, frame r   r   r   z-- web source rect selector mapping grounded: r  ; 8-command cadence grounded: r  z; cadence commands: r   z	; model: r   z)- frame-quantized interpolation present: r   z; held input tile chaining: r   z- wall-slide fallback present: r   z+; actual movement direction drives facing: r   z; diagonal follow-up: r   z; default collision mode: `r   z` (r   )z- camera deadzone present: r   z; deadzone tiles: r   z- deferred map query sync: r   z(- actor-overlap collision mode present: r   z; default enabled: r   z
; query: `r   z- actor controller: `z`; collision helper: `z- original party trail ring: r}  z slots at `r|  r  r  r  z`; initial cursors r  z
; timing: r  z; web partyTrail slots: r   z; cursor model: r   z; records accepted target: r   z; bounded: r   z- original collision flags: `r  r  z`; direction bits r  z- directional collision cases: r  z; object overlap response: z; clears latch: r  z- map collision loader: `z` copies CNS layer0 to `rq  z` and CNS layer1 flags to `rr  z3- web original layer1 flag collision mode present: r  z&; default uses original layer1 flags: r  z; tileClass fallback default: r  z,- web actor-overlap collision mode present: r  r  z; opt-in review switch: r  z#- web party-trail history present: r  z; ring slots: r   z; actor slots: r  z; initial cursors: r  r  z; matches original cursors: r  r  z; call timing match: r  z; still approximate: r  z'- input-driven tile mutation grounded: r  z*; original collision flag tests grounded: r  z!- original actor position model: r  ); sub-tile interpolation evidence found: r  z	; scope: r  z(- browser interpolation classification: r  ; overlay detected: r   ; fixed-point preserved: r   z; offset field: `r  z9- web position interpolation still visual approximation: r  z(; web source-rect phase still inferred: r  1; exact actor sprite-frame phase still inferred: r  z- status: `r  r  z## Projection Formular  z## Verificationz| check | value |z| --- | --- |r  z| z | z |z## Actor Motionz| area | value |z| actor controller | `z` |z| current input mask refs | r  r  z| party trail history | z at `z"| party actor screen projection | z| collision helper call | `r  z| collision helper | `z| collision flag table reads | r   z| object overlap response | z| script tile step handler | `r  z| sprite frame selector | z!| sprite frame selector writer | rU  z| sprite frame timer | z` via `z	` opcode z#| party actor frame script table | z| object descriptor table | z | descriptor activation/order | z from `r   z| map collision loader | `z| CNS layer0 destination | `z&| CNS layer1 collision destination | `z## Party Actor Frame Scriptsz`| character | descriptor | surface | state table | idle state 1 selector | moving state 5 loop |z%| --- | --- | --- | --- | --- | --- |r  r|  r   r!   r   z | `rs  z` | `r  r  z` | c              3  (   K   | ]
  }d | d   ywr9  Nr9   r:  s     r;   rz   zmarkdown.<locals>.<genexpr>       Q%1UG1Q   r3  c              3  (   K   | ]
  }d | d   ywrF  r9   r:  s     r;   rz   zmarkdown.<locals>.<genexpr>  rG  rH  )r;  z## Object Descriptor Tabler;  zZ| index | descriptor | class | linked CNS | +0x68 state table | valid frame initializers |z'| ---: | --- | --- | --- | --- | ---: |r  rH  rv  c              3  (   K   | ]
  }d | d   ywrF  r9   rY  s     r;   rz   zmarkdown.<locals>.<genexpr>!  s     B1TF!BrH  ru  -c              3  (   K   | ]
  }d | d   ywrF  r9   r:  s     r;   rz   zmarkdown.<locals>.<genexpr>"  s     X%1UG1XrH  rz  rw  )r;  z## Directional Collision Casesr;  z]| direction | input latch | blocked fallback | flag bit | flag grid | scan shape | boundary |z+| --- | --- | --- | --- | --- | --- | --- |r&   r  r  r  r  r.   r/   
)joinr   itemsr   extend)r4  r:  input_polling
projectionmappingr
   loadersprite_frameframe_timerparty_frame_scriptsr'  descriptor_activation	collisionparty_projectiontrailoverlapr)  linesrO  r:   r  state1state5r6  s                           r;   markdownr`    s   \"FN+M)*Jl#G
%
&C)*F01L12K&'?@12IJ#$?@&'89I}-.?@A]^M"#456IJE/0Gii  /*  O00
0 vo67q90 o./	0
 f^4[AB$vnG]^kGlFmmno0 #=1C#D[#Q"RRVWdewWx  zG  XH  WI  IJ  	K0 %]3J%K$LLcdq  sI  eJ  dK  KL  	M0 "-"@"H!IR_`oRpqxRyQzz  AN  O^  A_  `d  Ae  @f  fm  n{  |K  nL  MS  nT  mU  	V0 &j1F&G%HJWlLmKnn~  @J  Ka  @b  c  cf  gq  rH  gI  fJ  JK  	L0 $4566ST[\~T  TA  	B0 ,G4X,Y+ZZijq  sU  kV  jW  W@  AH  Iq  Ar  @s  	t0 -W5Z-[,\\hiu  wI  jJ  iK  K|  }I  J[  }\  |]  ]v  w~  j  wk  vl  l|  }H  IX  }Y  |Z  Z^  _j  kC  _D  ^E  EO  P[  \t  Pu  Ov  v@  AL  Mh  Ai  @j  jD  EL  Mu  Ev  Dw  wZ	  [	b	  c	T
  [	U
  Z	V
  V
~
  
F  GC  
D  ~
E  Ee  fm  n^  f_  e`  	a0 ::MNb:c9dd|  ~Q  Rk  ~l  mx  ~y  }z  zD  EX  Yr  Es  tB  EC  DD  DZ  [n  oR  [S  T_  [`  Za  ak  l  @c  ld  es  lt  ku  uA  BU  Vy  Bz  {I  BJ  AK  KN  Ob  cs  Ot  Nu  	v0 19Z1[0\\cdk  mL  eM  dN  Ng  ho  pU  hV  gW  W~  F  Gu  v  ~w  w^  _f  gM  _N  ^O  OQ  Ri  jz  R{  Q|  	}0 8@g8h7iir  tI  J]  t^  s_  _h  i~  P  iQ  hR  R_  `u  vC  `D  _E  EV  Wl  mC  WD  VE  EI  J_  `z  J{  I|  |P  Qf  gC  QD  PE  Ea  bw  x_  b`  aa  aI	  J	_	  `	D
  J	E
  I	F
  F
n
  o
D  Eg  o
h  n
i  	j0  S!456k#FcBdAeenor  tA  pB  CH  pI  oJ  JL  MP  Q^  M_  `e  Mf  Lg  gj  	k!0" c":;<<QRUVaRbQccvwz  |L  xM  wN  NV  WZ  [g  Wh  Vi  ij  kn  o|  k}  j~  	#0$ 8@f8g7h  iG  HO  Pv  Hw  Gx  xL  MP  Qj  Mk  Ll  lu  vy  zZ  v[  u\  	]%0& 4C8U4V3WWstw  yP  uQ  tR  	S'0( *#.H*I)JJuvy  {U  wV  vW  Wm  nq  rM  nN  mO  Oj  kn  oE  kF  jG  GJ  KN  Og  Kh  Ji  ij  	k)0* &c*A&B%CCUVYZoVpUqr+0, &c*@&A%BC-0. 337Y3Z2[[nor  tY  pZ  o[  [e  fi  jJ  fK  eL  LM  	N/00   67H I/ Z[[qry  {H  sI  J[  s\  ]l  sm  rn  no  	p102 (k(:';;u_G]F^^abghwbxayy|  ~C  DS  ~T  }U  UX  Y^  _r  Ys  Xt  tG  HM  N^  H_  G`  `j  kp  q}  k~  O  kP  jQ  Qi  jm  nG  jH  iI  IY  Z]  ^|  Z}  Y~  ~Y  Z]  ^C  ZD  YE  EP  QT  Ul  Qm  Pn  	o304 ((>?P(QRi(j'kknov  xE  pF  GX  pY  Zu  pv  ow  wI  JQ  R_  J`  ar  Js  tL  JM  IN  	O506 *#i8H.I*J)KKfgno  hA  gB  BR  SZ  [z  S{  R|  	}708 $F?$;#<<TU[\mUnTo  pK  LR  Si  Lj  Kk  kl  	m90: >gFq>r=s  tZ  [b  cS  [T  ZU  Us  t{  |b  tc  sd  	e;0< 7w?d7e6ffy  {B  Ck  {l  zm  mE  FM  Nr  Fs  Et  	u=0> .g6S.T-UUcdk  mI  eJ  dK  KZ  [b  c@  [A  ZB  BU  V]  ^{  V|  U}  }M  NU  Vw  Nx  My  yU  V]  ^H  VI  UJ  Je  fm  nV  fW  eX  Xm  nu  vj  nk  ml  lA	  B	I	  J	i	  B	j	  A	k	  	l	?0@ 2':[2\1]  ^H  IP  Qu  Iv  Hw  	xA0B ,G4P,Q+RR{  }D  Eu  }v  |w  w@  AH  Iy  Az  @{  	|C0D 37;_3`2aauv}  d  we  vf  f  @G  Hq  @r  s  sD  EL  Mn  Eo  Dp  pq  	rE0F DGL~D  DA  Ai  jq  rS  jT  iU  UF  GN  Ox  Gy  Fz  	{G0H g/013I0J 	K0L 	M0N 	O0P 	 Q0R 	S0T J*+,A.U0V 	W0X 	Y0Z 	[0\ 	]0^ 	_0Eb n-335 -
Ur#c%+,-	LL


 !78I!J?![ \\_`
&w}'=>O'PQY'Z[u'v&wwyz
"5)9#:";5AW@XX[\abq\r[ssvw|  ~M  xN  wO  OR  SX  Yl  Sm  Rn  nq  	r
,-=>N-O,PPRS
%gm&<=N&OPe&fgr&s%ttx  zA  BO  zP  Qb  zc  dy  zz  {H  zI  yJ  JM  	N
 !78I!J?![ \\_`
)'-*@AR*ST\*]^{*|)}}  	A
&w/?'@&AD
()?@W)XYh)i(jjmn
$\2B%C$DBG
+L9T,UVf,g+hhmnz  |W  oX  Yh  oi  nj  jm  	n
!+.>"?!@kRaFbEccjkv  xP  lQ  kR  R[  \g  h@  \A  [B  BL  MX  Yt  Mu  Lv  vy  	z
-.ABR.S-TTYZm  oC  [D  ZE  EH  	I
&'>?O'P&QQVWn  pD  XE  WF  FI  	J
*+@AQ+R*SSZ[pqy[zZ{{~
$VO%<$=SA
&v.?'@&AE
08N1O0PPST
&
j/9 < )6 
	>*1->*1-:&'tI6G,H+I J/01yA`7a6bbfyyQ6:O3PQQRRUyyQ6:O3PQQRRTV	

 
LL   'v. 
Wd3'8#9":$s??S>TTWyyB[1ABBIcJ#yyX37V3WXX_\_``c678<	

 
LL   )* 
[!"$s?';&<E#F_B`Aa bL!"%M(:';4K@P?QQTUXYgUhTiikm	


 
LL99Ur=   c                   | d   }| d   }| d   }| d   }| d   }dj                  d |d   D              }d	j                  d
 | d   j                         D              }| d   }| d   }	|	d   }
|	d   }|d   }| d   }|d   }|d   d   }|d   d   }|d   }| d   }d	j                  d |d   D              }d	j                  d |d   D              }d	j                  d |d   D              }d	j                  g ddd d!d"|d#    d$| d%    d&d'| d(d)|d*   d+    d,|d*   d-    d&d.|d/   d+    d,|d/   d-    d0|d1    d2|d3    d4	d5t        j                  |d6          d7d8|d9    d:|d;    d<|d=    d>|d?    d@|dA    dB|dC    dD|dE    dF|dG    dHdIt        j                  |dJ          dK|dL    dMt        j                  |dN          dOt        j                  |dP          dQ|dR    dS|dT    dUt        j                  |dV          d4dj                  g dW|d   d#    dX|d#    dY|dZ    d[|d\    d]|d^    d_|d`    dat	        |d          dbt        j                  |dc          dd|de    df|dg    dh|di    d[|dj    d[|dk    d[|dl    dmt        j                  t        |dn                dot        j                  |dp   dc          dqt        j                  |dc          dH      dj                  g dr|ds    dt|	du    dvt        j                  |	dw   dx          dyt        j                  |	dw   dz          d{|d|    d}|
d#    d,|
d~    d|
d    d|
d    d|
d    d|d    d|d    d|d    dt        j                  |d          dt        j                  |	dc          d7      d|d    d|d   d    d|d   d    d|d   d    d|d   d    dt        j                  |d   d          dt        j                  |dc          d7d|d    d|d    dt        j                  t        |d                d|d    d|d    dt        j                  |dc          d7d|d    dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d,t        j                  t        |d                d|d    d|d    d|d    d|d    dt        j                  |dc          d7d|d#    d|d    d|d    d4dj                  g d|d    dt        j                  t        |d                d|d    d|d    d|d    dđ|d    dƑ|d    dȑt        j                  t        |d                dʑ|d    d̑|d    dΑ|d    dБ|d    dґ|d    dԑ|d    d֑t        j                  t        |d                dؑ|d    dڑ|d    dܑ|d     dޑt        j                  t        |d                d|d    d|d    d|d    dt        j                  t        |d                d|d    dt        j                  t        |d                d4      dt        j                  | d          d7dd|ddd|ddd|ddd|d      S )Nr  r  r  r	  r  r;  c           
   3     K   | ]R  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d T yw)z
<li><code>re    -&gt; rf   z</code> rd   z</li>Nhtmlr   r  s     r;   rz   zhtml_page.<locals>.<genexpr>;  sh       T[[[!12374;;s=GY;Z:[[cdhdodopst{p|d}c~  D  	Es   AAr  rM  c           	   3     K   | ]?  \  }}d t        j                  |       dt        j                  t        |             d A yw)<tr><td>	</td><td>
</td></tr>N)re  r   r   )ry   rO  r:   s      r;   rz   zhtml_page.<locals>.<genexpr>?  sC      C 4;;s#$Idkk#e*.E-FjQs   AAr  r
  r  rV  rW  r  r  r  r  r  r  r  r  c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d	          d
t        j                  |d          d  yw)rg  r&   </td><td><code>r  </code></td><td><code>r  r  r  </code></td><td>r.   rh  r/   ri  Nrd  r  s     r;   rz   zhtml_page.<locals>.<genexpr>N  s       	{{3{+,- .[[_!567 8[[%>!?@A B[[\!234 5[[]!345 6{{3{+,- .{{3~./0 1	s   B<B>r  c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  dj                  |d	   d
   d                dt        j                  dj                  |d	   d   d                d  yw)rg  r   rk  rs  rl  r  r  rm  r7  r|  r   r3  rh  r!   ri  Nre  r   rN  r  s     r;   rz   zhtml_page.<locals>.<genexpr>Z  s      
! 	{{9Z012 3[[+<!=>? @[[+@!ABC D[[+J!KLM N{{499i&?&BDY%Z[\] ^{{499i&?&BDY%Z[\] ^	
!s   CCr  c              3  N  K   | ]  }d |d    dt        j                  |d          dt        j                  |d          dt        j                  dj                  |d         xs d	       dt        j                  dj                  |d
         xs d	       d|d    d  yw)rg  rH  rk  rs  rm  rv  rh  r7  ru  rK  rz  rw  ri  Nro  r  s     r;   rz   zhtml_page.<locals>.<genexpr>e  s      
' 	7|n [[%6!789 :{{3/01 2{{499S%56=#>? @{{499S)H%IJQcRS T678 9	
's   B#B%r  z%<!doctype html><meta charset='utf-8'>z<title>Runtime Movement</title>z<style>body{font-family:system-ui,sans-serif;margin:24px;line-height:1.45;max-width:1040px}table{border-collapse:collapse}th,td{border:1px solid #ddd;padding:6px 8px;text-align:left}th{background:#f4f4f4}code{white-space:nowrap}</style>z<h1>Runtime Movement</h1>z!<p><b>Update function:</b> <code>r  z</code>; <b>status:</b> <code>r  z</code></p>z<ul>z</ul>z<p><b>Draw prep:</b> <code>r  re   rc  rf   z<p><b>Input packer:</b> <code>r  z</code>; continuous mask <code>r  z</code>; edge mask <code>r  z</code>.</p>z<p><b>Tile projection:</b> r  z</p>z<p><b>Tile size:</b> r  z px; web match: r  z!; draw projection grounded: prep r  r<  r  z-; web source rect selector mapping grounded: r  r?  r  z9; web position interpolation still visual approximation: r  rD  r  z.</p>z)<p><b>original actor position model:</b> r  rA  r  z; scope r  z(. browser interpolation classification: r  rB  r   rC  r   z; offset field <code>r  z)<p><b>Actor motion:</b> controller <code>z </code>, collision helper <code>z</code>, collision flags <code>r  z</code>/<code>r  z-</code>; input-driven tile mutation grounded r  z), original collision flag tests grounded r  z. Directional cases z; object overlap response ro  z; clears latch r  z. party trail ring r}  z slots at <code>r|  r  r  r  z</code>; initial cursors r  z	; timing r  z!. party actor screen projection: z@<p><b>Sprite frame selector:</b> sprite frame selector grounded r  z; <code>rP  z</code> uses rR  r/  z plus r0  z; source-rect path grounded r  z; script/timer <code>rA  z</code>, table <code>rB  z</code>, opcode rD  z handler <code>rF  z</code>, grounded r  z"; direct +0x68 mapping eliminated r  z'; party +0x68-to-frame-script grounded r  z; remaining +0x68-to-+0x28 gap r  z. z<<p><b>Party actor frame scripts:</b> descriptor table <code>r  z</code>; opcode r  r*  r  r  z</code>; command <code>r  z	</code>. z.<p><b>Object descriptor table:</b> classified r  r=  r  r>  r  z&; non-party +0x68 state tables absent r  z&; non-party field-map CNS refs absent r  z0<p><b>Descriptor activation/order:</b> grounded r  z; count <code>r  z</code>, order <code>r  z</code>, slot base <code>r  z</code>; load rebuild <code>r  r  z</code>, after save reads r  z, before selector selection r  z'; opcode 0x20 self-mutation eliminated r  z'; current selector active order proven r  z&<p><b>Map collision loader:</b> <code>z#</code> copies CNS layer0 to <code>rq  z0</code> and CNS layer1 collision flags to <code>rr  z"<p><b>Web movement alignment:</b> r   z ms step from r   z; walk frames r   z (r   r   r   z), idle r   z, first moving r   z; source rect selectors r   z; cadence commands r   z ; frame-quantized interpolation r   z; wall-slide fallback r   z*; actual movement direction drives facing r   z; diagonal follow-up r   z; camera deadzone r   rj   r   z; deferred map query sync r   z&; original layer1 flag collision mode r   z%; party overlap pass-through default r   z via <code>r   z</code>; partyTrail history r   z with r   z slots and cursor model r   z seeded r   z, accepted target write r   z; default collision <code>r   z<p>r  z<h2>Verification</h2>zB<table><thead><tr><th>check</th><th>value</th></tr></thead><tbody>z</tbody></table>z"<h2>Party Actor Frame Scripts</h2>z<table><thead><tr><th>character</th><th>descriptor</th><th>surface</th><th>state table</th><th>idle state 1 selector</th><th>moving state 5 loop</th></tr></thead><tbody>z <h2>Object Descriptor Table</h2>z<table><thead><tr><th>index</th><th>descriptor</th><th>class</th><th>linked CNS</th><th>+0x68 state table</th><th>valid frame initializers</th></tr></thead><tbody>z$<h2>Directional Collision Cases</h2>z<table><thead><tr><th>direction</th><th>input latch</th><th>blocked fallback</th><th>flag bit</th><th>flag grid</th><th>scan shape</th><th>boundary</th></tr></thead><tbody>)rN  rO  re  r   r   r   )r4  r:  rQ  rR  rS  r
   callschecksactorrU  rV  rW  r'  rX  rY  r[  rZ  r\  rT  direction_rowsparty_frame_rowsobject_descriptor_rowss                         r;   	html_pagerw  5  s   \"FN+M)*Jl#G
%
&CGG /* E YY !.1779 F M"E01L12K&'?@12IJ#$?@'(I#$%89E./0LM/0G)*FYY  -. N yy 
! -\:
! 
 "YY 
' +62
' 
 99 $/$)$ 	w$ 	$	$
 ,F?,C+DDbcjk|c}b~  J  	K$ ugU$ &f^&<[&I%J'RXYgRhivRwQx  yD  	E$ )7I)J;)W(XX_`m  oA  aB  CP  aQ  `R  Rq  r  @W  rX  qY  Yr  s@  AW  sX  rY  Ye  	f$ &dkk*=P2Q&R%SSWX$  
+; <==MgVxNyMz  {\  ]d  eI  ]J  \K  KZ  [b  cE  [F  ZG  Gt  u|  }c  ud  te  eC  DK  Lr  Ds  Ct  tm  nu  vh  ni  mj  j[	  \	c	  d	M
  \	N
  [	O
  O
T
  	U
$ 4DKKHd@e4f3g  hQ  RY  ZJ  RK  QL  LT  UY  U`  U`  ah  iY  aZ  U[  T\  \D  EI  EP  EP  QX  Y}  Q~  E  D@  @T  U\  ]B  UC  TD  D]  ^e  fO  ^P  ]Q  Qf  gk  gr  gr  sz  {\	  s]	  g^	  f_	  _	k	  	l	$ 	T  	T
3  	TE:K4L_4]3^  	T^~  	T  @I  JY  @Z  [  	T  [z  	T  {D  E\  {]  z^  	T  ^l  	T  mv  wR  mS  lT  	T  TA  	T  BI  Jk  Bl  Am  	T  mV  	T  W^  _C  WD  VE  	T  EY  	T  Z]  ^g  hx  ^y  Zz  Y{  	T  {U  	T  VZ  Va  Va  bi  jz  b{  V|  U}  	T  }L	  	T  M	T	  U	t	  M	u	  L	v	  	T  v	I
  	T  J
O
  P
[
  J
\
  I
]
  	T  ]
m
  	T  n
s
  t
C  n
D  m
E  	T  ES  	T  TY  Zi  Tj  Sk  	T  ky  	T  z  @O  zP  yQ  	T  Q_  	T  `e  fy  `z  _{  	T  {T  	T  UY  U`  U`  ad  ej  k{  e|  a}  U~  T  	T  H  	T  IM  IT  IT  UZ  [g  Uh  iy  Uz  I{  H|  	T  |]  	T  ^b  ^i  ^i  jz  {K  jL  ^M  ]N  	T  NS  	T$ 	{  	{
J  	{7SxKyJz  	{  {C  	{  DP  Qc  Dd  Ce  	{  er  	{  sw  s~  s~  K  L]  ^  _k  l  sm  rn  	{  nt  	{  uy  u@  u@  AM  N_  A`  at  Au  uv  tw  	{  wS  	{  T[  \G  TH  SI  	{  I^  	{  _j  kz  _{  ^|  	{  |C  	{  DO  Ph  Di  Cj  	{  j  	{  @K  L]  @^  _  	{  _o  	{  p{  |T	  pU	  oV	  	{  V	e	  	{  f	q	  r	M
  f	N
  e	O
  	{  O
a
  	{  b
i
  j
R  b
S  a
T  	{  Tv  	{  w~  p  wq  vr  	{  rY  	{  Za  b^  Z_  Y`  	{  `  	{  @D  @K  @K  LS  TD  LE  @F  G  	{  GI  	{  JN  JU  JU  Vb  cs  Vt  Ju  Iv  	{  vz  	{$ GGZ[oGpFq  rB  CV  Wp  Cq  r}  C~  B  N  Ob  c|  O}  ~L  OM  NN  N^  _r  sV  _W  Xc  _d  ^e  et  uH  Il  um  n|  u}  t~  ~U  VZ  Va  Va  bu  vY  bZ  [i  bj  Vk  Ul  lu  vz  vA	  vA	  B	U	  V	f	  B	g	  vh	  ui	  i	m	  	n	$ 9Ab9c8ddkls  uT  mU  lV  Vo  pt  p{  p{  |  @G  Hm  @n  |o  pp  oq  qW  X_  `N  XO  WP  Pv  w~  e  wf  vg  gi  jn  ju  ju  vM  N^  v_  j`  ia  ae  	f$  ;7Cj;k:llz{  |G  |G  HK  La  bu  Lv  Hw  |x  {y  yN  OS  OZ  OZ  [^  _t  uF  _G  [H  OI  NJ  Jc  dh  do  do  ps  tI  JW  tX  pY  dZ  c[  [w  x|  xC  xC  DG  H]  ^t  Hu  Dv  xw  wx  x  @D  @K  @K  LO  Pe  f@  PA  LB  @C  D  D^  _t  uQ	  _R	  ^S	  S	o	  p	E
  F
m
  p	n
  o	o
  o
V  Wl  mQ  WR  VS  Sz  {P  Qs  {t  zu  uw  x|  xC  xC  DY  Zj  Dk  xl  wm  mq  	r!$" 11H0IIlms  uF  nG  mH  Hx  y  @V  yW  xX  Xd  	e#$$ 	\  	\
,  	\S1D-E,F  	\n  	\UYU`U`adeh  jG  fH  bI  VJ  UK  	\  KY  	\  Z]  ^v  Zw  Yx  	\  xz  	\  {~  K  {L  zM  	\  MN  	\  OR  S`  Oa  Nb  	\  bj  	\  kn  oz  k{  j|  	\  |K  	\  LO  P`  La  Kb  	\  bz  	\  {  {F  {F  GJ  KN  Oo  Kp  Gq  {r  zs  	\  sF  	\  GJ  Kd  Ge  Ff  	\  fF  	\  GJ  Kh  Gi  Fj  	\  j@  	\  AD  E_  A`  @a  	\  aK	  	\  L	O	  P	j	  L	k	  K	l	  	\  l	A
  	\  B
E
  F
a
  B
b
  A
c
  	\  c
u
  	\  v
y
  z
Q  v
R  u
S  	\  ST  	\  UY  U`  U`  ad  eh  i~  e  a@  UA  TB  	\  B\  	\  ]`  aw  ]x  \y  	\  y_  	\  `c  dL  `M  _N  	\  Ns  	\  x{  |a  xb  tb  sc  	\  cn  	\  os  oz  oz  {~  B  Cc  d  {e  of  ng  	\  gC  	\  DG  Hb  Dc  Cd  	\  dj  	\  kn  oH  kI  jJ  	\  Jb  	\  cf  gE  cF  bG  	\  GO  	\  PT  P[  P[  \_  `c  d~  `  \@  PA  OB  	\  BZ  	\  [^  _D  [E  ZF  	\  F`  	\  ae  al  al  mp  qt  uK  qL  mM  aN  `O  	\  O[  	\%$& dkk',/016'$( 	 )$* 	M+$, 	-$. 	/$0 	-1$2 	t3$4 	5$6 	7$8 	+9$: 	n;$< 	=$> 	?$@ 	/A$B 	wC$D 	E$F 	G$ $ $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runtime_movement.jsonFr    )ensure_asciiindentrM  r?   r@   runtime_movement.mdzruntime_movement.html)mkdir
write_textrC   dumpsr`  rw  )r4  out_dirs     r;   write_outputsr    s    MM$M.&&22

7q9D@ 3  $$00'1BW0U&&229W3EPW2Xr=   c                    t        j                  t              } | j                  dt        t
               | j                  dt        t               | j                  dt        t               | j                         }t        |j                  |j                        }t        ||j                         t        d|j                  dz          y )N)descriptionz--exe)typedefaultz--web-indexz	--out-dirzwrote runtime movement -> r}  )argparseArgumentParser__doc__add_argumentr   EXEWEB_GAMEOUT
parse_argsr5  rL   	web_indexr  r  print)parserargsr4  s      r;   mainr    s    $$9F
dC8
D(C
$<DDHHdnn5G'4<<(	&t||6K'K&L
MNr=   __main__)r:   
int | Nonereturnz
str | None)rF   r   )
rL   r   rM   
list[dict]rN   r   rO   r   r  r   )rL   r   rM   r  rN   r   r  r   )
rL   r   rM   r  rN   r   rd   r   r  r  )
rL   r   rM   r  rN   r   rO   r   r  r   )rL   r   rM   r  rp   r   rq   r   rr   r   r  r   )rL   r   rM   r  rp   r   rq   r   r|   zlist[bytes]r  r   )
rL   r   rM   r  rN   r   r   r   r  r  )r   r   r   r   r  r  )r   r   r   r   r  zlist[int] | None)r   r   r  r  )rL   r   rM   r  r  r  )p   )rL   r   rM   r  r  r   r  r   r  r   r  dict | None)rL   r   rM   r  r  r   r%  r   r  r   r  r  )rL   r   rM   r  r  r   r  r  )`   )rL   r   rM   r  rE  zdict[int, str]r  r   rF  r   r  	list[str])   )
rL   r   rM   r  r  r   r  r   r  r  )rH  r   r`  r  ra  r  r  r   )r  r  r  r  )r#  r   r   r   r  r  )r4  r  r  r   )r4  r  r  r   r  None)r  r  )|r  
__future__r   r  re  rC   r   rW   pathlibr   probe_exe_scene_tablesr   r   r   __file__resolvery  ROOTr  r  r  r  r  r  r  r  r  r  r  r[  rX  r  r\  r  r	  r  r
  r  rY  r9  r	  r  r
  r$  rZ  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  ry  rz  r{  r}  r|  r  r  r  r  r  r  r  r  r<   rH   rQ   rT   rY   r]   rb   rh   rl   ru   r}   r   r   r   r
  r  r  r  r&  r@  rI  rP  rR  rb  r  r  r  rf  r  r5  r`  rw  r  r  __name__r9   r=   r;   <module>r     s   G "    	   P P H~''*
Ul
]%<+% #VV & #    * ' # !   " & " & ) ! '1 $%) "+5 ()- &!  #       & ( ",  $ ' &    *    )  "     %   " ! !+ $ % ' !+ #-  -/ * ""#" ""#" ""#"#% !8 $
    ! 'D>  ! 'B$  ! '?$  ! ,W<K1 h8&,AA5([A
2
 $, JZOd
>L 	  "	
  4 	  !	
  ,)b 	  	
  . 		  	
 B 		  	
 B+nb<~\~Nb'T $' D
IX_D 25 YO zF r=   