ModernUO/dev-docs
Kamron Batman ebe730353b
feat: independent think/move clocks for creature AI
Creatures now run two clocks: the think clock (ActiveSpeed/PassiveSpeed,
seconds per decision - unchanged in meaning, storage, and cadence) and a new
movement clock (ActiveMoveSpeed/PassiveMoveSpeed, seconds per step, 0 =
inherit the matching think value). This lets movement pace be tuned freely -
e.g. toward RunUO's TransformMoveDelay pacing - without touching reaction
time, spell timing, or acquisition cadence.

- BaseCreature: move-speed pair seeded from npc-speeds.json (optional
  activeMove/passiveMove per bucket), [props-tunable per instance (0 to
  re-inherit), serialized (v22). SetSpeed keeps its legacy one-clock
  semantics: it sets the think clock AND clears move overrides, so existing
  callers cannot half-configure a creature; SetMoveSpeed/ClearMoveSpeed
  configure movement explicitly. CurrentMoveSpeed resolves by classifying
  CurrentSpeed - a verbatim active/passive value maps to the matching move
  value, while bespoke paces written directly (mount boosts, follow sprint)
  stay fused to both clocks, so external CurrentSpeed writers keep working
  untouched.

- Movement budget: one step consumes a full step of movement-clock budget,
  accumulative with RunUO's snap-to-now clamp, so long-run pacing averages
  CurrentMoveSpeed exactly and a stall banks at most one step of catch-up.

- AITimer: dual-deadline scheduling. Decisions run at the think cadence
  exactly as before; while a pursuit or investigation is live, the timer also
  wakes when the movement budget elapses and advances the step without
  running decisions. Steps no longer snap to the think grid, so any step
  delay paces smoothly on the 8ms timer wheel - no ping-pong stutter from
  incommensurate values. A blocked creature schedules no move wakes and
  stays think-paced.

- Move intent: ApproachTarget/MoveToPoint record their durable goal each
  en-route tick; arrival, failure, give-up, action changes, or missed
  renewals clear it.

- Badly-hurt slowdown now inflates the step delay only (RunUO parity) and is
  computed from the base each step. Previously it wrote CurrentSpeed back
  onto itself, compounding unboundedly while hurt and slowing decisions too.

No behavior changes by default: with no bucket or per-instance move values,
both clocks carry identical values and creatures pace as before.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 09:13:28 -07:00
..
claude-skills feat: independent think/move clocks for creature AI 2026-08-23 09:13:28 -07:00
runuo-migration-docs docs: update serialization docs and skills for generator v4 (#2588) 2026-08-22 18:29:27 -07:00
code-standards.md feat: Add zero-alloc interpolation handler to ValueStringBuilder, replace all StringBuilder usage (#2387) 2026-03-22 14:23:44 -07:00
commands-targeting.md chore: Adds AI instructions and SKILLs for ModernUO codebase (#2347) 2026-03-01 11:42:19 -08:00
configuration.md fix: Fixes Argon2 verify correctness and the password upgrade lockout (#2562) 2026-08-08 00:24:59 -07:00
content-patterns.md feat: independent think/move clocks for creature AI 2026-08-23 09:13:28 -07:00
debugging-event-loop.md fix: stop the idle-sleep backoff tripping on healthy hosts (#2572) 2026-08-13 19:58:03 -07:00
era-expansion.md chore: Adds AI instructions and SKILLs for ModernUO codebase (#2347) 2026-03-01 11:42:19 -08:00
event-scheduler.md chore: Adds AI instructions and SKILLs for ModernUO codebase (#2347) 2026-03-01 11:42:19 -08:00
events.md chore: Adds AI instructions and SKILLs for ModernUO codebase (#2347) 2026-03-01 11:42:19 -08:00
gump-system.md docs(messages): document interpolation anti-patterns and :L format spec (#2441) 2026-05-03 18:23:50 -07:00
ip-bans-and-allowlists.md feat: make the blocklist and manual allowlist opt-in; cut the ban subsystem's on-loop cost (#2577) 2026-08-13 23:22:35 -07:00
networking-packets.md feat: make the blocklist and manual allowlist opt-in; cut the ban subsystem's on-loop cost (#2577) 2026-08-13 23:22:35 -07:00
pathfinding.md fix(pathfinding): stop opening every .swb twice at boot (#2548) 2026-07-25 13:07:20 -07:00
platform-prerequisites.md fix: Require only runtime packages on Linux, and check ICU and tzdata the way the runtime does (#2561) 2026-08-07 15:03:08 -07:00
property-lists.md fix(opl): refuse property list invalidation raised from inside GetProperties (#2555) 2026-07-28 21:29:03 -07:00
regions.md chore: Adds AI instructions and SKILLs for ModernUO codebase (#2347) 2026-03-01 11:42:19 -08:00
serialization.md docs: update serialization docs and skills for generator v4 (#2588) 2026-08-22 18:29:27 -07:00
server-lifecycle.md refactor(server): unify first-boot prompts into the ConfigurePrompts phase (#2477) 2026-06-08 05:18:46 -07:00
server-requirements.md fix: stop the idle-sleep backoff tripping on healthy hosts (#2572) 2026-08-13 19:58:03 -07:00
string-handling.md docs(messages): document interpolation anti-patterns and :L format spec (#2441) 2026-05-03 18:23:50 -07:00
t2a-crafting.md feat: Pre-Publish 14 Crafting (supersedes #2181, #2381) (#2476) 2026-06-07 20:27:22 -07:00
threading-model.md perf(login): run password hashing on a parked worker thread (#2566) 2026-08-09 00:13:34 -07:00
tick-counts.md perf: Sleep the event loop when idle. Fixes networking micro-stalls. Adds event loop instrumentation. (#2559) 2026-08-09 13:24:59 -07:00
timers.md docs: update serialization docs and skills for generator v4 (#2588) 2026-08-22 18:29:27 -07:00