
    `gj5                       U d Z ddlmZ ddlmZ dZdZdZdZdZ	d	Z
d
Zd#dZedz  ZdZd$dZd%d&dZ G d dee      Zej&                  j(                  ej*                  j(                  ej,                  j(                  ej.                  j(                  ej0                  j(                  ej2                  j(                  ddgZded<   ej&                  j(                  ddddej.                  j(                  ej8                  j(                  dej0                  j(                  g	Zded<   eZded<   ej&                  j(                  ej&                  j(                  fej*                  j(                  ej*                  j(                  dfej2                  j(                  ej2                  j(                  dfej,                  j(                  ej,                  j(                  dfej.                  j(                  ej.                  j(                  fej0                  j(                  ej0                  j(                  fej8                  j(                  ej8                  j(                  fiZded<   d'dZ d(d Z!d)d*d"Z"y!)+aK  Pet sprite geometry + animation-state taxonomy.

These values are the common petdex/Codex pet geometry. The real ``pet.json``
usually only carries ``id``/``displayName``/``description``/``spritesheetPath``;
row taxonomy is inferred from the atlas shape so Hermes can render both legacy
8-row sheets and current 9-row Codex sheets.
    )annotations)Enum         iL  gQ?g?g      @c                >    t        t        t        t        |             S )zJClamp *scale* to ``[MIN_SCALE, MAX_SCALE]`` (the single validation point).)max	MIN_SCALEmin	MAX_SCALEscales    F/root/.hermes/venv/lib/python3.12/site-packages/agent/pet/constants.pyclamp_scaler   -   s    y#i/00          c                R    t        t        t        t        | xs t        z              S )a!  Half-block width implied by *scale*, clamped to the legibility floor.

    Above the floor it tracks the kitty cell box (``scaled_px // 8``) so the two
    renderers converge at larger sizes; below it the floor keeps the sprite
    readable rather than letting it devolve into a blob.
    )r	   UNICODE_MIN_COLSroundBASE_UNICODE_COLSDEFAULT_SCALEr   s    r   cols_for_scaler   ?   s"     '8E<R]'S!TUUr   c                N    |rt        |      dkD  rt        |      S t        |       S )zLResolve terminal width: explicit *unicode_cols* override, else from *scale*.r   )intr   )r   unicode_colss     r   resolve_colsr   I   s&     ,\1BQ1F3|aN[`Laar   c                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
PetStatea  Animation state a pet can be shown in.

    These are Hermes' activity state names. They are not always identical to the
    source atlas row names: Codex-format pets use rows like ``jumping`` /
    ``running`` while the UI keeps the shorter ``jump`` / ``run`` names.
    idlewaverunfailedreviewjumpwaitingN)__name__
__module____qualname____doc__IDLEWAVERUNFAILEDREVIEWJUMPWAITING r   r   r   r   N   s,     DD
CFFDGr   r   extra1extra2	list[str]LEGACY_STATE_ROWSzrunning-rightzrunning-leftwavingjumpingrunningCODEX_STATE_ROWS
STATE_ROWSzdict[str, tuple[str, ...]]STATE_ALIASESc                    t        | t              r| j                  n
t        |       }t        j                  |      }|r|S |fS )z@Return accepted row-name aliases for *state* (always non-empty).)
isinstancer   valuestrr<   get)stater?   aliasess      r   state_aliases_forrD      s9    %eX6EKKCJE&G7+E8+r   c                    	 t        | xs d      }|t        t              k\  rt        S t
        S # t        t        f$ r d}Y 1w xY w)z@Return the row taxonomy for a spritesheet with *row_count* rows.r   )r   	TypeError
ValueErrorlenr:   r6   )	row_countrowss     r   state_rows_for_gridrK      sL    9>" s#$$ z" s   / AANc                ~    t        |      }t        |       D ]  }	 |j                  |      c S  y# t        $ r Y $w xY w)zEReturn the spritesheet row index for *state* (clamped, never raises).r   )rK   rD   indexrG   )rB   rI   rJ   names       r   state_row_indexrO      sM    y)D!%( 	::d##
   		s   0	<<)r   floatreturnrP   )r   rP   rQ   r   )r   )r   rP   r   r   rQ   r   )rB   'PetState | str'rQ   ztuple[str, ...])rI   
int | NonerQ   r5   )N)rB   rR   rI   rS   rQ   r   )#r*   
__future__r   enumr   FRAME_WFRAME_HFRAMES_PER_STATELOOP_MSr   r
   r   r   r   r   r   r   r@   r   r+   r?   r,   r-   r.   r/   r0   r6   __annotations__r1   r:   r;   r<   rD   rK   rO   r2   r   r   <module>r[      s(   #  

    
 		1 qL   Vb
sD ( MMMMLLOOOOMM	  9 	 MMOOOO
 ) 
 )
I ( MM(----/MM(----x8MM(----y9LL++Y7OOHOO113OOHOO113X--335-) ,	r   