tarinai/js/ground_types.js
2026-07-05 18:01:36 +09:00

83 lines
4.6 KiB
JavaScript

"use strict";
const GROUND_TYPE_ORDER = window.TarinaiDomainIds.GROUND_IDS;
const GROUND_TYPES = Object.freeze({
// \u30c7\u30d5\u30a9\u30eb\u30c8\u5730\u9762ID\u3002\u8868\u793a\u540d\u306f\u300c\u5730\u9762\u300d\u3002
soil: Object.freeze({ id: "soil", label: "砂", description: "普通の砂地。", stressMultiplier: 1.0, grassMultiplier: 1.0, grassGrowthMultiplier: 1.0 }),
dirt: Object.freeze({ id: "dirt", label: "\u571f", description: "\u8349\u304c\u3088\u304f\u80b2\u3064\u5730\u9762\u3002", stressMultiplier: 1.0, grassMultiplier: 1.75, grassGrowthMultiplier: 2.45 }),
concrete: Object.freeze({ id: "concrete", label: "\u30b3\u30f3\u30af\u30ea\u30fc\u30c8", description: "\u8349\u304c\u751f\u3048\u306a\u3044", stressMultiplier: 1.0, grassMultiplier: 0.0, grassGrowthMultiplier: 0.0, grassLimit: 0 }),
blanket: Object.freeze({ id: "blanket", label: "\u3075\u308f\u3075\u308f\u6bdb\u5e03", description: "\u30b9\u30c8\u30ec\u30b9\u304c\u5897\u3048\u306b\u304f\u3044", stressMultiplier: 0.5, grassMultiplier: 1.0, grassGrowthMultiplier: 1.0 }),
foot_massage: Object.freeze({ id: "foot_massage", label: "\u8db3\u3064\u307c", description: "\u9752\u3044\u307e\u3060\u3089\u5730\u9762\u3002\u30b9\u30c8\u30ec\u30b9\u304c\u5897\u3048\u3084\u3059\u3044", stressMultiplier: 1.5, grassMultiplier: 1.0, grassGrowthMultiplier: 1.0 }),
ice: Object.freeze({ id: "ice", label: "\u6c37", description: "\u3064\u308b\u3064\u308b\u6ed1\u308b\u3002\u8349\u306f\u751f\u3048\u306b\u304f\u3044", stressMultiplier: 1.1, grassMultiplier: 0.15, grassGrowthMultiplier: 0.35 }),
laboratory: Object.freeze({ id: "laboratory", label: "\u5b9f\u9a13\u5ba4", description: "\u5e38\u306b\u6674\u308c\u3002\u8349\u306f\u751f\u3048\u305a\u3001\u305a\u3093\u3061\u306f\u3059\u3050\u6d88\u3048\u308b\u3002", stressMultiplier: 1.0, grassMultiplier: 0.0, grassGrowthMultiplier: 0.0, grassLimit: 0, fixedWeather: "sunny", zunchiStageMultiplier: 8.0, zunchiDecayMultiplier: 520.0 }),
});
function groundDefinition(id = "soil") {
return GROUND_TYPES[id] || GROUND_TYPES.soil;
}
function groundExists(id = "soil") {
return Boolean(GROUND_TYPES[id]);
}
function groundLabel(id = "soil") {
return groundDefinition(id).label || "\u5730\u9762";
}
function normalizedGroundStressMultiplier(id = "soil") {
const mult = Number(groundDefinition(id).stressMultiplier);
return Number.isFinite(mult) && mult > 0 ? mult : 1;
}
function normalizedGroundGrassMultiplier(id = "soil") {
const mult = Number(groundDefinition(id).grassMultiplier);
return Number.isFinite(mult) && mult >= 0 ? mult : 1;
}
function grassGrowthMulForGround(id = "soil") {
const def = groundDefinition(id);
const mult = Number(def.grassGrowthMultiplier ?? def.grassMultiplier);
return Number.isFinite(mult) && mult >= 0 ? mult : 1;
}
function groundLimitForField(fieldType = "garden") {
const config = typeof CONFIG !== "undefined" ? CONFIG : null;
const byField = config?.grassLimitsByField || { cage: 19, garden: 99, park: 299 };
const fieldLimit = byField[fieldType || "garden"];
return Number(Number.isFinite(fieldLimit) ? fieldLimit : (config?.grassLimit ?? 99));
}
function groundGrassLimit(id = "soil", fieldType = "garden") {
const def = groundDefinition(id);
if (Number.isFinite(def.grassLimit)) return Math.max(0, Math.floor(Number(def.grassLimit)));
const mult = normalizedGroundGrassMultiplier(def.id);
if (mult <= 0) return 0;
const limit = groundLimitForField(fieldType) * mult;
return Number.isFinite(limit) && limit >= 0 ? Math.floor(limit) : Infinity;
}
function nextGroundTypeId(current = "soil") {
const index = GROUND_TYPE_ORDER.indexOf(current || "soil");
return GROUND_TYPE_ORDER[(index + 1 + GROUND_TYPE_ORDER.length) % GROUND_TYPE_ORDER.length] || "soil";
}
function groundTooltipText(id = "soil") {
const def = groundDefinition(id);
const desc = def.description || "\u30af\u30ea\u30c3\u30af\u3067\u5207\u308a\u66ff\u3048";
return `${def.label || "\u5730\u9762"}\n${desc}`;
}
window.TarinaiGround = Object.freeze({
definition: groundDefinition,
exists: groundExists,
label: groundLabel,
stressMultiplier: normalizedGroundStressMultiplier,
grassMultiplier: normalizedGroundGrassMultiplier,
grassGrowthMultiplier: grassGrowthMulForGround,
grassLimit: groundGrassLimit,
nextId: nextGroundTypeId,
tooltipText: groundTooltipText,
fixedWeather(id = "soil") { return groundDefinition(id).fixedWeather || ""; },
zunchiStageMultiplier(id = "soil") { const v = Number(groundDefinition(id).zunchiStageMultiplier); return Number.isFinite(v) && v > 0 ? v : 1; },
zunchiDecayMultiplier(id = "soil") { const v = Number(groundDefinition(id).zunchiDecayMultiplier); return Number.isFinite(v) && v > 0 ? v : 1; },
});