
    $/j                    r    d Z ddlmZ ddlmZmZ dZdZe G d d                      Z G d d	          Z	d
S )u  Actor:持续动作模型——动作有时长、移动逐跳走真实路径、可被打断。

(docs/agent-runtime-v2.md §1.2;决议:室内每跳 1–2 模拟分,室外 3–6 模拟分)
Actor 不做决策,只忠实执行"当前动作";决策层(规则桩/认知层)负责换动作。
    )annotations)	dataclassfieldg      Y@g     q@c                      e Zd ZU ded<   ded<   dZded<    ee          Zded	<   d
Zded<   dZ	ded<    ee
          Zded<   edd            ZdS )Actionstrkinddescg        floatuntil)default_factoryz	list[str]path destTboolinterruptibledictpayloadreturnc                @    | j         dk    r
d| j         n	d| j         S )Nmoveu   到达u
   完成了:)r	   r   r
   )selfs    0/root/genesis-world/src/genesis/runtime/actor.py	done_desczAction.done_desc   s/    '+yF':':#	###@XTY@X@XX    Nr   r   )__name__
__module____qualname____annotations__r   r   listr   r   r   r   r   propertyr    r   r   r   r      s         IIIIIIEeD111D1111DNNNNME$///G////Y Y Y XY Y Yr   r   c                  Z    e Zd ZdZddZdd	Zd
dddZd dZd!d"dZd#dZ	d$dZ
d%dZdS )&ActoruQ   单个 agent 的动作执行器。wake() 由调度器在 until 到点时调用。agent_idr   r   Nonec                d    || _         || _        || _        d | _        t	                      | _        d S N)aidwsclockcurrentsetblocked)r   r&   
worldstater,   s       r   __init__zActor.__init__!   s-    
&*!$r   r   Action | Nonec                D   || j         v rdS | j        j                            | j        d          }| j                            ||| j                   }|sdS t          dd| ||          }| j        j        | 	                    |d                   z   |_
        || _        |S )u\   规划去 dest 的逐跳路径并启动第一跳;不可达返回 None(反馈给决策层)。Nr   r   u   前往)r	   r
   r   r   r   )r/   r+   	positionsgetr*   r   r   r,   sim_seconds	_hop_costr   r-   )r   r   srchopsacts        r   
start_movezActor.start_move)   s    4<4g##DHb11w||Ct|44 	4&TMMMJ*T^^DG-D-DD	
r   T)r   r
   
duration_sr   r   r   r   c               V    t          d|| j        j        |z   ||          }|| _        |S )Ndo)r	   r
   r   r   r   r   r,   r6   r-   )r   r
   r<   r   r   r:   s         r   start_dozActor.start_do6   s:    $T1G*1T#0'C C C
r   
until_hourc                    | j         j        }|dz  dz  }||dz  z   }||k    r|dz  }t          dd|          }|| _        |S )u#   睡到指定时刻(支持跨日)。iQ g      @g     @sleepu   睡觉r	   r
   r   )r,   r6   r   r-   )r   rA   now	day_startr   r:   s         r   start_sleepzActor.start_sleep<   s\    j$E\U*	J//C<<WE'>>>
r      若有所思地待着c                R    t          d|| j        j        |z             }|| _        |S )NidlerD   r?   )r   r<   r
   r:   s       r   rJ   z
Actor.idleG   s,    &t4:3IJ3VWWW
r   tuple[str, str]c                   | j         }|dS |j        dk    r|j        r|j        d         }| j                            | j        |          s8d| _         dd|j         d| j        j                            | j                   fS |j        	                    d           |j        r6| j
        j        |                     |j        d                   z   |_        d|fS d| _         d	|fS d| _         d|j        fS )
u   到点推进当前动作。返回:
        ("hop", 新地点) 走了一跳还在途中;("arrived", 地点) 到达;
        ("finished", 描述) 动作完成;("none", "") 无动作。N)noner   r   r   finishedu   去u   的路走不通,停在了hoparrived)r-   r	   r   r+   r   r*   r   r4   r5   popr,   r6   r7   r   r   )r   r:   nxts      r   advancezActor.advanceM   s     l;:8v#((1+C7<<#.. n#!#m#m#mDGL]LaLabfbjLkLk#m#mmmHLLOOOx " J2T^^CHQK5P5PP	cz!DLc>!3=((r   c                F    | j         }|dS |j        sdS d| _         |j        S )uQ   打断当前动作(若可打断),返回被打断的描述。睡觉会被惊醒。Nr   )r-   r   r
   )r   r:   s     r   	interruptzActor.interruptb   s1    l;2  	2xr   placec                R    | j                             |          rt          nt          S r)   )r+   	is_indoorHOP_INDOOR_SHOP_OUTDOOR_S)r   rV   s     r   r7   zActor._hop_costl   s!    #w0077J||]Jr   N)r&   r   r   r'   )r   r   r   r2   )r
   r   r<   r   r   r   r   r   )rA   r   r   r   )rH   )r<   r   r
   r   r   r   )r   rK   r   )rV   r   r   r   )r   r   r   __doc__r1   r;   r@   rG   rJ   rS   rU   r7   r#   r   r   r%   r%      s        [[' ' ' '    OS      	 	 	 	    ) ) ) )*   K K K K K Kr   r%   N)
r[   
__future__r   dataclassesr   r   rY   rZ   r   r%   r#   r   r   <module>r^      s     # " " " " " ( ( ( ( ( ( ( ( Y Y Y Y Y Y Y YOK OK OK OK OK OK OK OK OK OKr   