"use strict"; // Layer: entity-runtime/tarinai/update-step // Owns low-frequency AI cadence, need resolution, item/social interaction scans, // and facing refresh. Extracted from Tarinai.prototype.update. (function (global) { function update(t, dt, context = {}) { if (!t || t.dead) return { done: true }; if (t.playerHeld || t._heldByPlayer) { t.aiTimer = 0; t.target = null; t.targetKey = ""; t.updateFacing?.(); return { done: false, held: true }; } t.behaviorLockTimer = Math.max(0, (t.behaviorLockTimer || 0) - dt); t.aiTimer += dt; const urgentFoodNeed = Number(t.needRaw?.food ?? t.needs?.food ?? 0) || 0; const urgentAi = t.fightTimer > 0.04 || t.intimidateTimer > 0.04 || t.intimidatedTimer > 0.04 || t.birthRitualTimer > 0.04 || t.defeatedTimer > 0.04 || t.eatTimer > 0.02 || t.hurtTimer > 0.02 || t.hunger >= 96 || urgentFoodNeed >= 84; const aiJitter = stableUnit(t.familyKey || t.id, "ai-interval") * 0.35; context.urgentAi = urgentAi; const aiInterval = urgentAi ? 0.35 : (1.0 + aiJitter); if (t.aiTimer >= aiInterval && t.world.spendScheduledWork?.("ai", urgentAi) !== false) { const elapsedAiDt = Math.max(0.016, Math.min(t.aiTimer, urgentAi ? 0.75 : 1.50)); const scanDt = Math.min(elapsedAiDt, 0.75); t.aiTimer = 0; // Needs intentionally advance by a fixed coarse step per AI update. // Exact elapsed-time integration is unnecessary for this observation game // and can over-amplify safety/fear transitions when updates are sparse. const needStepDt = urgentAi ? 0.50 : 1.00; t.resolveNeeds(needStepDt); const sleepingNow = t.state === "sleep"; if (!sleepingNow) { t.reactToFreshZunchi(scanDt); t.updateFacing(); TarinaiItemInteractionSystem.updateOne(t, scanDt); t.interactWithOthers(scanDt); } else { t.updateFacing(); } } else { t.updateFacing(); } return { done: false }; } global.TarinaiAiUpdateStep = Object.freeze({ update }); })(typeof window !== "undefined" ? window : globalThis);