- Entity.Target is one slot of TargetRef, read-only from outside (IReadOnlyReactiveProperty); Entity.SetTarget is its one writer. A chunk is taken only while the entity can see it, so a rock in darkness cannot be picked. Every handler, agent, turret and test writes through SetTarget. - Entity.ChunkInfo (Q14 A): the value the per-tick sensor rule settles at, computed on demand through Sensor.PassiveRate/Sensor.Gain -- sum of the active sensors' passive rates over (sensors x TargetInfoDecay), capped at 1. Stored nowhere; no per-tick loop over chunks. ChunkVisible is the detection threshold through the chunk path. - The lost-track rule reads through the chunk path: Activate's reconciliation and a per-tick check of the one slot drop a chunk target that has gone dark. - Entity.VisibleChunksInReach (Q13 A): visible chunks within the longest range among active weapons -- the one reach rule for cycling and programmatic picks. - Entity-only readers take .Entity: TargetedBy/TargetedByCount, target items, the stance gate (a chunk has no stance), lock (Q12 A: never on a chunk), turrets, Combat, Minion, FireControl (a chunk fires untargeted until Cut 4). TargetRange and the arc gate read a chunk's planar position. - ActionGameManager: the reticle and next/previous offer visible ships and visible chunks in reach; nearest stays enemies-only; the target panel, indicator and fire-control debug take TargetRef. EntityInstance reads .Entity. - MiningCut3Tests pin parity, darkness, monotone brightness, wear and break, reach, the chunk query, target survival and loss, TargetRef equality, lock, and field-kind assignment at generation and first load. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
23 lines
No EOL
758 B
C#
23 lines
No EOL
758 B
C#
|
|
using System.Linq;
|
|
using UniRx;
|
|
|
|
public class Minion : Agent
|
|
{
|
|
public Minion(Ship ship) : base(ship)
|
|
{
|
|
var patrolState = new PatrolOrbitsState(this);
|
|
_rootState.AddTransition(patrolState,
|
|
() => Task is PatrolOrbitsTask,
|
|
() => patrolState.Task = Task as PatrolOrbitsTask);
|
|
|
|
Ship.VisibleEnemies.ObserveAdd().Where(_ => Ship.Target.Value.IsNone).Subscribe(add => Ship.SetTarget(add.Value));
|
|
|
|
var combatState = new CombatState(this);
|
|
_rootState.AddTransition(combatState,
|
|
() => Ship.Target.Value.Entity != null, null, true, _rootState);
|
|
|
|
combatState.AddTransition(_rootState,
|
|
() => Ship.Target.Value.Entity == null, null, true, _rootState);
|
|
}
|
|
} |