38 lines
1.4 KiB
JavaScript
38 lines
1.4 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
// Layer: entity-runtime/items/growth-system
|
||
|
|
// Owns passive grass normalization and zunchi lifecycle stage ticking. The
|
||
|
|
// lifecycle step is kept as a pipeline adapter only.
|
||
|
|
(function (global) {
|
||
|
|
function updateGrass(item) {
|
||
|
|
if (!item || item.dead || item.type !== "grass") return false;
|
||
|
|
// Grass is intentionally not simulated per item. World.update randomly
|
||
|
|
// advances one grass by one discrete stage every few seconds.
|
||
|
|
normalizeGrassStage(item);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function updateZunchiLifecycle(item, dt, worldRef) {
|
||
|
|
if (!item || item.dead || item.type !== "zunchi") return false;
|
||
|
|
item.lifecycleTimer += dt;
|
||
|
|
const interval = item.lifecycleInterval || (0.95 + stableUnit(item.id, "zunchi-life") * 0.45);
|
||
|
|
if (item.lifecycleTimer < interval) return false;
|
||
|
|
const lifecycleDt = Math.min(item.lifecycleTimer, 2.4);
|
||
|
|
item.lifecycleTimer = 0;
|
||
|
|
global.TarinaiItemDynamicZunchiSystem?.updateLifecycle(item, lifecycleDt, worldRef);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function update(item, dt, worldRef) {
|
||
|
|
if (!item || item.dead) return { done: true };
|
||
|
|
if (item.type === "grass") updateGrass(item);
|
||
|
|
else if (item.type === "zunchi") updateZunchiLifecycle(item, dt, worldRef);
|
||
|
|
return { done: false };
|
||
|
|
}
|
||
|
|
|
||
|
|
global.TarinaiItemGrowthSystem = Object.freeze({
|
||
|
|
updateGrass,
|
||
|
|
updateZunchiLifecycle,
|
||
|
|
update,
|
||
|
|
});
|
||
|
|
})(typeof window !== "undefined" ? window : globalThis);
|