This commit is contained in:
33333-33333 2026-06-28 23:07:40 +09:00
commit 0e432c62ae
87 changed files with 4282 additions and 3066 deletions

View file

@ -29,6 +29,23 @@
return /idle|wander|approach|follow|seek|panic|fight|birth_ritual|sunbath|zunchi_sick|fight_sick|cursor_/i.test(id);
}
function activeMechanicalObstacleNear(tarinai, worldRef = null) {
if (!tarinai || !worldRef || worldRef.isTarinaiHiddenInNestBox?.(tarinai)) return false;
const radius = Math.max(150, (Number(tarinai.radius) || 22) + 190);
const source = worldRef.nearbyItems?.(tarinai.x || 0, tarinai.y || 0, radius, true) || worldRef.items || [];
for (const it of source) {
if (!it || it.dead || !global.TarinaiMechanicalSystem?.isMechanicalType?.(it.type)) continue;
const reach = global.TarinaiMechanicalSystem?.reach?.(it) || Math.max(64, it.r || 64);
if (Math.hypot((tarinai.x || 0) - (it.x || 0), (tarinai.y || 0) - (it.y || 0)) > reach + radius) continue;
if (it.type === "rotator" || it.type === "reciprocator") return true;
if (global.TarinaiMechanicalSystem?.passiveItemAwake?.(it)) return true;
const body = global.TarinaiPhysicsBodySystem?.ensureBody?.(it, worldRef, { syncFromLegacy: false });
const vel = body?.velocity || {};
if (Math.hypot(Number(vel.x || it.vx || 0) || 0, Number(vel.y || it.vy || 0) || 0) + Math.abs(Number(vel.angular || it.spin || 0) || 0) * 64 > 0.8) return true;
}
return false;
}
function hasPassivePhysicsNeed(tarinai, worldRef = null, isVisible = false) {
if (!tarinai || tarinai.dead) return false;
const vx = Number.isFinite(tarinai.vx) ? tarinai.vx : 0;
@ -36,8 +53,12 @@
const ivx = Number.isFinite(tarinai.impulseVx) ? tarinai.impulseVx : 0;
const ivy = Number.isFinite(tarinai.impulseVy) ? tarinai.impulseVy : 0;
if (Math.hypot(vx + ivx, vy + ivy) > 0.35) return true;
const sleeping = tarinai.state === "sleep" || tarinai.sleeping;
const id = behaviorId(tarinai);
const state = String(tarinai.state || id || "");
const sleeping = state === "sleep" || tarinai.sleeping;
const lockedPassive = sleeping || state === "eat" || /eat|sunbath|birth_ritual|breed|repro/i.test(id) || /sunbath|birth_ritual|breed|repro/.test(state) || (tarinai.birthRitualTimer || 0) > 0.04 || (tarinai.eatTimer || 0) > 0.04 || (tarinai.sunbathTimer || 0) > 0.04;
if (sleeping && isVisible && !worldRef?.isTarinaiHiddenInNestBox?.(tarinai)) return true;
if (lockedPassive && isVisible && activeMechanicalObstacleNear(tarinai, worldRef)) return true;
if (sleeping && tarinai.target && !tarinai.target.dead && tarinai.isSleepFurniture?.(tarinai.target) && tarinai.target.type !== "nest_box") return true;
return false;
}
@ -57,6 +78,9 @@
const isNear = isVisible || Boolean(helpers().pointInRect?.(tarinai.x || 0, tarinai.y || 0, farRect));
const motionNeed = hasMotionNeed(tarinai);
const nestEntryActive = Boolean(tarinai.insideNestBoxId && (typeof tarinai.nestBoxEntryActive === "function" ? tarinai.nestBoxEntryActive() : ((worldRef.time || 0) < (tarinai._nestBoxEntrySmoothUntil || -Infinity) || ((tarinai.nestFade || 0) > 0.01 && (tarinai.nestFade || 0) < 0.985))));
if (nestEntryActive) return { interval: 0, lane: "nest-entry", smoothMotion: false, visible: true, urgent: true };
const hardRealtimeUrgent =
(tarinai.hurtTimer || 0) > 0.04 ||
(tarinai.pokeFlashTimer || 0) > 0.03 ||
@ -113,7 +137,7 @@
&& interval <= 0.75
&& !worldRef.isTarinaiHiddenInNestBox?.(tarinai)
&& ((smoothAllowed && motionNeed) || sleepPhysical || eatPhysical));
return { interval, lane, smoothMotion, visible: isVisible, urgent: false, sleepPhysical, passivePhysicsNeed };
return { interval, lane, smoothMotion, visible: isVisible, urgent: false, sleepPhysical, eatPhysical, passivePhysicsNeed };
}
function updateInterval(worldRef, tarinai, visibleRect) {