From 46258a83ebf32b7e585da31a1a6b19dda7d6252a Mon Sep 17 00:00:00 2001 From: 33333-33333 Date: Sat, 20 Jun 2026 02:07:01 +0900 Subject: [PATCH 1/5] dee --- README.md | 246 +++++---------------- css/styles.css | 129 +++++++++++ docs/AI_CONTEXT.md | 21 ++ docs/code_map.md | 46 ++-- index.html | 63 ++---- js/data.js | 2 - js/health.js | 148 +++++++++++++ js/items.js | 77 ++++++- js/render.js | 28 +++ js/sim_core.js | 4 + js/tarinai.js | 539 +++++++++++++++++++++++++++++++++------------ js/text_catalog.js | 71 ++++++ js/ui.js | 127 ++++++++++- js/ui_charts.js | 71 +++--- js/world.js | 177 ++++++++++++++- 15 files changed, 1303 insertions(+), 446 deletions(-) create mode 100644 docs/AI_CONTEXT.md create mode 100644 js/health.js create mode 100644 js/text_catalog.js diff --git a/README.md b/README.md index 1cb4af3..e64b3d1 100644 --- a/README.md +++ b/README.md @@ -1,210 +1,74 @@ -# たりないコロニー観察所 +# Tarinai Colony Observation Game -ブラウザで動く、観察主体の小さなコロニーゲームです。 -外部ライブラリやサーバーは不要です。 +Single-page, dependency-free browser simulation. Open `index.html`; no build step, package manager, server API, transpiler, or module loader is required. Runtime is plain HTML/CSS/JS loaded by ordered ` - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/js/data.js b/js/data.js index dc3de08..b681204 100644 --- a/js/data.js +++ b/js/data.js @@ -66,7 +66,6 @@ const ALPHA_BOUNDS = { }; const NEEDS = ["\u98df\u3079\u7269", "\u4ef2\u9593", "\u7720\u308a", "\u52c7\u6c17", "\u6c34", "\u9759\u3051\u3055", "\u3042\u305f\u305f\u304b\u3055", "\u610f\u5473", "\u7a7a\u9593", "\u81ea\u4fe1"]; -const NAMES = ["ta", "ri", "na", "i", "po", "yo", "nu", "ma", "fu", "he", "shi", "ro", "mu", "a"]; const CONFIG = { initialPopulation: 18, @@ -108,4 +107,3 @@ const LIGHTING_TUNING = { bloomWashAlpha: 0.040, }; -window.TarinaiData = { SPRITES, DECOR_ASSETS, ALPHA_BOUNDS, NEEDS, NAMES, CONFIG, FIELD_TYPES, LIGHTING_TUNING }; diff --git a/js/health.js b/js/health.js new file mode 100644 index 0000000..8b14f4d --- /dev/null +++ b/js/health.js @@ -0,0 +1,148 @@ +"use strict"; + +const HEALTH = (() => { + const MAJOR_DAMAGE_WINDOW = 10; + const WEAKENED_SUFFIX = "\u3067\u8870\u5f31"; + const CAUSES = Object.freeze({ + fight: "\u55a7\u5629", + hunger: "\u98e2\u9913", + stress: "\u30b9\u30c8\u30ec\u30b9\u904e\u591a", + poke: "\u3064\u3064\u304b\u308c\u3059\u304e\u305f", + firecracker: "\u7206\u7af9", + accident: "\u4e8b\u6545", + lifespan: "\u5bff\u547d", + sleepDisease: "\u306d\u3080\u308a\u75c5", + explosionDisease: "\u7206\u767a\u75c5", + fightDisease: "\u55a7\u5629\u50b7\u75c5", + zunchiDisease: "\u305a\u3093\u3061\u75c5", + }); + const DISEASE_RE = /([^\u3001\u3002\s]+\u75c5)/; + + function causeLabel(reason = "") { + const text = String(reason || ""); + if (!text) return ""; + if (text.includes(WEAKENED_SUFFIX)) return text.replace(/\u3067\u8870\u5f31.*$/, ""); + if (/\u55a7\u5629|fight|headbutt/.test(text)) return CAUSES.fight; + if (/\u7206\u7af9|firecracker|explosion/.test(text)) return CAUSES.firecracker; + if (/\u3064\u3064\u304b\u308c|\u3064\u3064\u304d|poke/.test(text)) return CAUSES.poke; + if (/\u306d\u3080\u308a\u75c5|sleep.*disease/.test(text)) return CAUSES.sleepDisease; + if (/\u7206\u767a\u75c5|explosion.*disease/.test(text)) return CAUSES.explosionDisease; + if (/\u3051\u3093\u304b\u75c5|\u55a7\u5629\u50b7\u75c5|fight.*disease/.test(text)) return CAUSES.fightDisease; + if (/\u305a\u3093\u3061\u75c5|zunchi_sick|zunchi.*\u75c5/.test(text)) return CAUSES.zunchiDisease; + if (/\u75c5/.test(text)) { + const disease = text.match(DISEASE_RE); + return disease ? disease[1] : CAUSES.zunchiDisease; + } + if (/\u98e2|\u7a7a\u8179|\u98df\u3079\u7269|hunger/.test(text)) return CAUSES.hunger; + if (/\u30b9\u30c8\u30ec\u30b9|stress/.test(text)) return CAUSES.stress; + if (/\u30dc\u30fc\u30eb|\u843d\u3061|\u843d\u4e0b|\u77f3|\u9053\u5177|\u4e8b\u6545|\u5f53\u305f|\u885d\u7a81|ball|drop|stone|accident/.test(text)) return CAUSES.accident; + if (/\u5bff\u547d/.test(text)) return CAUSES.lifespan; + return ""; + } + + function recentDamageCause(t, maxAge = MAJOR_DAMAGE_WINDOW) { + const now = t.world?.time || 0; + if (t.lastDamageCause && now - (t.lastDamageAt || -999) <= maxAge) return t.lastDamageCause; + return ""; + } + + function rememberDamage(t, amount, reason = "") { + const cause = causeLabel(reason) || CAUSES.accident; + const now = t.world?.time || 0; + t.lastDamageCause = cause; + t.lastDamageAmount = Math.max(0, amount || 0); + t.lastDamageAt = now; + if (t.lastDamageAmount >= 10 || t.lastDamageAmount >= Math.max(6, (t.energy || 0) * 0.36)) { + t.lastMajorDamageCause = cause; + t.lastMajorDamageAmount = t.lastDamageAmount; + t.lastMajorDamageAt = now; + } + return cause; + } + + function weakenedDeathReasonFor(cause = "") { + const text = String(cause || "").trim(); + if (!text) return ""; + return text.includes(WEAKENED_SUFFIX) ? text : `${text}${WEAKENED_SUFFIX}`; + } + + function hasRecentMajorDamage(t) { + const now = t.world?.time || 0; + return Boolean(t.lastMajorDamageCause && now - (t.lastMajorDamageAt || -999) <= MAJOR_DAMAGE_WINDOW); + } + + function isFightingContext(t, recent) { + return Boolean(t.fightTimer > 0.04 || t.defeatedTimer > 0.04 || t.defeatedById || t.fightWinnerId || recent === CAUSES.fight); + } + + function dominantDeathCause(t, reason = "", opts = {}) { + const text = String(reason || "").trim(); + const direct = causeLabel(text); + const recentMajor = hasRecentMajorDamage(t); + const recent = recentDamageCause(t, 20); + const fighting = isFightingContext(t, recent); + if (recentMajor && (!direct || direct === t.lastMajorDamageCause || opts.fromDamage || t.energy <= 22 || t.mood <= 20 || t.stress >= 118)) { + return weakenedDeathReasonFor(t.lastMajorDamageCause); + } + if (direct && direct !== CAUSES.stress) return direct; + if (t.zunchiDisease && ((t.zunchiDiseaseSeverity || 0) >= 0.30 || /\u75c5|zunchi/.test(text))) return CAUSES.zunchiDisease; + if (t.hunger >= 108 || (t.hunger >= 94 && t.energy <= 26) || /\u98e2|\u7a7a\u8179|hunger/.test(text)) return CAUSES.hunger; + if (fighting && (t.energy <= 44 || t.stress >= 112 || t.mood <= 22 || opts.fromDamage)) return CAUSES.fight; + if (recent && recent !== CAUSES.stress && (t.energy <= 34 || t.mood <= 20 || t.stress >= 118 || opts.fromDamage)) return recent; + if (text.includes(CAUSES.lifespan)) return CAUSES.lifespan; + if (direct) return direct; + if (t.stress >= 118 || /\u30b9\u30c8\u30ec\u30b9|stress|\u6c17\u5206/.test(text)) return CAUSES.stress; + if (t.energy <= 0.5) return CAUSES.accident; + return ""; + } + + function normalizeDeathReason(t, reason = "", opts = {}) { + const text = String(reason || "").trim(); + if (text.includes(WEAKENED_SUFFIX)) return text; + const cause = dominantDeathCause(t, text, opts) || CAUSES.accident; + if (cause.includes(WEAKENED_SUFFIX)) return cause; + const canWeaken = cause && !cause.endsWith("\u75c5") && cause !== CAUSES.hunger && cause !== CAUSES.stress && cause !== CAUSES.lifespan; + if (canWeaken && (opts.weakened || (hasRecentMajorDamage(t) && cause === t.lastMajorDamageCause))) return weakenedDeathReasonFor(cause); + return cause; + } + + function applyDamage(t, amount, reason = "") { + const before = t.energy; + const loss = Math.max(0, amount || 0); + t.energy = clamp(t.energy - loss, 0, 100); + const actualLoss = Math.max(0, before - t.energy); + let cause = ""; + if (actualLoss > 0.01) { + cause = rememberDamage(t, actualLoss, reason); + if (cause === CAUSES.fight || /\u55a7\u5629|fight/.test(String(reason || ""))) t.recordBleedExposure(); + if (t.sleepDisease) t.recoverSleepDisease("\u30c0\u30e1\u30fc\u30b8\u3067\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f"); + t.showHpBar(); + } + if (t.energy <= 0.5) { + const majorNow = actualLoss >= Math.max(10, before * 0.42); + t.die(normalizeDeathReason(t, reason || cause, { fromDamage: true, weakened: majorNow })); + } + } + + function briefDeathReason(t, reason = t.deathReason) { + const text = String(reason || ""); + if (!text) return ""; + const normalized = normalizeDeathReason(t, text); + return normalized.length > 12 ? `${normalized.slice(0, 12)}\u2026` : normalized; + } + + return Object.freeze({ + MAJOR_DAMAGE_WINDOW, + CAUSES, + causeLabel, + recentDamageCause, + rememberDamage, + weakenedDeathReasonFor, + dominantDeathCause, + normalizeDeathReason, + applyDamage, + briefDeathReason, + }); +})(); + +window.HEALTH = HEALTH; diff --git a/js/items.js b/js/items.js index c4bd39d..38ede23 100644 --- a/js/items.js +++ b/js/items.js @@ -7,10 +7,10 @@ class Item { this.x = x; this.y = y; this.r = { - food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, water: 12, grass: 17, stone: 20, bed: 37, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 + food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, sleep_drug: 13, water: 12, water_bowl: 20, grass: 17, stone: 20, bed: 37, nest_box: 42, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 }[type] || 12; this.amount = { - food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, water: 64, grass: 120, stone: 999, bed: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 + food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, sleep_drug: 58, water: 64, water_bowl: 999, grass: 120, stone: 999, bed: 999, nest_box: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 }[type] || 80; this.age = 0; this.seed = Math.random() * 1000; @@ -68,7 +68,7 @@ class Item { } } if (this.type === "water") this.amount -= dt * 0.9; - if (["sweet", "love_mochi", "fight_mochi"].includes(this.type)) this.amount -= dt * 0.12; + if (["sweet", "love_mochi", "fight_mochi", "sleep_drug"].includes(this.type)) this.amount -= dt * 0.12; if (this.type === "trace") this.amount -= dt * 1.35; if (this.type === "splat") this.amount -= dt * 1.05; if (this.type === "firecracker") { @@ -79,6 +79,7 @@ class Item { } } if (this.type === "ball") this.updateBall(dt, worldRef); + if (this.type === "zunchi") this.updateZunchiMotion(dt, worldRef); if (this.type === "grass") { this.lifecycleTimer += dt; const factor = worldRef.grassUpdateFactor ? worldRef.grassUpdateFactor() : 1; @@ -98,6 +99,26 @@ class Item { } } } + + updateZunchiMotion(dt, worldRef) { + const speed = Math.hypot(this.vx || 0, this.vy || 0); + if (speed < 0.08) { this.vx = 0; this.vy = 0; return; } + this.prevX = this.x; + this.prevY = this.y; + this.x += (this.vx || 0) * dt; + this.y += (this.vy || 0) * dt; + const p = Math.max(28, CONFIG.worldPadding || 30); + if (this.x < p) { this.x = p; this.vx = Math.abs(this.vx || 0) * 0.34; } + if (this.x > worldRef.w - p) { this.x = worldRef.w - p; this.vx = -Math.abs(this.vx || 0) * 0.34; } + if (this.y < p) { this.y = p; this.vy = Math.abs(this.vy || 0) * 0.34; } + if (this.y > worldRef.h - p) { this.y = worldRef.h - p; this.vy = -Math.abs(this.vy || 0) * 0.34; } + const slow = Math.pow(0.68, dt * 2.4); + this.vx *= slow; + this.vy *= slow; + this.spin = (this.spin || 0) + speed * dt / Math.max(8, this.r || 14); + worldRef.drawListDirty = true; + } + updateBall(dt, worldRef) { this.prevX = this.x; this.prevY = this.y; @@ -379,10 +400,10 @@ class Item { it.x = o.x; it.y = o.y; it.r = { - food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, water: 12, grass: 17, stone: 20, bed: 37, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 + food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, sleep_drug: 13, water: 12, water_bowl: 20, grass: 17, stone: 20, bed: 37, nest_box: 42, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 }[type] || 12; it.amount = o.amount ?? ({ - food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, water: 64, grass: 120, stone: 999, bed: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 + food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, sleep_drug: 58, water: 64, water_bowl: 999, grass: 120, stone: 999, bed: 999, nest_box: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 }[type] || 80); it.age = o.age || 0; it.seed = o.seed || Math.random() * 1000; @@ -561,6 +582,36 @@ class Item { ctx.fill(); } } + } else if (this.type === "sleep_drug") { + ctx.fillStyle = "#f5f0ff"; + ctx.strokeStyle = "rgba(112, 83, 170, 0.55)"; + ctx.lineWidth = 2; + ctx.rotate(-0.45); + roundedRect(ctx, -this.r * 0.95, -this.r * 0.45, this.r * 1.90, this.r * 0.90, this.r * 0.45); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = "rgba(152, 116, 218, 0.58)"; + ctx.fillRect(-1, -this.r * 0.42, 2, this.r * 0.84); + ctx.rotate(0.45); + ctx.fillStyle = "rgba(74,58,104,0.72)"; + ctx.font = `${Math.round((this.r || 13) * 0.78)}px sans-serif`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText("Z", 0, this.r * 1.18); + } else if (this.type === "water_bowl") { + ctx.fillStyle = "rgba(171, 120, 76, 0.72)"; + ctx.strokeStyle = "rgba(94, 69, 48, 0.55)"; + ctx.lineWidth = 2.2; + ctx.beginPath(); + ctx.ellipse(0, 2, this.r * 1.35, this.r * 0.78, 0, 0, Math.PI * 2); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = "rgba(86, 157, 224, 0.58)"; + ctx.strokeStyle = "rgba(62, 113, 178, 0.36)"; + ctx.lineWidth = 1.6; + ctx.beginPath(); + ctx.ellipse(0, -1, this.r * 1.02, this.r * 0.50, 0, 0, Math.PI * 2); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = "rgba(255,255,255,0.54)"; + ctx.beginPath(); ctx.arc(-this.r * 0.32, -this.r * 0.18, 2.8, 0, Math.PI * 2); ctx.fill(); } else if (this.type === "water") { ctx.fillStyle = "rgba(86, 157, 224, 0.50)"; ctx.strokeStyle = "rgba(62, 113, 178, 0.42)"; @@ -632,6 +683,22 @@ class Item { ctx.lineTo(x + Math.cos(a) * len * 0.5, y + Math.sin(a) * len * 0.5); ctx.stroke(); } + } else if (this.type === "nest_box") { + ctx.fillStyle = styleNight ? "#7d6040" : (styleWarm ? "#b98246" : "#9a6b3d"); + ctx.strokeStyle = styleNight ? "#4a3a2d" : "#5d4028"; + ctx.lineWidth = 2.4; + roundedRect(ctx, -this.r * 1.28, -this.r * 0.80, this.r * 2.56, this.r * 1.52, 9); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = styleNight ? "#3b2f27" : "#65432a"; + ctx.beginPath(); + ctx.arc(0, -this.r * 0.02, this.r * 0.42, 0, Math.PI * 2); + ctx.fill(); + ctx.fillStyle = "rgba(255,230,152,0.38)"; + for (let i = 0; i < 6; i++) { + ctx.beginPath(); + ctx.ellipse(randSeed(this.seed + i, -this.r * 0.84, this.r * 0.84), randSeed(this.seed + 20 + i, this.r * 0.32, this.r * 0.68), this.r * 0.26, this.r * 0.045, randSeed(this.seed + 40 + i, -0.7, 0.7), 0, Math.PI * 2); + ctx.fill(); + } } else if (this.type === "ball") { const speed = Math.hypot(this.vx || 0, this.vy || 0); const moving = clamp(speed / 260, 0, 1); diff --git a/js/render.js b/js/render.js index 2b624db..055d424 100644 --- a/js/render.js +++ b/js/render.js @@ -633,6 +633,7 @@ function render() { } }; drawAtScreenPosition(world.selected, () => drawSelectedCard(ctx, world, lighting)); + drawNestBoxTooltip(ctx, world); // Time HUD ctx.save(); @@ -675,6 +676,33 @@ function render() { } } +function drawNestBoxTooltip(ctx, world) { + const info = world.pointerNestBoxInfo?.(); + if (!info) return; + const box = info.box; + const names = info.occupants.length ? info.occupants.map(t => t.name).join("\u3001") : "\u4e2d\u306b\u306f\u8ab0\u3082\u3044\u306a\u3044"; + const title = "\u5de3\u7bb1"; + const text = `${title}: ${names}`; + ctx.save(); + ctx.font = "12px Yomogi, sans-serif"; + const w = Math.min(240, Math.max(92, ctx.measureText(text).width + 22)); + const h = 38; + const pos = world.worldToScreen ? world.worldToScreen(box.x, box.y) : { x: box.x, y: box.y }; + const x = clamp(pos.x - w / 2, 8, ctx.canvas.width - w - 8); + const y = clamp(pos.y - box.r * 1.8 - h, 8, ctx.canvas.height - h - 8); + ctx.fillStyle = "rgba(46,38,30,0.62)"; + ctx.strokeStyle = "rgba(255,248,220,0.72)"; + ctx.lineWidth = 1.2; + roundedRect(ctx, x, y, w, h, 10); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = "#fff8e6"; + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillText(text, x + 11, y + h / 2); + ctx.restore(); +} + function drawSelectedCard(ctx, world, lighting) { const t = world.selected; if (!t || t.dead || !world.tarinai.includes(t)) return; diff --git a/js/sim_core.js b/js/sim_core.js index 55fa064..89706e0 100644 --- a/js/sim_core.js +++ b/js/sim_core.js @@ -138,6 +138,10 @@ class Effect { ctx.beginPath(); ctx.ellipse(0, 0, this.size * 1.25, this.size * 0.72, this.seed, 0, Math.PI * 2); ctx.fill(); + } else if (this.type === "heart") { + const s = this.size * (0.80 + (1 - alpha) * 0.36); + ctx.rotate(Math.sin(this.seed + (1 - alpha) * 3.2) * 0.18); + drawHeartShape(ctx, 0, 0, s, { fill: this.color || "rgba(240,91,135,0.92)", stroke: "rgba(255,252,246,0.88)", alpha: 1 }); } else if (this.type === "ring") { ctx.strokeStyle = this.color; ctx.lineWidth = 2; diff --git a/js/tarinai.js b/js/tarinai.js index 5a2edb7..8feeb96 100644 --- a/js/tarinai.js +++ b/js/tarinai.js @@ -1,5 +1,19 @@ "use strict"; +function tarinaiRoundRectPath(ctx, x, y, w, h, r) { + const rr = Math.max(0, Math.min(r || 0, Math.abs(w) / 2, Math.abs(h) / 2)); + ctx.beginPath(); + ctx.moveTo(x + rr, y); + ctx.lineTo(x + w - rr, y); + ctx.quadraticCurveTo(x + w, y, x + w, y + rr); + ctx.lineTo(x + w, y + h - rr); + ctx.quadraticCurveTo(x + w, y + h, x + w - rr, y + h); + ctx.lineTo(x + rr, y + h); + ctx.quadraticCurveTo(x, y + h, x, y + h - rr); + ctx.lineTo(x, y + rr); + ctx.quadraticCurveTo(x, y, x + rr, y); +} + class Tarinai { constructor(world, opts = {}) { this.world = world; @@ -86,6 +100,14 @@ class Tarinai { this.formerName = opts.formerName || null; this.loveMochiTimer = opts.loveMochiTimer ?? 0; this.fightMochiTimer = opts.fightMochiTimer ?? 0; + this.sleepDisease = Boolean(opts.sleepDisease); + this.sleepDiseaseCooldown = opts.sleepDiseaseCooldown ?? 0; + this.explosionDisease = Boolean(opts.explosionDisease); + this.explosionDiseaseTimer = opts.explosionDiseaseTimer ?? (this.explosionDisease ? (CONFIG.dayLength || 120) * 0.5 : 0); + this.fightDisease = Boolean(opts.fightDisease); + this.fightDiseaseCooldown = opts.fightDiseaseCooldown ?? 0; + this.lastBleedAt = opts.lastBleedAt ?? -999; + this.favorite = Boolean(opts.favorite); if (this.isZunchiSlave) this.name = "\u305a\u3093\u3061\u3069\u308c\u3044"; this.tempComfort = opts.tempComfort ?? 0.62; this.tempTimer = opts.tempTimer ?? stableUnit(this.id, "temp-start") * 0.55; @@ -144,6 +166,7 @@ class Tarinai { birthRitualRole: this.birthRitualRole, birthRitualLeader: this.birthRitualLeader, pokeFlashTimer: this.pokeFlashTimer, zunchiStain: this.zunchiStain, zunchiStainSeed: this.zunchiStainSeed, totalFightLosses: this.totalFightLosses, isZunchiSlave: this.isZunchiSlave, formerName: this.formerName, loveMochiTimer: this.loveMochiTimer, fightMochiTimer: this.fightMochiTimer, + sleepDisease: this.sleepDisease, sleepDiseaseCooldown: this.sleepDiseaseCooldown, explosionDisease: this.explosionDisease, explosionDiseaseTimer: this.explosionDiseaseTimer, fightDisease: this.fightDisease, fightDiseaseCooldown: this.fightDiseaseCooldown, lastBleedAt: this.lastBleedAt, favorite: this.favorite, insideNestBoxId: this.insideNestBoxId || null, nestFade: this.nestFade || 0, sleepDiseaseAnchorX: this.sleepDiseaseAnchorX, sleepDiseaseAnchorY: this.sleepDiseaseAnchorY, records: this.records ? this.records.slice(0, 42) : [], zunchiDisease: this.zunchiDisease, zunchiDiseaseSeverity: this.zunchiDiseaseSeverity, zunchiDiseaseCooldown: this.zunchiDiseaseCooldown, tempComfort: this.tempComfort, tempTimer: this.tempTimer, parents: this.parents, parentNames: this.parentNames, children: this.children, birthTime: this.birthTime, @@ -200,6 +223,17 @@ class Tarinai { return sp ? sp.label : this.type; } + + addRecord(text, kind = "note") { + if (!text) return; + if (!Array.isArray(this.records)) this.records = []; + const entry = { time: this.world?.time || 0, text: String(text), kind: kind || "note" }; + const head = this.records[0]; + if (head && head.text === entry.text && Math.abs((head.time || 0) - entry.time) < 0.05) return; + this.records.unshift(entry); + if (this.records.length > 42) this.records.length = 42; + } + personalityProfile() { return PERSONALITIES[this.personality] || PERSONALITIES.calm; } @@ -303,100 +337,13 @@ class Tarinai { return gained; } - damageCauseLabel(reason = "") { - const text = String(reason || ""); - if (!text) return ""; - if (text.includes("\u3067\u8870\u5f31")) return text.replace(/\u3067\u8870\u5f31.*$/, ""); - if (/\u55a7\u5629|fight|headbutt/.test(text)) return "\u55a7\u5629"; - if (/\u7206\u7af9|firecracker|explosion/.test(text)) return "\u7206\u7af9"; - if (/\u3064\u3064\u304b\u308c|\u3064\u3064\u304d|poke/.test(text)) return "\u3064\u3064\u304b\u308c\u3059\u304e\u305f"; - if (/\u305a\u3093\u3061\u75c5|zunchi_sick|zunchi.*\u75c5/.test(text)) return "\u305a\u3093\u3061\u75c5"; - if (/\u75c5/.test(text)) { - const disease = text.match(/([^\u3001\u3002\s]+\u75c5)/); - return disease ? disease[1] : "\u305a\u3093\u3061\u75c5"; - } - if (/\u98e2|\u7a7a\u8179|\u98df\u3079\u7269|hunger/.test(text)) return "\u98e2\u9913"; - if (/\u30b9\u30c8\u30ec\u30b9|stress/.test(text)) return "\u30b9\u30c8\u30ec\u30b9\u904e\u591a"; - if (/\u30dc\u30fc\u30eb|\u843d\u3061|\u843d\u4e0b|\u77f3|\u9053\u5177|\u4e8b\u6545|\u5f53\u305f|\u885d\u7a81|ball|drop|stone|accident/.test(text)) return "\u4e8b\u6545"; - if (/\u5bff\u547d/.test(text)) return "\u5bff\u547d"; - return ""; - } - - recentDamageCause(maxAge = 10) { - const now = this.world?.time || 0; - if (this.lastDamageCause && now - (this.lastDamageAt || -999) <= maxAge) return this.lastDamageCause; - return ""; - } - - rememberDamage(amount, reason = "") { - const cause = this.damageCauseLabel(reason) || "\u4e8b\u6545"; - const now = this.world?.time || 0; - this.lastDamageCause = cause; - this.lastDamageAmount = Math.max(0, amount || 0); - this.lastDamageAt = now; - if (this.lastDamageAmount >= 10 || this.lastDamageAmount >= Math.max(6, (this.energy || 0) * 0.36)) { - this.lastMajorDamageCause = cause; - this.lastMajorDamageAmount = this.lastDamageAmount; - this.lastMajorDamageAt = now; - } - return cause; - } - - weakenedDeathReasonFor(cause = "") { - const text = String(cause || "").trim(); - if (!text) return ""; - return text.includes("\u3067\u8870\u5f31") ? text : `${text}\u3067\u8870\u5f31`; - } - - dominantDeathCause(reason = "", opts = {}) { - const text = String(reason || "").trim(); - const direct = this.damageCauseLabel(text); - const now = this.world?.time || 0; - const recentMajor = this.lastMajorDamageCause && now - (this.lastMajorDamageAt || -999) <= 10; - const recent = this.recentDamageCause ? this.recentDamageCause(20) : ""; - const fighting = this.fightTimer > 0.04 || this.defeatedTimer > 0.04 || this.defeatedById || this.fightWinnerId || recent === "\u55a7\u5629"; - if (recentMajor && (!direct || direct === this.lastMajorDamageCause || opts.fromDamage || this.energy <= 22 || this.mood <= 20 || this.stress >= 118)) { - return this.weakenedDeathReasonFor(this.lastMajorDamageCause); - } - if (direct && direct !== "\u30b9\u30c8\u30ec\u30b9\u904e\u591a") return direct; - if (this.zunchiDisease && ((this.zunchiDiseaseSeverity || 0) >= 0.30 || /\u75c5|zunchi/.test(text))) return "\u305a\u3093\u3061\u75c5"; - if (this.hunger >= 108 || (this.hunger >= 94 && this.energy <= 26) || /\u98e2|\u7a7a\u8179|hunger/.test(text)) return "\u98e2\u9913"; - if (fighting && (this.energy <= 44 || this.stress >= 112 || this.mood <= 22 || opts.fromDamage)) return "\u55a7\u5629"; - if (recent && recent !== "\u30b9\u30c8\u30ec\u30b9\u904e\u591a" && (this.energy <= 34 || this.mood <= 20 || this.stress >= 118 || opts.fromDamage)) return recent; - if (text.includes("\u5bff\u547d")) return "\u5bff\u547d"; - if (direct) return direct; - if (this.stress >= 118 || /\u30b9\u30c8\u30ec\u30b9|stress|\u6c17\u5206/.test(text)) return "\u30b9\u30c8\u30ec\u30b9\u904e\u591a"; - if (this.energy <= 0.5) return "\u4e8b\u6545"; - return ""; - } - - normalizeDeathReason(reason = "", opts = {}) { - const text = String(reason || "").trim(); - if (text.includes("\u3067\u8870\u5f31")) return text; - const cause = this.dominantDeathCause(text, opts) || "\u4e8b\u6545"; - if (cause.includes("\u3067\u8870\u5f31")) return cause; - const now = this.world?.time || 0; - const recentMajor = this.lastMajorDamageCause && now - (this.lastMajorDamageAt || -999) <= 10; - const canWeaken = cause && !cause.endsWith("\u75c5") && cause !== "\u98e2\u9913" && cause !== "\u30b9\u30c8\u30ec\u30b9\u904e\u591a" && cause !== "\u5bff\u547d"; - if (canWeaken && (opts.weakened || (recentMajor && cause === this.lastMajorDamageCause))) return this.weakenedDeathReasonFor(cause); - return cause; - } - - damage(amount, reason = "") { - const before = this.energy; - const loss = Math.max(0, amount || 0); - this.energy = clamp(this.energy - loss, 0, 100); - const actualLoss = Math.max(0, before - this.energy); - let cause = ""; - if (actualLoss > 0.01) { - cause = this.rememberDamage(actualLoss, reason); - this.showHpBar(); - } - if (this.energy <= 0.5) { - const majorNow = actualLoss >= Math.max(10, before * 0.42); - this.die(this.normalizeDeathReason(reason || cause, { fromDamage: true, weakened: majorNow })); - } - } + damageCauseLabel(reason = "") { return HEALTH.causeLabel(reason); } + recentDamageCause(maxAge = 10) { return HEALTH.recentDamageCause(this, maxAge); } + rememberDamage(amount, reason = "") { return HEALTH.rememberDamage(this, amount, reason); } + weakenedDeathReasonFor(cause = "") { return HEALTH.weakenedDeathReasonFor(cause); } + dominantDeathCause(reason = "", opts = {}) { return HEALTH.dominantDeathCause(this, reason, opts); } + normalizeDeathReason(reason = "", opts = {}) { return HEALTH.normalizeDeathReason(this, reason, opts); } + damage(amount, reason = "") { return HEALTH.applyDamage(this, amount, reason); } recoverHealth(amount) { if (this.dead) return; @@ -526,12 +473,7 @@ class Tarinai { return null; } - briefDeathReason(reason = this.deathReason) { - const text = String(reason || ""); - if (!text) return ""; - const normalized = this.normalizeDeathReason ? this.normalizeDeathReason(text) : text; - return normalized.length > 12 ? `${normalized.slice(0, 12)}\u2026` : normalized; - } + briefDeathReason(reason = this.deathReason) { return HEALTH.briefDeathReason(this, reason); } variantSprite(category) { const pools = { @@ -609,6 +551,192 @@ class Tarinai { } } + hasWaterCurableDisease() { + return Boolean(this.zunchiDisease || this.explosionDisease); + } + + hasZundaCurableDisease() { + return Boolean(this.explosionDisease || this.fightDisease); + } + + infectSleepDisease(source = null) { + if (this.dead || this.sleepDisease) return false; + this.sleepDisease = true; + this.sleepDiseaseCooldown = 8; + this.sleepDiseaseAnchorX = this.x; + this.sleepDiseaseAnchorY = this.y; + this.state = "sleep"; + this.target = null; + this.sleeping = true; + this.fightTimer = 0; + this.intimidateTimer = 0; + this.fightTargetIds = []; + this.thought = "\u306d\u3080\u308a\u75c5\u3067\u7720\u308a\u7d9a\u3051\u3066\u3044\u308b"; + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "Zzz...", "rgba(72,76,120,0.76)"); + this.world?.log?.(`${this.name}\u306f\u306d\u3080\u308a\u75c5\u306b\u304b\u304b\u3063\u305f\u3002`, "accident"); + return true; + } + + recoverSleepDisease(reason = "") { + if (!this.sleepDisease) return false; + this.sleepDisease = false; + this.sleepDiseaseCooldown = 14; + this.sleepDiseaseAnchorX = null; + this.sleepDiseaseAnchorY = null; + this.state = "idle"; + this.sleeping = false; + this.thought = reason || "\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f"; + this.surpriseTimer = Math.max(this.surpriseTimer || 0, 0.65); + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "!", "rgba(72,76,120,0.76)"); + this.world?.log?.(`${this.name}\u306e\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident"); + return true; + } + + infectExplosionDisease(source = null) { + if (this.dead || this.explosionDisease) return false; + this.explosionDisease = true; + this.explosionDiseaseTimer = Math.max(this.explosionDiseaseTimer || 0, (CONFIG.dayLength || 120) * 0.5); + this.fearTimer = Math.max(this.fearTimer || 0, 0.55); + this.thought = "\u7206\u767a\u75c5\u3067\u843d\u3061\u7740\u304b\u306a\u3044"; + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.2, "!", "rgba(178,78,42,0.82)"); + this.world?.log?.(`${this.name}\u306f\u7206\u767a\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "accident"); + return true; + } + + recoverExplosionDisease(reason = "") { + if (!this.explosionDisease) return false; + this.explosionDisease = false; + this.explosionDiseaseTimer = 0; + this.thought = reason || "\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"; + this.stress = clamp(this.stress - 10, 0, 130); + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "\u306f\u3046", "rgba(82,126,88,0.76)"); + this.world?.log?.(`${this.name}\u306e\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident"); + return true; + } + + recordBleedExposure() { + this.lastBleedAt = this.world?.time || 0; + } + + infectFightDisease(source = null) { + if (this.dead || this.fightDisease) return false; + this.fightDisease = true; + this.fightDiseaseCooldown = 18; + this.fearTimer = Math.max(this.fearTimer || 0, 0.35); + this.thought = "\u55a7\u5629\u50b7\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.20, "?", "rgba(150,78,44,0.80)"); + this.world?.log?.(`${this.name}\u306f\u55a7\u5629\u50b7\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "fight"); + return true; + } + + recoverFightDisease(reason = "") { + if (!this.fightDisease) return false; + this.fightDisease = false; + this.fightDiseaseCooldown = 20; + this.thought = reason || "\u55a7\u5629\u50b7\u75c5\u304c\u6cbb\u3063\u305f"; + this.stress = clamp(this.stress - 12, 0, 130); + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "\u306f\u3046", "rgba(82,126,88,0.76)"); + this.world?.log?.(`${this.name}\u306e\u55a7\u5629\u50b7\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "fight"); + return true; + } + + freezeSleepDiseaseMotion(dt = 0) { + if (!this.sleepDisease) return false; + if (!Number.isFinite(this.sleepDiseaseAnchorX)) this.sleepDiseaseAnchorX = this.x; + if (!Number.isFinite(this.sleepDiseaseAnchorY)) this.sleepDiseaseAnchorY = this.y; + this.state = "sleep"; + this.sleeping = true; + this.target = null; + this.vx = 0; + this.vy = 0; + this.x = this.sleepDiseaseAnchorX; + this.y = this.sleepDiseaseAnchorY; + this.wanderAngle = this.wanderAngle || 0; + this.thought = "\u306d\u3080\u308a\u75c5\u3067\u7720\u308a\u7d9a\u3051\u3066\u3044\u308b"; + if (this.world && this.world.time > (this.nextSleepBubbleAt || 0)) { + this.nextSleepBubbleAt = this.world.time + 5.0; + this.world.spawnBubble?.(this.x, this.y - this.radius * 1.18, "Zzz...", "rgba(65,70,92,0.72)"); + } + return true; + } + + updateNestBoxPresence(dt = 0) { + const previous = this.insideNestBoxId || null; + let box = null; + if (previous) box = this.world?.items?.find?.(it => it && !it.dead && it.id === previous && it.type === "nest_box") || null; + if (!box && this.target && !this.target.dead && this.target.type === "nest_box") box = this.target; + if (!box) { + this.insideNestBoxId = null; + this.nestFade = clamp((this.nestFade || 0) - dt * 1.8, 0, 1); + return null; + } + const d = distXY(this.x, this.y, box.x, box.y); + const canEnter = (this.state === "sleep" || this.state === "seek_bed") && d <= Math.max(18, box.r * 0.58); + if (canEnter) { + this.insideNestBoxId = box.id; + this.nestFade = clamp((this.nestFade || 0) + dt * 2.4, 0, 1); + const pull = clamp(dt * 4.2, 0, 1); + this.x = lerp(this.x, box.x, pull); + this.y = lerp(this.y, box.y, pull); + this.vx *= Math.pow(0.45, dt * 60); + this.vy *= Math.pow(0.45, dt * 60); + return box; + } + this.insideNestBoxId = null; + this.nestFade = clamp((this.nestFade || 0) - dt * 1.8, 0, 1); + return null; + } + + applyWaterEffect(dt, source = "water") { + const power = Math.max(0, dt || 0); + this.stress = clamp(this.stress - power * 2.4, 0, 130); + this.energy = clamp(this.energy + power * 0.5, 0, 100); + this.hunger = clamp(this.hunger - power * 0.2, 0, 115); + this.zunchiStain = clamp((this.zunchiStain || 0) - power * 10.5, 0, 100); + if (this.zunchiDisease) { + this.zunchiDiseaseSeverity = Math.max(0, (this.zunchiDiseaseSeverity || 1) - power * (this.energy > 70 ? 0.050 : 0.028)); + if (this.zunchiDiseaseSeverity <= 0.04 && this.recoverZunchiDisease("\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) { + this.world?.log?.(`${this.name}\u306f\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident"); + } + } + if (this.explosionDisease) this.recoverExplosionDisease("\u6c34\u3067\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"); + } + + updateSpecialDiseases(dt) { + this.sleepDiseaseCooldown = Math.max(0, (this.sleepDiseaseCooldown || 0) - dt); + this.fightDiseaseCooldown = Math.max(0, (this.fightDiseaseCooldown || 0) - dt); + if (this.explosionDisease) { + this.explosionDiseaseTimer = Math.max(0, (this.explosionDiseaseTimer || 0) - dt); + this.addStress ? this.addStress(dt * 0.22, { threshold: 9, duration: 3.6 }) : (this.stress = clamp(this.stress + dt * 0.22, 0, 130)); + if (Math.random() < dt * 2.1) { + const a = rand(0, Math.PI * 2); + this.world?.effects?.push(new Effect("explosion", this.x + Math.cos(a) * this.radius * rand(0.2, 0.9), this.y + Math.sin(a) * this.radius * rand(0.1, 0.8), { + vx: Math.cos(a) * rand(10, 38), vy: Math.sin(a) * rand(10, 38) - rand(8, 22), size: rand(5, 12), life: rand(0.18, 0.42), color: "rgba(255,64,48,0.86)" + })); + } + if (this.explosionDiseaseTimer <= 0.01) { + this.world?.explodeDiseaseTarinai?.(this); + return; + } + if (this.explosionDiseaseTimer < 8 && Math.random() < dt * 0.45) this.bubble("!", 1.0, "rgba(178,78,42,0.82)"); + } + const bleedAge = (this.world?.time || 0) - (this.lastBleedAt || -999); + if (!this.fightDisease && this.fightDiseaseCooldown <= 0 && bleedAge >= (CONFIG.dayLength || 120) * 5 / 24 && bleedAge < (CONFIG.dayLength || 120) * 0.85) { + if (Math.random() < dt * 0.000375) this.infectFightDisease(); + } + if (this.zunchiDisease && Math.random() < dt * 0.00055 * (this.energy > 66 ? 1.8 : 1.0)) { + if (this.recoverZunchiDisease("\u81ea\u7136\u306b\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u81ea\u7136\u306b\u6cbb\u3063\u305f\u3002`, "accident"); + } + if (this.fightDisease && Math.random() < dt * 0.00070 * (this.energy > 58 ? 1.4 : 1.0)) { + this.recoverFightDisease("\u81ea\u7136\u306b\u55a7\u5629\u50b7\u75c5\u304c\u6cbb\u3063\u305f"); + } + if (this.fightDisease) { + this.stress = clamp(this.stress + dt * 0.16, 0, 130); + if (Math.random() < dt * 0.30) this.wanderAngle += rand(-2.8, 2.8); + if (Math.random() < dt * 0.08) this.bubble("?", 2.6, "rgba(150,78,44,0.80)"); + } + } + canEatItemType(type) { return this.isZunchiSlave ? type === "zunchi" : true; } @@ -642,6 +770,9 @@ class Tarinai { rawSpriteId() { if (this.dead) return this.variantSprite("fear"); + if (this.sleepDisease) return this.variantSprite("sleep"); + if (this.explosionDisease && Math.sin((this.world?.time || 0) * 8) > 0.15) return "pokan"; + if (this.fightDisease) return "stress_dizzy"; if (this.isZunchiSlave) return "zunchi_slave"; if (this.type === "cry" && (this.mood < 26 || this.stress > 78 || this.hunger > 96 || this.energy < 12)) return "cry"; if ((this.state === "eat" || this.eatTimer > 0.04) && this.target?.type === "sweet") return "zunda_eat"; @@ -684,6 +815,37 @@ class Tarinai { return this.visibleSpriteId; } + + isAwakeCursorFriendly() { + if (this.dead || this.sleepDisease || this.sleeping || this.state === "sleep" || this.state === "seek_bed") return false; + if (["fight", "panic", "cursor_enemy", "hurt", "defeated", "fight_sick"].includes(this.state)) return false; + if ((this.fearTimer || 0) > 0.18 || (this.intimidatedTimer || 0) > 0.04 || (this.intimidateTimer || 0) > 0.04) return false; + if (this.mood < 46 || this.stress > 64) return false; + return this.affection > 12 || this.mood > 58 || this.goodMode === "smile" || ["lonely", "calm", "playful", "teary", "cry"].includes(this.personality); + } + + applyCursorContactCare(dt) { + const pointer = this.world?.pointer; + if (!pointer?.inside || !this.isAwakeCursorFriendly()) return; + const d = distXY(this.x, this.y, pointer.x, pointer.y); + const touch = this.radius * 1.35; + if (d > touch) return; + const p = clamp(1 - d / touch, 0, 1); + const relief = dt * (1.35 + 2.65 * p); + this.stress = clamp((this.stress || 0) - relief, 0, 130); + this.moodLiftTimer = Math.max(this.moodLiftTimer || 0, 0.5); + this.cursorPetting = clamp((this.cursorPetting || 0) + dt * (1.0 + p * 2.4), 0, 1.75); + this.goodMode = "smile"; + if ((this.world.time || 0) >= (this.nextCursorHeartAt || 0)) { + this.nextCursorHeartAt = (this.world.time || 0) + Math.max(0.08, 0.22 - p * 0.10); + for (let i = 0; i < (p > 0.62 ? 3 : 2); i++) { + this.world.effects?.push(new Effect("heart", this.x + rand(-this.radius * 0.58, this.radius * 0.58), this.y - this.radius * rand(0.68, 1.58), { + vx: rand(-16, 16), vy: rand(-44, -20), size: rand(7, 13) * (0.8 + p * 0.45), life: rand(0.62, 0.95), color: "rgba(240,91,135,0.92)" + })); + } + } + } + update(dt) { if (this.dead) return; @@ -703,6 +865,8 @@ class Tarinai { this.hpBarTimer = Math.max(0, (this.hpBarTimer || 0) - dt); this.stressBarTimer = Math.max(0, (this.stressBarTimer || 0) - dt); this.updateZunchiDisease(dt); + this.updateSpecialDiseases(dt); + if (this.dead) return; this.loveMochiTimer = Math.max(0, (this.loveMochiTimer || 0) - dt); this.fightMochiTimer = Math.max(0, (this.fightMochiTimer || 0) - dt); if (this.fightMochiTimer > 0.04) { @@ -721,6 +885,11 @@ class Tarinai { } this.pokeFlashTimer = Math.max(0, this.pokeFlashTimer - dt); this.cursorPetting = Math.max(0, this.cursorPetting - dt * 1.2); + if (this.freezeSleepDiseaseMotion(dt)) { + this.checkLife(dt); + return; + } + this.applyCursorContactCare(dt); const wasFighting = this.fightTimer > 0.04; this.fightTimer = Math.max(0, this.fightTimer - dt); this.fightCooldown = Math.max(0, this.fightCooldown - dt); @@ -792,6 +961,11 @@ class Tarinai { this.energy = clamp(this.energy, 0, 100); this.stress = clamp(this.stress, 0, 130); + if (this.freezeSleepDiseaseMotion(dt)) { + this.checkLife(dt); + return; + } + this.aiTimer += dt; const urgentAi = this.fightTimer > 0.04 || this.intimidateTimer > 0.04 || this.intimidatedTimer > 0.04 || this.birthRitualTimer > 0.04 || this.defeatedTimer > 0.04 || this.eatTimer > 0.02 || this.hurtTimer > 0.02; const popPerf = this.world.performanceLevel ? this.world.performanceLevel() : 0; @@ -821,6 +995,7 @@ class Tarinai { } this.maintainTargetProgress(dt); this.move(dt); + this.updateNestBoxPresence(dt); if (this.world.resolveFenceCollision) this.world.resolveFenceCollision(this); this.checkLife(dt); } @@ -840,6 +1015,12 @@ class Tarinai { const lush = clamp((it.growth ?? it.amount / 120) * (it.health ?? 1), 0, 1.2); grassComfort += clamp(1 - d / 105, 0, 1) * lush; } + let nestComfort = 0; + for (const it of this.world.nearbyItems(this.x, this.y, 120)) { + if (!it || it.dead || it.type !== "nest_box") continue; + nestComfort += clamp(1 - distXY(this.x, this.y, it.x, it.y) / 120, 0, 1); + } + if (nestComfort > 0) this.stress = clamp(this.stress - dt * Math.min(1.15, nestComfort * 0.62), 0, 130); if (grassComfort > 0) { this.stress = clamp(this.stress - dt * Math.min(0.32, grassComfort * 0.08), 0, 130); if (this.state === "panic") this.fearTimer = Math.max(0, this.fearTimer - dt * Math.min(0.22, grassComfort * 0.06)); @@ -862,15 +1043,18 @@ class Tarinai { } isSleepFurniture(target) { - return Boolean(target && target.type === "bed"); + return Boolean(target && (target.type === "bed" || target.type === "nest_box")); } sleepFurnitureLabel(target) { - return "\u5e72\u8349\u5bdd\u5e8a"; + return target?.type === "nest_box" ? "\u5de3\u7bb1" : "\u5e72\u8349\u5bdd\u5e8a"; } sleepSpotFor(bed) { if (!bed) return { x: this.x, y: this.y }; + if (bed.type === "nest_box") { + return { x: clamp(bed.x, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding), y: clamp(bed.y, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding) }; + } const angle = stableUnit(this.id, `bed-angle-${bed.id || bed.seed || "bed"}`) * Math.PI * 2; const baseRing = bed.r * 0.52; const ring = baseRing + stableUnit(this.id, `bed-ring-${bed.id || bed.seed || "bed"}`) * bed.r * 0.95; @@ -1012,28 +1196,49 @@ class Tarinai { } } - if (this.zunchiDisease && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { - const water = this.world.nearest(this, ["water"], 360); + if (this.hasWaterCurableDisease?.() && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { + const water = this.world.nearest(this, ["water", "water_bowl"], 760); if (water && !water.dead) { this.state = "seek_water"; this.target = water; - this.thought = "\u305a\u3093\u3061\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b"; + this.thought = this.explosionDisease ? "\u7206\u767a\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u305a\u3093\u3061\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b"; return; } - this.state = "zunchi_sick"; + if (this.zunchiDisease) { + this.state = "zunchi_sick"; + this.target = null; + this.thought = "\u305a\u3093\u3061\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + if (Math.random() < dt * 0.35) this.wanderAngle += rand(-2.4, 2.4); + return; + } + } + + if (this.hasZundaCurableDisease?.() && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { + const cureFood = this.world.nearest(this, ["sweet"], 700); + if (cureFood && cureFood.amount > 1.2 && !this.shouldAvoidTarget(cureFood)) { + this.state = "seek_food"; + this.target = cureFood; + this.foodReactTimer = Math.max(this.foodReactTimer, 0.42); + this.thought = this.fightDisease ? "\u55a7\u5629\u50b7\u75c5\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u7206\u767a\u75c5\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b"; + return; + } + } + + if (this.fightDisease && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { + this.state = "fight_sick"; this.target = null; - this.thought = "\u305a\u3093\u3061\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; - if (Math.random() < dt * 0.35) this.wanderAngle += rand(-2.4, 2.4); + this.thought = "\u55a7\u5629\u50b7\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + if (Math.random() < dt * 0.45) this.wanderAngle += rand(-3.4, 3.4); return; } if (!this.isZunchiSlave) { - const specialMochi = this.world.nearest(this, ["love_mochi", "fight_mochi"], wasSleeping ? 520 : 390); + const specialMochi = this.world.nearest(this, ["love_mochi", "fight_mochi", "sleep_drug"], wasSleeping ? 520 : 390); if (specialMochi && specialMochi.amount > 1.2 && this.hunger > 10 && !this.shouldAvoidTarget(specialMochi)) { this.state = "seek_food"; this.target = specialMochi; this.foodReactTimer = Math.max(this.foodReactTimer, 0.34); - this.thought = specialMochi.type === "love_mochi" ? "\u3078\u3053\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u3051\u3093\u304b\u9905\u3092\u63a2\u3057\u3066\u3044\u308b"; + this.thought = specialMochi.type === "love_mochi" ? "\u3078\u3053\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : (specialMochi.type === "fight_mochi" ? "\u3051\u3093\u304b\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u306d\u3080\u308a\u85ac\u3092\u63a2\u3057\u3066\u3044\u308b"); return; } } else if (this.hunger > 20) { @@ -1097,7 +1302,7 @@ class Tarinai { const pd = distXY(this.x, this.y, pointer.x, pointer.y); if (pd < 170) { const hostile = this.mood < 38 || this.stress > 58 || this.type === "angry"; - const friendly = !hostile && (this.mood > 52 || this.affection > 12 || this.goodMode === "smile"); + const friendly = !hostile && this.isAwakeCursorFriendly(); if (hostile) { this.state = "cursor_enemy"; this.target = { x: pointer.x, y: pointer.y, dead: false }; @@ -1149,7 +1354,7 @@ class Tarinai { } } - if (friendNearby && this.hunger > 44 && friendNearby.target && (this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "grass"]).includes(friendNearby.target.type) && !friendNearby.target.dead && !this.shouldAvoidTarget(friendNearby.target)) { + if (friendNearby && this.hunger > 44 && friendNearby.target && (this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass"]).includes(friendNearby.target.type) && !friendNearby.target.dead && !this.shouldAvoidTarget(friendNearby.target)) { this.state = "seek_food"; this.target = friendNearby.target; this.foodReactTimer = Math.max(this.foodReactTimer, 0.24); @@ -1158,7 +1363,7 @@ class Tarinai { } if (this.hunger > 62) { - const itemTypes = this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "grass"]; + const itemTypes = this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass"]; const item = this.world.nearest(this, itemTypes, 420); if (item) { this.state = "seek_food"; @@ -1225,6 +1430,8 @@ class Tarinai { if (it.type === "sweet") { this.stress = clamp(this.stress - eating * 0.42, 0, 130); this.fearTimer = Math.max(0, this.fearTimer - eating * 0.035); + if (this.explosionDisease) this.recoverExplosionDisease("\u305a\u3093\u3060\u9905\u3067\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"); + if (this.fightDisease) this.recoverFightDisease("\u305a\u3093\u3060\u9905\u3067\u55a7\u5629\u50b7\u75c5\u304c\u6cbb\u3063\u305f"); } this.eatTimer = Math.max(this.eatTimer, 0.32); this.eatCooldown = it.type === "sweet" ? rand(0.34, 0.62) : rand(0.44, 0.78); @@ -1245,7 +1452,7 @@ class Tarinai { } } - if (canSweetBite && (it.type === "love_mochi" || it.type === "fight_mochi") && it.amount > 1.2) { + if (canSweetBite && (it.type === "love_mochi" || it.type === "fight_mochi" || it.type === "sleep_drug") && it.amount > 1.2) { const eating = Math.min(it.amount, 6.8); this.state = "eat"; this.target = it; @@ -1272,12 +1479,12 @@ class Tarinai { this.foodReactTimer = Math.max(this.foodReactTimer, 0.16); if (Math.random() < dt * 2.2) { const mouth = this.mouthPosition(it); - this.world.spawnEatEffect(mouth.x, mouth.y, it.type === "love_mochi" ? "#ff7bab" : "#e07c43"); + this.world.spawnEatEffect(mouth.x, mouth.y, it.type === "love_mochi" ? "#ff7bab" : (it.type === "fight_mochi" ? "#e07c43" : "#b89cff")); } this.makePoop(eating * 0.20); if (this.world.time > this.nextEatSound) { audio.eat(); this.nextEatSound = this.world.time + 0.42; } if (this.world.time - this.lastLog > 9 && Math.random() < 0.02) { - this.world.log(`${this.name}\u306f${it.type === "love_mochi" ? "\u3078\u3053\u9905" : "\u3051\u3093\u304b\u9905"}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`, "food"); + this.world.log(`${this.name}\u306f${it.type === "love_mochi" ? "\u3078\u3053\u9905" : (it.type === "fight_mochi" ? "\u3051\u3093\u304b\u9905" : "\u306d\u3080\u308a\u85ac")}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`, "food"); this.lastLog = this.world.time; } break; @@ -1335,18 +1542,9 @@ class Tarinai { } } - if (it.type === "water") { - this.stress -= dt * 2.4; - this.energy += dt * 0.5; - this.hunger -= dt * 0.2; - this.zunchiStain = clamp((this.zunchiStain || 0) - dt * 10.5, 0, 100); - if (this.zunchiDisease) { - this.zunchiDiseaseSeverity = Math.max(0, (this.zunchiDiseaseSeverity || 1) - dt * (this.energy > 70 ? 0.050 : 0.028)); - if (this.zunchiDiseaseSeverity <= 0.04 && this.recoverZunchiDisease("\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) { - this.world.log(`${this.name}\u306f\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident"); - } - } - it.amount -= dt * 2.4; + if (it.type === "water" || it.type === "water_bowl") { + this.applyWaterEffect(dt, it.type); + if (it.type === "water") it.amount -= dt * 2.4; if (this.type === "teary" || this.type === "cry") this.affection += dt * 0.18; } @@ -1516,11 +1714,12 @@ class Tarinai { } move(dt) { + if (this.freezeSleepDiseaseMotion(dt)) return; let ax = 0, ay = 0; const baseSpeed = 46.5 * 1.5 * this.trait.speed * (this.zunchiDisease ? 0.5 : 1) * (this.energy < 20 ? 0.42 : 1) * (this.fallTimer > 0 ? 0.35 : 1); if (this.state === "sleep") { - const bedComfort = this.isSleepFurniture(this.target) ? this.world.bedComfort(this.target) : 0.72; + const bedComfort = this.isSleepFurniture(this.target) ? this.world.bedComfort(this.target) * (this.target?.type === "nest_box" ? 1.55 : 1) : 0.72; const bedCrowd = this.isSleepFurniture(this.target) ? this.world.bedOccupancy(this.target) : 0; const crowdedSleep = bedCrowd > 5; this.energy = clamp(this.energy + dt * (this.target ? 1.8 + bedComfort * 1.35 : 2.1), 0, 100); @@ -1540,6 +1739,7 @@ class Tarinai { this.y = spot.y; } } + this.updateNestBoxPresence(dt); this.vx *= Math.pow(0.55, dt * 60); this.vy *= Math.pow(0.55, dt * 60); return; @@ -1639,6 +1839,10 @@ class Tarinai { this.wanderAngle += rand(-2.4, 2.4) * dt + Math.sin(this.world.time * 1.7 + this.age) * dt * 0.8; ax += Math.cos(this.wanderAngle) * baseSpeed * 0.72; ay += Math.sin(this.wanderAngle) * baseSpeed * 0.72; + } else if (this.state === "fight_sick") { + this.wanderAngle += rand(-4.2, 4.2) * dt + Math.sin(this.world.time * 3.2 + this.age) * dt * 1.6; + ax += Math.cos(this.wanderAngle) * baseSpeed * 0.88; + ay += Math.sin(this.wanderAngle) * baseSpeed * 0.88; } else { ax += Math.cos(this.wanderAngle) * baseSpeed * 0.34; ay += Math.sin(this.wanderAngle) * baseSpeed * 0.34; @@ -1649,7 +1853,7 @@ class Tarinai { this.vx *= Math.pow(0.84, dt * 8); this.vy *= Math.pow(0.84, dt * 8); - const maxV = this.state === "panic" ? 116 : (this.state === "zunchi_sick" ? 54 : 76); + const maxV = this.state === "panic" ? 116 : (this.state === "zunchi_sick" ? 54 : (this.state === "fight_sick" ? 68 : 76)); const v = Math.hypot(this.vx, this.vy); if (v > maxV) { this.vx = this.vx / v * maxV; @@ -1734,7 +1938,8 @@ class Tarinai { const bob = breathing * (this.state === "sleep" ? 0.9 : 1.2 + gait * 1.6) + headbuttPulse * 0.9 + fallLift + birthShake * 0.25; const blastSpin = this.blastSpinTimer > 0.04 ? this.fallDir * ((this.blastSpinMax || 1) - this.blastSpinTimer) * Math.PI * 70.0 : 0; const fallSpin = this.blastSpinTimer > 0.04 ? blastSpin : (fallPose > 0 ? this.fallDir * (1 - fallPose) * Math.PI * 2 : 0); - const motionTilt = clamp(this.vx / 240, -0.22, 0.22) + (this.state === "fight" ? headbuttPulse * 0.05 : 0) + eatingShake * 0.105 + this.fallDir * fallPose * 0.18 + fallSpin; + const diseaseSpin = this.fightDisease ? (t * 3.6 + this.age) : 0; + const motionTilt = clamp(this.vx / 240, -0.22, 0.22) + (this.state === "fight" ? headbuttPulse * 0.05 : 0) + eatingShake * 0.105 + this.fallDir * fallPose * 0.18 + fallSpin + diseaseSpin; const insideCardboard = false; let drawW = w * this.scale * 0.30; let drawH = h * this.scale * 0.30; @@ -1765,18 +1970,19 @@ class Tarinai { ? this.sleepFacing > 0 : this.facingDir() > 0; const angle = (faceRight ? 1 : -1) * (Math.PI / 12) + motionTilt; + const nestHideAlpha = this.nestFade ? clamp(1 - this.nestFade * 0.92, 0.08, 1) : 1; const shadow = projectedShadowParams(lightState, 0.95 + this.scale * 0.8); const shadowContactY = this.y + bob + (drawH / squish) * 0.30; if (img) { drawImageProjectedShadow(ctx, img, this.x, shadowContactY, drawW * squish, drawH / squish, shadow, { faceRight, - alpha: shadow.alpha * (this.state === "sleep" ? 1.10 : 0.92), + alpha: shadow.alpha * (this.state === "sleep" ? 1.10 : 0.92) * nestHideAlpha, widthScale: this.state === "sleep" ? 1.12 : 1, heightScale: this.state === "sleep" ? 0.88 : 1, }); } else { - drawProjectedShadow(ctx, this.x, shadowContactY, drawW * 0.52, drawH * 0.13, { ...shadow, alpha: shadow.alpha * 0.82 }); + drawProjectedShadow(ctx, this.x, shadowContactY, drawW * 0.52, drawH * 0.13, { ...shadow, alpha: shadow.alpha * 0.82 * nestHideAlpha }); } drawCreatureGlow(ctx, this, drawW, drawH, lightState); if (this.birthRitualTimer > 0.04 && this.birthRitualLeader) { @@ -1793,6 +1999,49 @@ class Tarinai { ctx.rotate(angle); if (insideCardboard) ctx.globalAlpha *= 0.58; + const observeKind = this.world.observeHighlightKind ? this.world.observeHighlightKind(this) : ""; + if (observeKind && this.world.selected !== this) { + const style = { + parent: { color: "rgba(86,142,232,0.86)", label: "\u89aa" }, + child: { color: "rgba(93,170,92,0.88)", label: "\u5b50" }, + friend: { color: "rgba(240,91,135,0.90)", label: "\u4ef2\u826f\u3057" }, + enemy: { color: "rgba(214,82,66,0.90)", label: "\u6575\u5bfe" }, + }[observeKind] || { color: "rgba(255,250,220,0.78)", label: "" }; + ctx.save(); + ctx.globalAlpha = 0.96; + ctx.shadowColor = style.color; + ctx.shadowBlur = 16; + ctx.strokeStyle = style.color; + ctx.lineWidth = 5.2; + ctx.beginPath(); + ctx.ellipse(0, drawH * 0.14, drawW * 0.78, drawH * 0.60, 0, 0, Math.PI * 2); + ctx.stroke(); + ctx.shadowBlur = 0; + ctx.strokeStyle = "rgba(255,255,255,0.92)"; + ctx.lineWidth = 2.0; + ctx.setLineDash([8, 5]); + ctx.beginPath(); + ctx.ellipse(0, drawH * 0.14, drawW * 0.86, drawH * 0.66, 0, 0, Math.PI * 2); + ctx.stroke(); + ctx.setLineDash([]); + if (style.label) { + const labelY = -drawH * 0.62; + ctx.font = `${Math.max(11, this.radius * 0.52)}px Yomogi, ui-rounded, sans-serif`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const labelW = ctx.measureText(style.label).width + 16; + ctx.fillStyle = "rgba(255,252,238,0.92)"; + ctx.strokeStyle = style.color; + ctx.lineWidth = 2.2; + tarinaiRoundRectPath(ctx, -labelW / 2, labelY - 10, labelW, 20, 10); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = style.color; + ctx.fillText(style.label, 0, labelY); + } + ctx.restore(); + } + if (this.world.selected === this) { ctx.save(); ctx.globalAlpha = 0.85; @@ -1833,7 +2082,7 @@ class Tarinai { if (this.pokeFlashTimer > 0.03) { ctx.save(); - ctx.globalAlpha = this.pokeFlashTimer * 0.9; + ctx.globalAlpha = this.pokeFlashTimer * 0.9 * nestHideAlpha; ctx.fillStyle = "rgba(255, 120, 120, 0.22)"; ctx.beginPath(); ctx.ellipse(0, 0, drawW * 0.60, drawH * 0.42, 0, 0, Math.PI * 2); @@ -1846,7 +2095,7 @@ class Tarinai { const cursorLove = this.state === "cursor_friend" ? Math.max(0, this.cursorPetting || 0) : 0; ctx.globalAlpha = this.state === "cursor_friend" ? clamp(0.82 + cursorLove * 0.16, 0.82, 1) : 0.34; ctx.fillStyle = this.state === "cursor_friend" ? "#f05b87" : (lightState.nightStrength > 0.20 ? "#eef5ff" : (lightState.goldenStrength > 0.35 ? "#ffe398" : "#d6f5a9")); - const count = this.state === "cursor_friend" ? (cursorLove > 0.18 ? 5 : 3) : 2; + const count = this.state === "cursor_friend" ? (cursorLove > 1.0 ? 10 : (cursorLove > 0.45 ? 8 : (cursorLove > 0.18 ? 6 : 4))) : 2; for (let i = 0; i < count; i++) { const orbit = 0.24 + (i % 3) * 0.08 + cursorLove * 0.05; const px = Math.cos(t * 2.2 + this.age + i * 1.42) * drawW * orbit; @@ -1863,6 +2112,7 @@ class Tarinai { ctx.restore(); } + ctx.globalAlpha *= nestHideAlpha; if (faceRight) ctx.scale(-1, 1); const dw = drawW * squish; const dh = drawH / squish; @@ -1910,6 +2160,25 @@ class Tarinai { ctx.restore(); + if (this.favorite) { + ctx.save(); + ctx.globalAlpha = 1; + const starSize = Math.max(18, this.radius * 0.88); + const sx = this.x; + const sy = this.y - drawH * 0.64 - 20; + ctx.font = `${starSize}px "Apple Color Emoji", "Segoe UI Emoji", sans-serif`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.shadowColor = "rgba(255, 198, 28, 0.82)"; + ctx.shadowBlur = 14; + ctx.lineWidth = Math.max(2, starSize * 0.12); + ctx.strokeStyle = "rgba(92, 62, 0, 0.86)"; + ctx.fillStyle = "rgba(255, 218, 46, 1)"; + ctx.strokeText("\u2605", sx, sy); + ctx.fillText("\u2605", sx, sy); + ctx.restore(); + } + const hpActive = (this.hpBarTimer || 0) > 0; const stressActive = (this.stressBarTimer || 0) > 0; if (hpActive || stressActive) { diff --git a/js/text_catalog.js b/js/text_catalog.js new file mode 100644 index 0000000..1bfdb8e --- /dev/null +++ b/js/text_catalog.js @@ -0,0 +1,71 @@ +"use strict"; + +const TEXT_CATALOG = { + toolTips: { + observe: "\u500b\u4f53\u3092\u9078\u629e\u3057\u3001\u72b6\u614b\u30fb\u6027\u683c\u30fb\u75c5\u6c17\u30fb\u304a\u6c17\u306b\u5165\u308a\u3092\u78ba\u8a8d\u3059\u308b\u3002", + delete: "\u7f6e\u3044\u305f\u9053\u5177\u3084\u6c5a\u308c\u3092\u6d88\u3059\u3002", + poke: "\u3064\u3064\u3044\u3066\u53cd\u5fdc\u3068\u5c0f\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002", + pinch: "\u30c9\u30e9\u30c3\u30b0\u3067\u500b\u4f53\u3084\u9053\u5177\u3092\u3064\u307e\u3080\u3002", + new: "\u753b\u9762\u5916\u304b\u3089\u65b0\u3057\u3044\u305f\u308a\u306a\u3044\u3092\u547c\u3076\u3002", + zunchi: "\u6c5a\u308c\u3068\u611f\u67d3\u6e90\u3002\u305a\u3093\u3061\u75c5\u306e\u539f\u56e0\u306b\u306a\u308b\u3002", + sweet: "\u305a\u3093\u3060\u9905\u3002\u6c17\u5206\u3092\u6574\u3048\u3001\u7206\u767a\u75c5\u3068\u55a7\u5629\u50b7\u75c5\u3092\u6cbb\u3059\u3002", + love_mochi: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u7e41\u6b96\u884c\u52d5\u304c\u8d77\u304d\u3084\u3059\u304f\u306a\u308b\u3002", + fight_mochi: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u5a01\u5687\u3068\u55a7\u5629\u306e\u5236\u9650\u3092\u5f31\u3081\u308b\u3002", + water: "\u98f2\u3080\u3068\u6c17\u5206\u56de\u5fa9\u3002\u305a\u3093\u3061\u75c5\u3068\u7206\u767a\u75c5\u3092\u6cbb\u3059\u3002", + water_bowl: "\u6d88\u3048\u306a\u3044\u6c34\u5834\u3002\u6c34\u3092\u63a2\u3059\u500b\u4f53\u306e\u6cbb\u7642\u5834\u6240\u306b\u306a\u308b\u3002", + sleep_drug: "\u98df\u3079\u308b\u3068\u306d\u3080\u308a\u75c5\u306b\u306a\u308b\u3002\u30c0\u30e1\u30fc\u30b8\u3067\u5b8c\u6cbb\u3059\u308b\u3002", + grass: "\u98df\u3079\u7269\u3002\u5468\u56f2\u306e\u30b9\u30c8\u30ec\u30b9\u3082\u5c11\u3057\u4e0b\u3052\u308b\u3002", + stone: "\u843d\u4e0b\u3059\u308b\u3068\u4e8b\u6545\u30c0\u30e1\u30fc\u30b8\u3002\u7f6e\u304b\u308c\u305f\u5f8c\u306f\u4f11\u307f\u5834\u306b\u3082\u306a\u308b\u3002", + bed: "\u8fd1\u304f\u3067\u7720\u308b\u3002\u4f53\u529b\u304c\u56de\u5fa9\u3059\u308b\u3002", + nest_box: "\u3044\u308b\u3060\u3051\u3067\u30b9\u30c8\u30ec\u30b9\u4f4e\u6e1b\u3002\u7720\u308b\u3068\u7761\u7720\u306e\u8cea\u304c\u4e0a\u304c\u308b\u3002", + water_hose: "\u30c9\u30e9\u30c3\u30b0\u3067\u305a\u3093\u3061\u3084\u8840\u75d5\u3092\u6d17\u3044\u6d41\u3057\u3001\u305f\u308a\u306a\u3044\u3082\u6c34\u3067\u6d41\u3059\u3002", + ball: "\u8ee2\u304c\u3063\u3066\u62bc\u3059\u3002\u4e8b\u6545\u306e\u539f\u56e0\u306b\u3082\u306a\u308b\u3002", + firecracker: "\u7206\u767a\u3067\u5468\u56f2\u3092\u5439\u304d\u98db\u3070\u3059\u3002\u7206\u767a\u75c5\u306e\u539f\u56e0\u306b\u306a\u308b\u3002", + fence_v: "\u7e26\u5411\u304d\u306e\u79fb\u52d5\u5236\u9650\u3002\u5bc6\u96c6\u7f6e\u304d\u306f\u5236\u9650\u3055\u308c\u308b\u3002", + fence_h: "\u6a2a\u5411\u304d\u306e\u79fb\u52d5\u5236\u9650\u3002\u5bc6\u96c6\u7f6e\u304d\u306f\u5236\u9650\u3055\u308c\u308b\u3002" + }, + ecologyCards: [ + { + "title": "\u305f\u308a\u306a\u3044\u3068\u306f", + "image": "assets/sprites/tarinai_01_smile.png", + "text": "\u5ead\u3067\u52dd\u624b\u306b\u66ae\u3089\u3059\u5c0f\u3055\u306a\u751f\u304d\u7269\u3002\u304a\u306a\u304b\u3001\u7720\u6c17\u3001\u6c17\u5206\u3001\u30b9\u30c8\u30ec\u30b9\u3001\u4f53\u529b\u3067\u884c\u52d5\u304c\u5909\u308f\u308b\u3002" + }, + { + "title": "\u66ae\u3089\u3057\u3068\u6b32\u6c42", + "image": "assets/sprites/tarinai_05_drool.png", + "text": "\u98df\u3079\u7269\u3001\u6c34\u3001\u5bdd\u5e8a\u3001\u5de3\u7bb1\u3001\u4ef2\u9593\u3092\u63a2\u3057\u3066\u52d5\u304f\u3002\u96e8\u3084\u6c17\u6e29\u3001\u8349\u3001\u6c5a\u308c\u3001\u9053\u5177\u3082\u65e5\u3005\u306e\u72b6\u614b\u306b\u5f71\u97ff\u3059\u308b\u3002" + }, + { + "title": "\u6027\u683c\u3068\u500b\u6027", + "image": "assets/sprites/tarinai_21_normal_happy.png", + "text": "\u81c6\u75c5\u3001\u98df\u3044\u3057\u3093\u574a\u3001\u7720\u305f\u304c\u308a\u3001\u5bc2\u3057\u304c\u308a\u306a\u3069\u306e\u6027\u683c\u304c\u3042\u308b\u3002\u6027\u683c\u306f\u6050\u6016\u3001\u55a7\u5629\u3001\u7761\u7720\u3001\u4ef2\u9593\u3078\u306e\u5bc4\u308a\u65b9\u306b\u73fe\u308c\u308b\u3002" + }, + { + "title": "\u5bb6\u65cf\u3068\u95a2\u4fc2", + "image": "assets/sprites/tarinai_27_birth_ritual.png", + "text": "\u89aa\u5b50\u3001\u5171\u540c\u89aa\u3001\u4ef2\u826f\u3057\u3001\u82e6\u624b\u3001\u6050\u6016\u3092\u8a18\u9332\u3059\u308b\u3002\u5b50\u306f\u89aa\u306e\u7247\u65b9\u306e\u6027\u683c\u3092\u7d99\u304e\u3001\u5bb6\u7cfb\u56f3\u306b\u4e16\u4ee3\u304c\u6b8b\u308b\u3002" + }, + { + "title": "\u75c5\u6c17\u3068\u6cbb\u7642", + "image": "assets/sprites/tarinai_24_stress_dizzy.png", + "text": "\u305a\u3093\u3061\u75c5\u3001\u306d\u3080\u308a\u75c5\u3001\u7206\u767a\u75c5\u3001\u55a7\u5629\u50b7\u75c5\u304c\u3042\u308b\u3002\u6c34\u3067\u6cbb\u308b\u75c5\u6c17\u306e\u500b\u4f53\u306f\u6c34\u3092\u3001\u305a\u3093\u3060\u9905\u3067\u6cbb\u308b\u75c5\u6c17\u306e\u500b\u4f53\u306f\u305a\u3093\u3060\u9905\u3092\u512a\u5148\u3059\u308b\u3002" + }, + { + "title": "\u55a7\u5629\u3068\u4e8b\u6545", + "image": "assets/sprites/tarinai_26_intimidate.png", + "text": "\u5a01\u5687\u3001\u6d41\u8840\u3001\u7206\u7af9\u3001\u30dc\u30fc\u30eb\u3001\u843d\u4e0b\u7269\u3067\u50b7\u3064\u304f\u3002\u6b7b\u56e0\u306f\u55a7\u5629\u3001\u98e2\u9913\u3001\u75c5\u6c17\u3001\u30b9\u30c8\u30ec\u30b9\u904e\u591a\u3001\u7206\u7af9\u3001\u4e8b\u6545\u306a\u3069\u306b\u5206\u304b\u308c\u308b\u3002" + }, + { + "title": "\u9053\u5177\u3068\u4ecb\u5165", + "image": "assets/sprites/tarinai_18_fear.png", + "text": "\u3064\u3064\u304f\u3001\u3064\u307e\u3080\u3001\u9905\u3001\u6c34\u3001\u6d17\u6d44\u3001\u5de3\u7bb1\u3001\u67f5\u3001\u7206\u7af9\u306a\u3069\u3067\u74b0\u5883\u3092\u4f5c\u308b\u3002\u9053\u5177\u306f\u52a9\u3051\u306b\u3082\u5371\u967a\u306b\u3082\u306a\u308b\u3002" + }, + { + "title": "\u89b3\u5bdf\u306e\u65b9\u6cd5", + "image": "assets/sprites/tarinai_11_weak.png", + "text": "\u305f\u308a\u306a\u3044\u9054\u306e\u72b6\u6cc1\u3092\u89b3\u5bdf\u30c4\u30fc\u30eb\u3001\u661f\u30de\u30fc\u30af\u3001\u89b3\u5bdf\u30ed\u30b0\u3001\u5bb6\u7cfb\u56f3\u3001\u6b7b\u56e0\u7b49\u304b\u3089\u77e5\u308b\u3053\u3068\u304c\u51fa\u6765\u308b\u3002" + } + ] +}; + +window.TEXT_CATALOG = TEXT_CATALOG; diff --git a/js/ui.js b/js/ui.js index 78692a1..8bbde11 100644 --- a/js/ui.js +++ b/js/ui.js @@ -29,6 +29,7 @@ const ui = { fieldDialog: document.getElementById("fieldDialog"), fieldCancelBtn: document.getElementById("fieldCancelBtn"), ecologyDialog: document.getElementById("ecologyDialog"), + ecologyGrid: document.getElementById("ecologyGrid"), ecologyCloseBtn: document.getElementById("ecologyCloseBtn"), }; @@ -57,6 +58,7 @@ const uiCache = { chartBucketStart: -Infinity, chartBucketEnd: -Infinity, chartBucketAccum: null, + environmentInitialRow: null, lastChartSample: -Infinity, lastChartDraw: "", lastChartDrawAt: 0, @@ -150,7 +152,9 @@ function renderSelected() { t.parentNames?.join("+") || "", t.children?.length || 0, fmt(t.lack), rel.friend?.id || "", rel.friend?.score || 0, rel.friend?.id ? tarinaiSpritePathForId(rel.friend.id) : "", rel.fear?.id || "", rel.fear?.score || 0, rel.fear?.id ? tarinaiSpritePathForId(rel.fear.id) : "", fightRecord, t.isZunchiSlave ? 1 : 0, fmt(t.totalFightLosses || 0), fmt(t.loveMochiTimer || 0), fmt(t.fightMochiTimer || 0), - t.zunchiDisease ? 1 : 0, fmt(t.zunchiDiseaseSeverity || 0), fmt(t.zunchiStain || 0) + t.zunchiDisease ? 1 : 0, fmt(t.zunchiDiseaseSeverity || 0), fmt(t.zunchiStain || 0), + t.sleepDisease ? 1 : 0, t.explosionDisease ? 1 : 0, fmt(t.explosionDiseaseTimer || 0), t.fightDisease ? 1 : 0, t.favorite ? 1 : 0, + (t.records || []).slice(0, 6).map(r => `${Math.round(r.time || 0)}:${r.kind || ""}:${r.text || ""}`).join("~") ].join("|"); if (uiCache.selectedSnapshot === snapshot) return; uiCache.selectedSnapshot = snapshot; @@ -159,9 +163,14 @@ function renderSelected() { const effectBadges = []; effectBadges.push(`\u6027\u683c ${escapeHtml(t.personalityLabel ? t.personalityLabel() : t.personality || "\u4e0d\u660e")}`); if (t.isZunchiSlave) effectBadges.push(`\u305a\u3093\u3061\u3069\u308c\u3044`); + if (t.favorite) effectBadges.push(`\u2605`); if (t.zunchiDisease) effectBadges.push(`\u305a\u3093\u3061\u75c5 ${fmt((t.zunchiDiseaseSeverity || 0) * 100)}`); + if (t.sleepDisease) effectBadges.push(`\u306d\u3080\u308a\u75c5`); + if (t.explosionDisease) effectBadges.push(`\u7206\u767a\u75c5 ${fmt(t.explosionDiseaseTimer || 0)}`); + if (t.fightDisease) effectBadges.push(`\u55a7\u5629\u50b7\u75c5`); if ((t.loveMochiTimer || 0) > 0.1) effectBadges.push(`\u3078\u3053\u9905 ${fmt(t.loveMochiTimer)}`); if ((t.fightMochiTimer || 0) > 0.1) effectBadges.push(`\u3051\u3093\u304b\u9905 ${fmt(t.fightMochiTimer)}`); + const recordHtml = (t.records || []).slice(0, 8).map(r => `
  • ${escapeHtml(world.clockString ? world.clockStringFromTime ? world.clockStringFromTime(r.time || 0) : formatRecordTime(r.time || 0) : formatRecordTime(r.time || 0))}${escapeHtml(r.text || "")}
  • `).join("") || `
  • -\u8a18\u9332\u306a\u3057
  • `; ui.selectedInfo.innerHTML = `
    ${escapeHtml(t.label())}${escapeHtml(t.name)}${(t.displayGeneration ? t.displayGeneration() : ((t.hasPaired || t.parents?.length || t.children?.length) ? t.generation : null)) ? `\u4e16\u4ee3 ${t.generation}` : ""}${effectBadges.join("")}
    \u6027\u683c${escapeHtml(t.personalityLabel ? t.personalityLabel() : t.personality || "\u4e0d\u660e")}
    @@ -182,9 +191,18 @@ function renderSelected() {
    \u89aa${escapeHtml(t.parentNames?.length ? t.parentNames.join(" + ") : "\u4e0d\u660e")}
    \u5b50${t.children?.length || 0}
    \u305f\u308a\u306a\u3044${fmt(t.lack)}
    +

    \u500b\u4f53\u5225\u306e\u8a18\u9332

      ${recordHtml}
    +
    `; } +function formatRecordTime(time) { + const totalMinutes = Math.floor(((time || 0) % (CONFIG.dayLength || 120)) / (CONFIG.dayLength || 120) * 24 * 60); + const hh = String(Math.floor(totalMinutes / 60)).padStart(2, "0"); + const mm = String(totalMinutes % 60).padStart(2, "0"); + return `${hh}:${mm}`; +} + function stateLabel(s) { return { idle: "\u5f85\u6a5f", @@ -193,6 +211,7 @@ function stateLabel(s) { play_ball: "\u30dc\u30fc\u30eb\u904a\u3073", seek_water: "\u6c34\u3092\u63a2\u3059", zunchi_sick: "\u305a\u3093\u3061\u75c5", + fight_sick: "\u55a7\u5629\u50b7\u75c5", system: "\u305a\u3093\u3061\u75c5", seek_friend: "\u4ef2\u9593\u3092\u63a2\u3059", follow_parent: "\u89aa\u306b\u3064\u3044\u3066\u3044\u304f", @@ -216,7 +235,8 @@ function reasonLabel(t) { if (t.state === "intimidate") return "\u76f8\u624b\u3092\u5a01\u5687\u3057\u3066\u3044\u308b"; if (t.state === "birth_ritual") return "\u5b50\u304c\u73fe\u308c\u308b\u524d\u306b\u4f53\u3092\u3086\u3059\u3063\u3066\u3044\u308b"; if (t.state === "seek_food") return "\u304a\u8179\u304c\u3059\u3044\u3066\u3044\u308b"; - if (t.state === "seek_water") return "\u305a\u3093\u3061\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b"; + if (t.state === "seek_water") return t.explosionDisease ? "\u7206\u767a\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u305a\u3093\u3061\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b"; + if (t.state === "fight_sick") return "\u55a7\u5629\u50b7\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; if (t.state === "zunchi_sick" || t.state === "system") return "\u305a\u3093\u3061\u75c5"; return "\u5468\u56f2\u3092\u898b\u3066\u3044\u308b"; } @@ -224,7 +244,7 @@ function reasonLabel(t) { function targetLabel(target) { if (!target) return "\u306a\u3057"; if (target.name) return target.name; - if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", bed: "\u5e72\u8349\u5bdd\u5e8a", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; + if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", sleep_drug: "\u306d\u3080\u308a\u85ac", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", fight_sick: "\u55a7\u5629\u50b7\u75c5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; if (Number.isFinite(target.x) && Number.isFinite(target.y)) return "\u30ab\u30fc\u30bd\u30eb"; return "\u4e0d\u660e"; } @@ -327,7 +347,54 @@ function hydrateLazyImages(root) { } } + +function applyToolTips() { + const tips = window.TEXT_CATALOG?.toolTips || {}; + if (!ui.toolPalette) return; + let pop = document.getElementById("toolTipPopover"); + if (!pop) { + pop = document.createElement("div"); + pop.id = "toolTipPopover"; + pop.className = "tool-tip-popover hidden"; + document.body.appendChild(pop); + } + const showTip = (btn) => { + const tip = btn?.dataset?.tip || ""; + if (!tip) return; + pop.textContent = tip; + pop.classList.remove("hidden"); + const rect = btn.getBoundingClientRect(); + const maxLeft = Math.max(8, window.innerWidth - 236); + pop.style.left = `${Math.min(maxLeft, Math.max(8, rect.left + rect.width / 2 - 110))}px`; + pop.style.top = `${Math.max(8, rect.top - pop.offsetHeight - 10)}px`; + }; + const hideTip = () => pop.classList.add("hidden"); + for (const btn of ui.toolPalette.querySelectorAll(".tool[data-tool]")) { + const tip = tips[btn.dataset.tool]; + if (!tip) continue; + btn.dataset.tip = tip; + if (btn.dataset.tipBound === "1") continue; + btn.dataset.tipBound = "1"; + btn.addEventListener("mouseenter", () => showTip(btn)); + btn.addEventListener("focus", () => showTip(btn)); + btn.addEventListener("mouseleave", hideTip); + btn.addEventListener("blur", hideTip); + } +} + +function renderEcologyCards() { + if (!ui.ecologyGrid || ui.ecologyGrid.dataset.ready === "1") return; + const cards = window.TEXT_CATALOG?.ecologyCards || []; + ui.ecologyGrid.innerHTML = cards.map(card => ` +
    + +
    ${escapeHtml(card.title || "")}

    ${escapeHtml(card.text || "")}

    +
    `).join(""); + ui.ecologyGrid.dataset.ready = "1"; +} + function openEcologyDialog() { + renderEcologyCards(); hydrateLazyImages(ui.ecologyDialog); ui.ecologyDialog?.classList.remove("hidden"); } @@ -411,7 +478,7 @@ function syncTopButtons() { if (ui.soundBtn) ui.soundBtn.textContent = audio.enabled ? "\u97f3 ON" : "\u97f3 OFF"; } -const SCALABLE_TOOLS = new Set(["zunchi", "sweet", "love_mochi", "fight_mochi", "grass", "stone", "firecracker", "fence_v", "fence_h"]); +const SCALABLE_TOOLS = new Set(["zunchi", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass", "stone", "firecracker", "fence_v", "fence_h"]); const SIZE_ORDER = ["small", "medium", "large"]; const SIZE_LABELS = { small: "\u5c0f", medium: "\u4e2d", large: "\u5927" }; @@ -455,7 +522,9 @@ function syncToolSizeBadges() { } function bindUI() { - uiCache.toolButtons = Array.from(ui.toolPalette.querySelectorAll(".tool")); + applyToolTips(); + renderEcologyCards(); + uiCache.toolButtons = Array.from(ui.toolPalette?.querySelectorAll(".tool") || []); syncToolSizeBadges(); ui.colonyChartTabs?.addEventListener("click", (e) => { const btn = e.target.closest("button[data-chart]"); @@ -496,6 +565,16 @@ function bindUI() { showToast(`${t.name}\u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002`); }); + ui.selectedInfo?.addEventListener("click", (e) => { + const btn = e.target.closest("[data-selected-action=\"favorite\"]"); + if (!btn || !world.selected || world.selected.dead) return; + world.selected.favorite = !world.selected.favorite; + uiCache.selectedSnapshot = ""; + renderSelected(); + render(); + showToast(world.selected.favorite ? "\u304a\u6c17\u306b\u5165\u308a\u306b\u3057\u307e\u3057\u305f\u3002" : "\u304a\u6c17\u306b\u5165\u308a\u3092\u89e3\u9664\u3057\u307e\u3057\u305f\u3002"); + }); + ui.pauseBtn?.addEventListener("click", () => { world.paused = !world.paused; const archiveStale = uiCache.archiveFamilyVersion !== (world.familyVersion || 0); @@ -599,6 +678,20 @@ function bindUI() { canvas?.addEventListener("contextmenu", (e) => e.preventDefault()); canvas?.addEventListener("mousedown", (e) => { + if (e.button === 0 && world.tool === "water_hose") { + const p = screenToWorld(e); + if (!p.inside) return; + e.preventDefault(); + uiCache.hosing = true; + uiCache.hoseMoved = false; + uiCache.hoseLastWorldX = p.x; + uiCache.hoseLastWorldY = p.y; + uiCache.hoseStartX = e.clientX; + uiCache.hoseStartY = e.clientY; + world.applyWaterHose?.(p.x, p.y, 0, 0, 0.10); + render(); + return; + } if (e.button === 0 && world.tool === "pinch") { const p = screenToWorld(e); if (!p.inside) return; @@ -641,6 +734,13 @@ function bindUI() { uiCache.panLastY = e.clientY; }); window.addEventListener("mouseup", (e) => { + if (uiCache.hosing) { + uiCache.hosing = false; + canvas.style.cursor = world.tool === "water_hose" ? "crosshair" : (world.tool === "observe" ? "default" : (world.tool === "pinch" ? "grab" : (world.tool === "poke" || world.tool === "delete" ? "pointer" : "crosshair"))); + world.rebuildSpatial?.(); + renderStats(); + return; + } if (uiCache.grabbing) { const target = uiCache.grabTarget; if (target) { @@ -669,6 +769,19 @@ function bindUI() { canvas.style.cursor = world.tool === "observe" ? "default" : (world.tool === "pinch" ? "grab" : (world.tool === "poke" || world.tool === "delete" ? "pointer" : "crosshair")); }); window.addEventListener("mousemove", (e) => { + if (uiCache.hosing) { + const p = screenToWorld(e); + const dx = p.x - (uiCache.hoseLastWorldX ?? p.x); + const dy = p.y - (uiCache.hoseLastWorldY ?? p.y); + uiCache.hoseLastWorldX = p.x; + uiCache.hoseLastWorldY = p.y; + const totalMove = Math.hypot(e.clientX - (uiCache.hoseStartX || e.clientX), e.clientY - (uiCache.hoseStartY || e.clientY)); + if (totalMove > 3) uiCache.hoseMoved = true; + if (p.inside) world.applyWaterHose?.(p.x, p.y, dx, dy, 0.10); + canvas.style.cursor = "crosshair"; + render(); + return; + } if (uiCache.grabbing) { const target = uiCache.grabTarget; if (!target || target.dead) { @@ -722,6 +835,10 @@ function bindUI() { }); canvas?.addEventListener("click", (e) => { + if (uiCache.hoseMoved) { + uiCache.hoseMoved = false; + return; + } if (uiCache.grabMoved) { uiCache.grabMoved = false; return; diff --git a/js/ui_charts.js b/js/ui_charts.js index b9cb768..68250be 100644 --- a/js/ui_charts.js +++ b/js/ui_charts.js @@ -3,6 +3,7 @@ function renderStats() { const alive = world.tarinai; const avg = (fn) => alive.length ? alive.reduce((a, t) => a + fn(t), 0) / alive.length : 0; + const environment = world.environmentScores ? world.environmentScores() : { security: 100, hygiene: 100, happiness: 100 }; const values = { pop: alive.length, dead: world.deadCount, @@ -10,7 +11,9 @@ function renderStats() { lonely: avg(t => t.loneliness), stress: avg(t => t.stress), lack: avg(t => t.lack), - events: { ...(world.eventCounters || {}) }, + security: environment.security, + hygiene: environment.hygiene, + happiness: environment.happiness, objects: { ...(world.itemCounts || {}) }, }; setTextIfChanged(ui.statPop, "pop", values.pop); @@ -35,18 +38,16 @@ function updateColonyHistory(values) { uiCache.chartBucketStart = -Infinity; uiCache.chartBucketEnd = -Infinity; uiCache.chartBucketAccum = null; + uiCache.environmentInitialRow = null; uiCache.lastChartDraw = ""; } - const eventKeys = ["birth", "death", "fight", "accident", "food", "grass"]; const objectKeys = ["grass", "zunchi"]; const makeBucket = (start) => ({ start, end: start + interval, count: 0, - sums: { pop: 0, hunger: 0, lonely: 0, stress: 0, lack: 0 }, + sums: { pop: 0, hunger: 0, lonely: 0, stress: 0, lack: 0, security: 0, hygiene: 0, happiness: 0 }, objects: Object.fromEntries(objectKeys.map(k => [k, 0])), - eventsStart: Object.fromEntries(eventKeys.map(k => [k, (values.events || {})[k] || 0])), - events: Object.fromEntries(eventKeys.map(k => [k, 0])), }); if (!uiCache.chartBucketAccum) { const start = Math.floor(t / interval) * interval; @@ -63,15 +64,16 @@ function updateColonyHistory(values) { lonely: bucket.sums.lonely / bucket.count, stress: bucket.sums.stress / bucket.count, lack: bucket.sums.lack / bucket.count, + security: bucket.sums.security / bucket.count, + hygiene: bucket.sums.hygiene / bucket.count, + happiness: bucket.sums.happiness / bucket.count, ...Object.fromEntries(objectKeys.map(k => [`obj_${k}`, bucket.objects[k] / bucket.count])), - ...Object.fromEntries(eventKeys.map(k => [`ev_${k}`, bucket.events[k] || 0])), }; history.push(row); if (history.length > maxPoints) history.splice(0, history.length - maxPoints); }; while (t >= uiCache.chartBucketEnd) { const b = uiCache.chartBucketAccum; - for (const k of eventKeys) b.events[k] = Math.max(0, ((values.events || {})[k] || 0) - (b.eventsStart[k] || 0)); pushBucket(b); uiCache.chartBucketStart = uiCache.chartBucketEnd; uiCache.chartBucketEnd = uiCache.chartBucketStart + interval; @@ -84,13 +86,14 @@ function updateColonyHistory(values) { bucket.sums.lonely += values.lonely || 0; bucket.sums.stress += values.stress || 0; bucket.sums.lack += values.lack || 0; + bucket.sums.security += values.security || 0; + bucket.sums.hygiene += values.hygiene || 0; + bucket.sums.happiness += values.happiness || 0; for (const k of objectKeys) bucket.objects[k] += (values.objects || {})[k] || 0; - for (const k of eventKeys) bucket.events[k] = Math.max(0, ((values.events || {})[k] || 0) - (bucket.eventsStart[k] || 0)); } function chartRows(values) { const bucket = uiCache.chartBucketAccum; - const eventKeys = ["birth", "death", "fight", "accident", "food", "grass"]; const objectKeys = ["grass", "zunchi"]; const preview = bucket && bucket.count > 0 ? { t: Math.max(world.time || 0, bucket.start || 0), @@ -99,8 +102,10 @@ function chartRows(values) { lonely: bucket.sums.lonely / bucket.count, stress: bucket.sums.stress / bucket.count, lack: bucket.sums.lack / bucket.count, + security: bucket.sums.security / bucket.count, + hygiene: bucket.sums.hygiene / bucket.count, + happiness: bucket.sums.happiness / bucket.count, ...Object.fromEntries(objectKeys.map(k => [`obj_${k}`, bucket.objects[k] / bucket.count])), - ...Object.fromEntries(eventKeys.map(k => [`ev_${k}`, bucket.events[k] || 0])), } : null; return uiCache.chartHistory.length ? [...uiCache.chartHistory, ...(preview ? [preview] : [])] : [preview || { t: world.time || 0, ...values }]; } @@ -112,8 +117,13 @@ function drawColonyChart(values) { const perf = world.performanceLevel ? world.performanceLevel() : 0; const minInterval = perf >= 3 ? 2600 : perf === 2 ? 1800 : perf === 1 ? 950 : 0; if (minInterval && uiCache.lastChartDrawAt && now - uiCache.lastChartDrawAt < minInterval) return; - const rows = chartRows(values); const mode = uiCache.chartMode || "population"; + if (mode === "environment" && !uiCache.chartHistory.length && !uiCache.environmentInitialRow) { + uiCache.environmentInitialRow = { t: world.time || 0, ...values }; + } + const rows = mode === "environment" + ? (uiCache.chartHistory.length ? uiCache.chartHistory : [uiCache.environmentInitialRow || { t: world.time || 0, ...values }]) + : chartRows(values); const last = rows[rows.length - 1] || values; const series = chartSeries(mode); const seriesSnapshot = series.map(s => `${s.key}:${Math.round(Number(last[s.key] || 0) * 10)}`).join(","); @@ -123,7 +133,7 @@ function drawColonyChart(values) { uiCache.lastChartDrawAt = now; const cssW = Math.max(280, Math.floor(chart.clientWidth || chart.offsetWidth || 320)); const cssH = Math.max(160, Math.floor(chart.clientHeight || chart.offsetHeight || 188)); - if (mode === "events") return drawEventsChart(chart, rows, cssW, cssH); + if (mode === "environment") return drawEnvironmentChart(chart, rows, cssW, cssH); const pad = { l: 30, r: 12, t: 12, b: 24 }; const w = cssW - pad.l - pad.r; const h = cssH - pad.t - pad.b; @@ -150,22 +160,20 @@ function drawColonyChart(values) { if (ui.colonyChartLegend) ui.colonyChartLegend.innerHTML = series.map(s => `${s.label} ${formatChartValue(s.key, rows[rows.length - 1] || values)}`).join(""); } -function drawEventsChart(chart, rows, cssW, cssH) { - const series = chartSeries("events"); - const weekRows = rows.slice(-7 * 12); - const counts = series.map(s => ({ ...s, value: weekRows.reduce((sum, row) => sum + Math.max(0, Number(row[s.key] || 0)), 0) })); - const total = Math.max(1, counts.reduce((a, b) => a + b.value, 0)); - const pad = { l: 68, r: 16, t: 12, b: 16 }; +function drawEnvironmentChart(chart, rows, cssW, cssH) { + const series = chartSeries("environment"); + const row = rows[rows.length - 1] || {}; + const pad = { l: 58, r: 18, t: 16, b: 18 }; const barW = cssW - pad.l - pad.r; - const rowH = Math.max(18, (cssH - pad.t - pad.b) / counts.length); - const bars = counts.map((s, i) => { - const y = pad.t + i * rowH + 4; - const pct = s.value / total; - const bw = Math.max(2, barW * pct); - return `${s.label}${s.value}\u4ef6 / ${Math.round(pct * 100)}%`; + const rowH = Math.max(30, (cssH - pad.t - pad.b) / series.length); + const bars = series.map((s, i) => { + const y = pad.t + i * rowH + 6; + const v = clamp(Number(row[s.key] || 0), 0, 100); + const bw = barW * v / 100; + return `${s.label}${Math.round(v)}`; }).join(""); - chart.innerHTML = ``; - if (ui.colonyChartLegend) ui.colonyChartLegend.innerHTML = `1\u9031\u9593\u306e\u5272\u5408 / \u4ef6\u6570`; + chart.innerHTML = ``; + if (ui.colonyChartLegend) ui.colonyChartLegend.innerHTML = series.map(s => `${s.label} ${formatChartValue(s.key, row)}`).join(""); } function chartSeries(mode = "population") { @@ -179,13 +187,10 @@ function chartSeries(mode = "population") { { key: "obj_grass", label: "\u8349", color: "#5b9d61" }, { key: "obj_zunchi", label: "\u305a\u3093\u3061", color: "#6f8a3f" }, ]; - if (mode === "events") return [ - { key: "ev_birth", label: "\u8a95\u751f", color: "#73b94b" }, - { key: "ev_death", label: "\u6b7b\u4ea1", color: "#5b534b" }, - { key: "ev_fight", label: "\u55a7\u5629", color: "#d65e46" }, - { key: "ev_accident", label: "\u4e8b\u6545", color: "#e28836" }, - { key: "ev_food", label: "\u98df\u4e8b", color: "#76b94d" }, - { key: "ev_grass", label: "\u8349", color: "#489443" }, + if (mode === "environment") return [ + { key: "security", label: "\u6cbb\u5b89", color: "#d65e46", percent: true }, + { key: "hygiene", label: "\u885b\u751f", color: "#6f8a3f", percent: true }, + { key: "happiness", label: "\u5e78\u798f", color: "#d98bc0", percent: true }, ]; return [{ key: "pop", label: "\u500b\u4f53", color: "#5d8ee6" }]; } diff --git a/js/world.js b/js/world.js index 1bac9c4..fbb6ffa 100644 --- a/js/world.js +++ b/js/world.js @@ -274,12 +274,12 @@ class World { } toolSizeFor(type = "") { - if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "zunchi"].includes(type)) return "medium"; + if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return "medium"; return (this.toolSizes && this.toolSizes[type]) || this.toolSize || "medium"; } toolSizeScale(type = "") { - if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "zunchi"].includes(type)) return 1; + if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return 1; return { small: 0.68, medium: 1.0, large: 1.48 }[this.toolSizeFor(type)] || 1; } @@ -290,7 +290,7 @@ class World { item.toolSize = size; this.toolSize = size; item.r *= scale; - if (["sweet", "love_mochi", "fight_mochi", "grass", "zunchi"].includes(item.type)) item.amount *= scale * scale; + if (["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass", "zunchi"].includes(item.type)) item.amount *= scale * scale; if (item.type === "firecracker") item.blastScale = scale; return item; } @@ -905,6 +905,7 @@ class World { for (let r = 0; r < 4; r++) { this.effects.push(new Effect("ring", x, y, { size: 30 + r * 24, life: 0.48 + r * 0.11, color: r % 2 ? "rgba(255,116,62,0.78)" : "rgba(255,240,124,0.88)" })); } + this.blastZunchiFrom(x, y, blastRadius * 0.92, it.blastScale || 1); for (let i = 0; i < 34; i++) { const a = Math.PI * 2 * i / 34 + rand(-0.10, 0.10); const speed = rand(90, 260); @@ -950,6 +951,7 @@ class World { t.blastSpinTimer = Math.max(t.blastSpinTimer || 0, 1.35 + p * 0.70); t.blastSpinMax = Math.max(t.blastSpinMax || 0, t.blastSpinTimer); this.spawnFallEffect(t.x, t.y + t.radius * 0.45, 1.1 + p); + if (!t.dead && p > 0.22 && Math.random() < 0.035 * p) t.infectExplosionDisease?.(it); if (!t.dead && Math.random() < 0.45) this.spawnBubble(t.x, t.y - t.radius * 1.35, "\u306f\u3041\u3041\u3041\uff01", "rgba(84,66,86,0.80)"); } let blastedBalls = 0; @@ -983,6 +985,79 @@ class World { this.log(blastedBalls ? "\u7206\u7af9\u304c\u6d3e\u624b\u306b\u306f\u3058\u3051\u3001\u30dc\u30fc\u30eb\u304c\u6025\u52a0\u901f\u3057\u305f\u3002" : "\u7206\u7af9\u304c\u6d3e\u624b\u306b\u306f\u3058\u3051\u3001\u5ead\u304c\u3056\u308f\u3064\u3044\u305f\u3002", "accident"); } + explodeDiseaseTarinai(t) { + if (!t || t.dead) return; + const x = t.x, y = t.y; + const blastRadius = 190; + t.explosionDisease = false; + t.explosionDiseaseTimer = 0; + this.effects.push(new Effect("explosion", x, y, { size: 72, life: 0.82, color: "rgba(255,176,68,0.88)" })); + this.effects.push(new Effect("ring", x, y, { size: 58, life: 0.52, color: "rgba(255,238,132,0.82)" })); + this.blastZunchiFrom(x, y, blastRadius * 0.92, 0.82); + for (const o of this.tarinai) { + if (!o || o.dead || o === t) continue; + const dx = o.x - x; + const dy = o.y - y; + const d = Math.hypot(dx, dy) || 1; + if (d > blastRadius) continue; + const q = clamp(1 - d / blastRadius, 0, 1); + o.damage(4 + q * 15, "\u7206\u767a\u75c5"); + o.addStress ? o.addStress(16 * q, { threshold: 8 }) : (o.stress = clamp(o.stress + 16 * q, 0, 130)); + o.vx += dx / d * (120 + q * 260) + rand(-34, 34); + o.vy += dy / d * (120 + q * 260) + rand(-34, 34); + o.hurtTimer = Math.max(o.hurtTimer || 0, 1.2 + q); + o.fearTimer = Math.max(o.fearTimer || 0, 1.0 + q); + if (!o.dead && Math.random() < 0.020 * q) o.infectExplosionDisease?.(t); + } + t.die("\u7206\u767a\u75c5"); + audio.explode(); + this.log(`${t.name}\u306f\u7206\u767a\u75c5\u3067\u7206\u767a\u3057\u305f\u3002`, "accident"); + } + + applyWaterHose(x, y, dx = 0, dy = 0, dt = 0.08) { + const radius = 96; + const speed = Math.hypot(dx, dy) || 1; + const nx = speed > 1 ? dx / speed : Math.cos(this.time * 9.1); + const ny = speed > 1 ? dy / speed : Math.sin(this.time * 7.7); + let cleaned = 0; + for (const it of this.nearbyItems(x, y, radius + 80)) { + if (!it || it.dead) continue; + const d = distXY(it.x, it.y, x, y); + if (d > radius + (it.r || 12)) continue; + const p = clamp(1 - d / (radius + (it.r || 12)), 0, 1); + if (it.type === "zunchi" || it.type === "splat" || it.type === "trace") { + it.amount -= dt * (it.type === "zunchi" ? 230 : 180) * (0.35 + p); + cleaned += p; + } + } + for (const ef of this.effects || []) { + if (!ef || ef.dead) continue; + if (ef.type !== "bleed" && ef.type !== "splat") continue; + const d = distXY(ef.x || 0, ef.y || 0, x, y); + if (d > radius + 22) continue; + const p = clamp(1 - d / (radius + 22), 0, 1); + ef.life = Math.min(ef.life || 0.1, Math.max(0.01, (ef.life || 0.1) - dt * (1.6 + p * 5.0))); + cleaned += p * 0.55; + } + for (const t of this.nearbyTarinai(x, y, radius + 70)) { + if (!t || t.dead) continue; + const d = distXY(t.x, t.y, x, y); + if (d > radius + t.radius) continue; + const p = clamp(1 - d / (radius + t.radius), 0, 1); + t.vx += nx * (95 + 165 * p) + rand(-10, 10); + t.vy += ny * (95 + 165 * p) + rand(-10, 10); + t.surpriseTimer = Math.max(t.surpriseTimer || 0, 0.24); + t.applyWaterEffect?.(dt * (1.0 + p * 1.8), "hose"); + } + if (Math.random() < 0.72) { + this.effects.push(new Effect("ring", x + rand(-18, 18), y + rand(-12, 12), { size: rand(8, 22), life: rand(0.18, 0.32), color: "rgba(128,204,238,0.60)" })); + } + if (cleaned > 0.25) { + this.drawListDirty = true; + this.updateItemCounts(); + } + } + spawnZunchi(x, y) { const zunchiLimit = CONFIG.zunchiLimit ?? 56; if ((this.itemCounts.zunchi || 0) >= zunchiLimit) { @@ -1061,7 +1136,7 @@ class World { } isSleepFurniture(it) { - return Boolean(it && it.type === "bed"); + return Boolean(it && (it.type === "bed" || it.type === "nest_box")); } bedOccupancy(bed) { @@ -1672,6 +1747,84 @@ class World { this.tarinai.length = write; } + + environmentScores() { + const alive = this.tarinai || []; + const avgStress = alive.length ? alive.reduce((sum, t) => sum + (t.stress || 0), 0) / alive.length : 0; + let fightPressure = 0; + let diseaseCount = 0; + for (const t of alive) { + if (!t || t.dead) continue; + if (t.state === "fight") fightPressure += 16; + if (t.state === "intimidate" || (t.intimidateTimer || 0) > 0.04 || (t.intimidatedTimer || 0) > 0.04) fightPressure += 7; + if ((t.hurtTimer || 0) > 0.04 || (t.lastBleedAt || -999) + 30 > (this.time || 0)) fightPressure += 5; + if (t.zunchiDisease || t.sleepDisease || t.explosionDisease || t.fightDisease) diseaseCount += 1; + } + let blood = 0; + for (const ef of this.effects || []) if (ef && !ef.dead && (ef.type === "bleed" || ef.type === "splat")) blood += 1; + const zunchi = this.itemCounts?.zunchi || 0; + const splat = this.itemCounts?.splat || 0; + const trace = this.itemCounts?.trace || 0; + const security = clamp(100 - fightPressure - blood * 1.6, 0, 100); + const hygiene = clamp(100 - zunchi * 2.0 - splat * 1.2 - trace * 0.30 - blood * 1.8 - diseaseCount * 8.0, 0, 100); + const happiness = clamp(100 - Math.max(0, 100 - security) * 0.32 - Math.max(0, 100 - hygiene) * 0.24 - avgStress * 0.42, 0, 100); + return { security, hygiene, happiness }; + } + + observeHighlightKind(t) { + const s = this.selected; + if (!s || !t || t === s || t.dead) return ""; + if ((s.parents || []).includes(t.id)) return "parent"; + if ((s.children || []).includes(t.id)) return "child"; + const rel = s.relationTo ? s.relationTo(t.id) : null; + if (rel && (rel.fear || 0) >= 8) return "enemy"; + if (rel && (rel.affinity || 0) >= 10) return "friend"; + return ""; + } + + nestBoxOccupants(box) { + if (!box || box.dead || box.type !== "nest_box") return []; + return this.tarinai.filter(t => t && !t.dead && t.insideNestBoxId === box.id).slice(0, 12); + } + + pointerNestBoxInfo() { + const p = this.pointer; + if (!p?.inside) return null; + let best = null, bestD = Infinity; + for (const it of this.nearbyItems(p.x, p.y, 140)) { + if (!it || it.dead || it.type !== "nest_box") continue; + const d = distXY(p.x, p.y, it.x, it.y); + if (d < bestD && d <= Math.max(80, it.r * 2.1)) { best = it; bestD = d; } + } + if (!best) return null; + const occupants = this.nestBoxOccupants(best); + return { box: best, occupants }; + } + + blastZunchiFrom(x, y, radius, strength = 1) { + let moved = 0; + for (const it of this.nearbyItems(x, y, radius + 60)) { + if (!it || it.dead || it.type !== "zunchi") continue; + let dx = it.x - x; + let dy = it.y - y; + let d = Math.hypot(dx, dy) || 1; + if (d > radius) continue; + if (d < 0.001) { + const a = rand(0, Math.PI * 2); + dx = Math.cos(a); dy = Math.sin(a); d = 1; + } + const p = clamp(1 - d / radius, 0, 1); + it.vx = (it.vx || 0) + dx / d * (130 + p * 430) * strength + rand(-45, 45); + it.vy = (it.vy || 0) + dy / d * (130 + p * 430) * strength + rand(-45, 45); + it.amount = Math.max(10, (it.amount || 80) - p * 8); + it.stage = "fresh"; + moved += 1; + if (moved < 12) this.effects.push(new Effect("zunchi_miasma", it.x, it.y - 4, { vx: (it.vx || 0) * 0.15, vy: (it.vy || 0) * 0.15 - 18, size: rand(9, 18), life: rand(0.36, 0.62), color: "rgba(58,102,38,0.48)" })); + } + if (moved) this.drawListDirty = true; + return moved; + } + update(dt) { if (this.paused) return; dt *= this.speed; @@ -1753,9 +1906,9 @@ class World { } } - if (this.weather === "light_rain" && (this.itemCounts.water || 0) < 7 && Math.random() < dt * 0.035) { + if (this.weather === "light_rain" && (this.itemCounts.water || 0) < 24 && Math.random() < dt * 0.12) { const drop = new Item("water", rand(58, this.w - 58), rand(58, this.h - 58)); - drop.amount = rand(18, 40); + drop.amount = rand(24, 58); this.items.push(drop); this.itemCounts.water = (this.itemCounts.water || 0) + 1; } @@ -1912,14 +2065,14 @@ class World { this.compactItems(); this.updateItemCounts(); this.rebuildSpatial(); - const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[best.type] || best.type; + const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", sleep_drug: "\u306d\u3080\u308a\u85ac", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[best.type] || best.type; this.log(`${label}\u3092\u524a\u9664\u3057\u305f\u3002`, "observe"); return; } const itemType = { - zunchi: "zunchi", sweet: "sweet", love_mochi: "love_mochi", fight_mochi: "fight_mochi", water: "water", grass: "grass", - stone: "stone", bed: "bed", ball: "ball", firecracker: "firecracker", fence_v: "fence_v", fence_h: "fence_h" + zunchi: "zunchi", sweet: "sweet", love_mochi: "love_mochi", fight_mochi: "fight_mochi", sleep_drug: "sleep_drug", water: "water", water_bowl: "water_bowl", grass: "grass", + stone: "stone", bed: "bed", nest_box: "nest_box", ball: "ball", firecracker: "firecracker", fence_v: "fence_v", fence_h: "fence_h" }[tool]; if (itemType) { let px = x, py = y; @@ -1945,7 +2098,7 @@ class World { } const placed = this.placeItem(rawItem, true); if (!placed) return; - const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5" }[itemType]; + const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", sleep_drug: "\u306d\u3080\u308a\u85ac", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5" }[itemType]; this.log(`${label}\u3092\u914d\u7f6e\u3057\u305f\u3002`); } } @@ -1968,6 +2121,10 @@ class World { const entry = { time: this.time, text, kind: kind || this.inferLogKind(text) }; if (!this.eventCounters) this.eventCounters = {}; this.eventCounters[entry.kind] = (this.eventCounters[entry.kind] || 0) + 1; + for (const t of this.tarinai || []) { + if (!t || !t.name || !text || !String(text).includes(t.name)) continue; + if (t.addRecord) t.addRecord(text, entry.kind); + } this.logs.unshift(entry); this.logs = this.logs.slice(0, 100); renderLog(this.logs); From aea08dc3fb2a163d939a0b54817a6cff9d3908f0 Mon Sep 17 00:00:00 2001 From: 33333-33333 Date: Sat, 20 Jun 2026 15:55:52 +0900 Subject: [PATCH 2/5] fixed issues --- assets/sprites/_contact_sheet.png | Bin 398420 -> 0 bytes assets/sprites/manifest.json | 175 ---------- assets/ui/ecology_hp_stress.png | Bin 0 -> 14740 bytes assets/ui/tool_ball.png | Bin 0 -> 1568 bytes assets/ui/tool_fight_mochi.png | Bin 0 -> 1470 bytes assets/ui/tool_love_mochi.png | Bin 0 -> 1033 bytes assets/ui/tool_nest_box.png | Bin 0 -> 3135 bytes assets/ui/tool_pinch.png | Bin 0 -> 1381 bytes assets/ui/tool_sleep_drug.png | Bin 0 -> 4292 bytes assets/ui/tool_water_bowl.png | Bin 0 -> 1284 bytes assets/ui/tool_water_hose.png | Bin 0 -> 1120 bytes css/styles.css | 152 ++++++++- docs/prompt.txt | 485 ++++++++++++++++++++++++++ index.html | 55 +-- js/health.js | 20 +- js/items.js | 138 +++++--- js/render.js | 106 +++++- js/sim.js | 3 - js/tarinai.js | 80 +++-- js/text_catalog.js | 33 +- js/ui.js | 39 ++- js/ui_charts.js | 7 +- js/ui_exports.js | 3 - js/ui_family.js | 294 ++++++++++------ js/world.js | 548 ++++++++++++++++++++++++------ 25 files changed, 1625 insertions(+), 513 deletions(-) delete mode 100644 assets/sprites/_contact_sheet.png delete mode 100644 assets/sprites/manifest.json create mode 100644 assets/ui/ecology_hp_stress.png create mode 100644 assets/ui/tool_ball.png create mode 100644 assets/ui/tool_fight_mochi.png create mode 100644 assets/ui/tool_love_mochi.png create mode 100644 assets/ui/tool_nest_box.png create mode 100644 assets/ui/tool_pinch.png create mode 100644 assets/ui/tool_sleep_drug.png create mode 100644 assets/ui/tool_water_bowl.png create mode 100644 assets/ui/tool_water_hose.png create mode 100644 docs/prompt.txt delete mode 100644 js/sim.js delete mode 100644 js/ui_exports.js diff --git a/assets/sprites/_contact_sheet.png b/assets/sprites/_contact_sheet.png deleted file mode 100644 index 8d2ed9e44e1c447bdd08c29c9241603126a7eef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398420 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%0Ao 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%0A69!#TQ)}4jvLfthG~XYA7Np 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 z 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® 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 C{obVj literal 0 HcmV?d00001 diff --git a/assets/ui/tool_pinch.png b/assets/ui/tool_pinch.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad3cf1a5e0a941e3e2c2957438fac1784f27daf GIT binary patch literal 1381 zcmV-r1)BPaP)q(2pMP`v_498Q0+j7kU=NuRHT#Q zAE09g#Za&|V3R?iK{C063KFgZbK*Wb`@Hw#+k3Ac2%7uI;jVSQeb2e^1Rx?JA|fIp zA|fIpA|fIpA|fIpA|fIpA|fK9$Q%g00g~OnaQ;Qx`(AtW^t8)uafJoYbP2smOl4pJ zcG(DC7ef(P0Mv(n_0FwRO^^Ti`ybY-Zj)Yu>Ol6QwMd@7gb2xorIU z=9~W~o3CD;>-)SVh9cQM(y&2%0bC!hnOG}91Vk?ZYWPDA*M7Nq{Tu*%_UVC9<>N+2 zF&<&G`Fdjld?>;A_{nEow|U>T)GP%OmI1L7pwqkkBePHT{?vH4Go4h8e-jszK-w}O zvH+dNzKu6+it*fRX-cHN9EdD{%4hfmy#y%}SAf=|-%t$n#4VcL9LTC1|sU zryja0{sI8yLoq`c{#^g(x4MVt6u2&p0;sk(=5rtGU8Gll3TIEuT?DFsA~;vc7C_z0 zi~kcq`z3iIh$FteBnv?8u>hH40W!w|WR3;sX>noc$I#ngL$Zf~Hlz}Ao$Ly*y1Y_4 z8PpW=gNOHS*!=!=*AxsPivs-d*XvTqiwjGo+ii#3R_Om33?x*5rak%WiMhRyc{=!` zWC{S(@5$=vV0{_zMcViW5;_WK8spOTdI{qnNT>i^`Tl@N;@%HrRsekp_$qwWPT zMhq0^5dJ$xX70swxm7NTBJT+yijF$7-_ zSpXnh3AAy33@yWtDRh7g<-f1|ZjoDJCqO|h z!OnDg==$B;$6b7%pT4_Y3ik2Z`Zs-^C$@r!Ex^|&zuXJ@+f!ftuHI(51h&GjBDoY| z3ZMpVqL%;|UIaaOz<&59k_r*508N3Lm`YG+TLx3;1s~y?ge-*j0`v)9Rab%`LWQpi zQ3P)V7#h6JRuLowuk%?1F9on2zOHK-B!;f@RRZS)a2$RB~eTPbSV`=Qs6qV1u%)B6q3U>iK+lid=wl7{5 zE&$+8Fx1nv3eH)fVSV|mTcB%ndcd~EhNKScMDp5~NYz*kJwD!6r&n^45wRAHL4>G= znWAbN`&sY%_Ddt)!%Pt&y3K?p4@a85evrVcW@^3jsnEzS_(|B;-`Bq0n|!`Hb?6S$ zo4tY0T!_mtJ@rbG!PpJl-VWGiTvGyGNE`lt>qIAmHg(ayS|5bZ%Bmk8qDsAmS#qG6 zfuSEZC@?;ez;zEK0|tQXGE%ovNz2h6tmXxpr+wSE0RaR0?mll&=;CzwvUPXo9lR)X z#|E#((g4esU|weViA3UH{dQi%Qop#e?86(4_5sFd=+u!ux1BNBAo)B}B?bA^7;s5B`$@Am5by#3;5dk1>we2h@Qzd8z`UGwJUheRA z#GMuDz(wFLu+AG4t`u?g@EiMQd`Z}o-a~ei>0HhG;2dzDaD-XYBd-PjIC#+U%QVoa zW3x7p&%@3UW%p=Y5=wpyV7N<15_DD$mx^~@4%+P9Apo97yGK(IenPS5c#Gm%CC9u@ zwzfTE!f$amsN6~$ZyHJRG{H12NP009dHzeGa5S2-lMOJ}W>GDyKvtuH=K&SlvY0wQUV|r`Hz`g;lJ@veFhEEH23R0^tqs zd->1s9c5%ZdJ)v4?Qzk7o%e>s2hzs7$jzp_$%Dm}yi6yn!nYkl;>v2(5jwmB^V4A9 z@uyYOjE_}=6Mii37Tvcm?k$aD`L)BJjy*kV;gADTu@wvEnoa@QkW?n1tju1$aeNUY zwiEnk`bS%9qi7YYeh(l8j=Eb}_0rCBV(ssMZBNB!Xr?IMcz8dZXYC?Bq{d@G!r*+2 z@b(G=8miS(R?wt`_}*PRr;q{y5Ott0Ed5kSFkI~iapkL*9C*$q%=<2h8CD1tnpbX0 z5{)mk|Ac!^AT&|l-v-54*7U&D3Wk22c$zKT$b>+0Kh+sxo|A}J$5UQdVz&!P2lqCg z*R!iM9o5`-079aDIOeF#Ur;t8Q0hTFu(7Ta9Ybhkv|0D<+TmV5(1C_b3AT zrCF+dv`3XV>Ypqm5uGKATb~a!$`#5o9tK=N<4I2=TtWlh9K9#4TzfR_(nH&&RD1Cg zigO&<{($&^oz3$MuWV@z}IY7Z>f~w3ws0@+z$6NL;Yh52uJg-fe^L4-`+OLs! zxQ@hV+!LbM`wP8%J|=k?ILN3~^D!rr3eyAS8cvC*)9kzITVi8}?~3i@3lP#`@RR((jD$D9haK)Vz$VCXa&SHS5;j&Z@uoWEkeQ*o438 z@uiRB@Hw-Z>rAVFbSh$Ws(;Sg?_t)koBxAv`u?}lwr8vOl(^Rbkha3^z(HGC*0uDC zu>i`C_@}>Oh^p9|?<-ctGcw~207r2?UP8@_7W1%sM-w^)<;)2E15q+xeBlG9NzU|E z^XB1U5y#5VI}2-yy}D0o&Ya;4o(bas>{O??e@EqN>I&MY zy}}Nby|bihwCsF)#bsr}1XxQT3n7t-Iar@yKdXaNQ+ac*Ws4#C#dBUnw9{90_Fo<~ zXfwXyne{*w{kB$LRE&1$=76F5Ez@qHkYbN;7v|7)aXx-^C6rClCH2t!9%}FquQ*ay znpLn9yDdL<1tLD!i#s<3wrU6P8Fk>wlS$fWV;&}R>C@{(tb?OXLeB_IDAw8HTCqm| z%8mvE#mQZ}{z0z7p(+IPSlLZ5{*D$CeIW2hL&&^0xIXfRK1y3s;I!QhTeZ zYi>oL{=u*uIFqQnalLTmf(OeTk?|+{_p!Y3`8ui!)yi_)a_Y*K_q@=VD9(Qm3(GDJCuLBz(3`~+gput=5?N%?0pNi~m( z07^f3AC&s)X&<=?RLGpvcCNmc(DBUZ$pT1C_s?e?2Ixu1+@8#; z(SBpk@35V_+jZG6fKE4t>1x%t>K8#dvv9km8a}oPl6;a7M;3@v=BG4M%a=llTXhf* zcAzw*VOhuxcU@h{hi_(M`{lR3O}mnk=C6eh`E75ehp!UdyR5O*@I)6*)?3%E(D#iy zW;sjrId%&nU`S01Y-bB~#`J zGeM2j!ic}gs`m1@><_#Uz>yg2rg%Y*xjnZ1+2ZbZHJ4!5cerAzjD-UW0IWK?{FUXY z78J}aSBZ_Iz24eM_Hl{{pKM#7&HQ*n(SjkW7rTS=@m|}xK7QZ|K*)EL2Qfxy*?DWD zGGPs+8EcQOTlho)p70wPX7OfMefkDxR?!bFqs(qU@A;mk(Cq6e{Z#CPB70;cO$Sp! z%W_G+4;ClSCoS$Ry(36o;sE>R-6)~ZQj+1Wl- z9TsXL)-YX+x&q-*cd5@7ao0*;A+|6}R@TzCW8J}mhH$ZdFTel6K+rOF-kIAGhzDK& zFrh3FwYY(u7}xCS$wCi9=1^nB-LkS&@_3R1FD>!DDHY9YIsxem9ujH5jJ^4LAc?h6OC4?8 zZ%g3_-7>MHl+dX}xiWDek+q#{MNJt2sl_!c{;WoojlAj=xND@t(8B*@{=F5*u`V&C zb341~o&8`rf3`7in8;sah$i#$-kXB2Xeu8!51t2LwRF0zeS&N#M@|1^L97cb0Wmv;6fA8U-pO0Myxgbwe-sKQQ0*X^^L zRrCe!4jEGD5$Sdk1_LP+mppg+OFQ+9i{$<1QTtv%h?S;e-A3=`EP+MXpUhAI*mNkm z0d5m~`ous?y=s(HftfVl@E<4bf?!5_4$~V(N|&LHa9{8!egBV9(-K?sY`c$VCX3Rs z;xLi%&%4=uYzcK4ZXAHRPM<^;MRRb9l3Z)s-BR%0^U>V#ZvN;_TlFMJofZ)rL_6}X zmr}>wOuG|*YUhBm7h-BkM`5n4wH95zyst)l^`^Ca`rhv0Ay%m9khUkEc#4_q0yQ!dxZmu@PY0d1G@m1a}2tHFPAO6j{vaCuBYL~}=w z9m$P;$5P=6Z=V zVsD}R7>Sb@+6kcReK+Y-*6|1EB!{2}l*`Ba8$XL4=WP^`Z z;F$1cA6v_kDdD8DEJ?B>Q0(Fr`gmdLJLy$TkSCf?7U9K z;2l(3YJc0*%&|BpgXaC{Gk-djQds~ej!JO;$m{TgsG^V!MbpxNnZELGEWhGQoE@x` z8~V_yk~-&u=K_@?S1@J@Fn*?557f=W1XKDCVb(=OeLVMZ@MAW`I-k)-##d?Yxrc}O zU|+w-tr;yBRo(iYvqF(BRu8N0*}^O!<&D(P6sC#46> z;a#ffr3`cPE1um^KbD=uuGS~!zR3$`-Z|sM%K%B;C$*)?Dn&+|&Rc)?9juHlP_f;BoVgVrI zV{?b_2uEk_SP{hYaPV^?Rh|?)&-i$D_ruU?DI3)7mQjt2m5TR+xfGvq@XhG^6IR1N z&(49^$8VEc65;6;rX3iD{y0?J9I8oCJi-|FT+`}`jVhi?t!u28zc#pZj-M9zly?1% zg}K+uQH1svwRLNSs#0&ei)Cy3QdI`$k@xP|UnN)<*mWZ$VrTsEuH2~_0J;ga9r>NK zIq^Pj^tGO07a-kKqV8G54|DBVXW7!4pi-X+uMcLL?60v}t04iH(vmY?8M36;j<5rm zGxhkZR;3C~U0D+Gj1q2couh7_p)n?dsJja-#W&-ARQRXZfDAe=IK$xHCUfO37!2tc z*cdZqxgh^3(4yEs;Hhzs17BPqsaRG>$^F)}QN)aNGXEeLYkk$-Ms0BtH$9s00n!#I zGpTgG%(CD8h)!F}6pE^a>6BHh0Li(2et`-<)=Z?wA33}1*`?Mac2Y*XIKa!ZLbSYLZMfl|kofmTbJvi&NXtL2oBs02yqyLV=j~j83zi z(WYpgWrM(pKa$q_^AWq+TW7Wu6WppQB5jP07_X-S9|s*k{kx+s6f8*1ZUach(b2`R zZLoHRknX_86i@^Ctp>2L#vqUkI$B}91&9;1;?qnJm zV^QT_a}q#vU)t#>(;LkqlK;8TT6P^D?OKI56kWRf3b+p*&T+F*gfY2i4Vavz-AL($ t?py7J0VXo`Kj(d*_W$Rfzt_5_E!fa>wUVq`RF(Kszr4Qlv_e%0dvdQ?RhJ3$e7bvWOyj z5lQ7gf~2rALb?=Tl5w2fo!K+r%r|>}PjxxUJ-hS1JF{ocu8IHv000000000000000 z00000000000000000000000`>)p`T8o&EmTA6NYy53YT4rNp*aw5S4<2s_nMO3`%z zY6d=~*FtnxfZWi(Ja+u#s_*%3=jr2|zu!|Cx+p+u=q18Vm0AkxWiVZUso-k{K4q#9 zR*PV^07K#Xq2K-Ps~6#)Z{2>iskvP#hRR^E1m+4bH~0`mNMou1vGBubJ|%p|LJ36T zMX*u=GX)64kFD=H;X77JAo6(;ERkSY|3x5g1{jzW!qj>?=C49$P37Qq)!nqR< zFPuB^(0^^|;XC1e#>S$SCIxUi`|{Y&zqr>@!p~jLEv^3{e}COLv?#$BHQ%hn4sP9k zwb{$Zz&YF)-MRndOpW)e_9-9?KlkX5v3emWhyTgo@Xk-)`hQlV1nM(@=CsyZ*tu%V z2CC-(txjx~Mspn13NW_O=T99tr1ic%8ygp`5~vh_@aL;tg5m{84gd0I z!ryOyJZhGp+I0Yq{5-YBt7rj++Bvi{>pTk#9sRzcaVt3s6e~b(_%Z8Jf}H)-E`jP2 zkP?2_{-u{7+`plt->118H2*eGWPM67Cwy&1E(OP?qdBd;@%N?c;cH9yhA>v>IpN=X z^!9c5+NxIxP0RpJY*60qJbm2jj4-tA7LI(U>bHR@+~9<>fg8vkW`v=_S_~aHLvR>_X638~qj|-PpL5x=*m^l|X-^ z!s!aD@yD~|O`@uog8hwV7RWQU_Lo$=04xQot1?Qa}mDh2x_&^*gFh2KgTi z{f~tr|Lz#~3I6ZiqqnbPW8{9;dN@S=(Xg=+h){%B@FI1>7isWp;MmTtQxV+F9b@BB z?!^Yl??NWh3seFKNfw<2h5CzI1=*b1l0jMI;goXkkggX>`3sNK- z4XYh{c6a8zH#`4d1u|mR^S*sMvuisC0000000000000000000000000N;1~L?Pc`Q@%Li+$>_{Hz~9m5q70OUgeDpy1R+Sh#606-!pb^)yL^{8J0SmEnZ z4M3>agg}mZ2k`vVK7blo3V?HeLqHI=m>(?e=Ld`XRR2$X5!li0{|DggaPL_7a7^+G zzW3_Q+s)&{`u6f-KgIu64}f#syMX0tbK?I^C=65GL9~nBemzwPOax#TKMZ~lx)zHi zhhSIHeW?QQa_m2l&=h^S+MG0Dn9}8;Dg3UY=TJlkXlq>_KKrkg(gFIM?Om$61cbz{ z6Ra3p^tKcsC^`VX&^jR`K0D`I>ZEF3dMIWO#nm}ff8Fbf5F)Gx<>IW6YBsL zwruU%XW*5-B6)bwoSF8BaWA&waA0X7Gw@IbIujD z2pqcx7!sI&V;%b)KqCNmH`nV_mw?GV3&?4?+MHMjfOF$Rkm{`WnYtC6W0zq4=1{DZ zXT8tN=K=U=ShvmN!#Y>-oio+}@LbNqH_UW^S~S=3n7_+ieCG@WAlH{ahVC4+R;Ty$n14G5$w(8fu72IfV1#@igVigg9A;k{Sei(Fn zd9gn~Sll-u&^YUT<^qti*dbaWXbSC*uUUNOjI9A0xo_SyXJO7Uy2jl0I{?Ttw+4vy z@%y)@*uT9xIxY5n=2q0i^eK7>VR+8`WTYs12w^ZBfSiSIt2qef-neAp+iDDgnTJ8n z=@#F@_!`Uvz{=!XISwf%0$^>@tsPHJ>H)Ai*;bD$HPuDW*h!9Av`LInGPO51v@l}| zqA{j*DsOB^AyO7Wdwfg8-&Ehp&pGjyjzx?5B5<4B6F$X)_9Yqsi%;=|z1SW{5{RPa`OgTDFm^!3ZmkBrZLobUg-{T=m1Ps`Lhz!*adEH!=!0VyH?+Jzn}bljGLVfGTB zUG(NMF#B
    -

    \u5bb6\u7cfb ${index + 1} / ${uniqueComponent.length}\u5339 / \u751f\u5b58 ${aliveCount}

    + const html = `
    +

    \u5bb6\u7cfb {{LINEAGE_INDEX}} / ${uniqueComponent.length}\u5339 / \u751f\u5b58 ${aliveCount}

    `; uiCache.archiveHtmlCache?.set(cacheKey, html); - return html; + return lineageHydrateFamilyHtml(html, index); } function renderArchive() { @@ -1089,20 +1166,21 @@ function renderArchive() { uiCache.deferArchiveUntil = 0; uiCache.archiveScheduled = false; const familyVersion = world.familyVersion || 0; - if (uiCache.archiveVersion && uiCache.archiveFamilyVersion === familyVersion) return; + const familyDirty = Boolean(world.familyTreeDirty); + if (uiCache.archiveRenderRunning) { + if (familyDirty) uiCache.archivePendingDirtyAfterRun = true; + return; + } + if (uiCache.archiveVersion && uiCache.archiveFamilyVersion === familyVersion && !familyDirty) return; if (uiCache.archiveVersion && !lineageArchiveNearViewport()) { uiCache.archivePendingOffscreen = true; - return; - } - const running = world && !world.paused; - if (uiCache.archiveVersion && running) { - uiCache.archivePendingWhileRunning = true; - if (uiCache.archiveDiagnostics) uiCache.archiveDiagnostics.skippedWhileRunning = (uiCache.archiveDiagnostics.skippedWhileRunning || 0) + 1; - lineageSetArchiveStaleStatus(true); - return; + const hiddenInterval = 30000; + const hiddenNow = performance.now(); + if (hiddenNow - (uiCache.archiveLastHiddenCheckAt || -Infinity) < hiddenInterval) return; + uiCache.archiveLastHiddenCheckAt = hiddenNow; } const now = performance.now(); - const minUpdateGap = 700; + const minUpdateGap = 4800; if (uiCache.archiveVersion && !uiCache.archiveRenderForce && now - (uiCache.archiveLastRenderedAt || 0) < minUpdateGap) { if (!uiCache.archiveRenderTimer) { uiCache.archiveRenderTimer = setTimeout(() => { @@ -1122,6 +1200,8 @@ function renderArchive() { const relationSignature = lineageVisibleRelationSignature(family); if (uiCache.archiveVersion && uiCache.archiveRelationSignature === relationSignature) { uiCache.archiveFamilyVersion = world.familyVersion || 0; + world.familyTreeDirty = false; + uiCache.archivePendingDirtyAfterRun = false; return; } const ids = Object.keys(family); @@ -1130,7 +1210,17 @@ function renderArchive() { return sum + (Array.isArray(n?.parents) ? n.parents.length : 0) + (Array.isArray(n?.children) ? n.children.length : 0); }, 0); const version = `${world.familyVersion || 0}:${ids.length}:${edgeCount}`; - if (uiCache.archiveVersion === version) return; + if (uiCache.archiveVersion === version) { + world.familyTreeDirty = false; + uiCache.archivePendingDirtyAfterRun = false; + return; + } + const heavyArchive = ids.length > 90 || edgeCount > 160; + if (!world.paused && heavyArchive) { + uiCache.archivePendingWhileRunning = true; + lineageSetArchiveStaleStatus(true); + return; + } const renderStarted = performance.now(); lineageSetArchiveStaleStatus(false); if (uiCache.archiveRenderTimer) { @@ -1143,18 +1233,22 @@ function renderArchive() { uiCache.archiveRelationSignature = relationSignature; uiCache.archiveLastRenderedAt = performance.now(); uiCache.lastArchiveWindow = ""; - const components = liveFamilyComponents(family).flatMap(lineageSplitByActualEdges).map(c => lineageCleanComponent(c, family)).filter(c => c.length); + const components = liveFamilyComponents(family).flatMap(lineageSplitByActualEdges).filter(c => c.length); uiCache.archiveRows = components; const signatures = components.map(component => lineageComponentSignature(component, family)); if (!uiCache.archiveHtmlCache) uiCache.archiveHtmlCache = new Map(); - const activeCacheKeys = new Set(signatures.map((signature, index) => `${index}:${signature}`)); + const activeCacheKeys = new Set(components.map((component, index) => lineageFamilyCacheKey(component, family, signatures[index]))); for (const key of Array.from(uiCache.archiveHtmlCache.keys())) { if (!activeCacheKeys.has(key)) uiCache.archiveHtmlCache.delete(key); } const token = `${version}:${Math.random().toString(36).slice(2)}`; uiCache.archiveRenderToken = token; + uiCache.archiveRenderRunning = true; if (!components.length) { ui.archiveContent.innerHTML = `
    \u751f\u304d\u3066\u3044\u308b\u69cb\u6210\u54e1\u3092\u6301\u3064\u5bb6\u7cfb\u306f\u307e\u3060\u3042\u308a\u307e\u305b\u3093\u3002
    `; + uiCache.archiveRenderRunning = false; + world.familyTreeDirty = false; + uiCache.archivePendingDirtyAfterRun = false; return; } @@ -1163,9 +1257,12 @@ function renderArchive() { const forest = ui.archiveContent.querySelector(".lineage-forest"); let index = 0; const pump = () => { - if (uiCache.archiveRenderToken !== token || !forest) return; + if (uiCache.archiveRenderToken !== token || !forest) { + uiCache.archiveRenderRunning = false; + return; + } const started = performance.now(); - let nodeBudget = 72; + let nodeBudget = 28; let renderedThisSlice = 0; while (index < components.length) { const component = components[index]; @@ -1174,24 +1271,31 @@ function renderArchive() { nodeBudget -= Math.max(1, component.length); index += 1; renderedThisSlice += 1; - if (index < components.length && (nodeBudget <= 0 || performance.now() - started > 14)) break; + if (index < components.length && (nodeBudget <= 0 || performance.now() - started > 6)) break; } if (status) status.textContent = `\u5bb6\u7cfb\u56f3\u3092\u63cf\u753b\u4e2d\u2026 ${index} / ${components.length}`; if (index < components.length) { const schedule = window.requestIdleCallback || ((fn) => setTimeout(fn, 0)); - schedule(pump, { timeout: 120 }); - } else if (status) { - status.remove(); + schedule(pump, { timeout: 220 }); + } else { + if (status) status.remove(); + const renderDirtiedAgain = uiCache.archivePendingDirtyAfterRun || (world.familyVersion || 0) !== familyVersion; + uiCache.archiveRenderRunning = false; + world.familyTreeDirty = renderDirtiedAgain; if (uiCache.archiveDiagnostics) { uiCache.archiveDiagnostics.renders = (uiCache.archiveDiagnostics.renders || 0) + 1; uiCache.archiveDiagnostics.lastMs = Math.round((performance.now() - renderStarted) * 10) / 10; uiCache.archiveDiagnostics.lastFamilies = components.length; uiCache.archiveDiagnostics.lastNodes = components.reduce((sum, component) => sum + component.length, 0); } + if (renderDirtiedAgain) { + uiCache.archivePendingDirtyAfterRun = false; + scheduleArchiveWindowRender(); + } } }; const schedule = window.requestIdleCallback || ((fn) => setTimeout(fn, 0)); - schedule(pump, { timeout: 80 }); + schedule(pump, { timeout: 160 }); } function validateFamilyTree() { @@ -1211,36 +1315,21 @@ function validateFamilyTree() { } document.querySelectorAll(".lineage-family-tree[data-lineage-child-edges]").forEach((section, index) => { const expectedEdges = Number(section.getAttribute("data-lineage-child-edges") || 0); + const renderedEdges = Number(section.getAttribute("data-lineage-rendered-child-edges") || 0); const expectedGroups = Number(section.getAttribute("data-lineage-child-groups") || 0); + const renderedPaths = Number(section.getAttribute("data-lineage-child-paths") || 0); const pathCount = section.querySelectorAll(".lineage-links .child-link").length; + if (renderedEdges !== expectedEdges) { + issues.push({ type: "render-child-edge-count-mismatch", familyIndex: index, expectedEdges, renderedEdges }); + } if (expectedEdges > 0 && pathCount < 1) { issues.push({ type: "missing-render-child-link", familyIndex: index, expectedEdges, pathCount }); } if (expectedGroups > 0 && pathCount < expectedGroups) { issues.push({ type: "missing-render-child-link-group", familyIndex: index, expectedGroups, pathCount }); } - const panel = section.querySelector(".lineage-tree-panel"); - const svg = section.querySelector(".lineage-links"); - if (panel && svg) { - const panelRect = panel.getBoundingClientRect(); - const nodes = Array.from(panel.querySelectorAll(".tree-node")).map(node => { - const r = node.getBoundingClientRect(); - return { - id: node.getAttribute("data-family-tarinai-id") || "", - left: r.left - panelRect.left + 1, - top: r.top - panelRect.top + 1, - right: r.right - panelRect.left - 1, - bottom: r.bottom - panelRect.top - 1, - }; - }); - section.querySelectorAll(".lineage-links .child-link").forEach((path, pathIndex) => { - if (!path.getBBox) return; - const box = path.getBBox(); - for (const node of nodes) { - const overlaps = box.x < node.right && box.x + box.width > node.left && box.y < node.bottom && box.y + box.height > node.top; - if (overlaps) issues.push({ type: "child-link-bbox-overlaps-node-body", familyIndex: index, pathIndex, node: node.id }); - } - }); + if (renderedPaths !== pathCount) { + issues.push({ type: "render-child-path-count-mismatch", familyIndex: index, renderedPaths, pathCount }); } }); return issues; @@ -1251,14 +1340,25 @@ function renderArchiveWindow() { } function scheduleArchiveWindowRender() { - if (uiCache.archiveVersion && uiCache.archiveFamilyVersion === (world.familyVersion || 0)) return; + const familyDirty = Boolean(world.familyTreeDirty); + if (uiCache.archiveVersion && uiCache.archiveFamilyVersion === (world.familyVersion || 0) && !familyDirty) return; + if (uiCache.archiveRenderRunning) { + if (familyDirty) uiCache.archivePendingDirtyAfterRun = true; + return; + } + if (uiCache.archiveVersion && !lineageArchiveNearViewport()) { + uiCache.archivePendingOffscreen = true; + const now = performance.now(); + if (now - (uiCache.archiveLastHiddenCheckAt || -Infinity) < 30000) return; + uiCache.archiveLastHiddenCheckAt = now; + } if (uiCache.archiveRenderTimer) return; if (uiCache.archiveScheduled) return; uiCache.archiveScheduled = true; const schedule = window.requestIdleCallback || ((fn) => setTimeout(fn, 0)); schedule(() => { renderArchive(); - }, { timeout: 700 }); + }, { timeout: 1200 }); } function schedulePendingArchiveRender() { diff --git a/js/world.js b/js/world.js index fbb6ffa..4ac8673 100644 --- a/js/world.js +++ b/js/world.js @@ -1,4 +1,4 @@ -"use strict"; +"use strict"; class World { constructor() { @@ -28,6 +28,8 @@ class World { this.maxGeneration = 1; this.family = {}; this.familyVersion = 0; + this.familyTreeDirty = true; + this.familyTreeDirtyReason = "init"; this.relationNotices = {}; this.resolvedFightIds = {}; this.pointer = { x: 0, y: 0, inside: false, motion: 0, movedAt: 0 }; @@ -405,7 +407,16 @@ class World { entry.parentNames = [...(t.parentNames || entry.parentNames || [])]; entry.children = nextChildren; } - if (changed) this.familyVersion = (this.familyVersion || 0) + 1; + if (changed) { + this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("family-record"); + } + } + + markFamilyTreeDirty(reason = "family") { + this.familyTreeDirty = true; + this.familyTreeDirtyReason = reason; + this.familyTreeDirtyAt = this.time || 0; } normalizeFamily() { @@ -500,7 +511,10 @@ class World { changed = true; } } - if (changed) this.familyVersion = (this.familyVersion || 0) + 1; + if (changed) { + this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("family-normalize"); + } this.familyCleanVersion = this.familyVersion || 0; return changed; } @@ -509,6 +523,7 @@ class World { this.family = {}; this.familyCleanVersion = 0; this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("family-reset"); this.maxGeneration = 1; for (const t of this.tarinai || []) { t.parents = []; @@ -552,6 +567,7 @@ class World { this.family[t.id].deathReason = finalReason; this.family[t.id].personality = t.personality || this.family[t.id].personality || ""; this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("death"); } } this.familyPrunePending = true; @@ -597,6 +613,7 @@ class World { if (!remove.length) return; for (const id of remove) delete family[id]; this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("family-prune"); this.familyCleanVersion = this.familyVersion || 0; } @@ -687,6 +704,22 @@ class World { return false; } + canStartFight(t) { + if (!t || t.dead) return false; + if (t.sleepDisease) return false; + if (t.explosionDisease || t.fightDisease) return true; + if (t.zunchiDisease) return false; + return true; + } + + canBeFightTarget(t) { + return Boolean(t && !t.dead && !t.sleepDisease); + } + + canFightPair(actor, target) { + return this.canStartFight(actor) && this.canBeFightTarget(target); + } + spawnChild(a, b, index = 0, total = 1) { const inherited = Math.random() < 0.56 ? a.type : b.type; const mutation = Math.random() < 0.18 ? baseSpriteId() : inherited; @@ -735,6 +768,7 @@ class World { startForcedFight(a, b) { if (!a || !b || a === b || a.dead || b.dead) return false; + if (!this.canFightPair(a, b)) return false; const alreadyFighting = a.fightTimer > 0.04 && b.fightTimer > 0.04 && ((a.fightTargetIds || []).includes(b.id) || a.fightTargetId === b.id); if (alreadyFighting) return true; for (const t of [a, b]) { @@ -765,6 +799,7 @@ class World { const bDrug = (b.fightMochiTimer || 0) > 0.04; const actor = aDrug && !bDrug ? a : (!aDrug && bDrug ? b : (a.energy + a.stress * 0.36 >= b.energy + b.stress * 0.36 ? a : b)); const target = actor === a ? b : a; + if (!this.canFightPair(actor, target)) return false; actor.intimidateTimer = Math.max(actor.intimidateTimer || 0, rand(0.85, 1.35)); actor.intimidateTargetId = target.id; actor.surpriseTimer = Math.max(actor.surpriseTimer || 0, 0.28); @@ -791,6 +826,7 @@ class World { const scoreB = b.energy * 0.38 + b.mood * 0.18 + b.stress * 0.12 + (b.type === "angry" ? 12 : 0) + (b.personality === "irritable" ? 8 : 0) + ((a.relationTo(b.id).fear || 0) * 0.65) + (b.isZunchiSlave ? -10 : 0) + ((b.fightMochiTimer || 0) > 0.04 ? 9 : 0) + rand(-5, 5); const actor = scoreA >= scoreB ? a : b; const target = actor === a ? b : a; + if (!this.canFightPair(actor, target)) return; const actorScore = actor === a ? scoreA : scoreB; const targetScore = actor === a ? scoreB : scoreA; const canIntimidate = !actor.lowHealthSprite || !actor.lowHealthSprite(); @@ -849,6 +885,7 @@ class World { startFight(a, b) { if (!a || !b || a.dead || b.dead) return; + if (!this.canFightPair(a, b) && !this.canFightPair(b, a)) return; if ((a.postBirthPeaceTimer || 0) > 0 || (b.postBirthPeaceTimer || 0) > 0) return; a.state = "fight"; b.state = "fight"; a.fightTimer = Math.max(a.fightTimer, rand(4.5, 7.0)); @@ -942,10 +979,18 @@ class World { t.fearTimer = Math.max(t.fearTimer, 1.7 + p); t.state = "panic"; t.target = { x, y }; - const power = 170 + p * 360; - t.vx += dx / d * power + rand(-55, 55); - t.vy += dy / d * power + rand(-55, 55); - t.fallTimer = Math.max(t.fallTimer, 1.25 + p * 1.35); + let nx = dx / d; + let ny = dy / d; + if (!Number.isFinite(nx) || !Number.isFinite(ny) || Math.abs(nx) + Math.abs(ny) < 0.001) { + const a = rand(0, Math.PI * 2); + nx = Math.cos(a); + ny = Math.sin(a); + } + const distanceBoost = p * p * 0.55 + p * 0.45; + const power = (260 + distanceBoost * 820) * rand(0.78, 1.24) * (it.blastScale || 1); + t.vx += nx * power + rand(-95, 95) * (0.6 + p); + t.vy += ny * power + rand(-95, 95) * (0.6 + p); + t.fallTimer = Math.max(t.fallTimer, 1.45 + p * 1.85); t.fallMax = Math.max(t.fallMax || 0, t.fallTimer); t.fallDir = (dx >= 0 ? 1 : -1) * (Math.random() < 0.5 ? 1 : -1); t.blastSpinTimer = Math.max(t.blastSpinTimer || 0, 1.35 + p * 0.70); @@ -970,11 +1015,6 @@ class World { ball.vx = (ball.vx || 0) + dx / d * blast + rand(-80, 80); ball.vy = (ball.vy || 0) + dy / d * blast + rand(-80, 80); const speed = Math.hypot(ball.vx || 0, ball.vy || 0); - const cap = 1250; - if (speed > cap) { - ball.vx = ball.vx / speed * cap; - ball.vy = ball.vy / speed * cap; - } ball.spinVelocity = clamp((ball.spinVelocity || 0) + rand(-24, 24), -38, 38); ball.lastPokedAt = this.time || 0; ball.pokeCombo = Math.max(ball.pokeCombo || 0, 5); @@ -1003,8 +1043,16 @@ class World { const q = clamp(1 - d / blastRadius, 0, 1); o.damage(4 + q * 15, "\u7206\u767a\u75c5"); o.addStress ? o.addStress(16 * q, { threshold: 8 }) : (o.stress = clamp(o.stress + 16 * q, 0, 130)); - o.vx += dx / d * (120 + q * 260) + rand(-34, 34); - o.vy += dy / d * (120 + q * 260) + rand(-34, 34); + let nx = dx / d; + let ny = dy / d; + if (!Number.isFinite(nx) || !Number.isFinite(ny) || Math.abs(nx) + Math.abs(ny) < 0.001) { + const a = rand(0, Math.PI * 2); + nx = Math.cos(a); + ny = Math.sin(a); + } + const diseaseBlast = (190 + q * 560) * rand(0.80, 1.22); + o.vx += nx * diseaseBlast + rand(-64, 64) * (0.5 + q); + o.vy += ny * diseaseBlast + rand(-64, 64) * (0.5 + q); o.hurtTimer = Math.max(o.hurtTimer || 0, 1.2 + q); o.fearTimer = Math.max(o.fearTimer || 0, 1.0 + q); if (!o.dead && Math.random() < 0.020 * q) o.infectExplosionDisease?.(t); @@ -1161,6 +1209,10 @@ class World { let bestScore = Infinity; for (const bed of this.nearbyItems(t.x, t.y, maxDist)) { if (bed.dead || !this.isSleepFurniture(bed)) continue; + if (bed.type === "nest_box" && t?.insideNestBoxId !== bed.id) { + const occupants = this.nestBoxOccupants ? this.nestBoxOccupants(bed, Infinity) : []; + if (occupants.length >= this.nestBoxCapacity(bed)) continue; + } if (t?.shouldAvoidTarget && t.shouldAvoidTarget(bed)) continue; const d = dist(t, bed); const occ = this.bedOccupancy(bed); @@ -1196,6 +1248,7 @@ class World { loser.adjustRelation(winner, -1.2, 7.2 * loser.personalityProfile().fear, "\u55a7\u5629\u306b\u8ca0\u3051\u305f"); winner.relationTo(loser.id).fightsWon = (winner.relationTo(loser.id).fightsWon || 0) + 1; loser.relationTo(winner.id).fightsLost = (loser.relationTo(winner.id).fightsLost || 0) + 1; + winner.totalFightWins = (winner.totalFightWins || 0) + 1; loser.totalFightLosses = (loser.totalFightLosses || 0) + 1; if ((loser.totalFightLosses || 0) >= 5 && loser.becomeZunchiSlave?.(winner)) { const oldName = loser.formerName || loser.name; @@ -1298,18 +1351,100 @@ class World { ball.vx = (ball.vx || 0) + nx * impulse; ball.vy = (ball.vy || 0) + ny * impulse; const speed = Math.hypot(ball.vx || 0, ball.vy || 0); - const cap = 1250; - if (speed > cap) { - ball.vx = ball.vx / speed * cap; - ball.vy = ball.vy / speed * cap; - } ball.spinVelocity = clamp((ball.spinVelocity || 0) + (nx >= 0 ? 1 : -1) * (5.6 + ball.pokeCombo * 1.15), -38, 38); ball.amount = Math.max(ball.amount || 999, 999); audio.poke(); this.effects.push(new Effect("ring", ball.x, ball.y, { size: Math.max(16, ball.r * (0.95 + ball.pokeCombo * 0.05)), life: 0.22, color: "rgba(255,255,255,0.58)" })); - if (ball.pokeCombo >= 4 || speed > 430) this.log(`\u30dc\u30fc\u30eb\u3092\u9023\u7d9a\u3067\u3064\u3064\u304d\u3001\u52e2\u3044\u304c\u5897\u3057\u305f\u3002`, "observe"); - else this.log(`\u30dc\u30fc\u30eb\u3092\u3064\u3064\u3044\u3066\u5f3e\u3044\u305f\u3002`, "observe"); - return true; + // 繝懊・繝ォ繧偵▽縺、縺・◆繧、繝吶Φ繝医・隕ウ蟇欟I縺ク谿九&縺ェ縺・€・ return true; + } + + resolveBallBallCollisions(dt) { + if ((this.itemCounts?.ball || 0) < 2) return; + const now = this.time || 0; + if (!this.ballCollisionMemo) this.ballCollisionMemo = new Map(); + const balls = (this.items || []).filter(it => it && !it.dead && it.type === "ball"); + for (const a of balls) { + const ar = a.r || 18; + const avx = a.vx || 0; + const avy = a.vy || 0; + const aSpeed = Math.hypot(avx, avy); + const range = ar * 2 + Math.min(560, aSpeed * Math.max(0.016, dt || 0.016)) + 52; + for (const b of this.nearbyItems(a.x, a.y, range) || []) { + if (!b || b === a || b.dead || b.type !== "ball") continue; + const key = a.id < b.id ? `${a.id}:${b.id}` : `${b.id}:${a.id}`; + if (now - (this.ballCollisionMemo.get(key) || -999) < 0.055) continue; + const br = b.r || 18; + const hitRadius = ar + br; + let dx = b.x - a.x; + let dy = b.y - a.y; + let d = Math.hypot(dx, dy); + let hitX = a.x; + let hitY = a.y; + if (d > hitRadius) { + const ax0 = Number.isFinite(a.prevX) ? a.prevX : a.x; + const ay0 = Number.isFinite(a.prevY) ? a.prevY : a.y; + const bx0 = Number.isFinite(b.prevX) ? b.prevX : b.x; + const by0 = Number.isFinite(b.prevY) ? b.prevY : b.y; + const rvx = (a.x - ax0) - (b.x - bx0); + const rvy = (a.y - ay0) - (b.y - by0); + const rx = ax0 - bx0; + const ry = ay0 - by0; + const aa = rvx * rvx + rvy * rvy; + if (aa <= 0.0001) continue; + const bb = 2 * (rx * rvx + ry * rvy); + const cc = rx * rx + ry * ry - hitRadius * hitRadius; + const disc = bb * bb - 4 * aa * cc; + if (disc < 0) continue; + const u = clamp((-bb - Math.sqrt(disc)) / (2 * aa), 0, 1); + const axHit = ax0 + (a.x - ax0) * u; + const ayHit = ay0 + (a.y - ay0) * u; + const bxHit = bx0 + (b.x - bx0) * u; + const byHit = by0 + (b.y - by0) * u; + dx = bxHit - axHit; + dy = byHit - ayHit; + d = Math.hypot(dx, dy); + hitX = (axHit + bxHit) * 0.5; + hitY = (ayHit + byHit) * 0.5; + if (d > hitRadius + 0.5) continue; + } else { + hitX = (a.x + b.x) * 0.5; + hitY = (a.y + b.y) * 0.5; + } + if (d < 0.001) { + const rvx = (b.vx || 0) - (a.vx || 0); + const rvy = (b.vy || 0) - (a.vy || 0); + const rs = Math.hypot(rvx, rvy); + if (rs > 0.001) { dx = rvx / rs; dy = rvy / rs; d = 1; } + else { const ang = rand(0, Math.PI * 2); dx = Math.cos(ang); dy = Math.sin(ang); d = 1; } + } + const nx = dx / d; + const ny = dy / d; + const rvx = (b.vx || 0) - (a.vx || 0); + const rvy = (b.vy || 0) - (a.vy || 0); + const relNormal = rvx * nx + rvy * ny; + if (relNormal > 0 && d >= hitRadius - 0.5) continue; + this.ballCollisionMemo.set(key, now); + const restitution = 0.86; + const impulse = -(1 + restitution) * relNormal / 2; + if (Number.isFinite(impulse)) { + a.vx = (a.vx || 0) - impulse * nx; + a.vy = (a.vy || 0) - impulse * ny; + b.vx = (b.vx || 0) + impulse * nx; + b.vy = (b.vy || 0) + impulse * ny; + } + const overlap = Math.max(0, hitRadius - d + 0.6); + if (overlap > 0) { + a.x -= nx * overlap * 0.5; + a.y -= ny * overlap * 0.5; + b.x += nx * overlap * 0.5; + b.y += ny * overlap * 0.5; + } + const tangent = nx * ((a.vy || 0) - (b.vy || 0)) - ny * ((a.vx || 0) - (b.vx || 0)); + a.spinVelocity = clamp((a.spinVelocity || 0) - tangent / Math.max(14, ar) * 1.8, -38, 38); + b.spinVelocity = clamp((b.spinVelocity || 0) + tangent / Math.max(14, br) * 1.8, -38, 38); + this.effects.push(new Effect("ring", hitX, hitY, { size: Math.max(13, hitRadius * 0.38), life: 0.16, color: "rgba(255,255,255,0.44)" })); + } + } } resolveBallInteractions(dt) { @@ -1317,7 +1452,7 @@ class World { for (const ball of this.items) { if (!ball || ball.dead || ball.type !== "ball") continue; const ballSpeed = Math.hypot(ball.vx || 0, ball.vy || 0); - const sweep = Math.min(420, ballSpeed * Math.max(0.016, dt || 0.016) + 84); + const sweep = ballSpeed * Math.max(0.016, dt || 0.016) + 84; const range = (ball.r || 18) + 72 + sweep; const px = Number.isFinite(ball.prevX) ? ball.prevX : ball.x; const py = Number.isFinite(ball.prevY) ? ball.prevY : ball.y; @@ -1356,22 +1491,25 @@ class World { const bvx = ballSpeed > 0.01 ? (ball.vx || 0) / ballSpeed : nx; const bvy = ballSpeed > 0.01 ? (ball.vy || 0) / ballSpeed : ny; const damage = clamp((ballSpeed - 285) / 18, 3.5, 38); - const push = clamp(ballSpeed * 0.34, 95, 310); t.lastBallDamageAt = now; - t.vx += bvx * push; - t.vy += bvy * push; - t.damage(damage, "\u8d85\u9ad8\u901f\u306e\u30dc\u30fc\u30eb\u306b\u5f53\u305f\u3063\u305f"); + t.vx = (t.vx || 0) * 0.35 + (ball.vx || 0) * 0.20; + t.vy = (t.vy || 0) * 0.35 + (ball.vy || 0) * 0.20; + t.damage(damage, "\u885d\u7a81"); const timidStress = t.personality === "timid" ? 1.55 : 1.0; const stressGain = clamp(damage * 0.55 * timidStress, 3, t.personality === "timid" ? 26 : 18); t.addStress ? t.addStress(stressGain, { threshold: 8 }) : (t.stress = clamp(t.stress + stressGain, 0, 130)); + t.state = "panic"; + t.target = { x: ball.x, y: ball.y }; t.hurtTimer = Math.max(t.hurtTimer, damage > 16 ? 2.4 : 1.35); - t.fallTimer = Math.max(t.fallTimer, damage > 14 ? 0.82 : 0.38); - t.fallMax = Math.max(t.fallMax || 0.82, t.fallTimer); + t.fallTimer = Math.max(t.fallTimer, damage > 14 ? 0.98 : 0.46); + t.fallMax = Math.max(t.fallMax || 0.98, t.fallTimer); t.fallDir = bvx >= 0 ? 1 : -1; - t.fearTimer = Math.max(t.fearTimer, 0.8); - this.spawnFallEffect(t.x, t.y + t.radius * 0.55, clamp(damage / 18, 0.55, 1.6)); + t.fearTimer = Math.max(t.fearTimer, 0.95); + t.blastSpinTimer = Math.max(t.blastSpinTimer || 0, damage > 14 ? 1.0 : 0.44); + t.blastSpinMax = Math.max(t.blastSpinMax || 0, t.blastSpinTimer); + this.spawnFallEffect(t.x, t.y + t.radius * 0.55, clamp(damage / 18, 0.55, 1.8)); this.effects.push(new Effect("ring", hitX, hitY, { size: Math.max(20, ball.r * 1.25), life: 0.22, color: "rgba(210,75,65,0.50)" })); - if (this.relationNotice(t.id, ball.id || "ball", "fast-ball-hit", 2.8)) this.log(`${t.name}\u306f\u8d85\u9ad8\u901f\u306e\u30dc\u30fc\u30eb\u306b\u5f53\u305f\u3063\u3066\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u305f\u3002`, "accident"); + if (this.relationNotice(t.id, ball.id || "ball", "fast-ball-hit", 2.8)) this.log(`${t.name}\u306f\u9ad8\u901f\u306e\u30dc\u30fc\u30eb\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident"); ball.vx = (ball.vx || 0) * 0.58 - nx * Math.min(110, ballSpeed * 0.10); ball.vy = (ball.vy || 0) * 0.58 - ny * Math.min(110, ballSpeed * 0.10); ball.spinVelocity = clamp((ball.spinVelocity || 0) + (nx >= 0 ? -1 : 1) * 8.5, -38, 38); @@ -1387,11 +1525,6 @@ class World { ball.vx = (ball.vx || 0) * (isDangerous ? 0.78 : 0.92) + nx * impulse + (t.vx || 0) * 0.52; ball.vy = (ball.vy || 0) * (isDangerous ? 0.78 : 0.92) + ny * impulse + (t.vy || 0) * 0.52; const kickedSpeed = Math.hypot(ball.vx || 0, ball.vy || 0); - const kickCap = 1250; - if (kickedSpeed > kickCap) { - ball.vx = ball.vx / kickedSpeed * kickCap; - ball.vy = ball.vy / kickedSpeed * kickCap; - } ball.spinVelocity = clamp((ball.spinVelocity || 0) + (nx * (t.vy || 0) - ny * (t.vx || 0)) / 16 + impulse / Math.max(12, ball.r || 18) * (nx >= 0 ? 1 : -1), -38, 38); ball.x = clamp(t.x + nx * (hitDistance + 2), CONFIG.worldPadding, this.w - CONFIG.worldPadding); ball.y = clamp(t.y + ny * (hitDistance + 2), CONFIG.worldPadding, this.h - CONFIG.worldPadding); @@ -1418,6 +1551,78 @@ class World { } } + resolveTarinaiHighSpeedCollisions(dt) { + const threshold = 150; + const now = this.time || 0; + if (!this.tarinaiCollisionMemo) this.tarinaiCollisionMemo = new Map(); + for (const a of this.tarinai || []) { + if (!a || a.dead) continue; + const avx = a.vx || 0; + const avy = a.vy || 0; + const aSpeed = Math.hypot(avx, avy); + if (aSpeed < threshold) continue; + const px = Number.isFinite(a.prevX) ? a.prevX : a.x; + const py = Number.isFinite(a.prevY) ? a.prevY : a.y; + const sx = a.x - px; + const sy = a.y - py; + const segLenSq = sx * sx + sy * sy; + const range = (a.radius || 22) * 2.5 + aSpeed * Math.max(0.016, dt || 0.016) + 64; + for (const b of this.nearbyTarinai(a.x, a.y, range)) { + if (!b || b === a || b.dead) continue; + const key = a.id < b.id ? `${a.id}:${b.id}` : `${b.id}:${a.id}`; + if (now - (this.tarinaiCollisionMemo.get(key) || -999) < 0.42) continue; + const bvx = b.vx || 0; + const bvy = b.vy || 0; + const relVx = avx - bvx; + const relVy = avy - bvy; + const relSpeed = Math.hypot(relVx, relVy); + if (relSpeed < threshold) continue; + let hitX = a.x; + let hitY = a.y; + if (segLenSq > 1) { + const u = clamp(((b.x - px) * sx + (b.y - py) * sy) / segLenSq, 0, 1); + hitX = px + sx * u; + hitY = py + sy * u; + } + const d = Math.max(0.001, distXY(hitX, hitY, b.x, b.y)); + const hitDistance = (a.radius || 22) * 0.74 + (b.radius || 22) * 0.74; + if (d > hitDistance) continue; + this.tarinaiCollisionMemo.set(key, now); + const impactor = aSpeed >= Math.hypot(bvx, bvy) ? a : b; + const target = impactor === a ? b : a; + const ivx = impactor.vx || 0; + const ivy = impactor.vy || 0; + const impactSpeed = Math.hypot(ivx, ivy) || relSpeed || 1; + let nx = impactSpeed > 0.001 ? ivx / impactSpeed : (target.x - impactor.x) / Math.max(1, distXY(target.x, target.y, impactor.x, impactor.y)); + let ny = impactSpeed > 0.001 ? ivy / impactSpeed : (target.y - impactor.y) / Math.max(1, distXY(target.x, target.y, impactor.x, impactor.y)); + if (!Number.isFinite(nx) || !Number.isFinite(ny) || Math.abs(nx) + Math.abs(ny) < 0.001) { + const aa = rand(0, Math.PI * 2); + nx = Math.cos(aa); + ny = Math.sin(aa); + } + const damage = clamp((relSpeed - 118) / 26, 1.2, 22); + target.vx += ivx * 0.20 + nx * 28; + target.vy += ivy * 0.20 + ny * 28; + impactor.vx = ivx * 0.72 - nx * Math.min(56, relSpeed * 0.10); + impactor.vy = ivy * 0.72 - ny * Math.min(56, relSpeed * 0.10); + target.damage(damage, "\u885d\u7a81"); + if (!impactor.dead) impactor.damage(damage * 0.35, "\u885d\u7a81"); + for (const t of [target, impactor]) { + if (!t || t.dead) continue; + t.state = "panic"; + t.target = { x: impactor.x, y: impactor.y }; + t.hurtTimer = Math.max(t.hurtTimer || 0, 0.9 + damage * 0.035); + t.fallTimer = Math.max(t.fallTimer || 0, 0.36 + damage * 0.025); + t.fallMax = Math.max(t.fallMax || 0, t.fallTimer); + t.fallDir = nx >= 0 ? 1 : -1; + t.fearTimer = Math.max(t.fearTimer || 0, 0.55); + } + this.effects.push(new Effect("ring", (a.x + b.x) * 0.5, (a.y + b.y) * 0.5, { size: Math.max(16, hitDistance * 0.45), life: 0.20, color: "rgba(210,75,65,0.40)" })); + if (this.relationNotice(target.id, impactor.id, "tarinai-highspeed-collision", 2.6)) this.log(`${target.name}\u306f\u9ad8\u901f\u306e${impactor.name}\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident"); + } + } + } + nearest(entity, types, maxDist = Infinity) { let best = null, bestD = maxDist; const candidates = Number.isFinite(maxDist) ? this.nearbyItems(entity.x, entity.y, maxDist) : this.items; @@ -1430,11 +1635,12 @@ class World { return best; } - nearestOther(entity, maxDist = Infinity) { + nearestOther(entity, maxDist = Infinity, predicate = null) { let best = null, bestD = maxDist; const candidates = Number.isFinite(maxDist) ? this.nearbyTarinai(entity.x, entity.y, maxDist) : this.tarinai; for (const o of candidates) { if (o === entity || o.dead) continue; + if (predicate && !predicate(o)) continue; if (entity?.shouldAvoidTarget && entity.shouldAvoidTarget(o)) continue; const d = dist(entity, o); if (d < bestD) { best = o; bestD = d; } @@ -1458,48 +1664,111 @@ class World { const vertical = it?.type === "fence_v"; const horizontal = it?.type === "fence_h"; if (!vertical && !horizontal) return null; - const len = Math.max(82, (it.r || 42) * 1.95); - const thick = Math.max(20, (it.r || 42) * 0.43); - const halfW = vertical ? thick : len; - const halfH = vertical ? len : thick; + const len = Math.max(112, (it.r || 42) * 3.55); + const thick = Math.max(10, (it.r || 42) * 0.31); + const halfW = vertical ? thick / 2 : len / 2; + const halfH = vertical ? len / 2 : thick / 2; return { left: it.x - halfW, right: it.x + halfW, top: it.y - halfH, bottom: it.y + halfH, vertical, horizontal }; } - resolveFenceCollision(t) { + nestBoxCapacity() { + return 5; + } + + nestBoxBaseRect(it) { + if (!it || it.dead || it.type !== "nest_box") return null; + const r = it.r || 42; + return { + left: it.x - r * 1.28, + right: it.x + r * 1.28, + top: it.y - r * 0.80, + bottom: it.y + r * 0.72, + type: "nest_box", + item: it, + }; + } + + nestBoxSolidRects(it) { + const base = this.nestBoxBaseRect(it); + if (!base) return []; + const w = base.right - base.left; + const h = base.bottom - base.top; + const colW = w / 3; + const rowH = h / 3; + const mk = (left, right, top, bottom, cell) => ({ left, right, top, bottom, type: "nest_box", cell, item: it }); + return [ + mk(base.left, base.right, base.top, base.top + rowH, "top"), + mk(base.left, base.left + colW, base.top + rowH, base.top + rowH * 2, "middle-left"), + mk(base.right - colW, base.right, base.top + rowH, base.top + rowH * 2, "middle-right"), + ]; + } + + nestBoxTopRect(it) { + return this.nestBoxSolidRects(it)[0] || null; + } + + solidObstacleRects(it) { + if (!it || it.dead) return []; + if (this.isFenceType(it.type)) { + const rect = this.fenceRect(it); + return rect ? [{ ...rect, type: it.type, item: it }] : []; + } + if (it.type === "nest_box") return this.nestBoxSolidRects(it); + return []; + } + + nearbySolidObstacleRects(x, y, radius, { include = null, exclude = null, maxChecks = CONFIG.maxFenceCollisionChecks ?? 24 } = {}) { + const rects = []; + let checked = 0; + for (const it of this.nearbyItems(x, y, radius)) { + if (!it || it === exclude || it.dead) continue; + if (include && !include(it)) continue; + const partRects = this.solidObstacleRects(it); + if (!partRects.length) continue; + checked += 1; + for (const rect of partRects) rects.push(rect); + if (checked >= maxChecks) break; + } + return rects; + } + + pointInRect(x, y, r, padding = 0) { + return Boolean(r && x >= r.left - padding && x <= r.right + padding && y >= r.top - padding && y <= r.bottom + padding); + } + + pushTarinaiOutOfRect(t, r, rr) { + if (!t || !r) return false; + const cx = clamp(t.x, r.left, r.right); + const cy = clamp(t.y, r.top, r.bottom); + let dx = t.x - cx; + let dy = t.y - cy; + let d = Math.hypot(dx, dy); + if (d >= rr) return false; + if (d < 0.001) { + const left = Math.abs(t.x - r.left); + const right = Math.abs(r.right - t.x); + const top = Math.abs(t.y - r.top); + const bottom = Math.abs(r.bottom - t.y); + const m = Math.min(left, right, top, bottom); + if (m === left) { dx = -1; dy = 0; d = 1; } + else if (m === right) { dx = 1; dy = 0; d = 1; } + else if (m === top) { dx = 0; dy = -1; d = 1; } + else { dx = 0; dy = 1; d = 1; } + } + const push = Math.min(rr - d + 0.8, Math.max(10, rr * 0.92)); + t.x += dx / d * push; + t.y += dy / d * push; + if (Math.abs(dx) > Math.abs(dy)) t.vx *= -0.18; + else t.vy *= -0.18; + return true; + } + + resolveSolidObstacleCollision(t) { if (!t || t.dead) return; const rr = Math.max(8, t.radius * 0.74); - const maxChecks = CONFIG.maxFenceCollisionChecks ?? 18; - let checked = 0; let pushed = false; - for (const it of this.nearbyItems(t.x, t.y, rr + 132)) { - if (checked >= maxChecks) break; - if (it.dead || !this.isFenceType(it.type)) continue; - checked += 1; - const r = this.fenceRect(it); - if (!r) continue; - const cx = clamp(t.x, r.left, r.right); - const cy = clamp(t.y, r.top, r.bottom); - let dx = t.x - cx; - let dy = t.y - cy; - let d = Math.hypot(dx, dy); - if (d >= rr) continue; - if (d < 0.001) { - const left = Math.abs(t.x - r.left); - const right = Math.abs(r.right - t.x); - const top = Math.abs(t.y - r.top); - const bottom = Math.abs(r.bottom - t.y); - const m = Math.min(left, right, top, bottom); - if (m === left) { dx = -1; dy = 0; d = 1; } - else if (m === right) { dx = 1; dy = 0; d = 1; } - else if (m === top) { dx = 0; dy = -1; d = 1; } - else { dx = 0; dy = 1; d = 1; } - } - const push = Math.min(rr - d + 0.8, Math.max(10, rr * 0.92)); - t.x += dx / d * push; - t.y += dy / d * push; - pushed = true; - if (Math.abs(dx) > Math.abs(dy)) t.vx *= -0.18; - else t.vy *= -0.18; + for (const rect of this.nearbySolidObstacleRects(t.x, t.y, rr + 150)) { + if (this.pushTarinaiOutOfRect(t, rect, rr)) pushed = true; } if (pushed) { const pad = CONFIG.worldPadding + Math.max(2, t.radius * 0.18); @@ -1510,6 +1779,10 @@ class World { } } + resolveFenceCollision(t) { + this.resolveSolidObstacleCollision(t); + } + segmentIntersectsRect(x1, y1, x2, y2, r) { @@ -1529,23 +1802,18 @@ class World { const cx = (x1 + x2) / 2; const cy = (y1 + y2) / 2; const maxD = Math.hypot(x2 - x1, y2 - y1) / 2 + 120; - for (const it of this.nearbyItems(cx, cy, maxD + padding + 160)) { - if (it.dead || !this.isFenceType(it.type)) continue; - if (distXY(cx, cy, it.x, it.y) > maxD + padding + 130) continue; - const base = this.fenceRect(it); - if (!base) continue; - const r = { left: base.left - padding, right: base.right + padding, top: base.top - padding, bottom: base.bottom + padding }; + for (const rect of this.nearbySolidObstacleRects(cx, cy, maxD + padding + 170)) { + const r = { left: rect.left - padding, right: rect.right + padding, top: rect.top - padding, bottom: rect.bottom + padding }; if (this.segmentIntersectsRect(x1, y1, x2, y2, r)) return true; } return false; } grassBlockedAt(x, y, self = null) { - for (const it of this.nearbyItems(x, y, 52)) { + for (const it of this.nearbyItems(x, y, 96)) { if (it === self || it.dead) continue; - if (it.type === "fence_v" || it.type === "fence_h") { - const r = this.fenceRect(it); - if (r && x >= r.left - 10 && x <= r.right + 10 && y >= r.top - 10 && y <= r.bottom + 10) return true; + for (const r of this.solidObstacleRects(it)) { + if (this.pointInRect(x, y, r, 10)) return true; } if (it.type !== "zunchi") continue; const dx = (x - it.x) / Math.max(22, it.r * 1.35); @@ -1782,9 +2050,10 @@ class World { return ""; } - nestBoxOccupants(box) { + nestBoxOccupants(box, limit = 5) { if (!box || box.dead || box.type !== "nest_box") return []; - return this.tarinai.filter(t => t && !t.dead && t.insideNestBoxId === box.id).slice(0, 12); + const occupants = this.tarinai.filter(t => t && !t.dead && t.insideNestBoxId === box.id); + return Number.isFinite(limit) ? occupants.slice(0, Math.max(0, limit)) : occupants; } pointerNestBoxInfo() { @@ -1839,7 +2108,11 @@ class World { const perf = this.performanceLevel(); const itemCountBefore = this.items.length; for (const it of this.items) it.update(dt, this); - if (this.itemCounts?.ball) this.rebuildSpatial(); + if (this.itemCounts?.ball) { + this.rebuildSpatial(); + this.resolveBallBallCollisions(dt); + this.rebuildSpatial(); + } for (const ef of this.effects) ef.update(dt); @@ -1848,6 +2121,7 @@ class World { } this.limitBallChasers(); this.resolveBallInteractions(dt); + this.resolveTarinaiHighSpeedCollisions(dt); this.compactTimer += dt; const compactInterval = perf >= 2 ? 0.95 : 0.58; @@ -1867,6 +2141,11 @@ class World { this.countsTimer = 0; } + if ((this.outOfBoundsCheckAt || -999) + 1.0 <= this.time) { + this.outOfBoundsCheckAt = this.time; + this.sanitizeOutOfBounds(); + } + this.drawSortTimer += dt; const sortInterval = perf >= 2 ? 0.16 : perf === 1 ? 0.11 : 0.07; if (this.drawSortTimer >= sortInterval) { @@ -1925,6 +2204,60 @@ class World { } } + + sanitizeOutOfBounds() { + const pad = Math.max(28, CONFIG.worldPadding || 30); + const far = Math.max(360, Math.max(this.w || 1000, this.h || 720) * 0.75); + let changedItems = false; + const repairPoint = (obj, radius = 12) => { + if (!obj) return "delete"; + if (!Number.isFinite(obj.x) || !Number.isFinite(obj.y)) return "delete"; + const minX = pad - radius; + const maxX = (this.w || 1000) - pad + radius; + const minY = pad - radius; + const maxY = (this.h || 720) - pad + radius; + if (obj.x >= minX && obj.x <= maxX && obj.y >= minY && obj.y <= maxY) return "ok"; + if (obj.x < -far || obj.x > (this.w || 1000) + far || obj.y < -far || obj.y > (this.h || 720) + far) return "delete"; + obj.x = clamp(obj.x, pad, (this.w || 1000) - pad); + obj.y = clamp(obj.y, pad, (this.h || 720) - pad); + if (Number.isFinite(obj.vx)) obj.vx *= -0.18; + if (Number.isFinite(obj.vy)) obj.vy *= -0.18; + return "moved"; + }; + for (const it of this.items || []) { + const result = repairPoint(it, it.r || 12); + if (result === "delete") { it.amount = 0; changedItems = true; } + else if (result === "moved") changedItems = true; + } + for (const ef of this.effects || []) { + const result = repairPoint(ef, ef.size || 12); + if (result === "delete") ef.life = 0; + } + for (const t of this.tarinai || []) { + if (!t || t.dead) continue; + const result = repairPoint(t, t.radius || 22); + if (result === "delete") { + t.x = clamp(Number.isFinite(t.x) ? t.x : this.w * 0.5, pad, this.w - pad); + t.y = clamp(Number.isFinite(t.y) ? t.y : this.h * 0.5, pad, this.h - pad); + t.vx = 0; + t.vy = 0; + t.entryTimer = 0; + t.die("莉墓ァ倥↓繧医j逕サ髱「螟悶〒蜑企勁"); + } else if (result === "moved") { + t.x = clamp(Number.isFinite(t.x) ? t.x : this.w * 0.5, pad, this.w - pad); + t.y = clamp(Number.isFinite(t.y) ? t.y : this.h * 0.5, pad, this.h - pad); + t.vx = 0; + t.vy = 0; + t.entryTimer = 0; + } + } + if (changedItems) { + this.compactItems(); + this.updateItemCounts(); + this.rebuildSpatial(); + } + } + updateWeather(dt) { this.nextWeatherChange -= dt; if (this.nextWeatherChange > 0) return; @@ -1947,11 +2280,11 @@ class World { if (rect.left < CONFIG.worldPadding || rect.top < CONFIG.worldPadding || rect.right > this.w - CONFIG.worldPadding || rect.bottom > this.h - CONFIG.worldPadding) return true; const searchRadius = Math.max(rect.right - rect.left, rect.bottom - rect.top) * 0.5 + 72; for (const it of this.nearbyItems(item.x, item.y, searchRadius)) { - if (!it || it.dead || !this.isFenceType(it.type)) continue; - const r = this.fenceRect(it); - if (!r) continue; - const separated = rect.right + margin < r.left || rect.left - margin > r.right || rect.bottom + margin < r.top || rect.top - margin > r.bottom; - if (!separated) return true; + if (!it || it.dead) continue; + for (const r of this.solidObstacleRects(it)) { + const separated = rect.right + margin < r.left || rect.left - margin > r.right || rect.bottom + margin < r.top || rect.top - margin > r.bottom; + if (!separated) return true; + } } return false; } @@ -2087,16 +2420,7 @@ class World { py = spot.y; } const rawItem = this.applyToolSize(new Item(itemType, px, py)); - if (this.isFenceType(rawItem.type)) { - const rect = this.fenceRect(rawItem); - if (rect) { - const dx = Math.max(CONFIG.worldPadding - rect.left, 0) - Math.max(rect.right - (this.w - CONFIG.worldPadding), 0); - const dy = Math.max(CONFIG.worldPadding - rect.top, 0) - Math.max(rect.bottom - (this.h - CONFIG.worldPadding), 0); - rawItem.x += dx; - rawItem.y += dy; - } - } - const placed = this.placeItem(rawItem, true); + // 譟オ縺ッ隕九◆逶ョ縺ョ遏ゥ蠖「縺後ヵ繧」繝シ繝ォ繝牙、悶↓縺ッ縺ソ蜃コ縺吩ス咲スョ縺ォ縺ッ鄂ョ縺九↑縺・€・ // 驟咲スョ繝励Ξ繝薙Η繝シ縺ョ襍、陦ィ遉コ縺ィ螳滄圀縺ョ驟咲スョ蜿ッ蜷ヲ繧剃ク€閾エ縺輔○繧九€・ const placed = this.placeItem(rawItem, true); if (!placed) return; const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", sleep_drug: "\u306d\u3080\u308a\u85ac", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5" }[itemType]; this.log(`${label}\u3092\u914d\u7f6e\u3057\u305f\u3002`); @@ -2117,13 +2441,22 @@ class World { return "note"; } + shouldHideFromObservationRecords(text = "") { + const s = String(text || ""); + return [ + "\u30dc\u30fc\u30eb\u3092\u9023\u7d9a\u3067\u3064\u3064", + "\u30dc\u30fc\u30eb\u3092\u3064\u3064\u3044\u3066", + "\u3092\u907f\u3051\u305f", + ].some(part => s.includes(part)); + } + log(text, kind = null) { const entry = { time: this.time, text, kind: kind || this.inferLogKind(text) }; if (!this.eventCounters) this.eventCounters = {}; this.eventCounters[entry.kind] = (this.eventCounters[entry.kind] || 0) + 1; for (const t of this.tarinai || []) { if (!t || !t.name || !text || !String(text).includes(t.name)) continue; - if (t.addRecord) t.addRecord(text, entry.kind); + if (!this.shouldHideFromObservationRecords(text) && t.addRecord) t.addRecord(text, entry.kind); } this.logs.unshift(entry); this.logs = this.logs.slice(0, 100); @@ -2172,6 +2505,7 @@ class World { this.family = data.family || {}; this.familyCleanVersion = null; this.familyVersion = (this.familyVersion || 0) + 1; + this.markFamilyTreeDirty("load"); this.weather = data.weather || "sunny"; this.nextWeatherChange = data.nextWeatherChange || rand(CONFIG.weatherChangeMin, CONFIG.weatherChangeMax); this.relationNotices = {}; @@ -2188,4 +2522,10 @@ class World { } } -const world = new World(); +let world; +try { + world = new World(); +} catch (error) { + if (typeof window !== "undefined") window.__worldInitError = error?.stack || String(error); + throw error; +} From 874911821f904270cc35ae3fe919a84f05c9f1fe Mon Sep 17 00:00:00 2001 From: 33333-33333 Date: Sat, 20 Jun 2026 20:29:44 +0900 Subject: [PATCH 3/5] fixed issueeessss --- PATCH_NOTES.md | 35 ++ README.md | 7 +- assets/sprites/tarinai_22_stress_blue.png | Bin 108346 -> 0 bytes assets/sprites/tarinai_23_stress_cry.png | Bin 111962 -> 0 bytes assets/ui/tool_pinch.png | Bin 1381 -> 0 bytes assets/ui/tool_poke.png | Bin 2391 -> 0 bytes css/styles.css | 162 +++++- docs/prompt.txt | 574 +++++++--------------- index.html | 74 +-- js/data.js | 63 ++- js/health.js | 17 +- js/items.js | 53 +- js/render.js | 53 +- js/sim_core.js | 193 +++++++- js/tarinai.js | 471 +++++++++++++----- js/text_catalog.js | 116 ++--- js/ui.js | 179 ++++++- js/ui_charts.js | 5 +- js/ui_family.js | 383 ++++++++++++--- js/world.js | 465 ++++++++++++++---- 20 files changed, 1950 insertions(+), 900 deletions(-) create mode 100644 PATCH_NOTES.md delete mode 100644 assets/sprites/tarinai_22_stress_blue.png delete mode 100644 assets/sprites/tarinai_23_stress_cry.png delete mode 100644 assets/ui/tool_pinch.png delete mode 100644 assets/ui/tool_poke.png diff --git a/PATCH_NOTES.md b/PATCH_NOTES.md new file mode 100644 index 0000000..8582fe4 --- /dev/null +++ b/PATCH_NOTES.md @@ -0,0 +1,35 @@ +# Patch Notes + +## Encoding cleanup +- Normalized `index.html` back to UTF-8. +- Replaced mojibake strings with the intended labels. +- Escaped Japanese text in source files to avoid encoding-dependent corruption. + +## Personality specification fixes +- Personality tags and data UI now use Japanese labels from the four-axis personality model. +- Threshold-crossing personality logs are now generated in Japanese and only when visible trait bands change. +- Daily personality caps now track increase and decrease separately per parameter. +- Current personality effects are neutral inside the -0.5 to +0.5 band. +- Direct conversion to the legacy timid personality after damage was removed; cowardly behavior is derived from high neuroticism plus low aggression. +- Corpse/splat contact now increases stress and slowly reduces neuroticism through habituation. + +## Follow-up fixes +- Fixed CSS emoji escapes for tool UI icons. CSS now uses code-point escapes such as `\\1F448` instead of invalid surrogate escapes. +- Hid the detailed four-axis personality rows from the compact tarinai data UI. +- Restored `bestBedFor()` fallback so tarinai can choose hay beds when no usable nest box is available. +- Damage now wakes sleeping tarinai and forces tarinai hidden inside a nest box to leave the box. +- Added a short minimum stay window after entering a nest box to avoid immediate exit loops. +- Renamed the friend relation label from `\\u4ef2\\u826f\\u3057` to `\\u53cb\\u9054` in UI text and related logs. + + +## Personality cleanup v3 +- Current live friend count now changes sociability drift. Family/friend proximity raises sociability more when the tarinai has more current friends, while a lonely tarinai with no current friends can slowly lose sociability. +- Removed the legacy named personality route from constructor, serialization, child inheritance, selected data UI, selected-card overlay, and family-tree titles. The game now uses only birthPersonality/currentPersonality four-axis data. +- Kept empty legacy stubs only for old-save compatibility so older saves cannot revive the pre-four-axis personality model. + +## Follow-up fixes v4 +- Restored compact personality information in the tarinai data panel: visible tags, birth personality, and current personality. +- Moved the focused-tarinai highlight outside the sprite rotation transform so the ring and label stay upright. +- Shortened ecology cards and added the HP/stress meter placement note: upper meter is HP, lower meter is stress. +- Raised the friendship threshold to 16 affinity and reused the same threshold for friend count, friend behavior, friend UI, and observe highlights. +- Observe mode now highlights friends of the selected tarinai as well as parents, children, and enemies. diff --git a/README.md b/README.md index e64b3d1..a55624e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Read only these first: `README.md`, `docs/AI_CONTEXT.md`, `docs/code_map.md`. Th ## Important mechanics -- Personality affects fear, fighting, social pull, sleep priority, zunda preference, playfulness; children inherit one parent's personality. +- Personality uses four axes: aggression, openness, sociability, and neuroticism. Children inherit from the parents' current four-axis personality average with variation. - Relationships track affinity/fear/fight outcomes and influence approach, avoidance, intimidation, conflict, co-parent behavior, and UI summaries. - Death causes are normalized by `js/health.js`: fight, hunger, disease, stress overload, over-poking, firecracker, accident, lifespan. Major damage within 10 seconds can become ` de suyaku` in UI text (`...\u3067\u8870\u5f31`). - Water-curable diseases force high-priority water seeking. Zunda-curable diseases force high-priority zunda seeking. @@ -72,3 +72,8 @@ docs/code_map.md Symbol-to-file lookup table. - Selected Tarinai UI includes per-individual records derived from matching observation log entries. - Observation highlights selected relatives and major social relations: parent, child, friend, enemy. - Explosions impart velocity to nearby zunchi items; cursor contact reduces stress and emits dense heart effects. + +## v4 \u8ffd\u52a0\u4fee\u6b63 +- \u5de3\u7bb1\u5165\u9000\u5ba4\u3092\u5c02\u7528\u72b6\u614b\u5316\u3057\u3001\u900f\u660e\u5316\u30fb\u5f53\u305f\u308a\u5224\u5b9a\u6d88\u6ec5\u30fb\u500b\u4f53\u6570\u53cd\u6620\u30fb\u9000\u51fa\u5fa9\u5e30\u3092\u5b89\u5b9a\u5316\u3002 +- \u7761\u7720\u6642\u306e\u512a\u5148\u9806\u4f4d\u3092\u300c\u5de3\u7bb1 \u2192 \u5e72\u3057\u8349\u30d9\u30c3\u30c9 \u2192 \u305d\u306e\u5834\u300d\u306b\u5909\u66f4\u3002 +- \u305f\u308a\u306a\u3044\u30c7\u30fc\u30bfUI\u306e\u53cb\u9054/\u6575\u5bfe\u3092\u5168\u4ef6\u30c1\u30c3\u30d7\u8868\u793a\u306b\u3057\u3001\u30af\u30ea\u30c3\u30af\u3067\u500b\u4f53\u3078\u79fb\u52d5\u3067\u304d\u308b\u3088\u3046\u306b\u5909\u66f4\u3002 diff --git a/assets/sprites/tarinai_22_stress_blue.png b/assets/sprites/tarinai_22_stress_blue.png deleted file mode 100644 index b1f3b404151da3f1db221e2878bb8df2e598cb66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108346 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
    )$CE_DK{!YqYm*qnb9ANY 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

    Q%Ki$GQ5b^j_)e? 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 diff --git a/assets/sprites/tarinai_23_stress_cry.png b/assets/sprites/tarinai_23_stress_cry.png deleted file mode 100644 index 320a2b1f836abd489a0466d3cb519d413b581f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111962 zcmc#)^0ssO4 z$_lb?J=6Cxywd64rCcJ$Uc7T_SW4Ox*Jm=r2{vW|0x9U;W`9F6*=v$e8NH&jPMw~h z9&rAn_&HZ#t0><6%uQDIW!P;uAx^bClh3bROGEBZV%9 zWnyl2(qk@}rxIg8e5{}@I1Kv#c@X8!miGf-^>h_{`zBv*I8(;ydE;fe+jQK&JLy!~Nb^y@00dv}@vaMlw25Rj` zaSNTvMi3imuX|kGx)Vz#%f$0XL(@I)F_}nt68q`W7(k`_eh>qoRKKRboLA8A#&v3H zD*y7_mjJ8hUpEH;rL19XT{zq5%*tcj{I&k!tg!Z?OGXLQ>2|p5P#hofWbUDq$dZ?N zJ+sAOTg$U4K)hb!vT^3O@cRC}U(44+ueb#4bssqFI&(~F()owyA1#A`PPh)hrAW($ z{KShb&RI`R&Yl1Xw1PFt?ZaWUzW^k)R-Uh!DOHfcn0U0rln~O$5w$V95z`T(y@!kp zRUG!I?1B-42#=1(ZwSsT?k~F@t(#XBh;=-o>1IlMozlv}nW^LHC$=CR0ARY@cvnDx zgv3IcoF%9WRt3XFn*GuwKLb?OwxqQH4ls+jw(OJiPNUMs8eW?1u0&b;?CA|vkP-4- zoKVNOclk4D!NP=Ur{QG)!0^i^y~OCu%^>~T>=S#1>=VP6-RAieWC9`f-x%M773m2D zCg2Vu&2M0Q=AFN@}rwp%vFjdPiY9^4FZuwW^-I?1u z-20BK`;)7rOkY_2?RsQk+tnYev8X9yhgh+pA!|ua;>*QAT(J&Jg??}thmp?h%T*aY zt#=*_blZyB@4d!hSt~XJX#ijhq+RTbEL!2$dYUsiwL-qrAAi++p0B|Sy4H9p ziG*}p#f&fkW0-8FpU4uCu3qNm%EAG15Yc*qGK$(0;It;M{CnWEl;ADg3Zl%UOwtEH zG9l-Pra&=-+>l|hwm8Q|}C~pF{E2sJ;Q9{q*Qp^;KI-OUt}% z+3&U1%~(Y(L;uS!Hw3hg;q6O*TJl4x$s(utsDhge_dsC6K-*_Pd7MEHVObFb@?0WC0EaqbhOO zz=FGjhB{>m!5zWK_xdv9UD);n@5To|uvj)+I|=Z!nYs#v5~YN8&~rhX>3LdJ#5*h zd<|Xv9Oh+~dEH%X5IqT6qt1+nWso|CyRzn#CsuffChxqeG0 z3kiQFbBoNfzOqGSO&y)$`lrS&_YFEu4jzv7j8J5M!aZP$+2!dR^M;p^K=A_2@WRH) z-e}rFF%;nR_yS031xwp?R?07|`ZLH@qQ-VlmV?;_Z}rK&zNEgVe(WJNx&K?_p(O2KB4(O)O<2B#_v{ds%KIgiFC9(p z`-L|^O=x6SMn;C^ClWN2gN|o=sh`5opYvhWk+dRO=blHbhA-+?XO?{)U1%RTM5Ir{ zKGkh0_4Q87xiXqZVb;Ft;z7P4Jqb*~SRDnFIOUKNClau)Gfmrd*^w)$yQ~O`7p1Lb zJGXL)G{p!A#A2{rI?8#~^@Vg+1zCX`A^assn)o*Wi-0bgbKa^W< z>NH;C|B+*8*D_FIPM)(SKq^;{_0q^jOIh`llU2qO#_c=jZ5TMw@URv3Ylu~~^p$5#v7x*$sKErGEx(FC2Hu$Y(xF@$iE=V5`*42*8!r=yEjJ0eb#G*4J^)2hI zR`QKyg4LsC-+~3~`%*(b;FyU!=eZm#Tk%O8%zV)h-K26!%(_^a8{qNJN3$SaH0y|D zfy3y;2roCrD;Z07w_@lQ7sc!(Iv$J}h+0u8go)3^b7&5R65=(T=rs93XslaWPY7;WZ|yyY#Q< zkM9^y>%gl3ww5D2+ke&6ALbIr@lk|<<6-%b?kTo(O6+4!!oMT@wG0_DrD`loHaY(F z;OcNQ2Rc+4kS_QKwgTB%GW&I>*83O4l!3RbkdGa&#+FZJFA4>{MGD@`#)9n$Nbqub z^yGt5LXc;YS+on*n({-nheB%lM^l%NJp(fsPpoCZ$wk1RRk&HIS`UMM)2IA8OJ(n{ zfd}?xsm4#6TznlZF}vbwEpywHUW4x^@pW>r+uiLMn)`F-FoMDCPwd{7m_g5^R9D^|}BeH#&I#kRC~z^ z`*SfrTY;X_PN1eRtka*koGSUOhdx2zgyt!vwC4^)N=zubj)TG1ID658U;kLl*knu{ zQx>=iB(AL>4|+fBoLxpfXnXf$YOHzVV!?6QsB}^kj|Lx`a&nmFH73KIF`BS_``5NS z=ap6GHaSnr-GNY+%0gJn)77VG$lo%2nxm^>udB4^R-YwzRLwQ>2Nk~njlTW7@r1uO z71NU2Y1AT;$tUA^lvjMBxjHKlf(?Mo=^{ru7izbeZ8rHIbLHnVTXEXpzle-DugBc^QIcl7&#l9 zQum4qF5j{^@SyVutMifv_uGB@ zQd&nNLzg%-+pauJF1Ugfh`AnqIP~4DEf^M<{MFR`LC&ipTA#Znh}zSu>__5H^}fB0 z>qr};WSPl0s8)?b?>yvrxyq=QELOYIiQ#062w+_Sr4Boky`dngC}r$Sy!DP*P6(yI zP{OUW(rMp(Lh7to^~d?Q^5%jzRfgv(MG4=7h4tp^-TH+C-F_N4EP}qkOKOQ7pHKR_{T zK{@H|0PG^T2jh7JA$0cNYF~?Y)jpBr5w`K5Xn>LoR~Zhsc@=avyu$QTx0goy<)Qep zqQdp)s5%}}xE+Yq^I(y>+k)&J5#p{F6^rt{-t4XfZ^T-#=l@;Wn!FgoE<+G;^pv*@zB5#Im3@##;rx=fb zd^1CZNFME&BFB9Pshh7Ai=Wnb414TQs#)kp_JVNISL2hIxUK=Mi27=-_VT9GWz)<1 zg-6j3mqTrjxz*RYFF56T-kdA(sD7U%*Zn;b9-G0^OM?kOeJV-6=!J+2Krc|^Ebu3g zpWym?p`awh@92lkn@%lR1JY7G&gIiIgH&^eDaYiNf4%nB+IAWkqo z%5Q)J5Fdk%gR`M7RmB04BlTMP@mizS5phs8>hRb(^{@gDCk>va;FPp@_wBnO6OWmI zELF`exMm1wMYrstZ4}t1`S}!{(49TSIZJ&{9F(2K-k6K zr#d2T1*plM*}(S13v9Fgl{Rfu+iO)L+OtLwonw|{Ut^NJ4dPR;cf4PZkYN7G!!sk2 z_N9riU3TJtM=~W;vcj&ok9Ln{NhY3NV{bh-?WV_$bo{rmxG!g0Zw3l;BOCImtF9XSf zFSHHrt}8wyx}9Rm+S^pn)qH?O;Dtv8I?GUDnmkMaGWVCTDmnmM$^f!tAr)qh3D^_k z8DYdayL7_^GgGp+_xaA0l~N}h`s5Wbd4;^~=8Hwno4(HMY2^w>iURn{a)| zjQcB$5wSuO;nAAUFOn}PkWIHJXO-;a=cUP=2kgcYZkvQ>ANE2c1e72)rd$JwTCxYC zC&2;;$^9^a>Gt!oq@|g;xouZBwvt`Kl0HQ27SiQVirg&bly>Rnsz+P)zKuVye(2S z)1meL#!vtQEXXjiGv@OlZOXklIAL59j3q$b<(Pa$?t+~M*-jG7ygdNa-@oT#@`G^Z z_~ipA-MRZd2vGSW=4`3j@58yuw~YT=KK&S(PHdw%1?R3ZCdV{8mVhfW^z8z92eW+atD$2sD0r=-H< z>yd{s0piG8S_Jk)T5tTg-dplAefv}Y3+30t@XCrD$>(c#C}jcxnckQvg+nr2jmI(f zGpQ*Il1;5qz(Regf-&v$`GeNA77qkIKunxDf)oz>%5QF-J~21P>GXJ?`)94=6QQ*` zBCPey&|$Q}>ZS%sKe^9d9|m@GP&hTGowu-A?meU>WR>IRwUEhS^jyXE^Sq{N$#!Gt zP8<&x(koW@zH|Zi6Z|mJe&4cuf57_<6N>*nq7ljt6DTujGa&D|UOJ8<64@P&XFREC zJ9H7H9V&DguY5Pe&ttx{n^t`9iLC(3yhruKj}r(hF^~^GZ*=nmj`=%^SGU|UuVGr5 zSL#H4Fm#yu@Wy?wy8^M96zvKirKgA41`~vezjBDc$bB(V(eY5w=e*?Z+U~J{t>v6P z-BA*qAF+G$GSd74OdxpPi&-j~ec~W-OAyK@an=%s5j2J?aW1`3dAgbrb1cIT&rkTu z7D6#L=eGZNx$d~=_5|SS?kcL+{MN(GjhbDy$Luo+V`ySr(DM0Ahkg5aTZ3l1bzM*w zXVZh!RpyyNltY7c)^fx}Jl(7tjX!g8`he&aHK8Hu^MN%zK2Bp$=c)8T&xYwiVAc=W z{wI1tz=C8ldB35v4q?@lM?S{;e^mYu=rW*Z^~)OoA<2ZY>a@{i{mkox2j));YbN!K z*Aa(8svnYEOhsO*N)MnW@rwe5Gw-o5VCLS8I>;Dg7|x!5Z(q%04XxzZ0U;e`2z;L_ zBWy12eRrC$#}6uN`t$D{#)$iKQ^Wt$I$YmxkiqEGq2Lu_O~LEsKiAh-=iN74Cn*`G zadt9|`ZMfY%!L^fa(K(*;mu8?KPTbK!#}NIU!m&2l|goFdC*7c)jmeTzw4$SgAUi3 zEkLE&f?RX6v&gr*5_`}i>AQ3B7HKfl9=Uqd9riVd2)JUud{gkPc>FR!Y(Ux~+q&UG zGL0tMCYx2K!F>J)4wCvi9J8Yf7A(mLU^Z}BVd4P0ORuap9b|0z1fZvGF%)g3V&+`_G#GBTv{g+bv z*Xk~9LZ?$a$&WX$*bE>hyf!}~g0i|a`#3_RsUG=Ic>Mw0AK{Z40<&i&^hbDeoiv@8 z9Qo#-gMaJXbFm~gA8~m+{Huy0RLaI!TwL@HZll2`qhU2C1fdnzsu{E<>33dY>c3k+ z(BX4mpCsH)-Tv!m{Ga+z@7sqmHoOR^+$z1Bg-%LuUii>fOJaP-!D+`+*H?|D&x# zgv86Mlo#9W>7;I)FAfjqD^~~zD(M2VM2_#UdKl(t!P(6Yy&~C_X_eapL7vy``$u>I zj>u`ajoOc9F>;Bjdglvg`z+-d$@?`&UvJn>tvyVYGNSQ?jH|2bAicQz_|5t5eRS*Y z$>Z5`@#QL?O`W1vO*KW4p+4Q(9JgXJ)me+~8+_CR|1&T$l>1BKBn`1J6Qo#BNfcriJMwi z7i{VruuDv>Y#fFt~PdD11QjShrd*5UAnABi{v!|~RBhTp)e;yRUCWMX z3_Dau`QN^+rQel#FWR`X@sk$cXAIVMb27s`3Xu0#qyPYrgo!^enOhQ$_cHuukH-l+ zkC}smb=s4{*d3@oFSA>5BhINhuKK!vCUBLVuLc`q^(gd(+Fn|o<@6ZlIIot?3@@oyCFdNSxZwOQwalC$2w^M97#tf8a1BB+Genb26B6^*hdXEMXW`EeX`{0yfm-W}XNr2JY(js~_T}F!+G^b?zP(spIZ2RmDWhNgy%1jR*A0FGUUOn5pDtDhu zOk>Twz1jYIWjMbo7zY1o;#Cy=8!p;fye*}f1I6rdDGizvE^PnVKOr*mYAs#(>IJG& z>E?CGUMHdS#-;DWO+)KOL3#Q4!+$9dclWdLxT+r|A?NzokH!pga_%G=nVfm+z z5wiJ;d>lhe3W}YCTUGuV@1GlkL&aY~L9_7~a9fhoupyNaw`2i$VJBIGqx=|Zu`-?| zSwAKrs*vV=z|P0^H3Z@~e>94)u%u;SvBE_FO8ER0a29*I%#dANr(zoOXe24irT);$ zf0d#-F)c~r@h`ROKZ?k425fp^mKaM3U*NgY+GVS_sF);Ve*%6cT2>urOCGKJ8~fiiKx536&I z?~i`*i3HFw!n;Z(rKbc(MqhlOT0A!0_18)VyE2abf{U&|o$IV201wx47n-c5)6C=! zpLbH?*}gNer@WacRz62zD+F45sg{-pe2WA?PcQ%^!ED43Rhm-F%t&6XyrwH0T6 zQdZmy{V%ZVRi@gc6ril^&WfnTaRQHx{vWJ&E z!>}28d=j#_*f!C2eR4Wh&wo|72hS=r8p^yx*@~jUWh1S*rB;;Hrt-bC|&*C zypC`f3loVMAldoRlDoMX{38*|MmHeX^?3?#Eay(Q+-vt`Vd?I{bOx8&Pk7H&4+lVq z19jZG`5kXm>tSUv#G!s-NX7o(rMB&lgtCAm5lKXl+21$28T28Pru?5e-|Nc9VHyK= zHt~iJZ7}jM13oh=6&Xnq99$6t|DY=oP5hb&w4a!@`#XpC!IJM3*xDuM(fWE%W_W~b ztO@>I&s&XFF9jcg)x&I^{KL=g$!)Qb;7<;ufqDQ($E6&u3^9`F4e>6M#R^K?yYl*A zzj7C6-hx7-H_uvV(L{PJ`SShqj^jvaq?v>nH-O~7w%vZF{Cvq{|D|;g{hc!J4CCoZ z;AWtW)K`gwUTk+iRI{i3TzJ?#ml=_IuE-#i2zmp@gy zhnA7utXF^tOvQRKOdBxU0+`Zt3af+{Yu~;y#@)Sg=8Mb5uCDR<25WOmi<@N3D z>;`0UI5KT-kh2%ohfzGj=-mXsZSUh<093Yhbl(8Q>n_ex{V58;!ZMvOX_dUZMvfD)oQGQqa{LQ|e^R5Xf~w~h;N0EyO%2439n^_gEx6HEg>$?iW@Ac% zlT#pY%s6zGh50xl%Klb6<^o@rDBjZRr@kJwPTuc@~wtYbJ?dEp- z_?A4xP-nhM67Tw`dOY*E)0Svy^JlaWVZPQMd3GaWbk}Um=Xlql7QJ|QMs!g*YAAR~ zpk1}Mqf-Q8w9@T^C$Ic=!YWN6E~@=_WhpaN1B?=Vp-C_RA|)y8G{5JrJeKw_TQIGc z?^RL>JbHg$vwXLDNR=`NA_$GcSsGgu7yh`HdvNfv?sVO{ptbe*Qr&b}J;_)W%{<`8 zX@)tHla9jBr-E;f-?%I)(L5}@#MIFsC%(e4$q!-K%5PJZtq`~9uGjrW0E#ap3NWv$ zPjD(S1=!PzK}hqy@msv34_-r3|2iiZcZybaocn6f)@3TqHKxt)ASpv2wb!uY8tk)_e|uZLp>uH9_|>3(y|rrs0aXbe?_JVmd5tR8=X?SV|R z*P&KeJ*C_CuuP=a6CP0Fn{UKv-O*0(GFF1;{Sf+v#uBEg)2-_Jjn7~S&L>>PO-pmY zl^X37nEjev2K5WSP~Cjvh1%943}8bbD|fcW~TZ?hTk!Z9vfC$9tY}ldETGGox_W9-fdD121ny|CoI(1HIzzFG?GY zc#xjg+{VMAxZ~E&&M$iG8$ANlv!^v%-_()gb7mj>|0c8yj%BVPbh*Ms~M7?)}GkavIGY4)^v1%i>qFVcQI~QBj2G zfvdqG!DiNrh3SWANs;|+kmVxDxt^~Vp5Csqjlg$^ z6Hi-qDJC&+-nzCdjP*r6!@MpNDMy|UsiDc$T5h(J?#P-Dv_DljAMhU^1$8#GpD(@} z;K{hn`dBYgK*3GoVsrdnJH~-xoZ)H1CR*W~6?nqj9%_bUUJI5locn917?|pUmB5bo ziylFF5~*ACgRs9RQ%^W?(XGl+5VlKtuT>>Zd*Vt z(SKyR=j)qc3_(jhc*VD1IWB3JNaeuqZbViP993}vaJ2)h=14N%;gd%D!A}tre5AOT z*gq47fUZhiRa`I}U9D@;t}>IH%_@7I4n+NK69cEpu$M7yY82_ysfsSAMrY!LdxMtm zO4M}vdbkiKnI@XDAv!_c@*wvVCZ)MR9`!@fDs+OXrwQAjfM~M;4j(1@s$ZfPwdRL; zu8+>5myXwW*#nuC+Acf%w{@JA&x`%h*PJMMc2)d+IK~EPmVu#I)bS5fkClyylynfc z@^5EE%?^OM3z;!Q0oXT5^Lg;7;`2ZL*ihs0w_yTxJfwhVEGj8c>A2s|(2m)?c4cl$ z>*@}4tz7vf+?)C%`2qd&8Itpl_O<|Kl2x@>?^h05P>R<8-D?K&Pz)tZZEyoayv!#n z+&x=!7L;kS_g+fH^^If)BJaMQxAF%bTvSta3%lgox1NK&J#v%BpawC2qM+K%O<6R; z%x`R+Ep9}h_)qM1fEK@AKy%{az}XjhKm%aatAK55K^aaUaShYf!w0@H@8hcFvV(&y zVq;_De(G^2ndHj9{DSu_eC=0%$yYB-3z# z9xC(|d+$so!Oq8AB-xVvzvJVT)K!p@lu`nv>87lKsaNF1e+7}#x+ha)L+dl?SH+~eFwDEyk4rbWHN`ki{q{yOBk1Inyf zhDqEh#kypbb3Th@!x*Eb#hZ5FBO+baeu&yR*r#|Kd@QfLK ztv++hJZx_6%>D3Ez$!g4IBT;1%n=49A)eoT5xNrKX6R7s3Y7AA{XxhsU*?)>Jee&hN^a z)Jzl=2Z9|+2-ebYtl19tjBH1eonJ_vcaAN^@6O#6%P|k_&7BlAjP#_7^p2<^u!3^p z-dKVotgdM7X%&1r1n>HlJ|+>PB&ZhsD5w<9}6$Hz{4 z9~&lD=%*)*B>DTug%4!?hYjWBLw*w4p~4a5alrJ!hZHq}MZX_a{a1h8MsU}#;ZW_T z5ukCLurfo$GspIg)QiOm36D+qp?em!!$4dzLYZvu731C{X00vMu7?RijH#*=YWC-O z>O}#{1%9TxoyIbl-2YX3hbfN$SsG}lnK)iyuR1?)cELOTRI<{HI|YW@Ssg`a&~hQm zm$6iBK!r7WR0lF*wkmaadHM;@pP~Oux|j(j2&H*dQUZSYfY18;XCvbKxrIW!`FivG z0Z@n@WT!!`3TTN)wBY_dRvLQY>I5+1?YeG9?4YfYTL%oQp7^LX3%Ri2|L)3cTg${{ zzm7_b<#F4!dD-Hnj@@h44Wn^L;PVWH9=2@m-&~KM2ThqYp}6=VCoxA(>x!qkx6A)@ zV5k=rW+?Ep?ne}tz)xeqJKI230kAEB=tywln%1~f04C1Z$aR#HX^quL9lJZmPdy;M zMPH*XpgUOFdzZ;zcJW?2VP6Fn3x02L0WMP-dCHNbdbkW5Eu!pwepkYS#IVij(i}g^ zS?LPJLusD{vyWPVndG9P>RT?4hBaxE!q^A+}J(xxD zffMFy!%JuZ``P9LSJKF0!*tMdV)_vf91O-LoML`bkR4#fBpa#p*=klvt{W(WzMmWb zhYiQoUSQ5j&&$loqq!h+D&FTuF+m$3@>ZD%IK?x%bqxZ>a7hkN&7)OkN-zUv0P|o# zu<^;z3XX$2YjDQFucZ58OU9L-6_{8YTZ3DmZ)O3JD6re?y$w-m@Ym}-z#xs@{+Q3g zyItwqxxe`AWS3abe(;(pu#s_VZ?D#5&gqdq?*yMXk7D2tp24ahhW~WLJ?%wOY<1_9 z`zB#&gVbB)K>;@X7)Wql5c$qJcU}nn2p|`2+PU6*oso zo0J!VElC8`eUH?vI3hT-{C2Ox=ZOo&*ovv$%&}-}u;PA)u?fj((UI!RwopNpQ#j~V zZ1`7>8lvTjjn2MRm+!dsm(dY|K&XK5LhOE9Nquva&k`I%@ojxebgy63^(g`1C(GCynNxV`P^q--+ z1KKcs`kx(eszkTMP5N#-9NpYRI(}R@`~4inWcy?*m}pFXXaeMKMx@@1>WTVvNW+15 zRV}(6r_4Yc6GI-PzzzEl8Ys4vfCtg5I6lM|C=(L~mRvke zEh%_)W_s61T~39kcCg3D%ve zVKYL1gAvJ*&DY3JYKM;Pxawed6&9J4d6Sdl83KCA83nSg>_g!56)l^$%tMHp;Ko~} zdhPY0XW5~?6@wFu{#Y4zBw8R0_(<%@dQ5v;Jpe$V0|>XIWdjyTtX3fwLLQPlZfB;kHL*BH6FQmyi(GiC`k)zrTYqg_xOX#Tm3-?NU7iMg>*XkK3jYB|T7{r3nqoMPSDEQ4P#{|JEeFahaq z%mUwBOkZwMDFvLGjC@B;(kjmKvDRW~W?PD$lkyC(O7ULX&>jFc{oQ&fNZwV-+D zvd6MtBHCDc`_uC+ps2wk;NkCP#Z{*^;$h-l<}Qwo%wp}+VF?im%bzgSPojIWSZ2;3 zO7q{yr~E{b=FfH%#A$4vYW+q97ZH60^M)?lax|tB?&f}Pzp+&R=)%FlrNnD3OKd}> z2)A>tVd_QsQKgam=J$Lf}sdHNKDeA5H*TulbGM zL$XnKB;naq{M!EI>z~xt^(_2fvOihXcl;of{j0PqSNr8j*q2vq#Xx5}{Qj-~Y??2W z64#t(zY#UyKNMTn!yR)b(010z%hMmHltKg9v+oK~rSr)hBO!3_c1aJS!ZbgtkB8qtXYB z9*2JUSn?^(`GDY2MDuCT%;;?0cFI(UuSr#4QQCBvt@V@6cK&+}D+nedxHc?AkEDeT z#Gp39v6eRb9W z1F!^c`gjkh(AF&9OgE@oZAdSXCNXkz3WO0*kl0(w@7oExj>HfZro}2!x zw`znsU3&}`FhA^)yOj_v3Z)%2(`1;Q8?(;Y*r=nEA!42?#v%Xa92@!XH+gL#L{5uW z08Vh=xhmP=wUu*$Hm1V_7*BeHRVDhrfRSiXxA!Zjc53F`&|(9Z2$==TbbGd~^>0@G zgca+N*+)yontr*>DJ4xZqtRsNJ7tx8i-IV83P?5ofI)!%31;3tz2_VP!dD_~(cn)= z!)wXO*8{!9jSzkYkJb+uqIg&M$a4ewt%_�UX9{0oEgsS=M^RA9w<3G&zzc0%4CaOC;|kI^fyh+-%m&q@8RM~~V^dgDhzB_}vZK+|bp z_*vyZ*=79=%{5l|@{3%$w=;&Z?8qV78Wuh0SNCtwV|QpwyZI==1;gX`y|jwEhdkPH zGv5kBr`8_{L4{tmZFqj*_=WA%tm#`OAxG&g3T=NUHugTKowo_2`kZz zxf9w2V+n1|Uqo+qb3+TYQm1}RU70$4`1=8=(Y7*cAncz)7LV}>=6rlFwVg^`I0GXP z1p*e(*LCkYUx5?{bL=9!FWa6c>QxB(LLbKvF;W$~ObWAk<^x_ezT+rWbDJqi7d zQz^Q(j6mG_Y!V uN8oe=AL9ovVWF?qS71EX*TSlkC0U?n3VG+urV=$ zwww2@{~k#yib7#U4M?Tn?a;ohPq=UU&JSJ67Y9)k3oh?c%sACW0asp;3TYt<_H=U} zY#|HPShu&0`TjeKh`TlHcE5?2>{geXngpSYp}#@n6TssJQ@`6@dcKdI0s$7O`teWJ zhZEE)|6+~>Kd8M9bbh2u?KMhYDaEQ0Mj?8nv?cjTWV7E5%lkMmNByqoqdbS293jwK zmh?T-1Js;}*9T<|RkLE)6;Y3pqv4Bz;EQKU zy(^z6ahHz#K|&>kX6=VPInM!BuxRsVt6TobZ=^*6oP56~>&vcNH2585BmrfW&ZX!g zS7Ga#?4ZAD8u#mL>r`~aU#Cg6)juGO`Le4e2#v@IEL21@e@LlE7zf#&aKs-CILUAr zfXVOTva{aPf1y6HIny^h%6;@fKQA2HC9J?;B>mH^2_Hw93gJy60RouwKAT*E05F$@ zQ}aluS_VVy3*BHaCKnODR(+o5NBC_DpdDKV^fYQ3CPt{-P=a=g;FaiX>t_0`lqN5G zXfTU2eI0u~VW7eOFloeA2%2}rWv9mkCJBi4x04TL5PHJa9#BEp@}a^YT2eH@cW>R3 z4yI~b{uXK){1?RCi)NzfNx2+VDuHQUTbJWC(e`KmR3z`di`m@(h`}f@DC{RLFl4tA zpxik|%<$MvcqToAw++FvuaEn%u=u-mt^In$@xa_Fd0eK)MpUru@cX-FG#hh~x+U4) zpu-B2%uS?lQyL+DdOXI)M*LvQT|L%QHQIL+%h@}p3x7IV{XP^7EW!#f-IemOTHAd zKdekKidd&*0?xTEPoPqE?9w7oLW%WNAXu7?A=!dHTK_~3UvHsGUot}X4!i107G5Do zJu^IX0z+uN(7@`^K;U62@8=Q`miEyozM+vFTj2mR58g0C7-ntK`>Qz@Abfz3jL-&3 zk8P}N)a;7w=I$=`i}4P!O(#!W0vh*rpf`w$0DndduZi0-LC9mejJ#;nKN~ZO0qxMf z3DK`GY|cW3E!(|Mlu|84RQq}xtqfdihXeXmmuBsLln$?RI;m|=Fw$gxNJz`Y<*a%? z$|q6@fq6F}Vbg~1GP{2S&`^?$vaWWdMr{(!LR)HwEZ~b*H2%QJOiuC z$MxcS393hyb-kz}TGQJk%`2j3I5}FyTDQl!CRw{JepU5}Tqfqcw6WIPoat)>xD;5J zK&4xUu_ z6J)a&rVWqKbJ56G+FV%*|%GyK1#(ROi*r1CThpSI3$+?r_lrhp!Yc$7tRmu}} zLBU!1tKd?46(_hO@XPwBU1=pBb`M{ODK&m*Ds$V8q~n`#EJ)@aH{EM^@wq`d*&}h{ zJXM#Rgz9@qE%nDYhvgd{K8>|;y6 zBTCr)X^ow%r1ukphH^T`KZ;-(UHF|qs}(s;fqoQGb<3DUUQkCwkEdDD5u-jev{^V8 z;)LZaxFWh~o=)EZb}7})UXiU5X~jmUF(TWTc4&*BKT-%wy>WE#LBZ4EU!8al(BnS6 zx}R6*R&!AH4d6es0D61;xOkStyB$~K6|7OVGN@IBLtu=B(37N9O_}`6j%c!UuBzYu z#|Iu?`~H005ZaVhTZIX|=}}4BMqE>J;QGPj3GLU2!M8-Kj+IaQy{#;_%%1D z{NE@tO1#~@Z&Wwah*SB004zb%zQmbX3s`7BwGLLJ0{g?yf@K)r5CmN0aEyI1jnPY6$b%afHm}ISRQtZE$2$X%mv| ziDD)}meLl3{kz?lpM2m!0J#7D`^_+bVMGo_OD(#)yLGyE`%UcUj`Ec9SZSGPNulld z7_?VApN3)lQ_SsulyxDFvoC>%oN@LuOngS$QK!lu1OWvP427ee3vsG*Jz~@t`ofGd zN+2?~z=(&)09l0OtT0tEff%4dAzx=FlXrjrr@xs9ENepsLcQS`|y@#1qvE7 z4_VBX$6;ms-Dnp}N`3*OQ;;ir{pI7Ywgxa_t$+{`%nTtU<+B-W5nGK7%`q~bRfauq zKox+_&Q7s$$`row&99lK^4VjR(qIi?#T~S-sDqFi%trc8Gzbzd(wJ+#3MV;N1JJ>g zrbd%9j5GEW_BYh}xCfazOnnjmyx@N(c*voFrs9m)+p)wt4+=gs{80>%jhIh3awrTt zC1E)Zm^GNSN+e>mYwJtv5gXhc&bwli0K>2xPz7M)#*Nh7-K{*outt!Yr?l4Wv8bO@ zkH#gIG5=3Mf-(OzX33LrYU~CG5+=Q`VZyREX#uKy0QXc9fPjwzBqWY^F2TvpwTM&m zUgr!bPcvM#Tr*-#4(xgx&Un%9~2bMki;9ox1-QBI%ty^b?01U%&ARi9u?(SCC zUH9&(0^YmwxtxX|$y%Uoc@vx_g7z_?%>O}dFmc!lyP)Tv!A!9Nr#tU}1>0o!GfV>Z z+|#bLP0gj%*?U<)L&M_&=2|D;j_{dZ%m^7gcw-s2_;5@l%RPO zI1L52lpXAFiFGfU{bz_1@T%B5VN)#haGw0Ixk3&)CHjF=mw-wEanpIitC6p+SDxdN|>y#qF4p%P?z{)UOmUS|a!sjg9!DMkqZ zjCt}Dw8s|VY41L~sQw5KX;_GtCL*e(S6AoM48#9n$KwD705FIMTKTm3`N#7?sqXze zGs9%&fG7Z+ouIC+ZuQ}tuCxLBP3c}2!m=bYP`@+=yAJTu1RCe^BY0t5Fat;07h<_{ zDQrq2t9vk@w_vA!7F*S$80789>fIm$Bw`Sd2>J;JL-{5Yo$v(YnD3JyP(TK=4$^ln-G#9lA=_O2%3mRE|k*hSV_S8y*O{f;lu$^0G2K5 zpw7;vqOj|k>%Dwhg9NnF!fsBW^;iem8}AeU1cq%FX*AF*EO*|5xz@>0D8S(t zT8ins49n~b(66^)r+x}s)f3pEHX_dhkYqu^Ip7un1|v=lVAjZ?A9BoYX*i`XXE4t? z3#Z1eg@k2@1{KY7@b_kXR`T;p41T_Y(4k*#Y8>gtt&Z-9bA7R_Q7PI0cn zc6|z-_I{1+dLt}25D>w>seBv+3N--=asddyZkB*32mP_u$PV=M;&2$7H0&1#L;={a zVFz_}b*r1NJnz*4T9AOR^DOF)N}^$|1MQ99*#BaVZy!G9$}@0+b2;j$4PGgZS3p5Q zu^*NvG>PeGk#lf_wGxARJ6=?O!VCUykml{Mkthu#9GK$;T+U#wbvisQ;1%`fF%Zy2 z1t^0h_Uo|1xf}ovd*MG8CgW%wMj4n$)Vlf6_d2k|mCEiRT(G*C>_Z59NZU~|4ur~uT`vNwL!^XYzm!tQU>J@uZ_PV9J4IL5diA+afBZVZ{)xF< zUJ-<35}2|g1?doYoDP#09sL9>tZ?3jGh^>Uk{UzdU-s55I{*gDg89NTVEAYd({Q}g zfpg;@#X{>`Xejt7jO^{ZpD1{E+5a>8`KA4K$_r*Y)9~TqSo_U5$+-#)eb{;XN3FX& ze0x5o`!I|Rdvg98@mg2K`f-(czxbVNEet=SbN*EyORbp!ijKq{@?a<&WuK3eovYzc zJ$%krymuV6LWEyQBCr4e0EBc4u5ywMXWVeZ4J*6WuUG3jI^+mvY&eV=a|^)6jT;Go z&h+nIuH0NRKuT*(PD2c>OXFb<%dy_;{zDM(kU^_hf)nj4F-0zhhis^Ak1Y72kpRJz zpf2jD8K*keW0pJtk9ytc)i1z83<4I$+CMhG#P3#<_bV}cen2BWU=ezi%u)# zb4*f@E@;#rokaZ{8>%q=X8sG3+hnmouEL4VRftidG^5?#9%@k;@ZkgSFk7C0Hn9*- z`@g_5{=LX?FC=V8I2b!cfWv5npw7LgINqN|gP4I+V%KB3JO(bOCw-XXz6$=m-EME6 z`C|R!?OmDNM9uj_&F(`OTCB2kO-H~H>MK<%;BgjBGy`Wi@4%D(J$OO=4u0q$7$^#% zr9lH$l0Z_FM<9rxmB-T0cq8n_U^p-~-L5Xu+5TNEM8%OQ3(bq`K=$}+&5B;`3$1f- zdhAA6WWz&#kG=jq*Gr*QAqR)zSZ)Wy0!Lb}N0M6Mat1yM2wvo|x()jf;|u{n!{aPw zStsM1_^p^GmWIOrzztg*N=9RLXC7L%ayuU7-|+S9&9NHBhN0JTs4>6tzE!U&-`DDd zz2%}*u7M*ZinIKUU=1j%AOao=uqlS)olEhm*xNBxEQ5vzm$P7~pfnTW^%h9Vh;sk{ z*2KO)`CeYbm@=jofR2t1xpe7L*8MMC)U)|-?Rj4*283N_qy4xffXZj|P*a@EZmxAI zPI9h-h6g<)DaZcrgQ4Lfiw2s8lVew6K)(iC{711#{TaLTGw?YBi$W7$mEbr~M8_R% zB(U7M7)RL`fI#7_ev@mwe@{ZRrj>V0B=2x_P|bZtd;H9-h=`e4FoTIGXz>9eBF)T1 zL}q+9!bs!)qgJ|Vd@KDNsmEX3KNpn>t~A#VvrToYSo}pGXjah3VVXP=?Q$Wu>AzvK zdKf$L6g=cmP+6$B53&imQ1m|_018lr(Vej2uw_gYfad1sMORn1_wFlReXJ!>r-(gx zkoEJENKCb$z42rICrEgl#&l~rPIYboL534`9Ebx9>;XmpfD|?3NauVU!DnHodIrz= z>+ypm8DqB@^k zbPb1+OY5SGEX!nFlLQ371%PZIwAO$<=c#{~!ym}MP{S@Iaxh-sDa^mAnh-!F0I>&EQZuynmn0&u};} zW(q*y{om!^a?34e_`9Ec*Ff)9EiK#fl}2J(011+lm~peT#9LODR!u5@RWZKwy1~UArmGP3U1F>ih5+oDF9z6s2F@UV{{pHe*Jr7_2 z5Gk+VF0tdWhX9HtQ!N(*O!;h|5<(bjzz{~ddDXq}Q4kg4qZ&>a#qKG(VCX}_42ZDj zrW*B9^Ad{ zR$WL>0Z}m5uM|kkJy02k_Z|TW7g@B4BXLITCd5VkK@t8@iv9rr;2{r%0;bAEI3sow z&W?Ww3*_0bDFv6a@Q_8($#4GzG{faAY)WCN{RW&H|0tF@7ec}s6Q76iz)0ie!;Rk$ z8L_Wgz&whP{!x~T8g-aiX|0e*Bt%_98(B`>Q(CK+|MI8befWRB`#&Ff_q*N+A}SD3 zVcLwjiiq6sw>x9@d__cAB64rJnh-16zA}jqR!y?8$$HBf_Afb63pd27sBFHFI5ky##Cp;GXsC??2{~pZw%+*RTK0 z^g^LHP-T6!hJ}U-_uBQK{BRWK_8oc8sQsix8d0V&=P_BEPs|6gg$R-Vq;okAU z_n?4wu@ozuD*$k4RiMc$_=hp^*IGQnXh6*?I+~|=h}bB#{o0pOT8TuG0K5C1d+zzo zrI%hhH=RzO3E+AlFx?6fD9=hMrL|@v5?X84S~CI%KvGI6W`<>1u}mhLIR7;leutTl z6GEi49;cbM#udZ&=0{x4QGp(+dR${5X*6=adLJ~>0!DQ<4rWFy=8%*&ksyt5fRzB2 zQot`{?+t4rqXZagF(wK?XJ@Clt*gsd*Ijq4m45!!Zl+H`NU3rPO^f4*w^-0#?HR5P z1|powwp}d68L@XEHO_>8l%h~BIt&sCG|K6^IkkX%@4R2Xl7H|gUTn)-w$(j(>Mr+L z3>JFfhofp>k30wycc^$Yp?l%4$p00KD%*3-I=E&;B51Gu(Lu)M~0$c|B5ASDCPBSwBLB=Nz zLIHmN(hGlE0iabWr4Gl)fU%nTw=B(vQ5=Wcrf8;*Dh7lw>***o%j)G+Q~|>JqIDC% zVBJvPAkyjdpL~mV&zUpl!iRqEDkPGU!R*)${`SzXKL-G}tz0Rwe!V}c(>EMejEMrU zapOiJK;PgFPO*fVR?zHA31SvVw#OhHz;h4H5CB1-z-dgE$Kv$ZJCUFUcsR6X|IrXl zz@y0*8Urj7&RKK4<7Qa$^dEQ|AI%?ml$x{EdUU~axj%6ZyNFpsl2e)$Fi;{qEVRzS z0_*f}3g3w*8%8JeYc$xAwsXizB50*Jo=6DGj>9cvQ7E_&;iM|nyX2BmRb}3F)2C10v3c|6 zr-Tq^Dy25fp1U{+z+r}esE69d8+%UuJM7P4R#y1-hfp{RVARp0YEzDGSFvU7eNp+d zs0>8x0&GbM$F_Ih_2VD?Zs*Qzjj?$A^kNhVGb7R1)G*TN7z|@71>N-Kv@YaW2m&h& zyUs$x!uTOG|5G@R{cP(LoEdvJ;#42W%Rg}l9RP`a-?kFsC|LN1>C;<}ZdXT5Jzl;Q zuSs;$Db9_UY8?xUlJMaMJx-d2<@Q^!B6j736#T&63I7VKD_4~XR~CP2t^If+Md@^A z(_@c5@<-S8UUp(}D6PXLJn}E%;TLr#)Zt&$2~aE6TC+|jk|LQ(Qd4sq<#Rc8<&{@_ zf{0e!dFQwPKAX+90#Ls1Gc)hed9P?8Sg>F|EnT|wCm;Us2QPT(rI&vB&bQyV*zg(%-)(p#z|K{O`A5uU2 z*4+H+Ob+ikF|b@1M0&07$Ub zuv;W#0-;aySnO%f1W9f*e0W%9y$Q>mOTobezLO%xJxH$%yO7T_5fM>1uXyOu-$JuN zaxMUbSD~2IZ+xHoK9B83%=}cN9Unmg<3n@`PV2H<%< zNKmOaKbm7B0<>l&1j)vxCQm@z|KNiU{`ABXPn>R9*1LS)e-(9&%9dCxpdgZ-oCyX8uSAto+B7TQgWlDRTGT`|DS{f^Vf#b*J|A z?$(~~Gl)v2{o!)s?zwfRyPCxAz_uhN&&);y#8$V0JPAH}H{+p>M7JDE5x2N*u zxcfa;UGYHfJr1w60n8<{Ke3nH_aieL4vdKf;Py4Q zTe*e1j(YqLKS;3->|eqmEUG*6yVD)-jZYQsNmxi?tTNiwf*{}{j~E(ovU5G=S|`Cp z7R8*}hYJ&B_P+h<@mKw>uBuw-mp34Q;Y;Zxe)hAw9=_?On>-=xlR?5_hA8%qYbhN= z9R2`k%}AwEG8T*d_P@XN-&3!?>gsn1A!dipeLfLcfsfyQ!2pzHS(fknl9~0aSu>xy z>Z&Wf_rCXCkGHqaJRiV6vC1J|$e^qjMvr>v^*QXV05y95T)n)aNFeFUJ|)8s8`M%r zOY#4ab(SSySr!!vE?9G5eL}6Nx2x`DQTrr<5CXPk_vCWv!QkFA03lq@g?6U>1At$2 znM6Q_Vc0JPAe@YZm%sNd4Zr`%=N=URe8o(prDN4YE!y(tSKLj4v;!6gO85sZavrj1 zq`5dfb|YHFg3@%phVjE#3jK=TRoh2RtkFhYYo+QN8m(L|dk+zvwqU`+>6uI>#tdC* z;;Y*Aik}rj3EFRJYSIwm|IMF2|A7}@eDNJZh}l|e55aq7?Pp>dO~F{NAcE!l{-$_5 z{*BLm_TNu<``d471n?@rJKFcM$YrxiN=XnTP$Ap{!BI+3R3$?uw-Uf(VEw4oy)T=E zD#!VwCZmW}TKgbaN+PBF0nhh(Ez6oK$b#p2B_#j|mHA=xxXR~|p$dhZCCUZ0)?mg_ z(c%U}HDh7{IQgiC?0xIfS>Mekg|whtAUQ*#fBF+5<^$pYO#o1wY{Nwsvt=-&Uy@qj zB0DZ){0~?5)DZ76l&|Xdh=RYm43~xiSV#*}T08#ZKR)$?Q%^np8~~?hvl%TdOANQK z%A*QUzS6C2ZPxDHJ2x*`xLD^3xql0@^l60g`TGhHarh^cQefs?0PcMF;Rjz>zWjs^ z0LN?P)(;E}KuW0n9Sy~&m`lC@8k;k zxv^O6TCH_lvmT*MuDq87KxvJ9KHoBB#)4JbHvJ8N5TzXvn;`(hi0rqN?C9u_-}%n} z&FbIr(oY=Q;voK+5Nom!tCxT}FrKKz@qP`BW9&t3Hn6c)r#Q%d%xIpK~92=%G`OKK7W?GuezsLJHOZ>&mb` zJ>+-LqjX)58yXwM)~(zAcFDz;%p6D$yv6f86=vz%*9XrJg+7>>wAMl?^|WotJw=_3etl29L0qoHyfIz;d;JNP9 zwrMji$>;N+Xm5+PX$TD?vR@W}wQJW}-QC^Zx#zz6pKU2t=kj^qj>Rp2k!(vr*nswU z%sU_=%;}$`cAV&3g}L%%c*sHXfzHu3V_quK#*-Taufx-q}6vv9A zru<_6uxJ6G5jy|T`!kV;0`@Kg;79^B@=Qht?~6V9lI9sLJzQ5m@}(*?MQN>C8X9Cz zPtW%}&pV=b+sl4?TkEP_yLSI-*Y2K2Tbi4W+qJugr6sHHDu(z0gjoSKYu1`Ih-7K* z2?lVGoUaWNm$AtMpnWdn2N88lPtA^jEP%&217I<^Pn%eR)0{PE7PG?fembn2{SFnQ z?KKWxu1fevdsvaSu9n~ridQwlk?+-lKUzjBhT}N&@I#MoS+(jMD;{&|`}+qp5ecs9 zHZy>tziM%NrL^DP-fn^MKXF@nLeRBB2&MH%Cfi{z01F`m5lN+#2jEM$-ujW(zU3{K zy)tLc?72-%jf>Oi^u@mKp|`h}Ez4pel0&i@f1d3lOMMu>yp4bY&Siv=H z_cb5k=uk^lp<3mM%TE&W?WojbeJ}=|BGC+$S=_g~W|quGDRc8uy2q`6IupI$1T%{6kFp#Xk*1 zlI)bt_d1BvZ)j)~O5=B5``Yb%)>&sg1|SB&=g5AF^=J*K@Q)dAecx|tZm~$<+c8IY zQp&3VQd;Z19pCb$loU?xlT%9l&%gcKXKrTZIiLLGCt8;tz3e<9TD)s_PgA~7KwtlW zvMh@L5<{+k#r5Ly^{TNR)!SAJx=|{1{0(DFs0cod3|W;Iab=mv z{wt~^==!=kIhfA;6-4b#jSY@cO8K5ASnF2Da{fM@&HR>`1Ajga54KuKj-a)MWl3si zY><_cK(SE(40~k1q;y9|hdB4#bH%2OzgtaE5)94I!g3ObHxpR%n8@X#v!90o7RlG( z#MtE!5EC-3??hqWdiq@B8!7~SML1oJMv^NVRVI`t=ou1TRime0@fj&Aq)=P7Y~KCK zE3e#HS6{!bw?7RAEa>Pqk-9>BPx;fQPqljb`tO@r*Xk09Yqi#Dw3+;XQZ_$LBrK)W z4ghz3{Ntba>qkHOk>dw5xv!?PdE~NL_`a{Dlq3WZ1?F9;86XP#ryO~iLK8oiJ~><* zO&Jp@Q*~a^*K)F10rvRpa`l&CB!7+N(dRa}rseBi&I?%ipq6z876Su=kb;h5#<4xU zeGF!ch$x@W>qIhKp#|@WQ|J5#3irDX6Ybvxbxsi9~`xV)$bQ z4?TxSZ$4PY@RgRD!T~mu^0jJiX|)D2g}W~} z|J6rnt*<45-kUVOp^pHVS!k_3_vNpC^`DuUKl0I!{7WY1-7wHU$b*Avt+Zw-r2s(D z<45G2P<_6|Yl`Y}HSS&2jj47po2XWRp$vB-!wB<=AGOMi^kR(SrHMc!s8GnW*7$Nf z9$Q?<7l?{8P!frJzMztcL_Glx z?6;kMdv6cz-nm@|(%u0pz-lDOlmK}D9>BoU-vz-eQcA7JWHRA==R8#K0Ts)N z$<-JDYi8Sakj>;@%49Oz?)a~7ugT{NF~wRFlZe()G?+3Il=5_QbE|aX*0&p^?E*NL zh?G*J3u_5I`V{~j@#jCkt1XjL*Qc{yT~BW>q!d00S)9iinu9Y0bGSW* zbluDLkn;Ml7e|8D7>*nyF;K1DyzA* ztufuZwc>DW+sp-E7@7T60RH@o9|@6vSx9Lqgo0TMhK7dZeQ!w!5Qxi^cuE%Wa zM7V66{eZFUt&OfOuKlZ)!cg_4Ru4Z|&Ly*HS#SedvjnK{pZ|ILiPNXgR8m^=(&;of z@YNqO3{d=DO5Ga%SNr9_aP!<0j2v* z1lH`kZlTw#Rt*h}1mJgT z*RK8H)mLBr5P(+C^F4&7@ltP$O9}&`&Vj|hzzL992q6m|wtw?$ckFogd)|M#W5?#E z(-{VYD3=TC0mJuw9gD|l^OnuH=vq5s`?;6T9B?-VfgO$3H*z z-bIU#e9g9WH>02VDf@zqepSihhb(YQDcnV{g2 z-AkEG5O6VwY2sL{ioYMNVjc>IX(JgIl zyFK4es^a##SVz!2d#=y*^-ZF;w~wxU+hzF6pZ^dSQnFHNG!Gw3DM?Bx=ggV=!1uoY zlY2k(;eVVmIGAqCWpnXtE~klvWEA&XBa#8-W2wBJwUrzOhuc)$-_pGrCLJzUUi-@D zpsMINRsx1H+JhbDq7&%|ei9XsExaLZPg9{TM_<`COhG z8ta!3qp7cNpx3r+S-m47kmq_3LbT3bu;~0;J`W*Clr1?E>gE{^0sB1!ptYwFI-ary zgiVOI$-QnlC^U7t$Y6n7g_B}e!-4}3If%n-UhA=bZ}&8AKg7t%HNMv909Q10!yI$e z#2*znLrwV%t+mMI@*tw6#~pXvtaLhar0aR48KSy}%tPuJIy|5mBp7P@&Yh`c#~xd^ za^*R*d|w6I>dNEymC~)P?E;MNUiRiUF5B?o!jSZrIVBjx({R4?q zB7RIZm)8J9#S0kT6cU6&KFyl|QR{^`*M1w~sC;eGMDGQjfKE4?SY?uP6s1ZQBkKiPVcvKKbN-B~o>tizng) zz$>QeEgfeV_g@?Wh}Nwc2zvSOQ>l9S```ce8~=63*Y9edGG!-g08Cu60B9~w>5F*M z`u5Sw=BGD2{^(L6rPg|M!k?M7*7}u?fAT**z3IglxKJp(ef#$9%JsZrdf)OnhSzdP zub+drXvnoe`Fv4v%_7$mC|fcjN>FJV)G$wT#Yg$x4yVYC`_ANE9^jA{p!}Pw)^q8? za5=$Jb#+4&T9lMM2D4*ZVsJ3i%Zj%p;_;=qqVSK@S9g z06DR^jQSK35tQd@Bm4~`vHwE=%g_8WYh7|PCTYQn%TYHNREp=faI$j)j(1jv%78j- zg#Z2u{-LH}3~BHygno2k_19?cx=Kitgi)kS`I9S@h*|=_e5^$!p|Z{(|2_c%p6j|E z04plwz<}b=cc8d^)t@Q}NkA(W1=mGeYy0xAto`rL_xGny84Mf>BSQ)VrL}5otQWWc z=U4MPwr#o8wrxv~!rMRS*)ugZHOtR^>FX`m-0+UBEj#nq_w@8=A|U}H&6VT)Ma83Z z%o?@7S11C*-$SliIMQ=eF;p;2g~NLej2|Une@xr^wk2163;vI0SEOM~0?Yt`NGT1i zRU?Q_38!_AhFGW#%ulqfp20wCY_bv&M`|He1Ibpil% zc6J^fjj3U;*zbqJ&8Hhn53XWZbrw?7CA80bG#e5GJmip~cAOP|KNi`m;BgMX;SuJy zFM_|8&?~L0_*W@h%T|FJ%0hG`~c@GNeRvR^=PeR&%V+lk?kM;`87yyU1aCR245GkoSC%b#Yz z^L*Xd)Z#p`;cuV%*H3g_ueEOWN8vmrrG(ZRQ>IMKf9lg;{N9@{dt0)%r#IQ#*XIi% zM6{<~KF6pc#8t~9O3{#eRQ4Gt-@~$EP+T5;Mi9CGdr}bgCSlxoQ36I{=rPt7&QW!z zrUPL0W*prnw62wQ7HO|IswM!MwN51BAfg`uoD7C;s3K!iNu>yH7$b1v6C~VXaKE74v#j6Fr6rL4}az>ct_Er=F>LqZ*1p zeg4)8rq98egtpxy}H0xMAfkMIinNs|l zL?TIAD_tR&Bjp2gf4MgwDM$Hy0VFZ)gcDZ0@$ttVy}|Q5rIfZSj-hBN0Ls(&>PWq1 z#XtjunKS3!oru>#XU;cdImd%?#BBhLtB>ag4q?E$mRTvh`y>a`Bz`J%8p_Iy5aAoGtt|q8SNjNS-5UZ0x?;#M37dqdXm^Q= zs-eL!Jo_bafBD1jwh#2~N{VuNGQ^Vc=vY(*!Faz5K;Q)DDxB(E2T3yY0hrvL{(EEY zAHHm{kt&;ui;`o=kU&YIRD7)vAZ7D(<={cov_E8A8kOd3tyw!xj1r0DqbHwy@`g`; z<}>+3A~68akTACj0nI3z>Wcy#5QFJ7e1#LPeA_jz>+2s#S(Yu8;&S+(j%=&T=JV*- zdZ|7VS~GCr8!o;(o=6R{rtT4*ao__BK{>lBy*S~kX z5ca9PJ-rZ85?35w*}+g(4Rw@{H6q*rRQLsif;uYPtIhsVC2z>H6W;0Sp@8x;P!&2j z%u_ZJ<7+5jgo7DY5vsMm91al~94MVENB$e)hcHC9DBqnht7CzP280k*FKG=cOzHPf z_st=hfDl+~w6CBw7b8Q2Qp%T>HTC+pz4)F{1lYsqF0BlDrmO?bDpm`yJ zfE~AMSO6%D@6V!+rr@mjEm&q<2!#R|dQ$iN_h0Zwgnn`TFv7h;5s0j-5G)l9KbL#> z#lPs}I1zzgT}Nb$TV!)NQd%E%^UXKk@=qWA=wkpLN+j!q)~t(V%W?M+!CgECE(%S6 zNa#Yr)ib8gxcAS0{_{P)uby|D7%Qc@LScvqTpi{W2)zHp2!KEkTYbHK@Ld0M@kHXB z!So=QNd(8DRb71}wr<^W_s{P7;T9nzv{p6mR5;$xM=UxDKltfyUU~N|AMpXfnM|66 zlodk0Ea=PENox*|seJz!<=^EVd_<{>DhL(#x-vQ-*lcJNLG+m_Zd>tCpt2mI+eMU) zkvJ4ez@8icD_8T-Z$kuiw9fLoR$X++i&xsN>~X`<)urnmDhmW#Ya}WYN>#W4?CFGb zX_IpNXUPn};Bqic_*)1O6U++%VC&Yc#u{K4!hT6!R{6YAUU|ri2zJu0C=&>G9ZcgZ zPR2R$TQNf%0~Z-Yp5{r(SP1@7JvHizHtNwH-bnREd->FEIj_VC-+s*(|l*)`j03fEhjXGbLXFT#TA$R&%i+X9NV@l%b?uTD#^Yf>x11F@-7mo z)YQLi+V21dfP*s&d>5zOiO)#~fkX78>f3R?!L|2=F`?j_p)UIO7*5q`^=HTm!JI zU;;WRl%GW*msi4)ay%pn+Bx^PzLxht97Kddq3{xsoI?ObQ$!KLkJqKFnX~79qj&eVW7^tUPs-;#T|Qx+ybY~k zzuCWWA*}%BQiDWNAl}ZQH>!e*G+M+WoM2y$8S-d&$Rco%p1jZGXxgaSWhxt*A#18T zDkIdzm69p=&=re@-Ck?WmSwwIYqwDF3bt*xDy;yfQVx_#t3bFnrG#yBZq1r^=*(cc zp}w)HqNiJJimvP>M@-s*P?za+M%Ona|MjI8Uc6}f^jY6&Yn^iQ&Rsh_)93-$t^v7R4njy-I{#uj z9QnX^4o|H$)J5kxHe6V6}P6rkCV> z8z1>MA)KSO?e1CJ-`A75+4f1307@8&OD^am!X{_y+X{ZoHmKgSa>vMdXp z=Rs=?OIlo4m!gwTJ+;d(&l^7VfH?5X>I3EeEO@Rsih6s zOd3+k(tb+Q^_I2?g+EY^&f;)d-|CAWS_Vp10F-os$h|3t;%Oe*%Vy0wk%*J$d5>+< zjbHlt`afL%*du>?kDJTJw`_hf+1${iAAW8d4P@O#jw72+#`GiGr_W()-l=HPnu;mo z?c(`>NDIOvef2kZIn@8``@fsF{^1uNSaZciTjnoZa;}@t(QtWa4yF}g|A|Uku6&M1 zB>H?sw%@~+%*>LAG}CVYyopenX<#o8n=7aGD=Lu8Qh6S>Z`*!CJW)5p_Z6sUB?CZ2 zd$}XS;l%z~0K9B}MWZDc%F3fv9D`-?H({oA928u5$eCXM2!cPlek7qkv}|P|uKFGo zJXL1)Qo#yAsTp=G#&_QNKRcdy;?YxXx#a`Tw6-?8nQYDp#=5KOjBHCF<-}|`b;iuE z`>uPQiKq;!Rv=2tO1~@D z6}|8+%fZeaJMhG#4+gzo%RG%bLrv{>sAjn#FIMfsl@5KiUYeor0jhfN#d#ZodrG94kxIrd$!2qv z!x+&Ux(9_o2r4@PRvs^DrIF2KXIYkAuY<8CLf}vfCTYC?4a2fu4~K}iywgi>0uao0 zB5j9{ORUx>$KD{N>x5(dbXW`j(f0VO+o$1#ez0z6p=t%9W)DBAGSpBQz|i?zA@#!_ z{=efcyzn(ox3#sr=KlMC^NmwaJN2r*{(%^Cr4=Cf9{kXN)z>=+H8L$R1 zMfP3YBaigTqrLV}*8mYAlSv0Zi9}gQSH;su>MJ$gDAyPLR7xX}h~cqEevKDjd=|52 z&qGslE1r1lK>!3P1^J$rS#snt-btsPb!qSJ-7KXgN@Kl6qT}&lgI{eG2zp@U1JR(0 z9)Iyzg(%y_m^m12DJc-q4a)lu0}m-luQ9x%G2%=X*0|&zAXImPbkw zG;XM&N!J`2L-85r%KKZ|DEg39t&0l%ArE9=f)5>TIh)OCAQJ0bQP&JlwxBOQTyDqZ1JYw69O{ZH6VyjTUQ{}9=4*_tsrlXA`bTT#!RpDh3)pUXp9*0K-Z`VVU^Iq$UmRc9Uf z?Ja-(`JXO5apu4O`w?gn+bc%A}QT+tBB~ zWz7k9-Sew<1VbY=U+B?T!S;u}3;zq3?YYvSg(He&<*L2kLD7O^Sr!3RiB9&SStJ6O z;8i+pQbhsZ^^{VILyM8NEX&U2vRnGn7kvf*)~;Ra4XxR5xU*jhKp~rXQd$zstS!qz zzL4LZ^K-w{Y-0PXP3@&-q*`c%tD}NATCQw`EQi!ZrG2&FA0nV5z2(Z>{FTC{XdYKe zBa_K`8aU~H{^#5IR4R4PPw%>Wfo3i!rDb{6Ij#`0fq*9DayeZnxEu)KNVr}pV_zgm zPDDU+xD26ykH-A7uFNA4-DkP3s`?_=AV_o+{1zmU$z*ZX*{@Uo_tQV2rETiZo_l8F z7R$E5tjUQbaBJsh7TR{~tZZhGm?5LeMf8rAu7C7;hW83p$5FnAwS|0fS+pZs-Y&W< zVo4E%d?Bv~2h)kVrk47q=Ei^d=TCg%D6RGBx4!SD{F#ee|L?iqe1G??SHF4VAMaf+ zAfQt9Lf49TsD%&$zR!XI{nrN{0$7i#uX<>SzDQLs8LGZVw*e}YA2%SYo&ygIy*Svzx~>)J|u0c&$1?GX1~!0evURk)jf7p zwn>$Zdu^d#5@1#JR3x7%rNRxO;gwces~{0iWt@Gr5H4o?D+^bUw6|^BPx|NQqo5B~U$?|cZ?r56h&tp&0y>7Z22jZ%6^?CB6(quO zfTA-sv18jH(2mC*{_Bq%TY@=AA;ru{)i(`OvB40qe^CI;^~?+*1o@tiWJCSTtFFKK zKLBBkwwE!H7>)2BvaIyq&=sQ*3Ps^TT-6wrR-h!Dlx8H8N#Qt7##bukxgN6FtQJC0 z$xpkY5v=@P`l&S-u=@J@v0&j5Z=Ex5-s)VwU`NkI7mtYn4iB#A)y_beQLr*&U1^^s zMW{-U7LOsaK}ByqT)^RZgTv@XUAzwEYZkr6)%(|4LrMz|{`C)d>dD6#0BNmp*;Vhr zrI%fcbb64aw5WJK!`-7H)M&_=t3BkoqF{7=vHDuYgX>(CPoTOyksXXTXPJn^wrx8& z7IUU7S$52nJMX+R^T$8@cGCr~yYQK}eejd#y!GAhqVxb*YfV8U#88y)qrTDR=Qlj! zA9vKke*)~!6Olr-Is1^XH`>NXTFXcad4w{R%d3?T0wI`HlAA#C%3Ll7jM(9-as&*! z`3%68627lMV#p{0DW#Av6k4Z8I8s1$&R^jxFss>_FAZ;Z$kyP9>(iNST)w;aA+Js&l9w=Y8NL>+&LHRm|y>bc?94%bD6epjyl4i`B zi)+^0f_J|AqsZm*<@;H!e4w%}6z_5QrdQna%JNZVq-@ct_52jqRqwZ2;M6KZK^7+g z0MfF^SBeMv`}OXgp44flpV`>kKk%0q{`~Xze&T)a-4mDWOeg_Kr40zVC{ zV@?eDbnia`z`Bl(aiFjn#v}XnGRs(eYGrINQ-6QII%KxM1H|44e=hcWt9u6#L9T-& ztkLjyY{{2e7fJ!qyBFaMLutBiCq`;K+9o=q- z10gE6i(Vg&?l+<|l=cyBPekxN4{hz!@z0F?j(@#E=p7ELP@3X1kH3~(SA z?)-;44vxNTD2JWa(g6KH0>8{E^oQsRh+*z$*>+X+j#t)AAb7q9OUh{)ctbv4001$} znN;g9#X4m!n*&Jv9V>leCYuGS+H4^NVzF3Z=eAdV9FIF-&6)uOb5zha0NAi&$K>_I zHtZMsr2y2o%=lO?UjUJ?fS_R&)pn{0Otg1CQkn2uxlyPR)Lds6xP{o<2v9BQnlj?Y~gr zX&*i2$olG;^(t>zaT&pLT_oa3w6#q|CX<2IL7-lBufBBu7!^`CdT*+GfK~Egm}ds1 zaKhThSowTa?x4JV)uzGda1HH%h|trs+bKde&whC@{jMIdGhHiZ!P5d>$TQ$ykrBcyszbJGrW#fd}hjG zolBol>C32ybEwk9sj||lXQg8ADjti&_tm|`SQtDb!^KZl_UMBo5(L|_D3i;j3G_%q zef`Wr!POLY{|N*Q*0Dq!nM~%#1O0ucg!K@ZLBe7uRkwF@4j2wQ_R9yLvcVUn zG`8*7E!*0szWGN#`PugVzJY&Tbi|wsmLGTYuXgU-{;71;=@6G0D*SLagOy|Z)mcJ>N`|n+E<9j;&r~~ zEz4xHETko(=6_j}I>4|N_B%^d z}|XI?@gxa zF6r&IaeE^$sX7GW9!gb>1YUDj%N+I|NdgnRD2 zr!+jc&hDKytqj-}EFjS#fkRzibH`?XVOV8`?m&Y$&I<*yWigIZye%Zkb{jb0RY)b790P#vZ^1(To z7yv*-qS>f(xzc?EGr#AxuY2A3zxc(e({|WlhpTSC_4cnhcHy7Xr%&T@r6N7w)8Tqv z2%Pa>(&#O%x)0|sr4+AQzuuEVy!6`ZZoK7y0}gum_r7(?-&?LXLL{WQoi4jRpRx_e zv?0fSAkm&+S3$2CM?rnY7FnZ z5v9S|)PTfklE2A!BUas;YG!Je9hILcG{c)rKyk%F2-46zJUj%j|GMs;z6F4M9e}sC z8ujhQMhCRkdYkk5mwaB?@6U|mY+zVO6p>N?xAWxX%^%-*DIuLmvu3SzAu!6!X*crc z%kW7%jspP8LA1fPEF(751`$Y5>+vTZ8B@N8aCN}dKMU0;gl12bT0oag~VrXci_I>xTSHAMtA6$O< z<+FbF)1SWP>x&ofbi@%yTygp3SAMPF6fT-IbCxKU%0ekts%7O^;cF0FR`RQ4;TJ837r2^Ja8E}ul9}(jbcF+WOa|>VgFA3}k ztpbd^?Jx~m(wXhLJV)Y^Yeiu`;NrI=`1rfeEx^I*p! zcoW4Yt00n6Vsvy=)oL|8Haeol$A*;e`z!;o{{;gan`YxS6_rlY>BTb`{{$l!t6@0M z1_{@7sk^)DP$5L0@A(~@kUz+54-E~2fN!zp7uOq21g4x3>0+?}t?}f2w_Ufa;Mibh z-L6;7*>0!ZyhiQd#ful~HEY)V%h+X2(blCcVgQDRhY`J#%y4W6wrzn~chGyjuqhAx z(-LA@@(l9Dpsh7S2r0(K#`NIeAeznQf>*uf)i1yBf(s5m=_@C_^rt`l>7l#sy6Z!i zUV7;lD&^8OJw3g$P%M#F%8R6a!=qm)F-OLDoRY*fgGh)*qrroNgR`ekpYdJWa*iGu z83QBqa%WiMBjs(64M#tw=E1Pm59`VE{Aac?vsKS%W8U`1=r0_*h)GGNjTjY!S(yy- zo04^&iXBLTe@S-UDo4Iu3VSHdt=%U#_{Neu``m^B2z;tXi#dErZddV(P^meY+D&;)Y#KY!}DNXQ4;?n${HO#HJi6~CLVL5Y! z;pC5*b$3?4%r!`&6k^f^Hw40g^N{H1z#@e|7F$TM1rK07#pkUjT;BL8ujLag-0HB;5mO&F^fkw0Y=-B}dZx-hQpKAFc40ag(sU^CQxZhUknSU? z-OvsQ5liyXwUNQRH#Gy<>r|SQM#9uMq;S8ZM&N}-9iC=}yUV{%J7S8NUXwdd*)Ao* z(~JNc?^~yQfi{$ZIuSO?;CS9ivav9ptNFf|4>#DpS}K>U?(Uw2_1d@=ZTBn88ih)a z@a&zZ5fKB6I@dEr|Ms-S+W)0Fz_TNBoo6gP#Wf z%%p9`rKI*ST_Vg#mrfJU{gf=DU1^d53DSg|eL8P$e>;TbYc`%6MuNjNp6EUioB2Nx z6Mkz6@J~7ZiP9u_xQol{ac$f*x1d;pPVC_MPb z$OEWqPq%bi-sP8Gxb*32wJelo4F(q+N4jqF&&^`*Q~mw@a`EED|5`rTr)aCvmYoHV znW?iJ^R`Z%z-B^*JqP>~acLmU0spkr8fQQofC8T%&1Q?&tzCzo*Q-9{zncEJ--*CxcA|U4p;&b!l z1*Q-xq3WJQnVX*`1<*#NCit7enklu1dD5!;G?Rd^EED_2o5244_1a!9OL5j6|vQ>EtF;kYErDwK@?%B6T08 zB|{nqAdK`PM_Ly~8ErW|0(v1Rk(NxuKZCKz)Sq7ar))pc!xQ5N8SOFBQrNmwczWQn zH@UQRH3P;sn8zq*f>Ix8A~I|FALj^n3~(xITZ6!z*oySqmYx_Gj$=z9$lB!Y1&aTK z5CEe=LY(W^HUQ{Q4-hZ`1f`VSs*lqX4?pykxpTKaxK?j~1W5*jW{@aPdkt!O+R~-x z=_wxoQ#286p(|k4Fqnv7vVY-dobtZQ%>n;#d%jkR*jS_sPsj@;F>V7dwavUka3mrf zG6Dn=q1PW1P{Vc#A;tK3O^=V)sHdm*Ph;a_7#bP{KvIY8PUYdmWM+h?`k(f+mmV87 z+hq(+LKaJxm6IkVuw}~5#u`Mab}=%TMCL_`pP*E_JZv-b=St;Bf~YC+NBQ&eMvOsH zLy%GR=aidS8lYtUME$99(g2@sYa0AJBgF(v!m~i;9FkG}r{AHxj}+#2%$d9yK^`3J zl<3HvCSUyAqN64R7es`X>#k+ZvnSqGNkQiJb7rkUf=W{0?Vjg@2yOSj!4qSEZQCXW zHr{^oKd-SQ-qO;n1hF7N3}FrXo<96Hr~YWgqD56PwFEFl6VVni0Jdcd&kWFN;u(4y zqI~dA2V}3?I(OF0Y}>Z9ZJVT&&Rd0yaWxW+D=r!9&BtiiiXQl(*I&gMSR{Ix5LblVo-hn$S+^ zIEk;(xV77nnUBK@LUvj;7>~@e=nxRqoe<@X3~8iKQ6@iUlO{kno!Jb_Na=Be3C^Ym zeWEtU97_I3Y8GIEe^{kauL<^vbg9O2x^0vF6cY@>^Ff=CmZKCYM%|20aIfjln2o>$ za!*h@#d$dW_8ae$F-J%#N&D({0Iw$6gciUUXwA$5#9DI<{3as_Kw1KhQyRSPvcFu+ z%6&75;E+K92*pDF<_}Ak0l*aaPtm4mix>c<{6~b4yK!5bRZ2l=6--9kHvVTwYu2Xy zl=-=;w%%Mbi$bA5g<`oqjjOc)uim(EsOP%tt{c7Jg7bf=wHEW|?|68*Tz>uX<;zb5 zfZg}l<7<_2W$vw&r`zp73%dm z0-b=QRl5yxD(TfC_r;Pl< z7ciCAv;!ccBO+>m(VhfeB>R-$nNmzins3@%Nq_5T1~|iPnsIr8`NYW0srQnNFylJ$ zv4nL;9C)hmI8pe2nk8s6V_E~t1n6}WbU4fr)oEFhEXyX>^*|!5E_5D60D;_=3n5#( z@A#q@|M1?MFC)89u(V<=q##f8O$!$-vaVUYSmp5CQ#3^h+9C$P;re%};GEHDHWh&^ z-}j(=A0T=`;eW8DrXs)!jYb2Z>u#+BfxPGx$SM>FfCj7wSFe8R@2gj@f9h*r`|1bo zxZ}>&z`#J0nfC{9daCHtQujXrfOF3I9ZJQLTkWd40|Nu&d+xaxefINTL~n23cX!x+ z$35rFoA;lduj_N?&3(s9OR-uoA)&jNlDWaGd@6*>1n zu(qFwPlJ3Im%}6^mIgX92cd0&(e9i&(rr$UPntPM4o>Pfb@Obh|4pm^?0b@f{JBhI z+VVdqO# zTCV%FQtrLo-Cf7k>J3Fg$mkHpAfu}E_Q>_C*Pg!Y?pxkcC={SHGXc!3vDbcw*3UZm zWPS4D#d+0C(G(?U%Nzm8Vg-IJQh{~ayS=TE*+iwZww)3+>&@FWRK<46d$n41CWa^! zi`ufwb*-8!AARJJ+Wq%0JLoH4{raDmFJFEnfcF8I5th^5Pae)7L`1~x#Y`d!vzi?KtJRWYV`D6W)7psB6PxkNZ6r@K2j-Y`TH{Y@5#ouEjI_~D zj+P(`966TODGIZ2DvXUtvslgvOP6I{bTpdFVE_bj7+M36!)1|ZiG>0!gK5bh<{?3W zHpE~GfHe3grS`C0ru?6~W*_D^`j`valMQ=LsnZKF@r%OA{}M5Id<3Tha?3Qp-uwts ztU|hA0zotDa=A>crh6ANzox6Z>rt)sc0{BBNYkj$L}(%+&+`DHIRZ4TQEz|%8NN`a z=7||RIyO>iHbzyYR6x6Op*7elb{!3X76Vf!08Y^+X^R*DVOg4$F>{3OG+!XZ%#czF z)(W2X-diXXPq!?K1PYLL33uOhhx^lCoc5)wuDI%>D^{%79>Mqebs+?V5P^oE4f4z^ zm^m$YrgvGyQ+e<~w;kVt+P>I(wboei%ZUmU+VxIJ$LSQ z7ytH;e>wM+3tzf$1@r40jRt&Qv5^n_$eT2{M`1aF-i~g=NAFNP%_^ z_?vNI9bvk>*QbM!pWC)%eOaJSw<}+2PD;I$O5e%oE+f5%<(lDuVfi1ox#Q9R#nO7B zj#Pe=k;nu8q-G*HR%tB=CGN6mI*sKsrOs-9GZ9Q!&b`XI{57R?PKKvBVon+NnHq_X znu*+ol2Sf3o2~5}$KJnCC}6{ejci$#insuOwB#NFXK+sx~ zZCNxluyH3=$_XbEtrV9lRk91Ese^x}XwtN0Mu2t!o)>&XLI%0K1?%D9 zaO-~910Q+G-emR%?m;Q5{g zw+*K8<3*2bPonQ5-rJvGnvM6|yh;_6hz;+Eh+NlIGiFSi zH8?o<(SZ#cU(?sy`-ai6F$E$Ss_DomHGH0xN?F!w4KNglL^uzasdcql5n8FcFFNn+ z!S3#AujhF_K*AD&n8c%2vHHd1mo7~YLZGiUw+z^R}4qr4#|MwbtzWJ`<4^Lhg0{eRsccuU%)}bj}}s^Zn^Fr>(Rs zOY63kUugLsO7)4ubPV7&1*5d~fH^t+v2nrac`?(6WCL@4o>k$x!wgKde30Dy%c zwrvY5pLzoK-+Q}=B;1w@qSZzg+I(Ms4)IJ@(qC@2g)uvFGWhS6?}E=Jca}^7B)_ zsFa!}r4&R&ZE2sFnYMxDjbIjF7FsI~xPQFo%U}BB;$NSB+O%?|DwWn0`rZ#Ig?@MD&-vZQAFY3X<}Yq4 zm5Q2KN5Ez}{Clb6P&nO_Jaf^3$2$PKP!d zbuq)AHm#3*SDg=F&*{^9D@v(&J)SvS0|XF4JRpR006suz1rn);96cPCwR!_;_r#s_gBXcL}&J<0NNn54?unRiS|bxzrD>s#sK3h5Ok7uJ=?S`*Z1muC!AyX3&U&FW$t^;^aNc-*IghZd< z0y4J<-iPe8nwIR-z@HnB7_=y8BTFgJ)6>`Zr`FU3bfLf1B61M0010nr^2OxP!l1f#K_RVlcU1} zl|cInFtaWcOV-$U{VFJVNq>L8JmQEWr;GrnXp^)>41i;mE4J+rxA%<+K^Pt!993HD z$*K^aOJZggLa?w3Pk-l>Q?5Sy>^~emIyN?M-Nub)SeA82d)*xfg(4!@whhN|uzK}s z_`d)Ab|9ZDW@gWAVbNDVi<@t}9;H$lTC0S_Z!QM_S>QMQ{+ozy<{=p29U4PKuq+!w z$b^I(<iyJ;;zf&riq%#+f70{q+Qq%hKmB(R6|#o=vcf|Bi!p;})g>x$bK?)Nqsf_9iN z90no3Pa%cz38_D4@YCaKK9x;@|1)I{vXXy}^q%+$LE5~J^RfxphDhJpZ-26$v@J~b zy-ujoayn#OQ=92#21)*&CX)3=6Uduq+XEqA4qGHF?LxecC0p|#ddv76Sde)=0<`P%>6$+E1%>eXvxv)R(|3|-3iMkB1maL2%!P^MC4mma8E>jxO1R=t)*o_S{9^~EQHWj`#wl7I1Qc?5i^sN z63u1sWH?_myKiQDq&$-;`9t zh)8k`=SfzY6-uSD>h0?jzg_b4n?7;E+uj0T!4WSzv{b3~9DK*^H|p;09#JS1NNXK{ zElepK34jizY#8y$dQ%cQLIBU#P$ZWT;^h3*57Fw>Bl87NlxSoefx%w8Z^ftEyz|3q}HiiZ_Jo?I4zwQfC%3ZbA2$aSU zm|!gOz_<Ej>XzvcNnA!6E;GUT+t#!C<(9&89<@->+52X}ot%cvd57KL5 z=5`$tQcAS<5qF%i+I_)8%kRg!b!$^Fo5A!DCz|b7bh27mfvbU!fk3I6B{KBW+hi@+W-0K1C^R}a3 zssC@$*X?z;T|M``Z-1>g^=IE}&6qyz(Q35?~b9=9ZKb|NQo)bqOYOz@pJ; zP`_R&Wlz3$dqZoYo^J@))E06e&S`8QvB$RV%Ze*O*zGXu?5bM?lJ z8}Hw7r=5@WeIF~HeEibYtDb(z(@#G&eQb2Jj^G(pf#6V(ltU1N2d9L4;n%Ew8lV5v z`*HFq|BF5LdNIaEN3{^KIwsePAENm(BlSmCN{H_%ohB+%I^=2t&`<>i-LP#zf>1_1quH@}6x z`_YeyN~wsmzwu4}-9P?LAN~IK+zT)I^HWQf{QgC|@3FV=To2>pqmWVnOx!+U*^t89 zk`@JR6K2~IQZ}M=38p1vZp`@hz3JUA9Y?9Wi8g^?!iDMXH`>AnL}{Y>6Jtt=GUG8$ zY88wUQej)45_|NcuuQ6~sz3KWsnW^^|5UkV@p)RXC@%ll--HGs^Ra~Cnu~=3HCrt` zJUnuKq2Tw3|vl}ADl6Y(Qj^GwUKs+u`|o^6Je5HJhHVu{wRTf6SjWp{NK9A}oV zWA5B%$<0ocOwkl|pe^(SXy4Ry{Q)UuA8Xc?N>x1k!0iuOQvONWVZ(+s>(;Hk(YxRGG3~mom;d?Pvx={K ze;~Y387dlp-`|fGBScIF1kMvu4hyZrC{B3n{J8XfvQFukbw|<0Hcd*tUg6tpO=z zv@^*rb(5s7ZExLmineLmVxIr~|Med?J9_+OuCEjUlI%kL3*R_(!ybFTWXEP>oQ06j zqFk|Q(pt0Q6v^}5dw1Mvo+$`u8dD$R|=u7&ic@zv)eHI%fa<_rG(${r7Jj z^0Gr-I&i8o8#k=g8#k=aeDt>M!1G)H82ZcK zZv4rfd%xu5(UD;lYGv{!vrzCz#HT<$yi6$sq6@7w%H;|kd1M*-Uw=4WecXTH=f6G= zLjxPyb_oH4BBhKxDGDKASr(jv1LZ3`_Q-O5H6bxIs>_>Wk|+9 zAK>3f`kz?ZXX83iX0(K5fIM>|U2>U#V~s(|@;^RNGhJ4@hQxKYZf4fSVnNjF^}iB{ zYc%VV%BA9*X0yeV!vQce+qO-Ggi%G>>^I&+r~ba&tBEna->HfgOqMcW>2kp^JVqD5lWgE!c4 zYXAcp42w~2Hk&(w!UJfZchbTti9h}BoTVE#Z2YoiS?v3Mx?PHhBoSHdb^6iSvuAH` z9OoDP{r&&(?Qeg3q);dfHyVv&q$LkfN~6_sX=HS4-{2Tup#dTxB`K}hR|>2FDJ5ym zP|9W9-u|nUZfnFvgr-{QwiMrv2a)GBxY4LHgP|3RQmMT6?tAQw-S^yQpEtbmc+_e& ztY5!I+;`7ic<90Var2GW;^BuLfakjGc`kKz_5S(2ANs`6-MxLUa9b^aS+v(3k+-g& z`=BWIGLm}Dh!FHF+w!lz>~9wk(SNO4wF2k;{?~NC!7s#a^kP~U{n&lgYu|YKKQ21oQhx8(M@L5q zfEFS=!Y3ucM`8I)L69c7G!Vsi${Sv%v=1_s-^OrTD=}I-Dx5U zeE-|FJzYo%&+{OJq;M%rw2fif&zKp2Qhsyex^@5Qxh^@y5^>=0Lt9SC@~JTV;~)RH z(cj$UcAy1~cE z3@t57fFYRMr|2<=KnRZKiYua6u%PS&Lh%F^xCH~Xi5VaZXti2eb5k%QG7y|QZwKtW z%O22LV{~)`YgVts6OTVi%kRGjGiJ^{;%)ExP_Jd#M~#gRfrOw8_)mfo62Adv;j!pu zQ9=lekB!KS|Mq`JFf-kE&mFk$o;%=_t2p9_W6?Klnzn66u3YihP0N?vcjfHab3gU; zs+BtqZCtNmtdkyf;DPkEqmIHG4m}LB=gtl6EE)}H&ueeV%hz-YA;3yOkB?)gdGqk? zPk)*}ef;s_2Y>j(v>%=Or>{$*D{jB*k?+4~_ZNL?U|_K9xvmyc26SaThC%d+uTV^h5C*w>>KUr>m1=+QK zGk-Q`Y$(XOTq;tt)x4h>x>zpk*=RNr?{o)Z-}iw)0HDy@CAAGd!h5YX_w-E@k36*e z?njs3{gOhlI8(Q+2MH{FmUWc7Z$R*Xr}qC((WGh1J=@q-OSl%=Vl7KS^!Ovo9y##k z3uj2n>SL{QRbbBrF*94XqXCR|RjU^g(SaP#B0e+Q%Mc}3I#WJV?X-QaR=?c+q`dl<2xVy;7338;cB&d=*aMpFQtgM!jQQMrR|P3 z0Tj>f8EG8Jba}v^1^J}LAWv-{Gb33kJ~J{YZAEg7vg4LV&#u}(8O^D*!JQeI2fawC z?M<*Z>NWn0g?Ur@PucOO`HXa$Y(H39QmBTWqm>@Dq&2Osw4PwzQ`Krkj*pLDPD1Qh zDwXzVHku3(KB{mRKv1@A+ro2O8ytx^&yx zelsNy^PpXqj(YhaxccWm*B|@A5BB?i z|L@CZUU}se|9jb$SBwiW?bwl_L0`zWabN`On^N(2NYnn0jB(0~Lr%K9w8?zQba}%P zE;GbcWXs+ZZ3(+RdGJq5`W-&3Jgy=Ap&1`$XJ9wB1e$5`KH#+KKZnBHS}|8DB{@1e zKBScXbEQ)L+}PMyN7a9uooxU^r8#@^6>)>Jmeh!s`Yvu zTC)a$q>v&P>{G<%Us@ZPqfMNsoKR?qryrw^oVhVuYz#)B%VN`QX%@xv+mcWS7?NIJiMwa>)f&!M5oQhaL)D57z4)$HB}}2{UKT3^&gQmQ9)g-vfLf zy3vT5Nd{xHr4(ue)Yv%YPMaqFe9E`==YR1t`rmWU{rn*ZAM~ReZn<3w>N|RDWY{Mm ztguhHKpcj18(0k$dmiwIdCYN5OXXw?Z~}PKZAeS;nT}>7o(cGG33UR@O|1rG`GBmX zo!#>vCdqyrIRbjTBOs^ptlxl~{5g$fW-b&QEiJi$nEz+S^l9C$=LNftCm3*MM!8%P zt(M!~{SuuMlz5kdYbIv!;K1N*t@`*;p69``3&Dw>thBI80#50=rHdE4ixw@k5F9Z+ zMN>2>+M;bE{r&xNs7a4Dn(l2*!4{gewk#WKR;|>&??F7z2LdrO2_ii{KKS73)oW+? zzAs(ZyXbr0J7qO9AM)ZCzu0QlN2}vwLw?(#k4U>tNlV?P1RqDlX%m2LO8%imatQS8 ziN{p^r~Qm4Cc2K=$7CIuI3NWI$?NoA6qk@xlV0&c3SHi6t^MiKXNucyzWyIiJ^9$^ zL3{0mgZ5s))M~+!609|}=Rr4{Q1v?0_&C()C{%4cP}R401IXB0Vooo&jHHy%t_#vi z{P?q<6W@IQ2h?46-SPQX9{GxUsuky|YFC%VtaW&(PvoZ8bo)!O-sl& z&OkeTB;^_5h_9n`2}U7i7ShWQA)`RXGc)T*+bVRT%}JX_om~8O1pnL@Ig>k8w)tV1 zupE9z$qzFn(3_3TO8@EQgS6FuqJ11Pf#mxhjgE}YV8WMd+xpt*=qP0z|Fr9D_l0fS zMx)+*keQp7v<#*(UiXjI{}pqgSfbl*ylSUaD<1Z3rvPRRFe}@(Ey%(XZ1-N#-`_76 zFTQqa{eOx!i?#@%mo8nZ){fM7QL^+h-}5vW!gd_2U-hK__#?}fN~;8(NRRd`6A?jJ zwtLDqzWtZG@4iPLdgvh+GxMEa`qEb{fETt}Zc!-(BC_)Ai`bkC%sBywP&;M_lHE)w zA2SmhGLupU;MojMm)*I)nXsJeG}xQ@^ZtUkw7c5?sI>BQU*9y#vcxq%{qeVE0_Zv6 zwXf5%T&B=FVeEk~0C_0{q?7^R8+B|A3K=b}HB{;k0F+YjYBhZAgcIaR@BD9d!;Lq5 z?mh2#=heNvr8}zCiU6?|A~3{CoE~U01|kMq5%n(_hlqJdk7v?7u&Eh{L7X~*c=YTj z`5fc2vi=J;MO!-jo3-Yjg7@eu1+MY?p9A`wEGkpGp?(XQ>;T9ataXyPFze1?K;k~+ ze|3F*Jpuw3GNX6H#sS|nGR}5A;8H9pnZXZ$sM+3+8Wf)7;=s(h(p@FbSNGm{&BcCK zrDEy!{$vJ-ghh6-e99SToH00IBd2JJI?xu2=r%!Eg)%~4Z_EVNzP;+Hr;bG6ck?+= zK4vLoxRvh}7oGg|uhqwg|8&C**S-SaMV>pp# zqXpON&&>JIW>9$Wiq;xRsmL8NSr$a81X-;@R;w(lRhC^{T2v}*b#-aGTGfzJf9J## z`NaSJZ++hX{pl_D-t)jkrBcxi=itzzZUTTq@HSlgn(-#6$1A!9!;~7sNP-u}bPTfqVhz!st8H2RZOji0&bKGWp2i3osH!b}Wm|2ex z4UPQGlGZER^MsW<9`RZkm>HI35fN>#ln&PF1Q~A&5bJRuz~DP?xnafV#x*VZ^ZL7$4=1;pSH*bfSKu|AN|arVtb9S3$wNFv6Mu<*YaBR@tXkq^~{=+ zo2;HYA|m0r4HS!o-62ZfXf;NlbxkoKgcPEq8q%0kazWj&^4s3}!ZJ;;No!q%)Uis)F%kibpd}znz z%OCjSf}M92XPoq9u9Qm9t{b_--C7g^esoTPlpxCrP}#BorGZux<74CgnxR3ladcFy z8yKX4(GmDc(P+Jn@kWDeDN!w#Fr%+eOs`g;wchuj1NYtO?z``E=FXc3&+`(Rk8teF z?vR1V6s3y;Oy(&uZmIaFJS6Kg^OynI_{{_TbRAnlnqZI05Y-rgQLG(2*<@>RL3yV^B2HqMzRmbBspGjp+66l3FK zD}|7AE9FwP*=%y#`Cr5Uw%tT)%W;Sq_g;C)Uw3BZ7KOC9t>N-Y#iH%9xMGlBHhmkWbMRO+Z`30DSnvAGVe(S@O{P-~G;il#104)W-*WtrYe3^*Wbca8C72 z@BGL=3Z=ptYV)vA|f=KuGYG#g&-^PhL=(w5&@APZor5@!k{nwrpZXs3AEFK zPKJ1bI3y>gbe)|jX@HiU>CG@9C7O*!t8e=BjlL!4HR^Q|GG2o>HIh*aSSul| zhO4i**g5I*AL&`MX4Tv`y<#Cw{p@EkXZ9T8W@D>J{~_Q5!8Sm$ZAixn0N?j@b8L*C zTKN>M+OSdF`p|>8_Rc%8V$~{WA*?6YtVYxGHGp*hTmS<|4j}jMB2LAr{Y zz7XI1@sEGpShQ%%HMvvt?@3$k2LK>xJ4IFn1fK~JYeus^TCLZHi=|Qpo3e_1wkcSC zrVi(F29yvEQgZ?s@!_|f)(#}gomd)5&pXk4kt5wR$Cx#lX?7wC>!Cn@&rYF8tDk;y ze913=xa>n8{>*lB=FV>p4-XbuD@~#Eeq-L%+UM@B9%(x^etX6*9{>86KivzU=PU1e zxBkY5K15Oo(pv%iLn&Vh0a+>mLNJ<5Ub}w1xZ{yW^iB8QFP>PvO5DF<1s-_faVVun z0f-rM=9CXU_+{d<%P#rxTi^PQmmhWHQ3vh&l6@cO>FF7rF=NI(Z8y&v07#PHz%AoZ zUESUDlu{oY8yhW+kJTWANVpuxWdIN}Qxi(v9d*o@q5IrD^wsM&0?5OhnqR6MrcXokxHiRa2pY}=Nl+{VU>FZk2GJ>8{UTP;r^ z5MG!7p=H^1UiHqqasEHCc<~lb4O8@QN?STL5CHzfC%(FKW8<9ItgoiZHC3x`#Oy0U<-RFm1s8db8rs? zX+r6RIj782{jsEDv~v^vP6;5L0e~6BQVBO)cO|}d;>Uh@;#W?2@qfPg9fuJKxNZwT z;0b{d08gn@LbFl7`D-VA>ZSj8-tWZhzG?W;CqIdI9(NqL*^I3DpD8J=1EaY@AyDZz zo4EbK2lci0+$}D?`4-%8_g!cz1po>{+z+i+zxK7SpY_2LPWXMLRO#Mrk3CNA?de5# zPx*eOFiUI9_BB>yY}ke2kbTyxSFMiR8MzWl>9?E<22)=>PLMu2UmATNFVW7cV= zO@co&`*Y{av^H!QxT@B4ztCMRU+MdPukZV4`|!;jnFKQzaB)ux5<3u)2z~trb|t|z zGwW$HrwiZJzkTx&d$qQoKktNk%k>FlF>9|>D%(xbeez@Lyi@iVAEzaE+%cv8pQ2|( zTSEf?nm%iQM#?2_Bae`lZq!C`{S|-z&f7oqg-=S+>V7U+)O;y~z^Tb7{4zOppC~K* zFCCXz13)M+=a-RcUjoQG3{I#42)zF#!_)aV6_*CCcmhhQu3OCpA9c*D{d50v)k{zQ z+UE}V(>Z6g-tfl$^Y_{JfVVl0&8(S72#gF5)$hLZ<_mxF z-)(o&P_t2=D5l}iOtU!&o%aim0UcjIr9Af$k8IXk(& zA1ocE{s6FLTckX-?%d!1X8z3CvyX1HJPyDgT1p{3EjOr2-|5#}vs9gYG6;9%jPDdp z(IjX~8369@@0Zr7@3FAXx191Dz2-PGS%RSH$tND)5A1bsx|rvN$Y28UfI2@c_Xk+T~O*O@VM+7V-8>!-i{?b5aNdcRz{bm`RI|0#OLv^6vU^2a~^eB*uZ zd*7ACO81-G`j|_CrIZ%du6p8?jauz4yHMI+`z@X8AY&V(P4NZc#Lszw;k1!v7&_IJ z(m)u81|WxPo%Q}@Ly;*^F{`HSe!AIZl`kjPjv1&AEbHP6Xe%ppD6wnwM!39@d>7D+!zuDK^ z8Hh65@3`YruX)vLzW>c{edmzgzTVf4jEsK6({Ng?2Aa)!C@JYSFGQAYNmCjZAWEz1 z6X0uru4%oWQR!2Dp2RX7odrXaZ6C!)gLFtrmq>RvB8{YUNRE_lMhht2Ey6&$K|mNt zNjC^1McUCFpX-XlgVTfSko9rUA2|Fc#A=Y?W`qUX2e&yi0Wry!XE0n@M4(1^8*9_UMdoXlSrS_nCmyPcPE`F&9(v z+v*s`y=Bjei!$XVC=L-gj|4T!@beH|u+^CJXT;%cd~|wmBI`o^r!EEYa~@kvTF3)i zRpD2T++<+5V$|VXfhG65HH5hM#BH>dz%Vx>SvS$eOtK^Jvhu99^B8B{S%w*{Y#chC z^Eum?c_96-YSY)H5pJ!(?fa%O;IoYUkQ0pJmaX zQ@~!JE@AGg=fVv-ZmM(a{Az-4BTBZ=N)j?>ccC0Vx%e8HDS#08zW-ue+U ziNS@DxjwPgBiHou?2azThUnrz}V z9e?^o=T$H1hiL3}9D7ML6sT9uDKWP47UGT7NVYwvjoaL|=xK-UB%H~l*9qs4X~_>j z;s-!%kG7Vpa;(oeiZDizr7Xi9NAY~)F#vz82a+BlXjX^sJo@S_pC)neb_Eq2adq=~ zm9Qxm+5h;M_su`P%#rlJuYCo0w*Plep2KkuT`G5hcdNFTR0|tD%RT*t=68wcxToVG zc17FO_d*|3iUOP~gM-d5^0y1pmeFrqbX-T6Le_p{4(F0=aTp~fYJJ5WRZ+Ql5rN4b z#>n@e&V->uE~Sy-gZdEe$nI$T4CZ-G9tpTA{`^OpK3`u*)qIR{37C;`w~qURFQlrebWtNt}h4sMFX1JfGKjXFK2iTQZ?6ncsq(t{-{ z$NsdVA=O|%j`oJu=fd6X`{}~rLY?K)9pJqU@w5GYH3OKo#0w7_4dc1h|DZ}(77h-uDq;^AW$HuG&njaa{FD&;qVC^}Q(LT22X}2UW4t$#Oqm&1N zv~m|Jn*wg8J>y4*a=lb|mgU7f8{XhP`loj=AyU zJoDf+F2#s3{MgI6O9xhF^iqXyBOv}@%Vr3_+ElWK>%t4=DKB3Ptxr@_>B``p<+(Fs zzXaS@NYLy1Hg^W2C<{KF{Ue)E9?T<9E#h^$XcT7;5s|KLHOd^0+~-lX`+w}j<%B?^ zl-UwfK$zyl3 zVAATJTTDiQ%FxNj?P>NxYS`Hb=MJJ17olgMdK{nvV^zd%D(O4wI2usC7a9^AE%?DeabuR#Jae= z>?)mh#GDwD;3vv~#s0dM;`_xZc9pWVCCuR8i6TJd&otgMbu#skl2B!#Q@5DCtnOmM z$>VqVO*de$4GBbqBh>@?cEDHCwJ+hVF>(tDmW7GxW%fH|`kK)_Pc3xCf*Quf=ij7~Wv3 zD8reel1S}XJeghnxj%EUr4dE?;$0c5igJvzf#yIHa(CKvZp<%F`ghy8S7+4b%?XJD z#&qFvgrKGQ=Nr6F4r|6%m5kEYaZB^vAp(Q56H^?-Ve?sEob)^@%y_I zM4q_J*!I8xqqLoJqcV1~@jMJAe^5g1dlGCm^l5G|{QFhsy4p9@Q(92 z6nQWYD_nLvS~(`fPjUnaRKu+_8w<2fK)pN^<5FzstL5p2WVz#S#r%kVvdVFA`^@^h zyRUjDRau}=5%QO}*~WC{a{tc#@$VSy3e9skl~wN^2_#~t3{6pu8vhc|gH(IjMNPZk zC}q|)^JG1PO1gIhV#)Eg<&$g%NY&;3$DSn`7XCyIIlnWvY(A6$0V39cN^Zig?OK2T z5AkymXzlEBgoX*)rC@3~m0LP(y0c32AdWA1kSYC!bZBZvrA;AuuhMW^r6%(ex`{J3 z98)z;@9Bcw=dXhdH}4N*2fJ_3v>WVZw?&i;b{$FI_0{MVowS66N%f+WS>0l~-S8Db zH)Znd<*w>9+oue$*S(CC4SNkSjwc(IB!0K;&g%o-SDd3#Ek7y#zz&;=hb~6OX@DdJMhIw_e04V<@F(Q7Z;-(;_Wg<*cIsWPfK|ZOAaLH zU7;T}b6|mru;hBqiXze5jA^bT-6j3fN7FKJjY{@b(Oo-h%H&plDIRx##I|NsLB>vxG`q-|#p->VL0{s20r**)_{dCUU?zS}u zEA*NOfCS&9e7w$Zd3CbDKZaCF)$c&q29MU> z%aUa{Q~BR!&1!*2u&X|0nVq+f0kkgo4cT5GW4~6*X)a5yRpGz>=X_Sise?mKVi>t?@RSm+{&wIbs5W-Sx3BB&d-PlPtzo$8Uyxy{^$I#uQ3szd<401^ z-iPyM(VI3LxQBJrm>oR>#J}5=OiI1&^20BG-J8cplgUX>F-aLnu4!2ezY;)hXFOO= z*+Bw0U*<5?INnc9ep`iuLG{h(%F<7QHkTcFl=@JHQ9G%de$u;NlflYdT{|WcHye@K zb~{*>AuAq56~Zev!Ru(*jOfGOG#a3!9*cf!xsTmtg?d632oHP&=xkw2lDj-=JNGyR z9K=T)>plvSC3aOio3uQ~Iy3yqoGt>rl{&#1M+ z%rGd~^t8I#d~m$c=Zn&NIrdGIx|g7MrBJJS)3L}%73ePx$-TX72`qr7qY~fXM!84} zrX6$MPh%b5qE{{8xz(}rI~#CiMQ`grJq%9hJvMn{`JTxu~gEe)+8i_E}T26c&YmPypdj<8XVR@Wm|iyo!wQytLAJ$xsg#No-G$46p-{89iL&vlT45lGcCm}FJ)1K z89h9^;Xd(v{V<>~x-}Z6`|PXPAaj!J5p1)cH}0N3=pu$x=A?LXE%30W6Gg0IsXA+D zNIAnU+E+XMpI$k#B`6&e`K@TPUMF~UA|-Y5e2AZ5EYUAt#3J=KS=ZYh8O?%Th+Yxe z?t^W{6-Tn>YX^O-iXUtjL!V#2C~&j+c#e8zO1JHp=62u3!`D-LXb-4i2U!6$Cp=@( z?@t^W+aCS<2Emz|842SD6GTpS<8tc7#w~eNNO#`x9e8gvCk)#H_x7X*yM>W8R z6Ys8D&Ue=h!m{TPBX|ZqBZbMH&mDhT5X0ek=(*9phw7r>-OdITN&EqCP|M%?wgC~~ z$?VowXmSYm%__^si4HajT(TbxrP-UpLw?^6uS_izQLT2y{petK3z*`YogP44Gf~>}Z)wD!ANvtPg3C2LH*c%duo216d!!e0A zlq=orjU0`%hmtFDSo*Rw>KqY34H9p%QPkdNtmZp_G=|K2oe zxLc3ccKQ8D(h=TxGyMm_E$ty|ydP=S&=dfo&Jszp+Cqmx2~@D)R_~Dm$UP zqxFoLDwFZd851v_o88Y!YeYDVDjXQ_h9KO5pNWOLjLqJ{RE8iBN{dNJyZtuvn~rhJ zScUcFvE;&h0X!;>3KstuJiju7Pv zfgbwBRC@*i-OzLyB>VD9az30TDIN12X&nVriu7ty;*u0}LvUE*0(H}UV9-KB0>!E! z=~sPy%bVNDfsD5G&|UmR%co)KtCh$81R7DtMV}Tj1yFufi;9Z8_*OpVQ)!^=ZhI-c zPA(PSAoJtHpPI0=5{kxt`Wf5mM^PMP%HKk*6my!SwzKUl(yVlI6~0*|;nL5@)EvBh zS@&Vac9vpXjG@{^8mqnNv24U`H%qDI$KYYvSqk)H5kaZsDK)TLiy1jWx}q$GbLvD; zGMb6*`)*?S8ub>5BtK990-=)w)Afv)0=m zY^@K4c|-4{uJ&$yi=Wk8dfAWt9J8pHQD3H&MeOTHUB$oa$~E!XE8K6Y(0_Ho(Em~B z)yFn*(ojsU@F+uu6ap0x!!lS>^*T;=Hk-FGa55z`!Sn0|GIk~KeT8V(v8=|YRwwh3 zusBKNxclwz4<*PCqvwFeGO=liysQ&Lat{@qpJl-w)Pcd5i|Vj$s){oMiBH_bV*=jO z&ya^57@k*#U@ImXnV_h(G5=nkDFM6U)3Y8z7qv4&gPnpuTj~=Sr*j7qd6j{RNWwZz zD^dNYCA)~~gLVCT2ip5mO7teKlJR-Z*FvT>>^Z`v$p(zSo+S`0Y5evO67Z-rs|btb zVf!i^tx)_JpVPCBw9)PAl8%T98CcIM6gJ~tDiyv5^_V!98?m`kz#1-Yw&s6E;}+>9 z?2|p-PZ>IZG683Rmc{qC$g?p)dQY7n zh+PQXU@r3C+hTt@egHQG25(31jIE=Lj0dvEFKh`GQ>`&13Pb0b(`i+Ih%@9Z$1kQ3 ztDx8}^DtDXC2>Eb9o~Tl8QL|c^qT+{O$T=OS^Xmc{2KA&eBu!H_;I}|ZQ>@QW%ASY z?Pk0BWJu)9LyTe7FvBmFrZk)0B(lC#lTXK`J4r=Kcb=eK1i+w*YtJ1tKkHSV?dwgD5 zUQ}HjcrcwMWXhwr0e<`3Mb%cEkgWgn`ThOW#G4J@u|KT}vFQA&s+0*%6l z#iH`FaWcU~u5EF+iIGkfCwpk4S+Wn2UXvMu4&%t9kn6ReFLiUAF&{Czddjtb@BZru z6%yF_&PG|DU*lV`NzO4PI<)$tP0Vd}FgW0%4*maYOX?5wbGliuus+R6gg$$iwd>an zYTSrov`lBgNA6cs6`&glN+vQpZEexSURXM47G2$%)D-u=DEgJQM{B1rqmF|h(@)f0cI||mYOM0=*Ey*8u zM6gqgVDj=g~9@hwCgk5CSHHz7s z&Z0t2w`K>ki2=S#)(`!2-M~nFVb9naM9yn5hD*WI95`^0slM%%uO&&T;n+<1x9F@`2e}6sLoD&eKdz=EkcUL*?XIL%gg;-rM^(Ca8i5V6hoWWApk^seIN3C5|^B7d*G9HVJfnG&$z_FnYQry zw+-PPApPr;4%7zKoOutZfyc*y^s3*g|Lp-gUBC%l=iAdle9SOoXSi>a`JTyBq+T~t zwyo|PWUp!c0eN+qOHNi23GimWUyM}MW<+$qZk&siPcR^#(^UE|Eshof{;QS|N$gtP4BJ)$w7$JsZbfOwr-OrH29B)$T2 z39&=Yi);qBJ>FT zYztSrLAkYkO|*AZGv^@$S>leo$i-R+xp{j0S4~T$z*)rf;1DJ?Ig|*WEE=W0=iEla zUO?f9GZ6o!h_j(4h{6|MWp2eI#)PAslJ1gTWW|Lu}m~$$W6D()-1KMfT1F0LASCO8y(MI z4@`k#jSqDzq7#b)t?8v<=cv{$*ZlN?r_@J}!zs||E zAj6JIcQ@f7`3MrYt3pZFh6KlE%&(%sw9jk|>7~PbA4bKNRBKktC&~%C{;*DTO&Y)A zOZuhx?-}0=OWUp8{6oQrz?R(ympTnc5{2V%M&|HzhweE_d*PQAeAzZMA4?H{LGOuY zrdt&p2RK%T#8b0edb|}-l4sDHxv$|FgVbm?ISlAmQQmYFPm)!SeFA-e}M-7BRp5=l~VY=c5^kc_I}-bPm-S|ri+Q5LhNlsin-_KN}Po~}mN@XJ!D zzgL13iXk{|2_25^W&Qn76RmrgPbuKf<Tk zC5bTPPWTOsd2d%wt%25g?mR8Gr^v9FJv%(u1{USi9hob`!|!HkmOlK#cK(K6aC*X- zj~vGpG$ia;)2_<_Z!vLwE_4M%n4pS^eG=$T=)Y(}m;_h8Y!tA!(qe&XSYmbHt$lT3 zC=W_x30Vu&s0@}B%XSb+NHc${2iE#xFMPcEpMs8%_wB)K=w+TW1-IEt3dl&L0&9xpnWfBrFfYOnr6SaFBw6Y0XAP840k5 z{p(QAfi7p6hm4~9h7uy(fLelP&tbfJS}VlJ&|CT?6|G{1uaB_wp3*QTt0c&*uB*2z z$dyTk;x~R7GyXpnwZ(t{O+|$!%p;cu8!Qb5BS&;2%~XgFD2hXzW_ZhR>Ex*JpIgZbs@$N9w! zRNZHF4M+&ii!wm*nPN@4hG)w!X>Vme$zBry3CJ1Z$vK9%f_)t6{de<8y!S=3kf+nM z&=1R3t*MGu3d5_nI;qBq4|CxQS)W1?j(S-U>lo zQ;?+T%?IpyKeg%B()9awRqo5e88l0YRj3$qZHTtnOIxt1HbgN;Z575)@OZW$;Hh=8 zY=`VDh~7q0{w|A50n3ecvgFSl6({YglfFNmtWRR@A6zMqdebLnmBUqAU`xm-YI?St zk0GjpxT-A>%AdK`@XRTb04p;c?u_*&>(vf&BKK=`m8Ze`G*Mf0RKccZE)cehH8nos zRtA@mfdNmGav)@y+JvLkg(KK9;o-4vH^Dz)^A=D5t%_UDMlyId;UN^LyfF9auhDvM zkXqAT%99d6S6J{*9CoAK{HtwivJQwvj*MmF*$+^5ROm@}XZO`j-)I&*IyFf%j+yol z6fP|DxI}sx1iN``@0#T_tE(_O`KS|Tuh6a=r^vxin7z&3D;3X|4YEQ#!Q%$zD-63m zbYF$U*yV+Z3q8x7c~ES*ZaJznV=43SdK}=CYIn9@{HQ-@CTm-TbkK{3(I2|LLpeO@+q%deO+s=-oA3{5hr zEsjneX|1*|S$dG=*d7Yr_Gz!(rR)s*eENkzkdW#L4XPWLu4~h4A{!n>7QR6r%vZLK zBQp3oHnzpB*0?Jsb2VVgIX5AfJd+jm9v#ft>7E}C4*_hNghAQM*RroC8Kv2e{Ij@> z|8Sc$$L@>=?O!{OboX-@(Atj|*6HvVc}-fJ!KmNbWTvC$4Wm2O=y2%+F8P%ax8mzq zMauxL#lh@S;hb9V+@Ub05j)G&6{KA(4b_2R7+vXB;51D9IvY;`=$DL6Y3a5eFM8Kz z>_*KXh$xOV7*@G&-yetQ(0>l4dgNp^o+m~C_)-75F+GeVi(;r->mVa|Ne+h#S~9lyxAVn4JR|L{URT`ke2b%h;Wsa>CE zx%QAlK3(FEXt9Y3AzIi5kb*F;Fr0E}K`MNK8B{$dN_p0uMkeSiz%n*fz0?TJ%0 zxGv{$Owt%O1L^8Q4vOFLbY2(AfS2Np-50!hp`fTp-q0iU-D9uc9+g$5o*yRO?!J#A za$E>swLH@u%ZA~$M84-(_<|SPmcoNBIlD2T4`t`x*Bp{ICWNRyhe(y%CZSEJ-GWtN zY0d7HH>3;5U%&=85g3Lu!|diIX3t^BE?BQOgZ%r_av5ue1P0#7!hq<_45DwW_x_&z zoCK0}{gx#%q25XlG8zK+egCXfRI$z_xFDy5*iAOKs<-EP{^^7Cabd&h>H52>?Jl+L zKY31D!ZcwT-t#Z0ZKB3RTOLPQqI}H>6=J)hS=TMf>JspHeB#Zm?B^3FzBPvjvoRE(i9l@?w~Mf{so156nN!ex1;^$< z-l#TSuCS6w#*(f8i@P%+wEa`QV?ief^E7oKxxP*_>)D1#~uSkal0QW^2hl;lW+FPh6G5Q@^ zxW$@N%XbU+Z;l%5l+X*Gi*a1}d9@`^b3&+YK+;Q1g|l5pGZLHesSI6JuqH)*&_cy^ zLXykWOe4_p>gS^FZ}#2T_xL0QiNyH-nkC*BeBI42l*9*xF{2(Dl1QJ!+zfWH@dr$t z)79)wduSKW8UcvZGKZmxvoHsnoHITn?cHTvsQFPr8!n=8QA3DECRU`xRB0@?Cb3D8 zE#O{s0KIgpPoFOnbH?fH^DEiQECLF9GqtTQzF z{=GWT4iCvJ97k(>Um;tSpG3-HaBlq_ERqFsY8o^8r)}u;?Xk(qISk@ffMH-^yk@YH0gD}}o!{jJL6Dw%bDSqjR2JPq6`0*=xIdqt?_^7pDG zT~xT7j^uF?j23dX8Dxo$?P$;BND}SVyB)A@*=Va8@_3hXiY3@&!PjD0mlu zPYZR;;`-Kb(XTVm-ozw8CR@M7c8ilf2p$slSguf!l^yUiq<*X#7g~w_;l2VURdsUL z)*Ynfir1YkPJ?V}w_f_vQdKy}h}CT?-{L-)XHw&V&1j2ibzYk?iEhhs*l+2?E&ax6 zau%EAr{<6>Q@P7X$_3nYQQKfSU zl0wd5;Q(L6c-+w0Zq#R}6sX+c^u48OdP$0Bmx;aH>WVQX9Wk{^Fs{Lqo(cN8BM?Po z)aGk`T|&5WrnMc!%EXAh%$xbDaT`v5bGZb0mULgRd=6~!xYFf#p#P$e`URnPA0KBY zrFKW74=z~E=Xun@&2uMyby zE5qnRHVCBJ|4poe4AY1vo)^DJh?*1g% zNPi|oSwn|pFCsi!Dt^AnUwpgHp71D9cRjRCohqxS%4pD{OJ(48*u`?%wI329LwsxE zECMILeq|gZ?#UQ^EG;-?P@_f^Y`+Y@ejbaOnY~P}hWWr@Ob678&#Z4v+g-mL_5G55 zoDt6o&w?fu-0pHt=9^pt8+%@%7bXalDBEp$aeY0yB#F2sEnn%B$Bx-`{@t1%aQgJP zS$gSQSpAHV&2}b7eoSU%@Z{)x*Bw&rN}+O}Ollh!2de4qL!$|}eI$IK4Vz%uOXl@( z7C_+(Ybwap1#`p|sP@GC$NkFN^jH&e)C(j~8_Jt1KpRs|6A?!bcr0?cAsY}92d{_K zCe9$sMpP`y{vCS3Q>`$WDr6U!DV@+150cc>RUc!Bzx3v0n?wT%fS`gI3G~wDKWY^$ zRr8H6>JsWg1IJDBGD2x0@1-U`5j#rrz3n#gM%(xTYsb8)&SeS*{k_1^QgA&-L#V*@|p_1R=U}-!V9&g zZO(pv*R_Sm^5=gkK@nkRa&ArX?m@foBy@%xG=ui`vNxMTuVW|vzCWi%`OQDXfa?^5 zXTu^dBt84~YB~QS2Svu#U#etHetK&{l5J>JVVJe52tU=V>Yt*oabVBGdoW+2?Q(N+ z5$9!|j(G0JbRCOy&dd&CH2-{_8Bl5XN<9vMr?92@Bao0^;b}87wzeYPgz%wRcwC@4 zeK!s`xj74uA1f`Ktv)zrb2Hk$*-}*_$WcA@n?gEeGnQU{RW7MedHdn+b*Z%T?ysQT z9DY|5U>x52@x!TQD3&^jP?KdnbovQZhu2p$lsvOPmnTy{c zZR@uU+Mx$xKyQ2((T>{O=4%sSI%U?m;|3>4+9-+&k~JR{`p5Gem&FxL;@eG{Nz6n@ z+!I?Xr;1c`emzJ0e$KaBb{(gD5wc2amERt6lB&9zMJN!F(yI^VG8(gBa~YFs(OCv9 zn;p$>m&~@JM`_ei*}E!b63W*mw#RM*hS&jB!8p`tgTllW;IAoLWritL7(f9;sw4=PAu6b&W>If6jdUzCwD% z8Txd8zIc6ot!~?#_}|1wTG|~C6fvn2a{9@#`f_aLGDxf80E~z%g)Y^MHie#cAwVl& zW7ZE7@+eAHnASU=bE>2)S64ABRYUX@KnXE}2ke=qUb_=?RtUw|ABc~(4@Cs8yXW$) z=$6kSa5@HE6`-&<*)*KkzEoxZ0EEg*k{RoCY^~Blyl>hlPyH7fEJ!hT_I+5|ToJzL z7g^%W+LxWWbb=%eO73d=wAD}eWsJ}k(Pd%*v;gj1+aNqlWe%vrWG5Z8)p@kT1WeGYx9|b?BO_>**k_5pV>Ra;h2CNSPi+;3UcBVuQT=+9x-GXfVG4cP`HGwIfUt*dq27rc_cqXobPJ_P+^Q+Vl>tCtGBR3|IsBGw|H zF9`8^^p5*7=bI@-0=g)!;TP&2XeR5e}er(18@U zVn;%pZ`pCeTw2Orc_}gud`AAbBt%+wsm*f9{^=jfC01LR5dE&E+F`7m#8%V#SRH(x zx;BCoq4t{;!1+?TZt554JW=Kv%QyMH_@w+s+5OxMV&P{w2?kBlP*UnE#1iyO>J)h@ zPu+-MkG)+rH~)K!tON+_FEisok!UTlcstAb1p}oS%DoNI$>iq2n?<{en1(Ng!fb)( zhXI$}b%F2IdY#Gq+OaGKQm=V@>U;zQ>RD;`n*aJ5w+7+6w(DK>yHoy|%HsLuXK;u# zMCM+!|I#=gtSA?e!<_-MtKj+Lye#yP>q>!1F2| zbR~KtFk@qKCc1!ngq?N$Vxe0Fb(fMQ&Ghu=ccMAP;gvCZwLLsNd5ZGI+ikWP##f>u zLU=09#{W_6%jc?pWTUzW5&l;YTw?fU0z+uHQfx+Pnw*~Z9}9#<&EbO_Hbs!`*yvSmD>6- z8rtkQt>C;rW9PO;3YfhEyY~Vd{!;|1v$*pH*m;n>PD{e~-ktiHR=|w_uhy6!Q3tt0 zR7H8CH)%Cz#H!rVfyVx$5F7_`oT>~#zOIGDbld`Plc zKa=?~tkj#?r)k=<>xia16GSJNTu$p>1{uyQ?U4>C`bE(ujeiHcx1U|GmpRa0z}tuu z%d*2+2#F$HJV@|h#q`a>c6>Re%TTbXT2<6xY=@QFPQkD6#;pLmJV3H zU%bjvr=+Eor2pcveGi!7EYy^yOmI<^eD}oo*}z}N@U8EfEh>ym?fVE z%bH!huE`5(r5<;LPwkM{@tm>c+<2;c2=%=!4Tss7dbX0eRn~G$6(twOZ54_gvz(Qp zKWXF>XPOBfmlB9BBKp2$qs8eTD_8y_3C|gHG*IYFwpIGmy+cV?cIIe5KIT?oWXrL) z`M#mvp~B2_bo*;b&Lz;h(6sO+-=Zuhb}km$m(GBKYEqNw=T)_B?oLsy9Ud^@UsKG@ z0hel03B|%=5Oaxjfn(ytnbyL{VGq+xD}JK}(eE2x2Cusk<5XeXcRJ)lMzgfUPUM1s z%Yq&z;N#Pr5fL2cH9>Fi=f7ZI^Lyy-XuX@U53warnL;0kuBC$A-O|^tS>D!U-C9Hr zpIla@&p=0nJchUzAJ3(W9v4W9EWAfd;|FTv?My+~weYCLv-&^NcHbWlV0HOx2DgKv z-4Ag|h{pR**Y0ze#%ei|m<4S6w*K}`6Q6SV+;o*lSA0JU)`}D_7kwR`6%_uLr{DU5 zNIlH=k3eS)Z(9flQBtH$2&RaEs zqd_fGcaL5>W1)+=Er&*>*%yBuvPTJ`UbFw?QvYi9%KC>PmS8aI(f-lCME$fQfNivr z;nR1rt{LlfW3CaR7~KZ^3b*~WSr-0uN1ccw(0%gELWGeV^a0LeG==# z-N*H(wU1eVs6edrTZ|7VWpmi6M#IAVc=WU*3Oij2xmvkgF7Sm62g@Pms*`5Qe&D+~ z&1h+R-ueZgh}&7G6524?Gdvf-crg9gI+qJc3t+>)!};w_LHDZ<%p2;l`l8EhdO0*A zKn0BT`D`OQ_@mN!?+65F&gRl`qJgVe>)DG7a5L3h6ap9U_^g3 zT)A>|^`AG>mJh078(+U1xEOFplC4UcpGeC#Av8Io-`i1xx`>H*!cOWadMLxpQRME0 z{cCZTo6CVVc+l5moTD>Tkx0)%GEHw$45VpvYj=Oqr>jAP(kaJ=*4(0e*BWwI?bKSS zdv0APellgFDHS3i>v;~Yv0ftYs51DRm}r5xchYRvl>oA(T`JDpK;5vCxbx!@lHJrP z0>bjsOIuqsA#t7u<1KfV`bS}EO--dQtqgKHf$?{o*!8qnP+gz}JpgWrJcYm{owg2! z0uK||OfxmrI9=fwy}p+gNr4uA3+)uuW3In(^RPj8_xA&LmxudX^hE=T?=IpbK_EY+ zxJ<5gn;CZM(7$>`>qE}M4*4E;ytPaE%cN^hM>eit>l%R&LwTTC?MXL^>A6Pu*6l z21g`5laN26>RMf_1%8`9qZjCcKF@}W5rrr!26BLGRCm@b1e?a?dx5sT{yzhsE*E9) zk!|=j7Tu*XGA3jSsSJ%*QX8?KWZL#1gtn{MyR9bq7M%|EmTF)eMy5W|8sS*%8be&A z(m2Pa#Rv9Cl)U$tYy<__XEb@t_uAn|!(!mX(UYf&ll91}J0Ltz-(5l%%d`8Cn#1Qu z;4;w>LVlB?=le?g!=Y&=YdnU7Pj4$sP{c4#?;DxrxCyJhD%Z>SfPDch%5YnN6n{Tw-r6TJmac3gdU`b zHT0SkM6R_h`wRoi#94)r--5;zaF?BzHiH=Dequ&#UtL{U2%XF|rhPJ>ZI^He8p~}d zzni1zKCvplx&q$87>A3qe;`|Z*{!NZ*jcDD*S${pmPE!guPO+OE*^Kn zc_pK$FO^kyTvoRTnyv+fFVr);glAlNaHrar^ag`XlL~2tpUO%@wqAV<*8s_)6x%_{ z(%<42y>t`kaYtMZp5w6^EKJ+vl=kosAx56@Mye*8a9Qg>)hW+9pP%tv(=T zSE`eAtBgsPT@Px(UTfQ8hVE5M0C_v2Wj(ZRjFt(HXd_4_TlmEg|C)P=tFo!tqFvY{ zUq*UnO@?kbMZ8t`8*DJV6>S_3EMAXmr_vdF_iK>Vw_-WFYqeH)cxGI?)-A@MJO~ZL~#v4L{V|+{Ne;svSmc#CY zdU^D(UFSavY5tk(sabBV`H8MnAra+HwdbzY0rAUyae`(F&D2v z#AImROzTRi0q<)?>=c#L(8iL?E#0O*b{`Mz?Oew^7N`d*aQ|A24AVaj|cuZEaX;TitoJT?h2Q^=CLv zTgp?`Z1JPrl4A??R4#wWf)w5I_ZV&tbR1mtm}HSCbIO1FdED96K~im@JNXC;TjPO| z#z_bQF6#aj%c%K7@pH8j_WTbKKy`*$i~s2#oS<&UX(p2<`vfy!e5eqQKYtnYuK^3C zCmf3|cE0KzCn&qkKHb(Ty2q_f8omvGVV3B;B}Ww=)iahpb{ z-DkZf%on#)jv~eB3oPj9#CbOPWpW|v=#I~Q`6k1tP=?q*N^hFNjN3vK8UE5yj`cGJ zO|RXJYh-xFsi+vWMrW39I^$?wC3E?vBuDE7cRCLMoR}7&>VN-@SF*U;`-WgR%=P0x z`~Umz4}1b1T6cS<>&w*U=jEHl^6yl@q{OthG1nc(H$87efXksc;@y70{!nSd7S-Q? zGU;4Yhm@L~m#|))%Nf8{QHX&eSLr*8?RpPnu>QCh7vEVN1-vbaPu=glV$H9VB0bj?vtN zWg)R@%r7Z3k(*-%G>g?M1l87(1g0}gHP55SUOpfF5YIYizD+W_s#T$$-WmAgv@Ek^ zE1^kM)UEknJejZYQijFDKL^>)!^fhhoka31Cv_lTLL=!Hd^pA6HMt~vtD3ZKBC7Hz4YakQ%Jc?*4ya@-NsdwzzSbwj&J+Yhu zx`Q;C`tz4MQIl8PzU?*I~KYnNK86NtuiDg@*V*@s>clp?B(vn0BQ1~!=7*fMsQEfLIs@ z8ETkvFE`iY->)AE+iYEQ7dlr-hd6w$g9PSei@$M190L8GXxZWWv*n5$toD;@rj~*8 z0g_c^_YH>NE7chePS7`@$M=092P!yYfc9TG-{|*?@#Alrg=*8gzkO|P{}7d--dlq$ z&xbe=ru4M=2qU2q9s0;)kzNU-Ge2`}w6|oGYOz<}i3PR|u^Ff4 z4KP6dg-OMm*4WnJsP)$&Z7q#vh*j0wn#=Cvc{E1ZZ)zqaEG#N2{H}xlXr(5ZC(q|L zdSWuB)qmm1p;Q8;(UDH z?1FB2K5mahp$nbju48%&*VJhP(3bV_v3Kbs+q^=iwIoUc#dq#O+6M>(ac!MpC%4}% z{<}w;i@_>n=-l9CRiF^5p!1m&#r?l0&lmSGZTkhjtD2YI2LA%P8d6sm8cGs&9D?ox z*EgNhO=`-_TK=f6gupM2LML5~+5$0}?NvA!N(XdRXcMg&@>{cLyNZ;QIw{>qMV=M4k0gvWtkwx95)JKS zC8jd{*^I03W~<56*jqIYk_dF1MCnf{E@;x;@W+ycc$d+L;~>WtGZip~oMtIk`Ab~r zE42)_Bg7%_`@WO)Uk3zE(9XoV9TLea{m&ozMQyv1EB%!sZ_w>#xfJroW<5s~(%BRg z7?}03k`e`{Sv!nfSqFUi2d0fcC>>J4<<>H%6XjW279!(05% zQns(9KTNv%U0-RzZMV9KGqB%w z6fjklc>kAORve_HE|?|~6U;a*Ldb{^raC^S4_buQBqY5stx5>Ww1bz}*dVLc9(sq? zt{X_N9TzZ-y+7=o116?kJPj1&U&pgBLYDdMH1#|`N%5)mvCGFR?d240WTwoy4EK0B z6zR*+ep#NKkY2{{PBD2VEGiY!ZuT{>2KmLl+iK!p4m$w>J`fmotjQo_I@^Ll$=udw z#{vT_i@q%$wk_seehTUc>i+E%&|3b(%Af;Llt%@G{aX=VbP*lL6L7bV(+IE0;MZQ> zeHH*H9cT|UP00P`efcMQkv6F>F|cKEcGWd&^tH>1*v+YZiMUM2;Dz>$8tsaU&?YAa z2Raaf0vl7(t;Dj^hhSf?`3M@yAcH>kg~>jeH$6epnzvYrYy%<;w9t07XH%zP~wl$6fxnTJ0)I%i&73 zN{&+)DVBR~Z8v8cfCB-K5v>_m09pV#tMvgudE;Pa2q_?BW#Sh>HyENsfPNa_m2Rss zYjk8_?uy4A`qtAco;=2F)Q-IBlJoC@R{OcF8kE}t2?-&kZfi6YYvq?Jl_JT~iut=A zw6Ug3@A}razO@|q*JK2?c}NMYXBY6QRjd9>j6eBXe{@X&(vqwd`ew|5KP2 z;LXiu6Pt4EGe!TJw0VFJY%S1F-sW-x$b!BR-l+jOl6X{7BEL~+E-;7JIqLaHjf%Lg z90sGK)Sp`GH+w2T(5zuu7ChG-1ks~~LgAoRtEIsl0o9hwqUJt-4o)MYQmM!Q-B_#F zuIcIS`BJmlw0)&WkN^YRUQ4D@xdLI?t5!bo`0dwRytMDZ`|o_k_}DO%W=()_-4=FV zus>e^miMR~U$ncJHfsj0Te||Vg8Hu*!N|QV=bGr-8>s8?50(dg&+b6uvVer9hie90AZEdP4UsF)y&-% zOhk%Z1%D3JwE68Yfi+4VOW$!AjIb~dC7A~X5}=&{bZznzaf>tHpVkVP z%ta!fVg`uV2T)*UNGVY$I2a$VL!@S#XUYJC#e_YqRLY`WZ@`igEzkRt6!Li6wuR?; zEQBDfU9fid7ax33!I66Yj=PGPvu6W9!?G=~(j}4ttUNRuEs&syhoo?Cg#q&BBYrNI zXgT6+Kp-ZqIp7cg6f0d|tw2JId#-1#eCnyT&j!|duDw{Y=8J^KU@6iQFF(}3z=RJ3;+P?@9!6V+b`(jjrU$C$Dew6 ztJU%a3341u&fjhSKYZo8zn%@%JhJ6BXTuG(<-t=GKqfqU*?$FYSVp*-J{S~C{xcQ9W4#&_}_do7?+sfg8U*8GkbXY};+ z>_I}D&deAY9rc6|b~wd^%MW1-BSs+Mj)0>$B7yLjVP?j(Y181kUckEngO;?Hjf{*O z?s}fGEGeH}@#F=oo?fwk!EtsNA0PXT*J_NlTCGprdCT>;J@x2=PgxR}Gk=GJs@1L? z8;vGwRsv^?-+pXv}&>P75TmoA%tPO0L@G!M4Fw;`cv2zDE+-@tu+84WzZ+v zDQO{#PYrBXwQA*x$9}iq#rvJKZtd#-S^SxIAMCdp?<^K<;rmK4YuVL19W}pr1C?fe z=~rj{{>Je9n&+oyTZgv2C)R;N4_ohl{|T>{W)J;!WX(f;zG9YAQoYe={^z?sb$9=} zK6Xg6KBPqYuz)FgLD4e@dtmbbKTe;%OqJF#OKytEfPNZi6F&(NKLf~#(mNXX8ExwT z{1a{+oFHFFnze3g8EDq*8MJ==hF>sncwbNNzC**q++JMHj?XioPz}t?+}+hhwR)X> zUp?7Xt=!JQoJOO0h!DbNW*-#zhwJL@LaAI`-DOW&=(-Ey2#Xgx24fbzU> z_XI!;x8=4C|6_?h(Z9Us^8x_>+%!6HMkJ&FgacMBkSqf5Z@lolb6$GRk{>)+Du{iY zLIJ+(x>8zBp?eluT>Q+h{&3+>`uqEx1q&AF(EH;Hjkdj~HUYIykh1oB(VU*uPu_dE zTN`?@QeY6vN>?8~@P$+UvF`zgAJ?o8wK?tQyTwy98QL3-uGFOM|g_ zF%cuekyO|j{Ih_ZZ>4Wsq?ZqXiP!o$ZfCl#*mIlFJj3WuYeuzPZmWU0)oiw|@IC*0 z+m>GwQtr@dwJ3j!-{w=>x}T+#RIZfaw%l8l@&~HbimesDl!5L>vkB!Zb_xzTwgaE3 z+0|9O>YtbY1J_^m_XF0fd~6Q;9z4Y?rJ!b`j!IWAAAI;Rc;##Vi)PH4jb^=Gt2Z0x zInsVmL4Ulbr*{X>by2G|l(d926^ltw7wulA!9T?aq`*Jnj{p=s#aM$GSpddE8N4#o z-Q5MU3jheJ)j-R0(LUlhsw;T(4BN3G?J@vDb9@NCRtWaE2PTH?lNPzXMIz&3{e=kr zz~twZz(gW=!-+szYm}=!q}&!ur@H9GkGyH-(~mBDuj5!{X<4kb&!tMAZ54Yy_tUfg z@#AN;6VEbjn@?^63fEq~`PI+7v$po3->+T$q$jO{<+=@3>7KUo3*S0@c-P(c+}~}6 zo;Y7{U7V0Qz0}+4M+j^!fKQZYl>N-|O|0#oq{N>^{&t)4IEu6+Y=Uc25@+K&%xg;g ziB=?}{v54Cp1OZhOh)It%+QWyp;Rs|8yg$@xotb-*v^+3dI!(-&}=(z*&0v1U5+jk z3ZhVO>Tb*Zq2*YklH^x3V_Lml2QzEUOkLF~3Cr5(w$#H9K5)mH8?Lx$zo#C5XxG~K zC`d?XX6?HzVc7-jz5mPbs@ETnJr=weLxTeYzEW$ZPw)HH(7?#6=4?0jxPgHIxUQ#( z2qMz=r=|GR+JCgoupQSSPbQrKu!$vwPAnUyIo)o0Gsy{sQaVqJmAmCn+yEuy1AWHyVIxjIU5HDzXHZg%d$RP zC^+R>z2Spdrk%tj#w3?IfC~T;0=8|zcI-7{qvID6XusLBXT5A-U=T{{&=t6zHhl&$ z==$4l`e*(28!q4esmC5%Ffud%&Co;#NO3iy-p$+61=|HSTqG^3Fj z`ppCXWS!dyY=8kf; z=L@aIFp?k4wnfh;;BQ-$KMq?&lGIl9|6@7iZC$wA_^+rQW5=6rA6&R`L zfpEP)0m?8yFtgqt_aVLMwI&8eM&}R>@M&tN-WMe|`9cv_oLqeu|r* z&`HoI-g)#FRb%A)tyW7hz|~60Qlfg<56<|@z2$QC<8EWDur2NnoC5!e`~Uoaf9HMs z$+o4-NSB@?O{698D4yf6@P3o|(vm*1;Gd&u$TjloR9;*gwAQ*@EDGQE(em8e3QpnR z;FLCK0K&wr)JWxC0>}Va6x`n1Un~|$YyD^6_g`XL_U^t`td(YISt4}0v*ziiaPu{n z;PxA@!szfIEZc@sO1D}~%$~EIIN*?lIOG+_VA_m1YiG=uwqn(qHP=>(MUO~)86Z(8 z7BDb4#Fmr+0w*NyG{~laJt6sL^Ch(f9W(@HJ$WksT;NVi>Jv!*DMo8kl0S6_Pt(5> z0}uu?YZM#@!mi*qr~dH%t1dWuhiawJ-EuwU*izcXuBQv-nTP-A%)hL7q4)~ewx8mr zi54vaEnW=$!Q+p91da8(XeO{`E);CpJ$u)Czy7_`b}N?)CC~G=2_E3z1N677kDDH% zJT`rz+lkV50{om(I!OGTtoftTCj@;Mz@55|^5*C33}2|41f#{amgfcoM5lJ(u_)_49x_k8EaQP zh1+kq61UxO6$Uq~f#Vdw%a>4#Dtxumh=h2?7>ceZ-ts4O0KtXa^ zPj}ZYBco#)07#G~kQKHkeS+O&)bgExKbJwsVFL1)fy~l_nLej&$)7Cv=W7F!H&ft0 zVQg5ovTO&oQ+@E9Gk9rLDwlEgs^{}b>3_!kfy3dNgzdAAlooAsm(v{E&0 zmHJ+Y^o%9^4ndQZ@H+(Mm(;0|32B>B>hktInd!`8(;ytinc!^#b1FU%N0PmX=CC}8 z-$?U1WV*Y%Dzwtq3$or(YmA@K-CcdOU=@mE&3g0N#~xmG)O~l}SibwV>oBlx4Q$7T5E89s1Jh>C!NG?f zRx-EiEZR@3*<2jLnz&6U;)GDKxN8 zl$8YTgb^T-F*MmWCG*E^O0>lo-pvR8Ou`QJZoBkMT!BwwdWlFY#pP-@ft&}={`HT~ zx#8laUt(3SdcO7?OV|+3Q?4tHIqUDYJQ5ygx4C_IuIPpFL^nbG{rz(O{Q1uK_~@yH z=F{)34Ls$MEZAVJJ=YbldFzMp*7tl2zSj)q;828W*L(;^lM)bk*ZY6Qfu}4 z!J&~oXV0AeMc4CYkB`@$Irsx<20<WieiFTp)=KwJd9fuN0L^B}i#QSk`cDZ0v#i z?zrLUTduqE@FyO7aCWmcZdsNE%eK*KHefpi9CX;xc*QGU-&(Nm{)Lgjf%69j2L7#a2cqjR-i+H4@HfUZPx7BY zy8l;^{DG}2{ZCX9Yo$t+sst4uJp0U_oO9#FOTVDK@ovvoo?}@yguSw*#VdY$!7Wd2 z%bI{~|A|hH!hZ0FKKR}<3yqcUs|~GoNjNqE)bd(*{o6l=xBT}9;d`#uT7v@jR?l*? zo;lb*AM{MV@2%V3$$f>Bll0?&tpWO-7>qn?{-C_P_Qjyh>2{bvngH-T(2v`d*M`YS z{qePtGb%@G?a!Mx+giD5^#`=;x8`j(@Ao4kBXB)W5s{o2_>Guc=|8v#0gjouP%M!k zf@Rxa2oTXDBZC`myZx3MUU%i+&wEO+zt7m{2!yl%B6zJP7>u2F+nbMl!`svz3-*;W zwwp&oYu8*dJ~n>Gj2YA4&}cUIX*OM*a13UGa=ZQ{2piXi)IJgTCzlC2q%p3ebm{h( z`4Z_T3H-)oCj&r}{?#OZVCyje6PFUiYOPhNT#+P7kNp13pZ)Iozn^m=v0G`np6}Sg z(y-UoMbBa9{N>8W7cJ^{7B61vZf4`2b$a1E*-aDm_xFpXOP8t-y!UNqSNsj{s*S9N zX3_!>p6BDWZ~q96f6qq%<)Yqb1P5(AD>T8h_&fsqwndZw;&R>ZcFdQPIswLnTwqM4 zPpIO}atIl#`sgZ$xd=g(3}8-zIOpa~EG4knugL(vQ9m2~$Y>g}<#5|`P^nxZmydbzr;Yg$(k)KOtkL1Yva11KmAs3?L2VaNjmlf#XjDxC9vKf0^CQunv<@b ztF8U<6HNB4<^(MOBEpy94SVV(G_?05f~I;rH#j;}Uu2SBvppTO{`k&;q3ofs$P>2J z`jh$m*-!q!&I$m#qW!mGi0VQ>Hd~Y=v-khsgQ{uO}UuUZ~sBC&`2cuM}sh-=T&&oMn=q5aamNV;}w)RPE0a@l_Uek5mvcq6I9 zq~10!c3JCBYC}>vep#%UiHLGJ3zbTh4MURadJ{y{ErejD6oOm(M&3>sO`laDQIiJ= zfY2E$D{_TGeHou&Z5-RNZNqIh{^m!2y!raKZ`-tPF9LU0t2U&RT&q^xLLr~Aazz|? z$Wb`yv=?K^J_o?aSQsB0e`MB-zH7H^9lcVMS~hE7;G3hPW1iAXM3k)gM>O;)wez-G zzkl6KjHbX4CG(^i{(-i%E~8p{t6kxbWDP&g`SHQ+xv2U3*l7V^7s)?Vgw`t8)g=Mz zzLj79&qwaK>6b6}92=h2UN&PInZm%j{f>F*r>cE3e*Uqyyrmp3~t z@r+x#XU@NW$EJre0{YZy&E5c}lZsu%V}zhnOQmvno=-bXdkWuuD^HN{!|B@z2%U&O zu`R*$p*lhj5cr5|{Ry|h3%@A|c2BLwXOhM7KFPQbh_3$ zJT^?}^KX{N08=5KhwFN<9S0-?ip4Hi**uJFj=_A}?SEdq?be%rJFxz-hmPL7;R%_| zTCg3*Q%XtJ%=tnWpL*s?WdFRq%F7Ns?EQ-lJoayu(e=Na7#|z+wElx3WG{o?VHk$! z>MBAjh4G0=UH=V7H2B7KOp9+`xA)11Hv?)Acf-sdPJ?hcO@X4BC|t&r#2?Mq`ZucP zKi{?fAf_(>Bn|>Qt^G&pRz@ZRGt>3Jmxtc_tB3CT%m4Ef9e|CS{Q@~$>@xeEpbujD6Ypau^vy>(Y)?Dn$%ZZYA-KW2L>CC0eZJ$&9<&fY4#@e?$YB0yT%EG^vk=+7N?<{K{g!e>6U?$lFH)lc`?0nhGl zdm8Y!4F1>mz4dUnwCRqCZR?dVOsSc*DIf~Hb8z;X-fJ&^;VT|yWgq0aHd-gOO^vDh z+pZE{`(%_5w#$Wv(C(R&YVK5DG+mpvBrtoM-&Na8JE!R<5PqAolYHv!%;~X~hsZfv zZk+hzLPJy-36>SSk7)e~^|h=Tt>O(KU}ZD#JP)?*+*>RZ?kra-%cT?xJWnYA(Kph( z$gvag*DtA=CwYB;z?>h`=#w@0*ml6XqxFZfPnY;3Y2($z;$yMT8}bLDma#x+a@r{q zwSFTcgqzKE+1s~n_|B(4@a8wW)v*~Gf|XNq_gZ>DM&%cL^>bgo@FUNJa|52;-}p4K zV#Nycfw^;e$zu;)QuMaJsWQ63VUh+Bfwf1j;_3;fzw)*>p8Kyy_w*F2cC|X7wbIl8 zurpfz6bU;isM9TDXPPh-XFnM|U?+s4oh5u=3es)(YsTDtcZ_aZH~RRakIdM%@v+z5{D*7RrYF`)&#A#M3@FW7Yb9LA!VLN4adFU47u-q`@?aZ2c@9@+p=}5>hA41J#Xb+Tq>7QE|*oqJs0V%(;@y=x{ka0 zwI%hybw@%EX#EN6`lCAxhT9W(mL#n|Lhz~9pNyx>{NGM#Xf*^3AYYt;HFw?mm(PFv z?X$WH*}ZK?Y3AvIdJ4C9~D#N$tFu)X)`XfKwkmejAQNM`T51#?9*VWRzTXi?X{LYgkKqQfMOzUqW zNVK&WB!_9O)j)r*93P+fi(PZhD|Q!tPDFDnl_~&CN&dk*t+m(F-DSAS`#WozDE9PS zTPsZ*@V7tTIQOrAzVV1hANYq zb!)j+tA2yQTZEART*&8-HBA$vqvJ{lB1-hjwIP3?p}B|C#MbHuqC@)v5k<-in*0L< zOkwg5Y3vc9B3ys8J;8>AS{!-I>1qAVCWS*{X_DLV?8Z|f0JIbG<85JP=0aD0_2O@Q z`T9Rxed)`y*^FRjZAw9$>G{XzuB9)y`r?ZxhlYm4)8z_y?tJ@GgRUGL6z8nEQm8l>yzm$J;}yK&IbFTm+9d(D;u4nC&D+Ft59Re%Adb-*_|ZTnF| zl4*9-T_*Zz%d%5;fVhz$DaTHVF;lDkQ~a2tntmXBr?mZcnt8aq=zXO0i0}|;dpoN^ zw4K3nqwP&H!FO0?khC09Yt5OA$yO$_p;RtED5VtneD1V~$&yD+Q+mA3;b7*vp+oC= zbLScm@-thv?l|?ahaY(2j=!!x`S!ouP|fG814@&V^$mTvUY6&%P+EDt19QiYKJm24 zvtRp$C7vekD&~H@ecSe1%H!kT>B;n0^Rx4l0AXTsl8HzQL9*2pU$BZ2W0I!bN{~1y zFQ%clgo1Xy{-8ynrOi{IxQO5oDL07Sn&BTPJ6>)qC^22Q4bL4sCI0`ZwEu8>*btJ) zFdx3?i^EIr`17yHFfy#P=B$+woSSu1an9*4o4oM~=i9g4?h!rps@-$17fb^g#l@5$aUrB)w_ohIRjOPY#ITaoR^I=1Al@zIv_+i3s^X8zj={5iS=9z`wS`|J)?0NZomr=9k-u%5E{_K>YA&B8&Jmpq^=Vnis0{&5r%ZF|-PA#vRF*)+YuieV_ zBkf8VuF@U}DGVWmV~Ou^O8V|V zlG7&rr(9;7E)r$p#%KL?P3s36Tf6RSg5e@Nl4|fD20&5GKB=BScrbG@c(&3W;{eGa~U)22=Gsh$t; z-0clhAn14b{`Y@dc;MFWzp^yC;X}$UA6v6+D9xS_0!n#?6atzuJZI5955IEo?YABO zf>Za^$~#I3kX^H(v~C`bva6)u!2mFwz-JtG?SQ2ujXn|(O4dQ!kNi*@jfzrkq{;-r zB4MU|tGH&Ocngw-k&l?o@u#oC;=!lmY_-eb};f``rY(wOGiXQ7V;}bo|x( z+COUm1j8_OS9iDAyk*lZH(vXT+QV!9zVD_DPt4O=2`No21d->uGCuw}Vs~HVxo|z@5lKN{!K@)OIn0{7_?A;&cFvYl&wR;V zhE?1Lu)8XglK^1~*FcPZIz&&OK%d&v4EF?lO&o20i|u}NNkkgdR+I8ilk@|5S@X%ngOsO4P>&J5mSn963lBx$49Q}>FJ&`K0c9b z_V?Ss^`mRej0Fa;W%EYd{kK2kAGiMr+qSH)e`O>925Pl31WC-8Jr@TbaRLrG>Ub>P zdp}6SP*%o7rCh$ZS}nagn=3vt(BB7{&tu2t%`l`~o6BZ@yluxwZPv_zLw4*Kd1XFV z$dt-u7D7b0F-rVlt-Sef^Pl$X`h#TNad}^i`2Fyp1t7WHW>cr*=MOi2H;BLUF#dcX zf8faw0NRg331W97ZS=RUbv9oRfbsB(*S+KxUEMM$jf|l+ORW{}eem(C7cD#WqPM;6 z%|E&F$}8nLjU5A@Y&<`D#?)vYBm@A=Odojb87tVf-)E3MbbNfAg^-$rB&9rLGKO$n zUF)4W|K1nB`psKj{L0to0UQfm$(KuIO@cu1&8uOi>ns;c-GQIkWbZ$#f9<33{2hNp zZKVMu`L%;-qx!KQ7_Y7s&&@W4%Z_W))AYkf+7@nRbT9};*56rY0bq*v(x^jgt+SRT z7z`;TYPNHy=XsT4p>TAyS~a;&?ycW^Q`@h9N+}@?6SiH$`o|x|UANtW`|kWJMz(JO z31Y*{z;j%9%B5^JkEI73ibIb&0S6y`EV_Dn0A|!`RV{>2{r$b>_U${qA`SD*uCC&N zV*m``9Ku zjre9-;qT%XC?_F(h~$Ih4}=7P&g9=n^fYPx@wPm-u{#35&T0RxfcE2gVvI5~IqfO? zH^U!Y@#5|4AIvfYl=4)6-+-Kd(5crgJ^aiMz3OGBta+-0fag!|m>wD{1y*SQJTx>k zLytf5?a^(UUg?%c4aczoqPj(ZAfy0lHBa@=TeS8?uYBVjFM7p4?Ii^r2QbQ$B?g#< z5Moy}{oOL5H_4O|;zEzxw*FnNddlFb6DAXW_$K@tYpTB;NIyyA=g4Jy4L!O1PDCBl z?vtM(vAr?jC26pV3mgDcZ%>aL8y{Pz6vML2y@&{gVW3*6#_DNl`vQh(fEgGc9l;|H z-iy0$zXgvyyauI-F&Ku)40u|3hSr*9%$|>BhaZb0k2?hm_SzekWx=jhp_PJWcDss2 zvwNTq8y;Kt4ifT^{#mnMJGOoM%~Fbci-p3g$HvCz_xAS8oh+50HG{z(0O<=RNv8hR zB}JkF1nu7^Xy^5)@Mlxg4^8y*!=u)LNO(*@X`}gf)cRvjn-c#X!1Tt=CrJR9#<=b& zkGp#2(BJ=d(}Q39zD8S_-B4~ z2Ae2j!XlgD1_6*@CYlQ7ff2uG=?TPK3>LHRyKTM*rREfV^4&|MenLj2x z1g@f_A4(J@{{)(kYW!1>e!IH-Eq$#_Ms#&|t=YD1`=fvu>+kD+zx8s3(?!e{^kHK>t2x({{f*=+>J-z6iF&Bp(eKM9EcC;Rt zIa_P3;5rVp)(}D%Qb^2NI1gLbZ~FE4$mDX>}rKd5)e+7o{WbY5~{O&DNgI26qVfZsM|MyG7 z$Bb`Tw_<$zrgzjz+eM{ZW+JJD6vWIhq!5#(%0#i4|N6QA_P^VYI{pQ(0>sfyZ7k>1 zY~gQE(%M~cs?OSu%pz%a7E$BCoL4VhCPj!k$Cc7BU8H#fMOf{_?0x>1#xRaD|`wy51W{qm4$|M9QFTw1Q|o9X9d_)ss+Wv_1l$S!)28J7<=dm@M5{sa1d7 z-_vvdj*-#tGSfyWX^H147DAAe2BcxYwriLe9l_d%?!&|P-;GBexCi4S+o80AX=Wg$ z!Jg-`6c8CJi#ZGSzT?OfPW|P}U-zyZUaj;t7it0PV)CgdD8d%jS#5$oB0&{qIk_=VjyD*XJ0530fOg z&hyOKpZ?wzzx<-VWPMtXvVdYMaY|7& zlKL4S3AAlOho4zH6Iut2JV}QRvi;7?=udp-obWyq1&Qg`mQJb;HE_y^WKaz93Q zY=vvv$XHnjBE<{{0qMCe3f+BJuxQDHhaP>>uaADgi?+;~GwUU8wQ_2?R6;(V!;T#z zw`;988-^6!-Q7GkKJl@!N_k6PzW7E!pFU@=z0Tge?r{Z>WM&0`NVJ69>H7EMVF8nT zR5M3}03*cTOdB)vClP-jE|#a&j%ePvk`NGaDJZI(izPHLh&~7?UwX;Zj&n{qSXh;M% zZTQlE{l{^Wn;%&*wqw&fCPy|qL{c&dA|VK@S$VGTl;(WTOlO~c54!R6vtE1n0S6!Y z_hQeC6FqyfM-Wgdl_7+v8%tw*vLkYvOc2j3Ov9+w!CW?#8NS_*s*|?gs|(%QQ0h+}I9AAbDZM;&*f zS*?_oYfojfSqo$16G{jnwAO0o%o&DbJE+>V+dNNQ)@50jl^th8Z*Pw|HZ}pxTKTJA zNQ9=(`4}QH)8|)ZG}i2Ee$-n^se37|DZ)7MEsnTC(>qWHYQH|;iPTCQ{sOz zu{$RM?zRBX42X_7$z?FJHq9(Dx$G_f{(-mrZOgj*Kd2c5*4i+nP}Yn)7aX|a_%&-* zsa035(s&ZK3Ql{`ZeVC=NUT{iOsiHw0l<4#yzPGsul!+WVk4aDID@rE!Z3&g5dq3` zkugo!itQP57VkLv#8dxx%<(TcZPC*G)*2b}xN2#V4MS43T4MkZBtqZM&iT=U5!5MB z0;1{tX6$_bYyKW$MI;F^iTZpjKJlmLYwDfMa2@^p9mu$?cApU5mi&|AlC+R^g9W^- zm64wEZgcF~^@V)lENL1g+jb8iqMmJAx5&pIeF*pe<94ijl;dx5$z3+jdTB~03vRA!{4nOAjTa1kL0xM%2<~YvGQmI_8ok$ZPG;61?x6c|I z9s5C{yKq48Gc1+n@=ZA{SmLrskgt10NB~+ZRqUA~0etVDPFYF|=FE6U zsao}*S!DBhVT_to7F}7tRJXgU}y4Bc@8gUy_IuO$MTes~^ z>+N>(YwWfij?@DJUlh?0O~i>5dhllF?NNIc%_03==YHU9Q%^2- zCb#~329+7)RZy*zHGvo;Ky|Y!3jsj@s@0k|XTjdG(9{2?x4!42m&}?w@BbBhdS^p< zy|qdeHQPpGw_#0$(B#47ez!Z;qMfxEOo4q5c$jX0Kha&FnGc+tv_T<<5iD6w(hT+)<1Ua<7@Ay2kyO7?by0W z)@l_NeLkY zQGG)qB4Q%a-Q8Wr`1r(w-MzhEE>BGMcXt;LtW>IRwH?<5k!*OYrquc=at}nc>$o-^ zNEs<75Fecw7^^QbagP$ph*=7Pf`#9Tpnwn+7-CPI68|#*Pt9_`qRMnE35azuTS7X5qO?S=o%VQM~k$t5(15$=D`1?OA&mgM)(-Xh~}C_}CY^ z#E$zuBE20;wOx6$)D^H>gX7pPku(}EQx<}R>pHM98H|mOKelAQLub$3Yv1e7`{aNA zRlCl60iIW>lwoBuRH;Osi(8tE>S3n{?L=G z3-LPJ4>lZ;GvWgYqrQWmVMt+`CTdk1hG9TT1I!w>ZDZT!jq1^d?;G2={;`3r8`fdd zhR0E@mLY^-!_0t{){ax-TrOuwDNw7qn7?=_wr$yT(W_s-;w1+icEsNKVz&mfaO@g% zW4m9VKAF{DjiR+?!!QT{X3d;|9ot7f<|_N1e7@_|h7_+g45NQ!bS!*WPm%^4)%xp| zw30{6{fVadQ2FgA?=^#iT7Od7kergRsZYc*(aIYYND|r~egV;oKzXsC#B}jCq}W+J zRc?UkSpeeo#A;yntZY#d>1*Ho@}oBvtjyaPg25Wn%sG>;Jn~1sy5;^oeQIFZyPhO0 zU%uQp^;94@d-I*=zVleFme1<5>^TzNijghr!Pe%&K@^r1D_ws}1&rAauB4FIkX1VPe}h9t+Xp;+w3yoHOfWBcfRM;v#` zj`<50|9Q#&2Q6B1z<~oJn>HQH&~t0mDibL2pgm@0BJ#49Wop(n+jbr@g#1CVSX^GN zmQU~N?ahshjzKBy5s?8Pt`WCxnvrphx-;=N%ZdsRG2%x=yPpp6w^%&x>rZN9RO=5v z3&N$Q#QzM#t_lE+kmPi+$iUdr!TQ?H{~u0IU{0Ui?XB9a{5v@#b4|7j zwelEPYfU5=M1n{VGwWQ|6s1xbAOkb!FUE}7d)@HDvtE7L;(hkzVzIbg3Yy7Uqf{yd z2MvvON4-96X#XSVq#*|bI{nb5NB*s_K#2*(wbT5kA#nKV7+_|_fFJ@fGg#O6=+EbJ zsM<9ch6$yV%&fU;)F*Zeo&8%Y!$X$gJ^8vBZL9ZwP9HqbanN> zc3c?Q{KjR69xa)%@{E_9T`KnUpPkR=9utDzFflRCU4;Twsx`Q->${HTS zVy%_SJ^i!flEYv0jt_n8lb7tt34v*EdkRrsHL!+OHO?AX@$K78=+IO3#JPB~!zgVtC%>*Q*s zs+pA`r9`Dt1pwXf=Spt;8rq!%w|fZM0UGzyFb%ZT|EDDX1Y5zBTlj{<1EnScnur=2G&M`rtQera-X1YIISHi{q%>e=GSFI&IktOOxiq@`(T5+<58ZbUt$pa8 zvFhY_pXWI!O-{lv&87=Lc^*8^Qy|hy_d7^TPEOu1cj408U-SC6y`$LEdv(^zXY+;J z8QZsQb8=a0k!czj86AU^0stvy79CFi)23-E&AbDwubi{j!RKv!^zJ_v3WWo0+vx`Y z*Y#Q_^Z{|AZ-%we`kNPZ0c0wzKP*5*NE`$rPSpCz?`I@hMN=SOw4H(L`u%hSfa#Hc z`(Ic}{!b;IayLL*7XbT8erHPo1Dct;y1L7&umA1p%fJ2kvplE9U}(!S$;kJ8>w+I% z|1T?69A&IrdAmE!hwF&6$30DmZtn2T5C7XfMrGRqRUZFOsmmwj4F_(ugj%f%Piaj; zKnfwWQi=iTxeoG$BFa^Ja>>#Iwl3V~;L&4GT<*-`yK6EF-3 zX-L?$`u^=itq{_%`Gp`;jNR0(?oFh*)c%JULVb1ISty z0H9i}BAd&?b=>-&3i&_^#!duZvX(^_O5f!p5G_)6C3U`6syk&*{k1Y5e(xFMsW+UA+TW%$>hz>%4h$KS*S5Gz>ZJy3P_JWUYK25aipZ0MEtf z=om;)iz^$G#bV2%P>-+kNIkBR#h+9L01|!-s6jf+sBaMyF0hlP9SfeG0FY>1sGH@v zaV5AF))?pOZ7t;U01>Ly8njjs-!mYE1b~M?LKCn*N%;V@o~KzC1ei*brT^ZsW7}bC z@4svPjvYH*TA3VM_}JQqxHK_Ju3dv^N;s}UgRJ4Xjwp5&(bd%rNDGVhJ`fA{-Uss+ zEKy7M-Ou(kuPo$qd9YqlE|rkYW>KzG;d!2FnD#~NsNXiwnvu&{$YpaF8y|llpUwV< z>#4mnR^}+B^q}iHP)c)@`0JN#%;D1_{zjUZ*58i!gL$LGAI;ZcBH=XZh&@)cZQ;jF zy4h*sPf7o&!L)^dDd!_aLYqTMG_2hiHa!6V01H8sv8?iMe{t30zx>gK2i9seEr{5% zENRPu?_a#?w{IN;+M@M|M85oUh^+|FWrCUqNV$M zO%S;nB!nQXUA0IU^d`r4Gzn2Z=CDpKN|10`W^r!(X$j_xW(}n@q!cI?3IG64d6=AR z%}LN&BbUn|m$NWAS%TxZ@OO=An9my@XqeRNdN>ds+NUCa*1D;+#*A=vAH0@QicH2p z&30fICJQMQ0Y>w=>RSA24RSr#K3WLsbsPt*H8eA{QmmDt#~)w&g^AJa_RLvxK7Hq{ ze?GrwVCJA9aM1d7YxVjk9v!WgO4*+7LSgHc&2U{0hG76iP|DMu>uRkub@z13LRU9t z&E3lx9UWP9$dMi+M}-P-krHm+l{1f!aNRO@es#kKL~r5}?({-Hcg;tmJ^ zu^j*db=Nx#LMf<2`F^PstRvL4csmo`#nj|K^{|=>08b6}>}0?x1b}9Ef-o_C0RT!V z-QCkC9)0+MzyIg|d)GY4?i{6|1r&?ooGN!MIeq1KzH{68L%Tm2FztoUK-5TUf?K>}NW)SSW842Gr1XqTjxyOC7kg&(%$hU*5W~!HHk+edKBs5Sm?<33y?fi{$G=Hr zNMgeG@ne@p{C;#E?^T-xWvs4BUl}h{PQX45~dWH9TTO$+~*Y2|@ zIxUNSF*Cyx|Ep9}Rpq-%BUK@No($N`_Y-Hj>g`|W(k+QmR?LK(t#fTIbZvwIpEN(A zy{_bw!!4Dc!B*RdCk!Cn*1cS8#cX3`hFPv7`-XbaBs)Q zmE>x6Z`s$FgyZ$lzaV zHf=~0i+oj)U$K&W5nNQO+~%H!MxRPFVi(J?CYLEJ?9m$~a|Bavu!V*%AuUxr^?6!y zzg_)4{I+xz*;x&5bFe*E2&&dOpy{8>ncs%}^q!u@!^^VOJKS=Na7+q*3f>ir(+u5l zu}9;U-Voq=d`#0@n7Z7oiei-VtT+jqJQ#yTV+frg%|bn--dgo;whLnl-=N5(y31U) zKY`sr>E9|tq6fhwuJWECJejHBYb#-)jY^=+lg%_uVMz&%z zwnr!{>t8m%1UtZ_LGlES z64g4^FgD?|8QKZKx6iJqTTPzcT8WcLuKDvWK?Q8;0*3P2PcSC`noETp+g<}ahx^MK zk3E+b@&bd}G-fZgzUdY=9tUEiYk%*o(SM_^{;;gGG&wu#bOavs^$98l~*O6(<2XZW==NeGXl{?b&=ayYOLv#Ii)@+z`{Q?0ghbFjHly z*u{ObO(kE4~tgW7#lzQ&gZN@3tbl*#nB-3zKL7^!XfQljsDbmZWzkMk9p0TGbIC?Fe zB(G!yb=a%}MgDpHx@qYm77Ab0RW0U3kW}0?$iuq^q-^8amCAnYPTHMUIwZ^ovx1-KcTg(X#A?_jO^| zjI{UVh*Gt|XY@#ekt@Oca`+vytsvsD}gZ)>i-omcArbgU) z_VeYY)2(8D`OHv`=zg$fz_$9EOzC2qv+H{$iQw-EA!QQ}UxlxGBC*2n=+m($Ly{j9 zbHkMOlko9?21KAobs%;`E@l3x+l;UEEG|V$pFKgJzajleQwWCfzScs&5PFcZUuO4fpu1qG*#7;Y?}OXk-~Q!bjcz_G_qT~7^^{<9~(GW^od)o?Eg6g#0TG=C2j;W^mxH~dt)pc#ZB>^6-{ISX z#9^p;+Mw+@>!M%P^ul6uXD14lmR8!cHIm1QX7{d2@Mq6sS+Hq%+jQ;oKP{QKTV!2) zEikDh*&oXp+PTB>6%42M2!Tjxnz1ofC7RC-RBt9N>lw{&)Rn0y z1TmuvsxD)hI0D2wqk~ubl-pE3pbS58{w5gnWwF?2na2@q#0k$a1j^5wgx)tJw;^6( z?WcQ@BIVQrssO{-*W0CgI@K}yNYN>7_#OK_J|0BCc1iiZ#bAsh{NNi%@X$=nM=Um z^AL6;hH>>~_hP(K7yWI7*q8FAP*W!L?0G?=!@#4N>Z9fQIWNd_F`=Ri?Z~}J5MhiZ zoI9`4B9|i?JmpN6;rV3f08`LPosI$%s2Z>|JF8Z8xuf(gxDMLRNjkK%&p?+a;qhk( z&XnlPBqd%jdijngLrpkS)Om5FncBdVcSF{=T339;RB(G=QyT7JtjX+WP-@3CKRbK9 z${_WMp3Bw_&5T!ELbd}p2?#KS&aNkWKR~{B&(`?8+1FeMu2?^VCyvsofcV9pQoTga z(oGJ8n7ahZi-P=e@oFod0sv#GMU~A|v&gmYmx#_2VK0K)pGE20PtI^yAy5PpQ^!Mw z+fU@(K1CmLm*o&PN`|dZ#=F>-5q>ffrQ$!^x((OC^a2pizDqI>KK%{J{+{pG;c~)S zW*IX7!-ZHcvT=52fVN7MPCHd^+1gMSUM@mNUS(KsvFTVj=3@b$yN_|Q)rO8zOsnEA zcyU?hxF2#iXftB;j(ry5i|Tf#pS8Bbl*e-{gy-=OnDDD9v7As;Q4lM3y(NkxQnZmP z!_l6u8UEa85meM(@aZVP{Qjm7B8v}T3OG`GY37)#bw(>0daHbkaGkD7tT`l^(5>WR_J z(#7=sD48O-LWs0$e~+6sL-q0({3w6mkX6c=OGDKDv~KiyeWTB#jQy~gfB(CErnYk* z1z;NR&9NLp-kNnCFW~Q@746o9VZHrNe`jaWtOd)T5tmu@L1+p56at@J4vtc*)erQ^9daG0(W@*QjqWD#70F06=cG@4%RFPZ(i-#|LdfDQBgGI+WT-4ny|HEmT`*O7ze!)`Hw%$?d z`2=79lsDp_k28K@LY^7CA_8LVi6ku+oA$W82dniTX7@xZ`G*+C>W^AzIy%~PX`!I3 zNKkKUaDMvR?1!D#sKc3W3v1Typt>5j_Z7{yrHH3S@ZeUHj=;w2qUHjhB7K^W4pYAC zR`m14F*_3I3nSpk+ZHyHRW66`9B>Y)mx+xb&Y8>ioO3JE^$q6_CeQ#PKFDSGJ#YtG ziXDKhJ!MLtKDuf1Wr^6qZllid8BB{mt7gQ`tEOuDpi;Eb$xnY4ik6*)Bw{>66Dwg? zOrqU*#Zt*$^;KLVC?yJ{xBZ>w>vK(`H7bfX zlqIH5+sVo?P^$N76Ks4mUF7fBsU%%K85~R$)tJ06c}+T$%X%%l_rw@+-Ay|D!6m4U zLOIC&;}=|EzXS1v2%(%mxdF!5?#MAu8q+NaQzAZd*Oe*XAC;H4JxI6u(2%_&2{GF|aOHWDT_^FQQ^uY6ElDtu0bv|r$Q7SMu*xM6B$&&*g09V6sFq!IU zv}>;POO%vsx?Oh*93ZPPu618cnRXgRC(Ir-9+V`7twB1kO1T(ISSRv7uhB$wcXubp zEJz6A>zhf=h4!_->&k!egs_5;qNh?n=s0*=>Uuz85jj}t%*57AG^+ElBpo0RV$I`O zsYn~?UG4kwu_KdrT3Zf1yBO6mn)2gwsuWV+Byk8+u%yI~QHf!RtQrMpQqpZa3#20i z#>(QWJ?{NH&dO8Tvs`6q$(gK93%h8wN||Iqp+}m=JG|Hjy*6ET!GfAvWZ5w|g$aNz zqKsjx-y1vq-;+AFeaZ>n0Og3dMs3~t$|ZOC(W@D8x-*r6dwCGqm5OH|SYPn<7 zSV96ps(X#dqoay%FSmos&J`Q_gb#*pD7o^@h)7BIi;9@hlBc&@%>u0tl~%j)B&GSK z;yJ%*Y$ruZDQ%L|b$Na1Hb0QTkG2up0wH%;QlXFW@0!(w&li{Ba5BJ03=TQGovOre zPuk~RedMpsygwdC%b5{8P{q4Nzp9L5z<%MOcmHsl(t+lc97 z3T3h13Tu&?F71$d`B99To<6-&52hWZZ^lKnSe8@Yt1b$&ht=;vG z_MD2T7Rg={*aLgb7_wAZIsIIPOAF!D+{&X(sFE4(F1PN>P0a3zSf%Kil)#+ zfqwdZ({*&G*I2(Os;Vn!eKrQXv1!*t9h z5IRwRPy3_i6Zt0%HHW=OEkzgP=7wy93W*W&#`$!`PQ5K zq1ZGeiCF=u+``U+hQly*nG0U8muO`OX)JjS)<7Dhrs;GzRZ`XhNL`6Y81-uMvE4^U z!;pPhut2Ml?BAK@+w~c&-%CA)LC)D_BI+kI#7UIC&i_u_%o+Z9k3u>h&1E|sR)3P} zsg^FQHh$kXros)|Bxc3Jpw#BJ!f20mOti2}kh-Ips#)K8#f3A$@X-b}kQ*!x|ph?bb zW|!a7I0f1d>NIBR^uH+FO1ceskJ=6XRh}WprC}p>7$r-B-R>8e-)!6?&=`45ee_V( z4_>ur?;vJ^)y+-n3(Tg{@{e&&Hw>akYBC)OiSM_){gAozXXhO7;+al)wO5h5kONtu z!Bd6Z7wJr5@@yhJXJU&#<0-iSY?=@14XD@m!`^XAqiHP%-3dP~*-Q#1sdBDqa?Iq7B|`qvZ|$pIjGk(-J41^1 z50&?1_hD<~-CF0rT$F>K9EK321ZqncjJv`@+e4%!uIOBjATvat?ojKUE@502bAf+` zk`=5x>w3*;?f_ykr$E~(UV{L^wk^xeC!LF%BzZ;v?UFekK>#hfQt$}CZ_3=vk&CnO zYoF3=Ew}7=pei%@gG6@9rd%2;r+98*$E5n9n-%xRK_@kt8DZ!Vf#CfjH>YG77WVuf zazS?T;gi$aUh0qRdBs)A{;%s?gwu*N@+)p3hLguj4e7Hw(uT?npI*-1`?VZC`zH*J zTM6I~$Tx-C)vf{WiMV=gOhWqpTG>4< z!!HeZ+_>p|Iw`of;@<}kFCP0e>*=igPO(^6E3wuiPU9Q6MvjM39Grl<(w(W?^dykCcg z`dm03`}eKcawc15;~G#1*IS+R&WRoS>6=Ezqq9E!R44CV`S~>)LpC@o4qq=}PA+8d zhB9!VuptVOh|a@YRHB1D@|tiy$AeoH`K1!8c3V%aM47C6%9Q7s_v^D5G0fc14-pSB z`jsmqort?8c+R=`yKlM}EYCHts`npU7jW3oQzZ0;>!D_hF>CcKZ4bWn{2KJ?npKU& z6h8I$vZGb&z_#0{enxP(>Mg&!N~*Xs z7IY30aVuk4*^uY*=z~D`xuvml(@p5!vnnivsh_%aR@EMUEujtm_^)roAabsGy?OPb z$(G%KP~l9z&>$5v6->YAs!l&+q>NQ<+TpxFtRcq@C{aFTv%K7!UY6YctP`?MhiJK? z(|=fv)y=-e6-MyjL^SHD(#D{9+Y8^ErGhr~Azr^8um8m&k+SIfA$q2YOKu&usWPQI z{y6YU=ocwVH!mYmk%994#p>FgKJy_*>U%894~@+(&Uh3d?Y?46cHG05 z6Z(}RB+CvUhra3QKU6pRoZP+ z9c{Y&L5=@@H^bHo$-;LAL1SR4jh@}S&*vlOZf+Fs(1SPaa9qyDofOdk22I2u<^hayN<*Ja zs^h6m=Dw7b{r3f!_0R<_CI+1OFNmb(=Nf5L(?REptkJxDs1#tO<)a41{tR8H$5>L> zjSNWTEfuB&7+Z@@4Is!D_@?$;GeB-c{>MGw`vg|p0WNHa*$ zey5AM{@tW$o|h`kENh7)qo_~ zU__%G2iA;{VJ7~?U)7$NB2$1g_ue+RF@!k_x?;e21QSD*i`d;e~mH^i1>@m(rr zi6N9+!Dfg^&-~oFs_mfNLK(=FO=AX4fOpbbaQ-}YnP`$awh1)5(o#to^*6aOH*YMc zzGV*Ze0P75pv$#go{gI-dRh|wwnoS1ykKQ0%skmO`$5v;&VH-kr%Fa$p&0EjjvfS{ ziByvWxR$G-uSd`kHVb?tnmFhONInOMY!=dgKW8s+V~aRoFSm)uvW@{4p%0jaq2bcQ z;=7i!djxh$35_uBr#7^u>F6@48|&u=L2wZczR(wZ$g9qj2v=IkwXETRw@b^Ef4g}< z8>mZ^Ov>fwKIo`Zs63`%J=SV0SU@&Qkn#O)XuZLN>>OZ7< zp)Pbet!@B!ic#PRnS@J?BeSyiSu<|F=@M&&^}(A&4a4If?O=^1A>K1 zy2O5bhETv^Jkb2^r2}7veovx{v8Dhefmixj*O1_I!(@?-HzKlR|J5I1z;=H71OqMY z(8Kjh$iu!_Y{$;T5i)?C+^E*>_fYx|&z8+=$YAismu=otX+9!FF|7wjmx9}&?+b}}K8ZXdUK zQ?F1-dly2JVZs`ftoMBnV(l#AK}P!syR*Q%o6*82$^g|;ZGpmszyR8ql$VW8VZP#w zRR6cZK6Rg*aN9dLw0bPRMj>9mdbdR>j1XsLV-tp!QnsNrU`gDf9;=S7Z}oP~ zU`SD}Jbue0zB~EQWP0%CJCgqP)AZCcQP60&?OO&YQO1}MJk6)@u-;ROO6lV^>jHl6 zC6a+EM$!Qvc+okh*L^^kAJHQAnA5EtP#x+%Y|2SKV5sT{B-i~RgY5f4y42Y|n*HD5 zixQOnxj<(GUuwC*(?_hv!KntFk1Lo}ZWPeGg{gut6k*j}w;v!iIYt2ch8>#^^YVT- zQYzW5Z>868@`Kp~_Ekc1pbilDZQnypj!u1&pX>*&(z<`rL#h8&;lJIm)mkph)QwTC zfbLK-5CP@~E}O^5Bkre`cIROoSKC=3KWfV5E@cz}tZC)HhVs|aNyTuqF~BcB+Ed5q z*IemUN&Nk}@v#!MH-OAao|fV&1zG5^MGx6|-ArCWdNlbvsnu~yk^$n%5JArHX9F^z z-&6a0Jqy0>>4X&C((sH$&g0BK8x*$E#{KVUnIE^Rc4MxlC@EQJ_4^r;EfV4&n4AxX zj92O46ap$unO_TGYCUc*o4lYn*wae0+AWCYJNK^^3WHXC>Z$=+uCQi<9iu%7*T-vK zY_7ON+8m*Stxq$$0Ogc5nz#%eH^11JOghB<_^8`uop4sX`ZYEg8x%$@Ck9>Jg6gkQ z=?62h5ha7|rbt0fsi797a>dX>)?%X&@00zF+3Uw#cnpO|#H({0jS`G{2W5ZY?Bs%J z0+y<7IyLK?$YdoD)HT+x);>ByCP7zj&MWRRuRnxUkTrnQ2 zaV~#ohBs79UtN>aWce=6!F1@w+{agE?lkny0bb6oZp1+3d#0NlN8+96DQ-aq5ocxe zM%@GOSvE{}2J^|znYTE?2#jDx2n@^+Q*oGHXu$aL@2bX(#@dj@varhZKfL7RM4%Fk zOd719LgD|e*-`iZasS%?hu_2^FDbS++w2N5d9E~6F}^kGDPdw7nO?^qR}O}`pKjV! zpOjZ+U}WcD4q_P3glDQ*1kwRLH~8hs;Q|QFX?jZ5v@gMHB&h*xVdo1})CvlUW3(W_ zFL$DBwZ8Qm1|8$K7+*ff7Z;7TRT1fJC(`T~j3#9WhQio~#ZJyVCZ9m5i{_lk{iaGT@{K;0BssB8JxPD)q z$DCf6O$BBMO|}_5x<9{!pf-FuTkYyIhVe^%4gmRc-BQ`rAkb^?H*!|Fz}8ndu}Z@P ze8b;qm?*&t>@U%YCK@FwpWM&lnx1rKlLw91o?HO&M$P5H3V%~te6N|AWQ=5LGx!&_ z9}ZyfgX_~wz#yzZA?l&0&zp>EbY0u=0o%?6U?FcKQC;ohbB)3SRGG9+p zc~V$^IDj$T%vMBBlc5d zB@%KcMJd`}d9W-Uk%~8zM~`mj=Y|C!|F=4;k%ZNa|0{{6 zURfb+RdtL#xT<+gN^V z0$skulFy-{=`2qDt7@%6cn%g+FF&Z75G+H8zKFJ2(Q8wQHi4*YJcix%@X-H#WXT%N z9ja=a5meWKcwh5v*~@z5a}Eue-UcVO$eO}E)aAzbK>2habMBq5?AX275r5F0m~XXR z$lbLlNFCJPYM@hGlYnFgq(f+sk7GWN95I#GTPJ^YsTi4ST>s0?MCSmQxcI}b7OEhB z^5qEbUK@1i&}ctuh~=vph4_}6e6cieEOhsX*LhZ37^fxGs&ZH4-7PX4T5fG~d_7tF zUafhLr4xoN2qwZW*F#4>Xvaibuqe;!lzy7N_m?4?I)XR;cWKSz;|j+BPFM5-VU-D$ z>MBHbILTu~hRdgOD~;%B)HvF}JqN#geB2LTDT~n8gc(FX6d46gcFs$Hnl#{cCxgSm z!ISQ(+UXIo4!^G_V{$BTCGc)3F8CQV5I zB5wnceLG4UPLh=Z4t_44bc7kPul6W{Ze`t3GJe}lRbjfyJ<)chFcXY7j%#5U7Vhru z%_JCS|JU8(p}jkcx@~g^`Qdwbc15TJw03HoIzXAL>+e`m!;h4^r4Dx(eUZkc{}bz^;$ zR`TV~j$X%l?S9g%>aNVewIn(A%kUwc~B%0+Z@i0@4gASzx_L@Nm?i~^)(+pKe# zUz)EI0aESWkn%3n00B{xfjv5`{}uW~3;$_a``;hG4hhu!-1E%*ExzSxNIb)jUu-n| z&ebOvDG=&Ee(!ekNKCaw_*1ON-33j{n}xsb+!gFu|oGlh&~xVfx;{!?z` z0(gI2dZY37RxFsPo$^j!eCCuR(1@2ygFO6nXk=%RU?Wc|Xn3bk+lv30x}<_6nkJPp zG9n09N`Uepr_C1*7mIxPYqo1R&RrqVPEO9@52VE_1XJ z$1L9)DVMp$VJv{6@_)Dk)S&5)F}h7iyF=T(3EdqvRjI$?8KqDFF6u0BB@NvTph7M~ zD&1O6!w5}(YZwlqw=FJco@34rKduY}BFAD`@bXV~5dg8}>_oBAavZJzXsM%pva=~P zYR5;j1y{^j+58)nzn)q|1Q!Kb8JSz0Xp#dlBjqvU-v?A1nkjgHV)}Xf zOSzPi7Kg^3GLD~KFNO5&G$kZ)p>>Uhgut|IUdfeNfcw_Y@-AB!C6_jvwLf*>(Nb1r zJb#;mutN>i-cZ+LW`=0Pm9)HqME-bmjT)bG$uVCecvHeX0%tMH3VoxIlC z8+l|?X+&Gpy88_aQQ}e~Hb(S^deL-NiDEBSQ*UHM&Ec)WORocBGMr}B)5hmvT~|B= z8|yn=hdQLOiY&v37ryA$Qd)*BLAN6a8c$ z`W{4Q0WR$9!Huot(TlBZnllR1bj-7-`z|l1=cF+#jOxwIke--YzE03ak*MEM+AvT} z7;5*5L;qrnSE81{VpIdrb+Hu4g+@r9TA`_R)kck~9p_(|j^vRLWZ@Dy|$BB@sbj^Ok+@J+F%yk)Pri>8~m^aQl)&{(hXG^rg zRPG`ni;LeXUkQ$}fE(n?nU0Hr-WyY=h7`L1-*d<~D=e;!J|$7LxNj^Xe$kSjzj9G~^16J!>4_{a;MjNt1g4H7lxtzgk96di z3aTI#AQuLC+uSstb6@*0E84#8nN$XaOsT12>b!6e0s%j`tTYQ9f7x59cZehjm(?aj z!>*%mtI)rdn1tl-amaBcYm?|T(U&g)?Kwj17^ED@uUH$ZLWZxdq5`&LxI{9PaLXBnn(J z5Z^wvsp$9Zspcku2;5}t=cee%(^&N4Ghgka8btts{_+_W{O-SiObyizw??puAApg*Iw|$$1cOc<-jRs zrqtrJZGI1AeUJN?owLNW)KfB%O7*LEqD1CZ#lh2@S9=zn93&g3_?Q|x9y%vLAd|c& zNsK5TdrAuYrLMds_{7NSm)wf&Z-0m~J3gj-;m8<|<{f`3c4QMx*$3Y`Ifc4JVih8i zIPu|@xEs*;6&ZLHG>&I(esK?-p#+kO4INVegZ;Xje!ol~Q|zmH6M-O&QVD+^_Bctr z%{6NHT{LC8RXS{3)@m6Z`*`>}c9c)RxXHPh6hQEQ{bAzQA70eN#H8y%`j3a6i)n6+ zo|5wA>xBh_Lxhg=@q{Ki&Iv!C&{B&%4-2H$7DBs==Z|rpcccy ziym~sr%JefGW|wT;g#0P2LkM2Dn@X##Yd%a=6;yR#BxUGNfv^`5D$ZclKxg8<>Jxr zseeMm@mF?(M)+W6E$E--uhF~)xOr@6R@Ze;!azy4G|abY0efwx!H66@enZ?Cs^hAU zAOZ?|br)23-Yq+eRd!dEB%k!RyaRgi%#NPVS^xi6*DWU6U14RVZirnUaTj8keVVDD zUxTq3kUMY9vT<&B+8gC}a2@3qO4j`EZWj7{eu?kB0$jG@?cf0uC8k`lXc`Srorq{p z!*ZBgT}7FaC^!1aSeLO1tr9&2{R<#gM1=H3(h71u~#JCu9qza~BvSBzIbO^2_a z4pX5kd$Z8TB=}@kJ24P<{B!$ss{;G$-w7loh-&i&N56}XhUHkz2bE*0h#tR%%bXJU zIB;^jVTmYdHbL&*7{Q4n8tMeZU^D7ukI}7OUk)8)N~+_rJ{PUmI`Ht*ta0=iZGD8f zg-nu;NN&@kr#}aWTl!BF{(EXl|N8z8`Wek|8p6p!ZsGk#zI3C{ZtoYtrm1R}$d&&! zmL%)W34h!SgCN)3LPDbU9l!kG#j8kif&Gr4tOHKrMCr-sHal`8qGb2Z^C++}Zyckd z{IkJ5zvRI#VDm48#gVUc*P)uVp}B${xO-Ov?CDH=XO1%rY#iA6ctuxui%%xNkCfxS zukb~e{~FL7Mn+w7hS(nNNSm0@39$%yXn|CesqmG(Geq9MEbzuU7N4_c!HGp!-V7)r z>5ffwp#3 zZFQcn6MKL3;y+knn+Dw&Z4wd72P1zC3KX;>@b&FI|M?jhqCI^`EtpI26?fo4uB}&% z=BQugvu;Z*w{6RCGiq(}XU=Uzk44qfA`dw!0T_JRF?K)}N`e5Z7`x%zoF~GSS4I}` z{E@xKh*(~n542{58*sQBqX`*eq(1NMej@ z6tGquIRkZl>zuyOb1eEm#W`&A1AMpH+gbB0=k-gO#2LB)G&jsqk zt{HC3yjK{YF(gipWZf)3!d~9V8LR*c1LpJ;_o?biAMY2PDRxhPoF+86bOv~OroIP} z1MaqtzL@$h(c~SQ`W`cKhJnv0G*Vc8pW`8)ck|Tz)LuSGBdm$!?yS@M#+|Ay;>-TF zdb{6{@Twb%I18l@of_Y-%s7*_dpb0vq$IyaNRlXjh7Fqd7!A_;TmPXqD$|zX*AQAx zTar%AKo<+TjCczr#+7EFmiraiytAd0G9R~U8-hPbAjQW;#Ob>9Dw9i0A2((Ym_?&b zMw*mC#x2{%pUjeV7<)X&ogg;g_#Ip2Ej=(k+3SH@=!MWr<#y87Y*|Z`6-KL;#4-kU zazSpvcfS-Xh)A{wfz+YjpvnDAMCpA7yRG z4^=JA)|f1;ZdEf!X1G<~U9NyP@=cK2td0MhHB0|SXZ22fe8Mvnblj2E8L*O2<7|qx-H$M5&3}2ME#p^_^$S5E} z_UqY2qIosomz*b68fT=PH-G$&n@cwDYXlzCFyaASxsv+*WYQrBzRH?m8$Ly+;oP`^ z^-s%fjvE31hxs~(mqEDyO`FcCdGxEjF~Va%aGKpO>L*VJmE|1LHmh@W89BmIes~re z(e^wxBTmlZ1#SfFhjZ^`XQyX7;Wagy&q}i~INpkTh|P-Mr(xxljmG>@k2INm*Bb0v z*j{-uO61Eo__OM2tnqTgzWm z*tw&$`QFsU=W-z)S8m{;c-Wd`F6)^&*rlcFrX89R;thFpHz(@Mn{i5NI_6W}V8$37 zEfD;m<8|KA$oPDY3bRu2Vf$(Tq8+A#p6!R8%iNSdh%z9t<$c;Nhfxt};+O0Dj9)sA zx`TrD-zQtZQg-v11E10_n+kY1PX- zhmBtUPu_OxbeRZES% z^AB2N9>5!8bQ!)4MaB`46L0ro^L2AnU5fJ%vt8~=d5#Wa=0;i$VuGAi48r4^c|Zs! zT|zj!`jp0FB(^d^Tnq})oak6OE+rU_Fh5r_3GB8{`JrAr!JRg&A|Q_P^xG{u4nFup z*D+nGUpZE}ps37;o`{#66#dUHyfn-7HtX0Vpl8B)_A_dCZx>IVu(Tm_LQsx;q4LnD zM?gSo9RazxYQ6r~zLl%+WB*v#Zj@Xu#DHy_`h+%2p`jW>L6MAHba8}yfD|qD=dad< z2HJQJp_AN$^2-M^KC&>|5fNQ<7(*{5HNOdv*G|>db+WGrOsihjM^>y!j*!^-K6Xrn zxJ8io6OfArHvo&-OW2M{s3%7hZ&`PXp}$xowV=h!JqRdxgF7zsThu12u3a*=u~Dlg z^b`g98?U!K7UY;lMXxrfVj1CSlo1Uhla0Vbuq*bRciDM|6O(-*K?{ow1cl>(+N%FEz?o+RJSS4T zD-pE*188#nCuYX`H2+x^kETOum}2V4py7OoQxkEIVDjMRiUf&M(;+4s&Rezdd9F%1 z9{yeRNI5Q@H!SM8a@5Z{G};%ks03Jz-ULCF_i4rj_3u+Y?X>UE=ckJd>3Gbn^}p7g z+}^PTd+2^8Ep`2U@6r8$vF6538uM~tcpxB>MXw}<4&rnM-?;A zf9#ozkfQ@9_5++u{q$GmSbo^l=|)yFy^&K=8akkjv9x>6kzSts2;OMn}HTH7B*OYck3(bPFA9{`XvZ?!v|`JEc2z9ntb)wIq2kV z@-*ufD!URqQ4K=%{lmOmRQ5M^MbJ1YgS#zSnG=)9L-$!;-F;wVddAAFB=Q0BK=V

    !A0IJRW=41K23vZ0wvt5xCJwBM__?iIs7$@btB9`= zb*@%}J@cN9Ghd@@Tymf2+l*_B}5M0bsF!S5qwpy?1$liyP zdj~^&&1C=fL1pm0mhx29F&;Tie+$FuY|W!2Htb-4Ke8gI@RF<%6pce@ZUM}E;_9{0 z8Z7_AL+h!ia;GE)dhUELg~}<52>!8us>c6-h;@TsecV)_P0g6lD|*IYy>)UOdNFt& zn<*fUW;QH;HAcPq4qC%v91El@pU z<>H+wQy!~MRd{~Q*^0+P>odm2G_;=PsSxn?j3jqkQYb7{jL8QN+siA@e#Ig)rpq9U zHo7n~6Y&|ylUEH8$wWHNd>-6%*hhNtO5Hv+})^O!UK(ZLqne%>o9vO-a$J#$3Cz<+YVs-_#2bHFJk}y zm3Ed7QMKRKAG%>E=|;Mwks7*10Rib8N~Al67L@J|0a57=r4^)0x;uuHW*GRL`+MKd zU+~O}c|GTx>s+(1wbx!B|B&kU#28wwZRx4<}i|q-DL2X!%ktW6v9n3kto8 zfa649@S=8KVGVs&{+hId-nlyy`uwT}#=8CpIm3)0nHWM20_kIiTGm!XMJ!D?xqZ2AAa|Qwi&GM=*myA*dj1|cD zL)b=mo&nvg?%HcV?TQlVvZJC_}99H0Y7;egXZW zZoA^GcB6g(q&~l(u}+Bzy9zGHi6OxK$6$&ERWZAfjU>ApH6&4|M}QS1Z%`ZJyr>*J z7}a8b3^@svRPH;r>T@tPH7$$P*5t{TcAAk9S;Pc!lmeQ!K6U(N1dha>pz0hYhg&_< z&w+s1T|!~JXv96~!Lcf8_wP(kFwRHTxTmqnl3*f@8tgyT;XmnrxD>ZHpREglW-9O% z)JO0uKan2x@`XpJIDL8;RI+yHv?mU_Shz+C)eGb24cIWWoemW&!{cR5Q-*9j@S&)_ zR;$Hk?o<8mJ5JS^9SyeWRsNA+lB}8qgd3J9>8rH$?}j@It_N$i5^@cwmfgd4XWZ3m zajTvP5O7LqqbR?dN@CA%eXy;*-L(c{1S>t#Ie}>Nbl~(c9=TORn&QP-gmcEm)1+XC1$Ha0xYeCYDg`-y z!_3~%(Lb@1;!aH^O!Y?P<6E6`EHC#yT~>n**ex)j4+v@)1a#VoUYdGb&G8J(t=w*;N-sU#D{Xmg-r)n)5%kI1b1OHpZEn^Dp<$7R7o;(5K zf`k8VE;4jp=hixF)9$wsHbAwp6+W%cKDop&5vY^C!?5en$qnoq(jUu`+yyf)pUjCK zW*0{?5*Kjnkzy*$&JvP1#mO@f^}7`|R&ka#sd2tLIXHM8U}JM=B(SOx;ggxA*|{lB zTQfJyPGrv;+V-R$J>eh)R65g^KDJ#KX@w%GtSqzcw^CGZH!9`Vzc;s8ak&k8lU!4f zHq>5bQnmM%kGl(4xpAZfp(RXBZ=?Z+LQ256=jxvpmM{p5IXBmUZC9LNa@4H_O;7X4 ziLjt~VH!`v7c??PM?xb^X6zkY$2%D{v0E|upG+IqYRlTBB!uE6bsmc6SPFK6pGTpU zH2v&s51H7;J(< z_O^#tTM8W;XXZow?K`gF=W9Q$GZ=0Y0#1+_gQo)dBtS^*>kmM0=#cH7T=*)$bcCE9 z@wxW1@t-xn=vJUQ)-J6Y;nPa*V$6ufhoR37vS@RT`dmu6pC*;bTx5&=kd|~gThU0> zeWR0~8v*w>5>DU45NX>>uQe*agUW^dUR4|SAeS0zFUS%@6*p7QG9XCdf3>_d26CLH z#&_tN@+uEAzP@(qO$6e8pwN5?>nK+sxTNf5xjwsp!1ohcy1d`mavEAwx!o4x@kT@f zZ}g#|&XTlE=zp@l9z8sgwK$DP+R@T(CYFC2X%n$KkUhqosxP3L6=703rkrhhub zs%Iq|PUeV>NiUzrediQw;}w@Kc)c@?1qU0+r*0V?P=1+(&G%Ubuls$X_N&Sh`jY~Q zbHi%=ECar@qSSBP!I#T0YIzVilOZIk8q`+%N;+IgCPS%D_}LpSIX~ROJ2R9)-A(Gi z4#px8xDU{Lo@zQW+dkk{T~msbUoUiTU21qDP>%%>5Zd;5bC4s6Wu4RfNsrHolhxMa z$$S$MB=qsEXmhpmA~gYv8+f=PnlV~YJS-43;oIiXHS?EM<>AR9n~Bnol{uLf$(GEY}&7r~lKoVg6N5dl`3!9Ujix z+=V4`dX+UD=OjD&?T(+Sh^ODHNF+c}UesLP8+zS}7!Q+P4M7U0mMh?|wo!TpYh@;Ni$ue1A3xgMYud+c$^S^+(0GxJiHdFY9 z?NC#)Y{Jghf9swNH6_pawZ&D}nU%@>n=cmEwBbusjoAd4CM1&;DIzFFNtT(vw>~7$ zx?gZQnf?7X>%(i*=82Q~-N3;LH6G4|s zQnsw?O`5BQ!LQm2th~`BI_ktp!!|&sX1AAVLz7O`uG1h`Ed`z<4;epZNXO6i;K4p+ zM~2?V!B9ybQ9V!(JPgy0kB^@$HaYkEbUye2!^qBzmh$jBL4AX(M@{mbPA_-&x;h|S zVfo=m`oBV3>UAMGcf6o})sJP25D#?#Iznd2j zaPtOtB5lY>C4J~M0q!wc(w~(mzitZLD zursH9X#PcXA9Puyh>8zYz@^kbnZAA}ap_fVKosCht@$`&7xqXuNoz-DG55ylw5uumry0P+ z7ls-#7JSf-#}Kd=%1@ywQzj^ZdgS*ZMmR}0Nc6W2t3##bcH7L6&m4|V{^fxfU8Czn z4~BQ;VAXE2ezqD|w-9jnSQE{e_^L~$ky1yQ7^-s-pa#o1XrmW22<&klt{oR?bmwbZt#9ixjrEwp*rlv z@D$GG{yV_D!I{6x7*gwADhZrhqu`Q-NU|>N)ysIXAI2GCe4$K_A}l6Tmr^xQEk&JY zhS+Gui=yLRvYlkG_I)FnyPraP#G`rWr9!|M)pzu|BJo8o%k<@&4E zwZm%|oISx=R)r7nLS!eer+oZ_`j7f+NAjiCvqpmZZmAi6bT;ki5hy79b$z9qoE4mo za2zOQIJw3`XNIAo=4LGyg#2uq9x>=c+MojKV#}R#kBdw<4OE(5j6(7jk zqgKM3X0M^TaZg@hjkp#9@AId>G!d1V5kI3z&71_y$C<$m^sXH3{K=YHR548<(uwL_sJ=mZK8`7SLFyc%p^jeAcc09yvLK+SDWsCRSP`fl~@zr z8`RluwE>o`mgK9iuXUSq0BPschcov*%U0h$%q64uu3Qx0ydbi4p)?Zhrx2 zUJ1(LmZ%ZnM4g$8(WksDxrC^=0G5QHRbE&=T$idemE`h>0$Y076d;nTbJ}QbYLk{u zqSZr(eGB!t+B;0X@{HJ2RK+@c(y8ncz!#4%jyW(^Fiywlcgx{cMh=A0At^#X78Z0$ z5bH+Roi(Q;n3{g@Tl|2qSu^L1Rj<}LEZTKknKJ}j@9lW?1Kf;obRlkg-YZF~R!YOb zo81-Uu@CI-p2mf&w=D0f;SL%8uMi?NC8scyp$yc-|;4v|@L~a-yCmkkGvj=W} ze8qoX-Q0<+d~^fACQ`dpYu7~oGb5>=2?jTwwN3eENTv>;AL zNr}q6_vNLjJsxz1>5)f^Dzm&YYpya6TS6|jMvSV-M zTo=13T0m7DAnKv=wbAeC15b}#g10?V+S-sMfc}qZbb$P&|B3g zl=-FQls1q#>Gn2J0F*?ve6q$Ob^@C_v+k$$K^@8Ov=Ei@fn?VOxChdrhr#`LR0Tu~ zNPZfTd?(-~k0lA#ql5rk6&crpW}yZc(>qP;;PVB(AQc`Et(g8Oi4Nw}F?nKRzywDD$)12QpN3PWu@k#1@Df zofH6CUM3+J#A@chKQvO%;w3oTLsDu`3eM4}Wy694&A+P%{U|*uuANzJj{akJoAsGf zNFUn2Wz*_Eq}6HeisY~E`gs+{XlYM^Y80@LIGOp~)g{({$8XiJ^#Fe9LpS$ngDUF3 zb0fL1aD&N;@1|pg8Ntbt$C&ZkZ_X#~Tr3RfW}N1{)7K~ggPkZk-v+R&l4**inW4nS)?W33>n7Yq|fQ(TK)fk;t zR89<@p)fFNKHSQxPET8p-FkBPQ2Tdv&UN@g;H2EoB&dkFX3+m|@O!CF)sB zaIoB`hp^0fVXdT*ovz^);KnT=c6DMaM*@}lryf}c?O_7J{H z@7nXa^LD^*aa8Jj^Dawpoge4Fg(MyJFr7dchrCD=FMBSb)ZO(;>;h8)`P~kBVO0~c z1+|Az^@%Ip*fq|Vx~OOG`43uy;K7MoGz0|Mk2$Dvzkf0q4lxKIoJzg;GDv}GtN0_C zv$+M8rpJfu0y?*TUKmJ^Kz){-kZWuziqX=rHK}7>qvP@RWAOd@{*MVe-2a)s$i{FK zcd<=;rt%QZh5`NTDos+)T93{Uqk@+F^KEC(IJV_DG0~_Q0d8dd3`iCClTqb|z#_cu zZ}mYFD_Ae+-Fi4R2&ML3=8M>wHNq_VNCi`t85VlCZYc44D{>key-_kNTiu9Z!S)5A zH3A@5Bt#cZlxqnlXQrOL9K)V&CdJRb4Zl{UM7I9=EYs5$XHyn1u0V|a@o5~#WlRUc zK|sezoh?4vZm)R|rWJiC6yO_R!)01QU*-yIMc|IjxY7TiTH z+j{qU6W{?f_${NoPpE)d$c|MWZZ1qqIT7VgWLbc7k31I_ zW3+Uc61yw)=GQwp-~FMn(27F}|GPVSALju5rnwaEIOq2|g9QS8tg57{ciDk-IDBEh ze}s+?h9%mD82_Ydz`s$=HQd9)aLbU>^NsFQYA}@UCRxRGvQ}3mp?}WI^D1IsSzEp+ zbsh0!UkryHdt}4K@wNj*%xR9jzK!=Q>D%Ut=lmd^M<;Ur=_tS_GuHy8R=F7cG^!Pj z7~Trt4q$Mfy!m9y-oBA*(0PAF6u5>qgF#_pp?#S;#`?c`PR{%kAWnb;1a80ubxB{l z?(E7wo`z6Yn>7Xj<-3vBp+Gl%gZsLFzHxyRM|LiAv??c2g$U55>FZ+`h1Ox5)L5I< z)aX$oF0%LomhrS@&eLG!n(u<_*sQ$*s)lqDg|$dGH#Zjy)V?<2(M4(@F0~8ha6(>? zfaGb&o_(@aWGBJIh?`^Wr92U9fZ;}nvT%-)O-(pU)@V#dDL`^h;FjGG+|xiE3=}ID z$15^Y)cgA-*9#3!CBA~G6w=azYS>u{{N3Z!Wtkp()3q@b+H|&Vvt7-M4z7cdU(2Uc z$XJD+9o^mEgtx&%ABp&h2;}gIWP{${9diA*0{nm;G!+(|Cm4&}=9$O4>A34br_M{4 zeyU{I;=>p}KMkHH?x*%+q2Er7ilZac;_9)5oklaGKthAtxc>faYra2O7Mt&nV-4=l z|Guq)bF1W?hM}d?`_8!m!XjTyz?0N4xHtggT)S)Y1+@k5J^QlFi|uqSHzemlC@1`5 zc`39IG)^WEND4E#f!te*$*m8CV1z87H_0b&aG2OhZ!koT@Y^;C4FDK&%L2Gs z!qdBil~SN2 z3mxj-ie4#fgqTv$Jtb3MR2(ltd(RALO#S3yFIfIzXZfL><7ICP`!=?^FnBBAMkhAI z$R{_7CqYX5Xk+v|KRZhx8#BX5#);+%G)rAsU{ry(?Sm48Qe^gWX2oOn2>#%Ge#w8k zSP)F4Pe=t-#$$?ZoT(tMFnLiovE6-ubap=JH4E53b*(g;5%Td{_58P&?rRp-DzkZX ze?C_BC1(xI91*v@FyrNke|_+sm=}Hs+Tp_2HP|^EB({~Y68FWeus*V40qj_!K&{5Fiw8d<)&Hhz%u9vS0< z2izBZC;FDE@hdj%DKko?2x;x_OiYd`jJh_1T9I==OWjSL#vhkRs^`id`L|Lpf#h|L zG8pl_f8T4@(0Q~(bR6(=-aH_1YsVv_W&7Z3a{H|F@@e!d4)46f8FfI#%oZ^eN}YL! zy!T~-%UJhMcIKPmnkpj?4-?>j1dP4(=;Gzu2!lub1Q^ijR!a(*FKV zB#GZdWy~ld_%LdSCSO7qnEV+8R-JlB`bp8U@J#;mnA;IMN?+h*UPOe2X3s5pH`N1^ zT;a$P3baL0K!}P|UUdsMa`Dk^m(B_1HNA}`^ROm+W!ap4nTim&|pV_ z+iH>l{{tl3AJF@dfaFkq5};C4qzMqjs5jy=$5{C=)J4+sr*Pk2ZcUl_PbLQut=-~1 z(djT;DwKA4*JMaG9fQ+Sg;pv;n#9JOwMCdvuWQj`-lHB-6In>CuT9&r8uJF$?H!T6 z6{!=&hTg!-eYlzMGjedFZ)xx@TOFX+RZfU`fV_WIwN@eK6t0(jRvQf-eRlxPo#cGw z3t^t8B{A3)9N)SY8W!Q@yxAXz-bIqR>uy(*V5=P1>@5%|qh{!&HB(SU$ zGGfs&WWLNd@8F?RylSAY27K;9PL*B;wH&3af8Lh$FnV5&+!n~1J(i~gKf+({0OMJ7 z#|vqnj>O+mLQVT7)bZ3N1w6o?8wX1_nmYo1iNHW1{|M14D%UgR`IcBWhid{8#U1MMbdv;&a#;-CFI;;j6SK&eJL4cis ziLugzSba-WqkLDMY!|uq=_8+!n7BAc2Cs47n366`^8YWOJd_r8z z;-mji_0Z;HXL~?gQaR5i=mEAel$BL4R4>+4(_UdxVo`)Gipfp=!Ag}h>`Xx|7Kd8C z2`8H}PVu(ESc^wEF*CF9i8V8|^_So)T{Nv8)Mpc7`M4O`Z~kgwVZI+VT?jn7 zG^jRf_pdN2$A#ELC)&~p2>rNLmCQ4vDgY;4+!6h#{rZ^RjL;>;1|nDUs_rlT$`ccV z$$Jh%j}^XSz1!&7kiW|)%g-eA6ZO8|Dzi8n;))QRBb^0f3YkCbpb(3FI)j3WejEpRVrch@hEj3i?Pd1G z7Wnz(TM=2SyyDpehMec(?J!oY6b%NL{a85TJQpoy$_}%*&9W1kMI}ZkDwPH*)UtM1 zDJ0s15A_Yq%GIU;W%God+Vrs}Px3hbpwcohFlDtpz&y0RqT*!v-%Gb+mQP7ZLD$UM z-+x`FvvVsg>2u#;U-0AZx5n7KV{3!kyDM>VGHhmiK|^|*pUj#)q4L;z5g;dN^)yFO zVZnp<%KAwj4@q%3GRQ~|W&PHcYJXSHkv3Ad#*^%ZJoMe%r`9C9Z*|d?#qsfk4BJK$ z#L;U67$J`kSquC+RuoXfB2KJGO`kWzXjJC!QR1X6B{TjH%z}!kUeEEE8{pd%1&?M) zWtXif^&_y8fSs|?HX5il?Pg>v>5`cdYuMbw1GQ15s3Lmb^Zh)A=xB(cBKjy5JP7@X zd?Spq<9TkJsb|*6+{(j<3(UvoZ@hOsZ0YNYMxb5(o4*4`*mE;l~><)$Os6Y#*|mjzluS8 z(c>yM`C7PQu3{1+XVYR-iNx${s(*n{CqC;5oSxK4p^3w6%+Y9Q5uf$n8R%zAE=h~4 zqWhlKWiUE6>Td1E_e1!6Nz$4dcpmV5f5wev(v*Gx!v1ef%iBMT%?QC|o>#VnEOnK?+u6^~||e1=kej zklLekN#HrLD5g=W^~Hs*pC5R99C7fRJedn^H2!$=!&LV1tcv9XJ|eF0?S$4$Tjc&1Kg_F~rSoL1J|Rey>zDDadB82LYVfbgjleD5SXan`8pb3YG(z|N zZmuYEhLU1LTL89xNdP+I@N#|N@y^gR+>25{b&60C-66Y&@_Qh@#rTm&1S5LUwpnod zk~}7!nhOY0EmGU1lH|3*5-mr}YCC6jv*e|Haa~aVQuPM@i{bHp3S&2?(|gFkyP)mr z>`W`z^P;Z?LqHd#{o=*o-)ztFN9X_TzjlRU=a}9XGG(@PC#(Du_1egill@NQnLGC{ z=Yh$v7LL1b3MhnB5qKeZkQZ4_^(ICA!@ui(FisJW*!%sdLLsKI#t1<_e)m<^2eX<< zu$>-tn6{1F7oT}kJxLb15n~aH77pn{vsvdBX_z`JSh+=Fq?ujj9%YYMFVx$OEg8?s zpk(elFWUD;5eQ1ODqLtjwom-CV~(O~%Sfz${@j(BEy(S~jvli3?mJSQd*q91_R5Vt zyF9ffSm3I+D=#Z!J>$&gGiIasD zl1dRKUo~I-VJ~&0d&T)KFW3BDfoWn_eC$}bRP|f9)9;FogRXX;rAedx_v~zJJfM|2 z+mEfsZE$^)0)HQ2&`b5N^ZA$%;gP7*b zyZM(TOar~-HpORBLz$qdWzRjjr(ksD+>gJF=igLL$K&Hy3tDl#KhC{bS2(%o>F*c2 woyhujIQP9dqoK^@TAi~rRp(1hi$ezCFZ&b++5eWFGDZNmvlD7!^Kb8%~g8%>k diff --git a/assets/ui/tool_pinch.png b/assets/ui/tool_pinch.png deleted file mode 100644 index 0ad3cf1a5e0a941e3e2c2957438fac1784f27daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1381 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 JPDHLkV1gJlZn6LX diff --git a/css/styles.css b/css/styles.css index 8653502..74c557e 100644 --- a/css/styles.css +++ b/css/styles.css @@ -156,6 +156,8 @@ h1 { .field-dialog.hidden { display: none; } .field-dialog-panel { width: min(440px, 100%); + max-height: calc(100vh - 36px); + overflow: auto; border-radius: 16px; padding: 16px; background: rgba(255, 252, 245, 0.96); @@ -220,6 +222,9 @@ h1 { .ecology-dialog-panel { width: min(760px, 100%); + max-height: calc(100vh - 36px); + overflow-y: auto; + overscroll-behavior: contain; } .ecology-grid { display: grid; @@ -228,17 +233,17 @@ h1 { } .ecology-card { display: grid; - grid-template-columns: 84px minmax(0, 1fr); + grid-template-columns: 72px minmax(0, 1fr); gap: 10px; align-items: center; - padding: 12px; + padding: 10px; border-radius: 14px; background: linear-gradient(180deg, rgba(255,255,255,0.88), rgba(243,237,225,0.76)); border: 1px solid rgba(84,68,48,0.12); } .ecology-card img { - width: 84px; - height: 84px; + width: 72px; + height: 72px; object-fit: contain; filter: drop-shadow(0 8px 18px rgba(56, 44, 32, 0.10)); } @@ -251,7 +256,7 @@ h1 { margin: 0; color: var(--muted); font-size: 12px; - line-height: 1.55; + line-height: 1.40; } .toast { @@ -338,11 +343,10 @@ h1 { opacity: 0.10; pointer-events: none; } -.tool span { min-width: 16px; text-align: center; color: rgba(72,58,43,0.64); font-size: 10px; } +.tool > span:not(.tool-size-badge) { display: none; } .tool[data-tool="observe"] { --tool-icon: url("../assets/ui/tool_observe.png"); } .tool[data-tool="zunchi"] { --tool-icon: url("../assets/ui/tool_zunchi.png"); } .tool[data-tool="sweet"] { --tool-icon: url("../assets/ui/tool_sweet.png"); } -.tool[data-tool="water"] { --tool-icon: url("../assets/ui/tool_water.png"); } .tool[data-tool="grass"] { --tool-icon: url("../assets/ui/tool_grass.png"); } .tool[data-tool="stone"] { --tool-icon: url("../assets/ui/tool_stone.png"); } .tool[data-tool="firecracker"] { --tool-icon: url("../assets/ui/tool_firecracker.png"); } @@ -373,14 +377,14 @@ h1 { } .tool[data-tool="poke"] { --tool-icon: none; } .tool[data-tool="poke"]::before { - content: "\1f448 "; + content: "\1F448"; background: none; font-size: 25px; line-height: 1; filter: drop-shadow(0 2px 3px rgba(52,40,26,0.12)); } .tool[data-tool="poke"]::after { - content: "\1f448 "; + content: "\1F448"; background: none; font-size: 48px; line-height: 1; @@ -396,14 +400,14 @@ h1 { .tool[data-tool="pinch"] { --tool-icon: none; } .tool[data-tool="pinch"]::before { - content: "\1f90f "; + content: "\1F90F"; background: none; font-size: 25px; line-height: 1; filter: drop-shadow(0 2px 3px rgba(52,40,26,0.12)); } .tool[data-tool="pinch"]::after { - content: "\1f90f "; + content: "\1F90F"; background: none; font-size: 48px; line-height: 1; @@ -418,14 +422,14 @@ h1 { } .tool[data-tool="love_mochi"] { --tool-icon: none; } .tool[data-tool="love_mochi"]::before { - content: "\1f495 "; + content: "\1F495"; background: none; font-size: 24px; line-height: 1; filter: drop-shadow(0 2px 3px rgba(52,40,26,0.12)); } .tool[data-tool="love_mochi"]::after { - content: "\1f495 "; + content: "\1F495"; background: none; font-size: 46px; line-height: 1; @@ -440,14 +444,14 @@ h1 { } .tool[data-tool="fight_mochi"] { --tool-icon: none; } .tool[data-tool="fight_mochi"]::before { - content: "\1f4a2 "; + content: "\1F4A2"; background: none; font-size: 24px; line-height: 1; filter: drop-shadow(0 2px 3px rgba(52,40,26,0.12)); } .tool[data-tool="fight_mochi"]::after { - content: "\1f4a2 "; + content: "\1F4A2"; background: none; font-size: 46px; line-height: 1; @@ -472,7 +476,7 @@ h1 { .hint { color: var(--muted); font-size: 12px; - line-height: 1.55; + line-height: 1.40; margin: 10px 0 0; } @@ -582,11 +586,36 @@ meter { .selected-info { font-size: 13px; - line-height: 1.55; + line-height: 1.40; } .selected-info.empty { color: var(--muted); } + +.selected-name-editor { + margin: 0 0 8px; +} +.selected-name-input { + width: 100%; + box-sizing: border-box; + border: 1px solid rgba(103,178,44,0.34); + border-radius: 13px; + background: rgba(246,252,238,0.96); + color: var(--ink); + font-size: 18px; + font-weight: 700; + line-height: 1.25; + padding: 8px 10px; + box-shadow: inset 0 1px 0 rgba(255,255,255,0.82); +} +.selected-name-input:focus { + outline: 2px solid rgba(103,178,44,0.24); + border-color: rgba(103,178,44,0.62); + background: #fff; +} +.selected-effects { + margin: 2px 0 6px; +} .badge { display: inline-block; font-size: 11px; @@ -605,6 +634,29 @@ meter { padding: 5px 0; } .info-row span:first-child { color: var(--muted); } +.personality-values strong { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 2px 8px; + max-width: 68%; + text-align: right; +} +.personality-values strong span { + color: var(--ink); + white-space: nowrap; +} +.personality-tag { + display: inline-block; + border-radius: 999px; + padding: 2px 7px; + background: rgba(103,178,44,0.10); + border: 1px solid rgba(103,178,44,0.22); +} +.personality-tag.neutral { + background: rgba(120,110,90,0.08); + border-color: rgba(120,110,90,0.16); +} .log-card { min-height: 260px; flex: 0 0 auto; display: flex; flex-direction: column; } .log { @@ -1250,8 +1302,8 @@ body::before { display: block; opacity: 0.96; } -.tool[data-tool="poke"]::before { content: "👈"; } -.tool[data-tool="pinch"]::before { content: "🤏"; } +.tool[data-tool="poke"]::before { content: "\1F448"; } +.tool[data-tool="pinch"]::before { content: "\1F90F"; } .tool[data-tool="poke"]::after, .tool[data-tool="pinch"]::after { background: none; @@ -1268,8 +1320,8 @@ body::before { width: 54px; height: 54px; } -.tool[data-tool="poke"]::after { content: "👈"; } -.tool[data-tool="pinch"]::after { content: "🤏"; } +.tool[data-tool="poke"]::after { content: "\1F448"; } +.tool[data-tool="pinch"]::after { content: "\1F90F"; } .tool[data-tool="poke"] span, .tool[data-tool="pinch"] span { display: none; } @@ -1277,7 +1329,7 @@ body::before { /* 15.3.0: shower uses emoji; nest box and fences use appearance-matched assets/hitboxes. */ .tool[data-tool="water_hose"] { --tool-icon: none; } .tool[data-tool="water_hose"]::before { - content: "🚿"; + content: "\1F6BF"; background: none; font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; font-size: 24px; @@ -1287,7 +1339,7 @@ body::before { opacity: 0.96; } .tool[data-tool="water_hose"]::after { - content: "🚿"; + content: "\1F6BF"; background: none; font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; font-size: 46px; @@ -1300,3 +1352,67 @@ body::before { bottom: auto; transform: translateY(-50%); } + +.relation-list-row { + align-items: start; +} +.relation-list-row > strong { + min-width: 0; + width: 100%; + justify-content: flex-end; +} +.relation-chip-list { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 5px; + max-width: 100%; +} +.relation-chip { + display: inline-flex; + align-items: center; + gap: 4px; + max-width: 138px; + min-width: 0; + border: 1px solid rgba(104, 150, 84, 0.24); + border-radius: 999px; + background: rgba(250, 255, 242, 0.88); + color: #4d6140; + padding: 2px 6px 2px 2px; + font: inherit; + font-size: 11px; + line-height: 1.2; + cursor: pointer; + box-shadow: 0 1px 0 rgba(255,255,255,0.74); +} +.relation-chip.enemy { + border-color: rgba(178, 92, 74, 0.28); + background: rgba(255, 246, 240, 0.92); + color: #754739; +} +.relation-chip:hover, +.relation-chip:focus-visible { + transform: translateY(-1px); + background: rgba(255,255,255,0.98); + outline: 2px solid rgba(118, 186, 72, 0.18); +} +.relation-chip.enemy:hover, +.relation-chip.enemy:focus-visible { + outline-color: rgba(190, 92, 72, 0.18); +} +.relation-chip .relation-face { + width: 22px; + height: 22px; +} +.relation-chip-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; +} +.relation-chip em { + font-style: normal; + font-size: 10px; + opacity: 0.72; + flex: 0 0 auto; +} diff --git a/docs/prompt.txt b/docs/prompt.txt index dc86a4a..dc90944 100644 --- a/docs/prompt.txt +++ b/docs/prompt.txt @@ -1,485 +1,265 @@ -You are working on the Tarinai observation game. +You are modifying an existing JavaScript browser game project. -Base input: +Implement a personality system for the \u201ctarinai\u201d creatures. Keep the implementation conservative and debuggable. Do not add extra systems beyond the specification below. -* Start from `tarinai_colony_game_fixed_v6.zip`. -* Modify the project files directly. -* Return a new zip. -* Do not remove existing gameplay features unless explicitly instructed. -* Preserve the existing Japanese UI text style. -* After changes, run syntax checks on all JavaScript files and verify zip integrity. -* Bump the cache-busting version in `index.html` so browsers do not keep loading old JS/CSS. +## Goal -Primary goals: -Fix the remaining complexity, behavior mismatch, redundant logic, and fragmented-spec issues identified in the v6 audit. Implement all items below. Do not skip any item. +Add four continuous personality parameters to each tarinai: ---- +* aggression +* openness +* sociability +* neuroticism -## 1. Family tree update performance +Each parameter ranges from `-1.0` to `+1.0`. -Current issue: -The family tree update still performs heavy synchronous preprocessing, causing the main game to freeze. +Personality should affect behavior only when the value crosses clear thresholds. Small changes should be recorded internally, but observation logs should only be written when a threshold is crossed. -Implement: +## Personality axes -* Split heavy preprocessing into small chunks. -* Use `requestIdleCallback` when available, with a safe `setTimeout` fallback. -* Avoid doing large graph construction, signature generation, relationship counting, or DOM creation in one blocking pass. -* The game loop must remain responsive while family tree data is prepared. +### aggression -Update timing rules: +Range: -* When the family tree panel is hidden: +* low side: calm +* high side: irritable - * Do not update every 5 seconds. - * Check/update at most once every 30 seconds. -* When the family tree panel is visible: +Behavior: - * Do not update on a fixed 5-second timer. - * Update only when the family tree is dirty, meaning a relevant change occurred. - * Relevant dirty events include at least: +* High aggression makes the tarinai more likely to threaten others, start fights, or retaliate. +* Low aggression makes the tarinai less likely to start fights. - * birth - * death - * parent/child relationship creation - * mate/partner relationship creation or change - * name/identity data change that affects the family tree display -* Add or use a clear dirty flag such as `familyTreeDirty`. -* Mark dirty from the source of the change, not by repeatedly recomputing expensive signatures. -* If a background update is already running, do not start another one. -* If a newer dirty event occurs while an update is running, schedule one additional update after the current update completes. +Changes: -Expected result: +* Winning fights should slightly increase aggression. +* Losing fights should slightly decrease aggression. -* Opening or updating the family tree should not freeze the main simulation. -* Hidden family tree work should be very rare. -* Visible family tree should refresh promptly after actual changes. +### openness ---- +Range: -## 2. Coward personality condition +* low side: conservative +* high side: playful -Current issue: -The “coward” condition may count total fight results and per-relationship fight results together, causing double counting. +Behavior: -Implement: +* High openness makes the tarinai more likely to wander farther, investigate new objects, and play with toys such as balls. +* Low openness makes the tarinai prefer familiar or nearby areas. -* The 5% chance to become `臆病` must be based only on total fight wins and total fight losses. -* Do not include per-relationship win/loss counts in this condition. -* Trigger condition: +Changes: - * The Tarinai has just taken damage. - * Its total fight losses are greater than its total fight wins. - * Then it has a 5% chance to change personality to `臆病`. -* Avoid changing the personality repeatedly if it is already `臆病`. +* Being petted by the cursor should slightly increase openness. -Expected result: +### sociability -* The calculation uses only aggregate lifetime fight result counters. -* No double counting. +Range: ---- +* low side: loner +* high side: social -## 3. Disease fight initiation and targeting rules +Behavior: -Implement the following disease fight rules exactly: +* High sociability makes the tarinai more likely to approach other tarinai, especially parents, children, friends, or the cursor. +* High sociability also makes the tarinai more likely to react when a parent, child, or friend is fighting nearby. +* Low sociability makes the tarinai prefer being alone. -Fight initiation: +Changes: -* Tarinai with `爆発病` can initiate fights. -* Tarinai with `ずんち病` can initiate fights. -* Tarinai with any other disease must not initiate fights. -* Healthy Tarinai may initiate fights according to the existing rules. +* Spending time near parents, children, or friends should slightly increase sociability. -Being targeted / challenged: +### neuroticism -* Tarinai with `ねむり病` must not be targeted for fights. -* Tarinai with any other disease may still be targeted/challenged by another Tarinai. -* This means: +Range: - * `爆発病` and `ずんち病`: can initiate and can be targeted. - * Other non-sleep diseases: cannot initiate, but can be targeted. - * `ねむり病`: cannot initiate and cannot be targeted. +* low side: insensitive / unfazed +* high side: delicate / sensitive -Apply consistently to: +Behavior: -* Normal fight selection. -* Forced fight logic. -* Fight-food effects such as `けんか餅`. -* Any helper such as `canStartFight`, `canBeFightTarget`, or equivalent. +* High neuroticism makes the tarinai gain more stress from unpleasant stimuli such as corpses, poop, nearby fights, or overcrowding. +* Low neuroticism makes the tarinai less affected by such stimuli. -Expected result: +Changes: -* Disease rules are not handled by scattered ad-hoc checks. -* Use clear helper functions if they do not already exist. +* Touching poop or corpses should still increase stress immediately. +* However, repeated exposure should slightly reduce neuroticism over time, representing habituation. +* This means tarinai can become less sensitive to unpleasant stimuli after repeated exposure. ---- +Important: -## 4. Collision and external-force unification +* Do not treat \u201ccowardice\u201d as a direct low-aggression state. +* If a cowardly tag is needed, derive it as a compound state from high neuroticism and low aggression. +* Do not implement a separate cowardice parameter. -Current issues: +## Birth personality and current personality -* Ball speed cap was removed, but some collision detection still uses capped sweep/search distances. -* Very fast balls can still tunnel through objects. -* Explosion knockback and ball knockback can be reduced by normal movement speed caps. -* Knockback, collision damage, explosion impulse, and normal movement are handled inconsistently. +Each tarinai should have two personality objects: -Implement: +```js +birthPersonality +currentPersonality +``` -* Separate normal self-propelled movement from external impulse/knockback. -* External impulses must not be clamped by the normal Tarinai walking speed cap. -* Add or refactor toward helper methods such as: +Rules: - * `applyImpulse(entity, vx, vy, options)` - * `applyKnockback(entity, sourceX, sourceY, strength, options)` - * `applyImpactDamage(target, amount, cause)` - * `resolveCircleCircleCollision(...)` - * `resolveCircleRectCollision(...)` -* Exact helper names are flexible, but the behavior must be centralized and not duplicated. +* `birthPersonality` is created at birth and normally does not change. +* `currentPersonality` starts equal to `birthPersonality`. +* Experience modifies only `currentPersonality`. +* The tarinai data UI should show both birth personality and current personality. -Unlimited ball speed: +## Inheritance -* Do not reintroduce a ball speed cap. -* Collision detection must handle high-speed balls using swept movement based on actual frame movement distance. -* Remove fixed low `Math.min(...)` collision-search caps that contradict unlimited ball speed. -* Ball vs wall, ball vs fence, ball vs nest box, ball vs ball, and ball vs Tarinai should remain reliable at high speed. +When a child is born: -High-speed ball vs Tarinai: +```text +child birth personality = + average of the parents' current personality + + random variation between -0.2 and +0.2 for each parameter +``` -* When a sufficiently fast ball hits a Tarinai: +Clamp each resulting value to `-1.0` through `+1.0`. - * Knock the Tarinai away using velocity equal to 1/5 of the ball velocity. - * This knockback must be an external impulse, not normal walking movement. - * Do not let the normal “play with ball” behavior also run for that same impact if it would conflict. - * If the damage from this impact kills the Tarinai, death cause must be `衝突`. +Then: -High-speed Tarinai vs Tarinai: +```js +child.currentPersonality = child.birthPersonality +``` -* When a sufficiently fast Tarinai hits another Tarinai: +The child should pass its changed current personality to future descendants, not only its original birth personality. - * The hit Tarinai should also be knocked away. - * Use the attacker’s actual movement/impulse direction and speed. - * If collision damage kills a Tarinai, death cause must be `衝突`. +## Thresholds and personality tags -Explosion knockback: +Use two threshold levels: -* Make explosion knockback stronger than before. -* Use external impulse, not normal movement velocity. -* Knockback should be partly random. -* Tarinai closer to the blast center should be thrown faster and farther. -* Tarinai farther from the blast center should be thrown less strongly. -* Preserve or improve existing explosion damage behavior. -* If an explosion kills a Tarinai, keep the appropriate explosion-related death cause, not `衝突`. +```text +-1.0 to -0.75: strong low-side trait +-0.75 to -0.5: slight low-side trait +-0.5 to +0.5: neutral, no visible personality tag ++0.5 to +0.75: slight high-side trait ++0.75 to +1.0: strong high-side trait +``` -Expected result: +Display tags: -* Normal walking speed remains bounded. -* Knockback from explosions and collisions can exceed walking speed. -* High-speed objects do not frequently tunnel through collisions. -* Collision behavior is handled by shared primitives rather than several unrelated implementations. +* Slight traits should be displayed as \u201cslightly X\u201d. +* Strong traits should be displayed as \u201cX\u201d. +* Neutral values should not create a visible tag. ---- +Example: -## 5. Ball-to-ball collision +* aggression `+0.62` -> \u201cslightly irritable\u201d +* aggression `+0.83` -> \u201cirritable\u201d +* sociability `-0.58` -> \u201cslightly loner\u201d +* sociability `-0.82` -> \u201cloner\u201d +* openness `+0.20` -> no tag -Ensure balls collide with each other robustly. +Behavior activation: -Requirements: +* Slight traits affect relevant behavior with a 50% chance when choosing a behavior. +* Strong traits affect relevant behavior with a 100% chance when choosing a behavior. +* Do not check this every frame. Apply it only during behavior selection or when evaluating a relevant event. -* Ball vs ball collision must use circle-circle collision. -* Resolve overlap. -* Exchange or reflect velocity in a physically plausible way. -* Work with high-speed balls, not only overlapping balls. -* Avoid creating infinite acceleration or NaN velocity. -* Do not apply arbitrary maximum speed caps. +## Daily personality change limit ---- +Add a daily change cap so personality values cannot change too quickly. -## 6. Solid obstacle and placement logic unification +Recommended limits: -Current issues: -Fence, nest box, and placement preview logic are still partly fragmented. +```text +Per parameter: + maximum increase per day: +0.08 + maximum decrease per day: -0.08 -Implement: +Across all parameters: + maximum total absolute personality change per day: 0.20 +``` -* Unify all solid rectangular obstacle collision logic. -* Fence and nest box should use the same obstacle system where possible. -* Rename misleading helpers if needed: +If a change would exceed the daily limit, reduce or ignore the excess change. - * For example, functions named only for “fence” but now handling nest boxes too should be renamed or wrapped with neutral names such as `solidObstacle`. -* Ball, Tarinai movement, path blocking, and placement checks should reference the same obstacle data. +Reset these daily counters at the start of each new in-game day. -Fence collision: +## Observation log rules -* Fence collision bounds must match the visible fence appearance. -* If the visual fence is not the same size as the previous hitbox, update the hitbox to match the visual footprint. -* Avoid separate visual size and collision size unless explicitly documented in one definition table. +Write personality change entries to the observation log only when a threshold is crossed. -Nest box collision: +Log when: -* Preserve the existing 3×3 nest box hitbox rule: +* a value crosses `+0.5` +* a value crosses `+0.75` +* a value crosses `-0.5` +* a value crosses `-0.75` +* a value returns from a visible trait range back into neutral - * If the nest box is divided into a 3×3 grid, the collidable cells are: +Do not log every small personality change. - * top-left - * top-center - * top-right - * middle-left - * middle-right - * The middle-center, bottom-left, bottom-center, and bottom-right cells are passable/enterable according to the current nest behavior. -* Ball must bounce off these nest box solid cells. -* Tarinai must not path through these solid cells. +Example log messages: -Placement preview: +```text +\u201cMochi\u201d has become slightly irritable after winning fights. +\u201cMimi\u201d has become playful after spending time with toys. +\u201cNoko\u201d has become less sensitive after repeated contact with corpses. +\u201cTari\u201d no longer seems especially social. +``` -* The preview highlight must use the exact same placement validation as actual placement. -* If the preview is red, clicking must not place the object. -* If the preview is green, clicking should place the object at the previewed position. -* Do not silently clamp or auto-correct an out-of-bounds placement to an in-bounds location. -* If the planned placement would extend outside the field, the highlight must turn red. -* Fix the issue where a fence preview extending outside the field does not turn red. -* The highlighted preview position should show the true placement footprint, not a different corrected footprint. +Use the existing observation log system if one exists. -Expected result: +## Tarinai data UI -* Placement UI, actual placement, and collision behavior agree. -* No “red but placeable” or “green but placed elsewhere” behavior. +Update the tarinai data UI to show personality information clearly. ---- +It should include: -## 7. Item/tool definition unification +1. Birth personality +2. Current personality +3. Visible personality tags derived from current personality -Current issues: -Tool names, labels, icons, sizes, placement rules, and descriptions are scattered across multiple files. +Example structure: -Implement: +```text +Personality Tags: +slightly irritable / social -* Create or consolidate a single source of truth for tool/item definitions. -* It should include at least: +Birth Personality: +Aggression: -0.12 +Openness: +0.31 +Sociability: +0.48 +Neuroticism: +0.66 - * internal id - * Japanese label - * tooltip text - * UI icon or icon renderer - * game appearance reference where applicable - * placement size / footprint - * whether it is placeable - * whether it is scaleable, if applicable - * collision shape if applicable -* Use this definition in the tool UI, placement preview, placement logic, and logs where appropriate. -* Do not leave conflicting duplicate label/icon/size definitions in separate files unless unavoidable. +Current Personality: +Aggression: +0.57 +Openness: +0.34 +Sociability: +0.76 +Neuroticism: +0.22 +``` -Specific icon requirements: +Keep the UI compact. Do not create a large new panel unless necessary. -* `つつく` must use `👈`. -* `つまむ` must use `🤏`. -* `洗浄` must use the shower emoji `🚿`. -* Remove or stop referencing old PNG icons for `つつく` and `つまむ`. -* Fix the nest box tool UI icon so it matches the actual in-game nest box appearance. -* Ensure every tool that appears in the tool UI has an icon. -* Avoid mojibake/garbled icon rendering. +## Implementation constraints -Water tool: +* Keep the code simple and localized. +* Reuse existing behavior, logging, and UI systems where possible. +* Avoid adding unrelated features. +* Avoid adding complex new simulation systems. +* Preserve existing save data as much as possible. +* If old save data lacks personality fields, initialize them safely. +* Clamp all personality values to `-1.0` through `+1.0`. +* Add helper functions where useful, such as: -* `水` must remain removed from the tool UI. -* If water still exists as a game object produced by rain or other simulation systems, keep that object behavior. -* Remove leftover UI-only water tool entries, labels, tooltips, and placement handlers unless they are still required by non-UI simulation. + * `ensurePersonality(tarinai)` + * `adjustPersonality(tarinai, key, delta, reason)` + * `getPersonalityTraitTags(tarinai)` + * `getTraitStrength(value)` + * `shouldApplyPersonalityBehavior(tarinai, key, direction)` -Expected result: +## Validation -* Tool UI no longer has missing icons, old icons, or mismatched nest box visuals. -* Tool data is not scattered unnecessarily. +After implementation: ---- - -## 8. Observation UI event filtering - -Current issue: -Observation UI hides some events by matching Japanese text strings, which is fragile. - -Implement: - -* Remove from the observation UI: - - * events about poking a ball - * events of the form “X avoided Y” / `○○が××を避けた` -* Prefer event type/category filtering over string matching. -* If event objects do not have a type field, add one at event creation. -* Keep the events available internally if needed, but do not show them in the observation UI. - -Expected result: - -* Future wording changes do not break event filtering. - ---- - -## 9. Death cause normalization - -Ensure these death causes are applied consistently: - -* Death by old age / lifespan: - - * `天寿を全うした` -* Tarinai deleted because it went too far outside the field: - - * `仕様により画面外で削除` -* Death caused by ball collision or Tarinai collision damage: - - * `衝突` -* Explosion death: - - * Keep explosion-related cause. -* Existing disease-related deaths: - - * Preserve current intended disease death causes unless they conflict with the above. - -Implementation: - -* Centralize death cause normalization if possible. -* Avoid scattered caller-side strings that can drift. -* Ensure the family tree, observation UI, and any memorial/death display show the normalized cause. - ---- - -## 10. Out-of-bounds object policy - -Current issue: -Different object types handle out-of-bounds behavior differently. - -Implement a unified out-of-bounds policy: - -* For objects or entities slightly outside the field: - - * Return them to the nearest valid in-field position. -* For objects or entities far outside the field, or with invalid coordinates such as NaN/Infinity: - - * Delete them. -* For Tarinai deleted by this system: - - * Death cause must be `仕様により画面外で削除`. -* For non-living objects: - - * Delete without a death cause. -* Keep wall bounce behavior for balls at normal field boundaries, but still sanitize balls that somehow get far outside or invalid coordinates. - -Expected result: - -* No permanent invisible offscreen objects. -* No NaN entities poisoning the simulation. - ---- - -## 11. Observation relationship highlight - -Current issue: -Relationship highlight during observation can be affected by sprite rotation. - -Implement: - -* Relationship highlights must be drawn in world/screen space independent of the Tarinai sprite rotation. -* Do not draw the highlight inside a rotated sprite transform. -* Ensure highlight position follows the Tarinai but does not rotate with the Tarinai body. - -Expected result: - -* Highlight remains visually stable regardless of sprite rotation. - ---- - -## 12. Nest box behavior preservation - -Preserve and verify previous nest box fixes: - -* Tarinai inside the nest box should be fully transparent in the main field. -* Nest box can contain up to 5 Tarinai. -* Nest box occupant popup should show each individual on a separate line. -* The nest box solid hitbox must follow the 3×3 rule described above. -* Ball should bounce off nest box solid hitbox cells. - -Do not regress these behaviors while refactoring obstacles. - ---- - -## 13. Encyclopedia / ecology page - -Preserve and verify the `たりないの生態` addition: - -* It must include an explanation of health. -* It must include an explanation of stress. -* It must use a Tarinai sprite/image with both the health bar and stress bar visible. -* Do not break existing encyclopedia entries. - ---- - -## 14. Naming and Japanese text preservation - -Preserve previous Japanese terminology changes: - -* `喧嘩傷病` must remain renamed to `きずつき病`. -* `寿命` death text must display as `天寿を全うした`. -* Use the existing tone/style for Japanese labels and descriptions. - -Do not reintroduce removed or old names. - ---- - -## 15. Code quality expectations - -Refactor carefully: - -* Prefer small, well-named helper functions. -* Avoid adding more scattered special cases. -* Avoid duplicating collision math. -* Avoid duplicating item/tool metadata. -* Avoid string-matching for gameplay logic where structured data is possible. -* Preserve save compatibility where possible. -* If save migration is needed, add a safe fallback. - -Add comments only where they clarify non-obvious game rules, especially: - -* disease fight rules -* nest box 3×3 collision cells -* external impulse vs normal movement -* family tree dirty/update scheduling - ---- - -## 16. Validation checklist - -Before returning the zip, verify at minimum: - -Static checks: - -* Run `node --check` on every JavaScript file. -* Ensure there are no `ReferenceError` risks from renamed helpers. -* Ensure old cache version references are updated. - -Manual or scripted behavior checks where practical: - -* Ball vs ball collision works. -* Fast ball hitting Tarinai knocks it by ball velocity / 5. -* Fast collision death cause is `衝突`. -* Explosion throws nearby Tarinai farther than distant Tarinai and is not clamped by walking speed. -* Fence preview turns red when the footprint leaves the field. -* Red placement preview cannot place an object. -* Green placement preview places at the same footprint shown. -* Nest box collision uses the required 3×3 cells. -* Ball bounces off nest box solid cells. -* Family tree hidden update is no more frequent than every 30 seconds. -* Family tree visible update happens when dirty, not every 5 seconds. -* Family tree processing does not freeze the game. -* `臆病` condition uses only total wins/losses. -* `爆発病` and `ずんち病` can initiate fights. -* Other diseases cannot initiate fights. -* `ねむり病` cannot initiate and cannot be targeted. -* Other non-sleep diseases can be targeted. -* Observation UI does not show ball-poke events or avoid events. -* Tool icons are correct: `👈`, `🤏`, `🚿`, and nest box matching in-game appearance. -* `水` is absent from the tool UI. -* Lifespan death cause is `天寿を全うした`. -* Far-outside Tarinai deletion cause is `仕様により画面外で削除`. - -Deliverable: - -* Return a zip named something like `tarinai_colony_game_fixed_v7.zip`. -* Include a concise summary of changed areas and validation results. +* Run syntax checks for all JavaScript files. +* Verify that old tarinai without personality data do not crash the game. +* Verify that personality values are clamped. +* Verify that daily limits work. +* Verify that threshold crossing creates observation logs. +* Verify that minor personality changes do not spam logs. +* Verify that tarinai data UI shows birth personality, current personality, and visible tags. +* Verify that children inherit from parents' current personality with \u00b10.2 random variation. diff --git a/index.html b/index.html index 1ca64b0..1a7885d 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ たりない観察 - +

    @@ -37,7 +37,7 @@
    @@ -165,20 +165,20 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/js/data.js b/js/data.js index b681204..6c4fe60 100644 --- a/js/data.js +++ b/js/data.js @@ -33,6 +33,68 @@ const DECOR_ASSETS = [ { id: "zunchi", path: "assets/objects/zunchi.png" }, { id: "zunchi_02", path: "assets/objects/zunchi_02.png" }, ]; + +const TOOL_DEFINITIONS = Object.freeze({ + observe: { id: "observe", label: "\u89b3\u5bdf", placeable: false, scalable: false, icon: "assets/ui/tool_observe.png", tooltip: "\u500b\u4f53\u3092\u9078\u629e\u3057\u3001\u72b6\u614b\u30fb\u6027\u683c\u30fb\u75c5\u6c17\u30fb\u304a\u6c17\u306b\u5165\u308a\u3092\u78ba\u8a8d\u3059\u308b\u3002" }, + delete: { id: "delete", label: "\u524a\u9664", placeable: false, scalable: false, icon: "assets/ui/tool_delete.png", tooltip: "\u7f6e\u3044\u305f\u9053\u5177\u3084\u6c5a\u308c\u3092\u6d88\u3059\u3002" }, + poke: { id: "poke", label: "\u3064\u3064\u304f", placeable: false, scalable: false, iconText: "\u{1F448}", tooltip: "\u305f\u308a\u306a\u3044\u3092\u3064\u3064\u304f\u3002\u30dc\u30fc\u30eb\u3082\u3064\u3064\u3044\u3066\u8ee2\u304c\u305b\u308b\u3002" }, + pinch: { id: "pinch", label: "\u3064\u307e\u3080", placeable: false, scalable: false, iconText: "\u{1F90F}", tooltip: "\u305f\u308a\u306a\u3044\u3084\u7269\u3092\u3064\u307e\u3093\u3067\u79fb\u52d5\u3055\u305b\u308b\u3002" }, + new: { id: "new", label: "\u8ffd\u52a0", placeable: false, scalable: false, icon: "assets/ui/tool_new.png", tooltip: "\u753b\u9762\u5916\u304b\u3089\u65b0\u3057\u3044\u305f\u308a\u306a\u3044\u3092\u547c\u3076\u3002" }, + water_hose: { id: "water_hose", label: "\u6d17\u6d44", placeable: false, scalable: false, iconText: "\u{1F6BF}", icon: "assets/ui/tool_water_hose.png", tooltip: "\u30c9\u30e9\u30c3\u30b0\u3067\u6c5a\u308c\u3092\u304d\u308c\u3044\u306b\u3059\u308b\u3002" }, + zunchi: { id: "zunchi", itemType: "zunchi", label: "\u305a\u3093\u3061", placeable: true, scalable: true, radius: 14, amount: 240, icon: "assets/ui/tool_zunchi.png", tooltip: "\u305f\u308a\u306a\u3044\u306e\u305a\u3093\u3061\u3002\u75c5\u6c17\u3084\u8349\u306e\u80a5\u6599\u306b\u95a2\u308f\u308b\u3002" }, + sweet: { id: "sweet", itemType: "sweet", label: "\u305a\u3093\u3060\u9905", placeable: true, scalable: true, radius: 13, amount: 62, icon: "assets/ui/tool_sweet.png", tooltip: "\u305f\u308a\u306a\u3044\u306e\u5927\u597d\u7269\u3002\u4e00\u90e8\u306e\u75c5\u6c17\u3092\u6cbb\u305b\u308b\u3002" }, + love_mochi: { id: "love_mochi", itemType: "love_mochi", label: "\u3078\u3053\u9905", placeable: true, scalable: true, radius: 13, amount: 62, icon: "assets/ui/tool_love_mochi.png", tooltip: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u7e41\u6b96\u884c\u52d5\u304c\u8d77\u304d\u3084\u3059\u304f\u306a\u308b\u3002" }, + fight_mochi: { id: "fight_mochi", itemType: "fight_mochi", label: "\u3051\u3093\u304b\u9905", placeable: true, scalable: true, radius: 13, amount: 62, icon: "assets/ui/tool_fight_mochi.png", tooltip: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u3051\u3093\u304b\u304c\u8d77\u304d\u3084\u3059\u304f\u306a\u308b\u3002" }, + water_bowl: { id: "water_bowl", itemType: "water_bowl", label: "\u6c34\u306e\u76bf", placeable: true, scalable: false, radius: 20, amount: 999, icon: "assets/ui/tool_water_bowl.png", tooltip: "\u885b\u751f\u7684\u306a\u6c34\u304c\u5165\u3063\u305f\u76bf\u3002\u4e00\u90e8\u306e\u75c5\u6c17\u3092\u6cbb\u305b\u308b\u3002" }, + sleep_drug: { id: "sleep_drug", itemType: "sleep_drug", label: "\u306d\u3080\u308a\u85ac", placeable: true, scalable: true, radius: 13, amount: 58, icon: "assets/ui/tool_sleep_drug.png", tooltip: "\u98df\u3079\u308b\u3068\u306d\u3080\u308a\u75c5\u306b\u306a\u308b\u3002\u30c0\u30e1\u30fc\u30b8\u3067\u5b8c\u6cbb\u3059\u308b\u3002" }, + grass: { id: "grass", itemType: "grass", label: "\u8349", placeable: true, scalable: true, radius: 17, amount: 120, icon: "assets/ui/tool_grass.png", tooltip: "\u98df\u3079\u7269\u3002\u305f\u308a\u306a\u3044\u304c\u5b89\u5fc3\u3059\u308b\u3002" }, + stone: { id: "stone", itemType: "stone", label: "\u77f3", placeable: true, scalable: true, radius: 20, amount: 999, icon: "assets/ui/tool_stone.png", tooltip: "\u91cd\u3044\u77f3\u3002\u843d\u3068\u3059\u3068\u5371\u306a\u3044\u3002" }, + bed: { id: "bed", itemType: "bed", label: "\u5e72\u8349\u5bdd\u5e8a", placeable: true, scalable: false, radius: 37, amount: 999, icon: "assets/ui/tool_bed.png", tooltip: "\u8fd1\u304f\u3067\u7720\u308b\u3002\u4f53\u529b\u304c\u56de\u5fa9\u3059\u308b\u3002" }, + nest_box: { id: "nest_box", itemType: "nest_box", label: "\u5de3\u7bb1", placeable: true, scalable: false, radius: 42, amount: 999, icon: "assets/ui/tool_nest_box.png", collisionShape: "nest_box_3x3", tooltip: "\u3044\u308b\u3060\u3051\u3067\u30b9\u30c8\u30ec\u30b9\u4f4e\u6e1b\u3002\u7720\u308b\u3068\u7761\u7720\u306e\u8cea\u304c\u4e0a\u304c\u308b\u3002" }, + ball: { id: "ball", itemType: "ball", label: "\u30dc\u30fc\u30eb", placeable: true, scalable: false, radius: 18, amount: 999, icon: "assets/ui/tool_ball.png", collisionShape: "circle", tooltip: "\u305f\u308a\u306a\u3044\u304c\u904a\u3076\u305f\u3081\u306e\u304a\u3082\u3061\u3083\u3002" }, + firecracker: { id: "firecracker", itemType: "firecracker", label: "\u7206\u7af9", placeable: true, scalable: true, radius: 15, amount: 999, icon: "assets/ui/tool_firecracker.png", tooltip: "\u7206\u767a\u3092\u8d77\u3053\u3059\u3002" }, + fence_v: { id: "fence_v", itemType: "fence_v", label: "\u7e26\u306e\u67f5", placeable: true, scalable: true, radius: 42, amount: 999, icon: "assets/ui/tool_fence_v.png", collisionShape: "rect", tooltip: "\u305f\u308a\u306a\u3044\u3092\u901a\u305b\u3093\u307c\u3059\u308b\u3002" }, + fence_h: { id: "fence_h", itemType: "fence_h", label: "\u6a2a\u306e\u67f5", placeable: true, scalable: true, radius: 42, amount: 999, icon: "assets/ui/tool_fence_h.png", collisionShape: "rect", tooltip: "\u305f\u308a\u306a\u3044\u3092\u901a\u305b\u3093\u307c\u3059\u308b\u3002" }, + water: { id: "water", itemType: "water", label: "\u6c34", placeable: false, scalable: false, radius: 12, amount: 64, simulationOnly: true }, + trace: { id: "trace", itemType: "trace", label: "\u8db3\u8de1", placeable: false, scalable: false, radius: 16, amount: 220, simulationOnly: true }, + splat: { id: "splat", itemType: "splat", label: "\u3057\u3076\u304d", placeable: false, scalable: false, radius: 26, amount: 260, simulationOnly: true }, + food: { id: "food", itemType: "food", label: "\u98df\u3079\u7269", placeable: false, scalable: false, radius: 14, amount: 85, simulationOnly: true }, +}); + +function toolDefinition(id = "") { + return TOOL_DEFINITIONS[id] || null; +} + +function toolLabel(id = "") { + const def = toolDefinition(id); + return def?.label || id || ""; +} + +function toolItemType(id = "") { + const def = toolDefinition(id); + return def?.placeable ? (def.itemType || def.id) : null; +} + +function itemDefinition(type = "") { + return Object.values(TOOL_DEFINITIONS).find(def => (def.itemType || def.id) === type) || null; +} + +function itemRadiusFor(type = "", fallback = 12) { + return itemDefinition(type)?.radius ?? fallback; +} + +function itemAmountFor(type = "", fallback = 80) { + return itemDefinition(type)?.amount ?? fallback; +} + +function scalableToolIds() { + return Object.values(TOOL_DEFINITIONS).filter(def => def.scalable).map(def => def.id); +} + +function toolTipsFromDefinitions() { + return Object.fromEntries(Object.entries(TOOL_DEFINITIONS).filter(([, def]) => def.tooltip).map(([id, def]) => [id, def.tooltip])); +} + const ALPHA_BOUNDS = { smile: { x: 18, y: 18, w: 476, h: 432, imageW: 512, imageH: 468 }, angry: { x: 16, y: 16, w: 480, h: 432, imageW: 512, imageH: 464 }, @@ -106,4 +168,3 @@ const LIGHTING_TUNING = { goldenOverlayAlpha: 0.045, bloomWashAlpha: 0.040, }; - diff --git a/js/health.js b/js/health.js index 7c74473..1e3f7a9 100644 --- a/js/health.js +++ b/js/health.js @@ -10,12 +10,12 @@ const HEALTH = (() => { poke: "\u3064\u3064\u304b\u308c\u3059\u304e\u305f", firecracker: "\u7206\u7af9", accident: "\u4e8b\u6545", - collision: "衝突", - outOfBounds: "仕様により画面外で削除", - lifespan: "天寿を全うした", + collision: "\u885d\u7a81", + outOfBounds: "\u4ed5\u69d8\u306b\u3088\u308a\u753b\u9762\u5916\u3067\u524a\u9664", + lifespan: "\u5929\u5bff\u3092\u5168\u3046\u3057\u305f", sleepDisease: "\u306d\u3080\u308a\u75c5", explosionDisease: "\u7206\u767a\u75c5", - fightDisease: "きずつき病", + fightDisease: "\u304d\u305a\u3064\u304d\u75c5", zunchiDisease: "\u305a\u3093\u3061\u75c5", }); const DISEASE_RE = /([^\u3001\u3002\s]+\u75c5)/; @@ -26,12 +26,12 @@ const HEALTH = (() => { if (text.includes(WEAKENED_SUFFIX)) return text.replace(/\u3067\u8870\u5f31.*$/, ""); if (/\u55a7\u5629|fight|headbutt/.test(text)) return CAUSES.fight; if (/\u7206\u7af9|firecracker|explosion/.test(text)) return CAUSES.firecracker; - if (/仕様により画面外で削除|画面外で削除|out.*bounds|offscreen/.test(text)) return CAUSES.outOfBounds; - if (/衝突|collision/.test(text)) return CAUSES.collision; + if (/\u4ed5\u69d8\u306b\u3088\u308a\u753b\u9762\u5916\u3067\u524a\u9664|\u753b\u9762\u5916\u3067\u524a\u9664|out.*bounds|offscreen/.test(text)) return CAUSES.outOfBounds; + if (/\u885d\u7a81|collision/.test(text)) return CAUSES.collision; if (/\u3064\u3064\u304b\u308c|\u3064\u3064\u304d|poke/.test(text)) return CAUSES.poke; if (/\u306d\u3080\u308a\u75c5|sleep.*disease/.test(text)) return CAUSES.sleepDisease; if (/\u7206\u767a\u75c5|explosion.*disease/.test(text)) return CAUSES.explosionDisease; - if (/\u3051\u3093\u304b\u75c5|喧嘩傷病|きずつき病|fight.*disease/.test(text)) return CAUSES.fightDisease; + if (/\u3051\u3093\u304b\u75c5|\u304d\u305a\u3064\u304d\u75c5|fight.*disease/.test(text)) return CAUSES.fightDisease; if (/\u305a\u3093\u3061\u75c5|zunchi_sick|zunchi.*\u75c5/.test(text)) return CAUSES.zunchiDisease; if (/\u75c5/.test(text)) { const disease = text.match(DISEASE_RE); @@ -40,7 +40,7 @@ const HEALTH = (() => { if (/\u98e2|\u7a7a\u8179|\u98df\u3079\u7269|hunger/.test(text)) return CAUSES.hunger; if (/\u30b9\u30c8\u30ec\u30b9|stress/.test(text)) return CAUSES.stress; if (/\u30dc\u30fc\u30eb|\u843d\u3061|\u843d\u4e0b|\u77f3|\u9053\u5177|\u4e8b\u6545|\u5f53\u305f|ball|drop|stone|accident/.test(text)) return CAUSES.accident; - if (/\u5bff\u547d|天寿を全うした/.test(text)) return CAUSES.lifespan; + if (/\u5bff\u547d|\u5929\u5bff/.test(text)) return CAUSES.lifespan; return ""; } @@ -121,6 +121,7 @@ const HEALTH = (() => { cause = rememberDamage(t, actualLoss, reason); if (cause === CAUSES.fight || /\u55a7\u5629|fight/.test(String(reason || ""))) t.recordBleedExposure(); if (t.sleepDisease) t.recoverSleepDisease("\u30c0\u30e1\u30fc\u30b8\u3067\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f"); + if (t.wakeFromDamage) t.wakeFromDamage(cause || reason); if (t.maybeBecomeTimidAfterDamage) t.maybeBecomeTimidAfterDamage(cause || reason); t.showHpBar(); } diff --git a/js/items.js b/js/items.js index 094f29d..0e78cf4 100644 --- a/js/items.js +++ b/js/items.js @@ -1,18 +1,23 @@ -// tarinai_colony_game build 15.4.0: ball collisions, fence hitboxes, and archive throttling +// tarinai_colony_game build 15.6.2: food servings, nest box access, and editable tarinai data "use strict"; +const FOOD_SERVING_TYPES = new Set(["food", "sweet", "love_mochi", "fight_mochi", "sleep_drug"]); +const FOOD_SERVINGS_BY_SIZE = { small: 1, medium: 5, large: 15 }; +function foodServingsForSize(size = "medium") { + return FOOD_SERVINGS_BY_SIZE[size] || FOOD_SERVINGS_BY_SIZE.medium; +} +function isServingFoodType(type = "") { + return FOOD_SERVING_TYPES.has(type); +} + class Item { constructor(type, x, y) { this.id = crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}`; this.type = type; this.x = x; this.y = y; - this.r = { - food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, sleep_drug: 13, water: 12, water_bowl: 20, grass: 17, stone: 20, bed: 37, nest_box: 42, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 - }[type] || 12; - this.amount = { - food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, sleep_drug: 58, water: 64, water_bowl: 999, grass: 120, stone: 999, bed: 999, nest_box: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 - }[type] || 80; + this.r = itemRadiusFor(type, 12); + this.amount = itemAmountFor(type, 80); this.age = 0; this.seed = Math.random() * 1000; this.dropTimer = 0; @@ -57,6 +62,13 @@ class Item { this.fuseTimer = 5; this.fuseMax = 5; } + if (isServingFoodType(type)) { + this.toolSize = "medium"; + this.foodServingScale = 1; + this.foodServingsMax = foodServingsForSize(this.toolSize); + this.foodServingsRemaining = this.foodServingsMax; + this.amount = this.foodServingsRemaining; + } } update(dt, worldRef = world) { this.age += dt; @@ -69,7 +81,7 @@ class Item { } } if (this.type === "water") this.amount -= dt * 0.9; - if (["sweet", "love_mochi", "fight_mochi", "sleep_drug"].includes(this.type)) this.amount -= dt * 0.12; + if (["sweet", "love_mochi", "fight_mochi", "sleep_drug"].includes(this.type) && !Number.isFinite(this.foodServingsRemaining)) this.amount -= dt * 0.12; if (this.type === "trace") this.amount -= dt * 1.35; if (this.type === "splat") this.amount -= dt * 1.05; if (this.type === "firecracker") { @@ -445,7 +457,7 @@ class Item { type: this.type, x: this.x, y: this.y, amount: this.amount, age: this.age, seed: this.seed, stage: this.stage, stageTimer: this.stageTimer, fertility: this.fertility, freshness: this.freshness, growth: this.growth, health: this.health, seedTimer: this.seedTimer, eatenAmount: this.eatenAmount, fertilityBoost: this.fertilityBoost, lifeSpan: this.lifeSpan, wither: this.wither, - comfort: this.comfort, wear: this.wear, crawlOpen: this.crawlOpen, zunchiVariant: this.zunchiVariant, toolSize: this.toolSize, blastScale: this.blastScale, fuseTimer: this.fuseTimer, fuseMax: this.fuseMax, dropTimer: this.dropTimer, dropMax: this.dropMax, + comfort: this.comfort, wear: this.wear, crawlOpen: this.crawlOpen, zunchiVariant: this.zunchiVariant, toolSize: this.toolSize, foodServingScale: this.foodServingScale, foodServingsMax: this.foodServingsMax, foodServingsRemaining: this.foodServingsRemaining, blastScale: this.blastScale, fuseTimer: this.fuseTimer, fuseMax: this.fuseMax, dropTimer: this.dropTimer, dropMax: this.dropMax, vx: this.vx, vy: this.vy, prevX: this.prevX, prevY: this.prevY, spin: this.spin, spinVelocity: this.spinVelocity, lastKickedAt: this.lastKickedAt, lastKickerId: this.lastKickerId, lastPokedAt: this.lastPokedAt, pokeCombo: this.pokeCombo, lastPokeAngle: this.lastPokeAngle @@ -459,12 +471,8 @@ class Item { it.type = type; it.x = o.x; it.y = o.y; - it.r = { - food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, sleep_drug: 13, water: 12, water_bowl: 20, grass: 17, stone: 20, bed: 37, nest_box: 42, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, trace: 16, splat: 26, zunchi: 14 - }[type] || 12; - it.amount = o.amount ?? ({ - food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, sleep_drug: 58, water: 64, water_bowl: 999, grass: 120, stone: 999, bed: 999, nest_box: 999, ball: 999, firecracker: 999, fence_v: 999, fence_h: 999, trace: 220, splat: 260, zunchi: 240 - }[type] || 80); + it.r = itemRadiusFor(type, 12); + it.amount = o.amount ?? itemAmountFor(type, 80); it.age = o.age || 0; it.seed = o.seed || Math.random() * 1000; it.dropTimer = 0; @@ -534,6 +542,17 @@ class Item { it.lastPokeAngle = o.lastPokeAngle ?? it.lastPokeAngle ?? rand(0, Math.PI * 2); it.zunchiVariant = o.zunchiVariant || it.zunchiVariant || "zunchi"; it.toolSize = o.toolSize || it.toolSize || "medium"; + it.foodServingScale = o.foodServingScale || it.foodServingScale || ({ small: 0.68, medium: 1.0, large: 1.48 }[it.toolSize] || 1); + if (isServingFoodType(it.type)) { + const servingMax = foodServingsForSize(it.toolSize); + it.foodServingsMax = Number.isFinite(o.foodServingsMax) ? o.foodServingsMax : servingMax; + if (Number.isFinite(o.foodServingsRemaining)) { + it.foodServingsRemaining = clamp(o.foodServingsRemaining, 0, it.foodServingsMax); + } else { + it.foodServingsRemaining = Math.max(1, Math.min(it.foodServingsMax, Math.ceil(it.foodServingsMax * clamp((o.amount ?? it.amount) / 70, 0.05, 1)))); + } + it.amount = it.foodServingsRemaining; + } it.blastScale = o.blastScale || it.blastScale || 1; it.fuseTimer = o.fuseTimer ?? it.fuseTimer; it.fuseMax = o.fuseMax ?? it.fuseMax; @@ -548,7 +567,8 @@ class Item { const warm = lightState.warmth; const styleNight = lightState.light < 0.42; const styleWarm = !styleNight && (lightState.goldenStrength > 0.22 || warm > 0.55); - const visibleAlpha = clamp(this.amount / 40, 0.24, 1); + const servingRatio = isServingFoodType(this.type) ? ((this.foodServingsRemaining ?? this.amount) / Math.max(1, this.foodServingsMax || foodServingsForSize(this.toolSize || "medium"))) : null; + const visibleAlpha = isServingFoodType(this.type) ? clamp(servingRatio ?? 1, 0.24, 1) : clamp(this.amount / 40, 0.24, 1); const dropT = this.dropMax > 0 ? clamp(this.dropTimer / this.dropMax, 0, 1) : 0; const dropY = dropT > 0 ? -170 * Math.pow(dropT, 0.42) : 0; const shadow = projectedShadowParams(lightState, Math.max(0.4, this.r / 18)); @@ -869,4 +889,3 @@ class Item { ctx.restore(); } } - diff --git a/js/render.js b/js/render.js index 4270e76..1b59734 100644 --- a/js/render.js +++ b/js/render.js @@ -124,51 +124,30 @@ function drawItemGlow(ctx, item, lighting, visibleAlpha = 1) { return; } -const PLACEABLE_TOOL_TYPES = Object.freeze({ - zunchi: "zunchi", sweet: "sweet", love_mochi: "love_mochi", fight_mochi: "fight_mochi", sleep_drug: "sleep_drug", water: "water", water_bowl: "water_bowl", grass: "grass", - stone: "stone", bed: "bed", nest_box: "nest_box", ball: "ball", firecracker: "firecracker", fence_v: "fence_v", fence_h: "fence_h", -}); - function placementPreviewFor(world) { const p = world?.pointer; - const type = PLACEABLE_TOOL_TYPES[world?.tool || ""]; + const type = toolItemType(world?.tool || ""); if (!p?.inside || !type) return null; const pad = CONFIG.worldPadding || 30; - let x = clamp(p.x, pad, world.w - pad); - let y = clamp(p.y, pad, world.h - pad); - const r = { - food: 14, sweet: 13, love_mochi: 13, fight_mochi: 13, sleep_drug: 13, water: 12, water_bowl: 20, grass: 17, stone: 20, bed: 37, nest_box: 42, ball: 18, firecracker: 15, fence_v: 42, fence_h: 42, zunchi: 14 - }[type] || 12; + let x = p.x; + let y = p.y; + const r = itemRadiusFor(type, 12); const rectOutside = (rect) => Boolean(rect && (rect.left < pad || rect.top < pad || rect.right > world.w - pad || rect.bottom > world.h - pad)); const circleOutside = (cx, cy, radius) => cx - radius < pad || cy - radius < pad || cx + radius > world.w - pad || cy + radius > world.h - pad; let blocked = false; - if (type === "grass" && world.findGrassPlantingSpot) { - const spot = world.findGrassPlantingSpot(x, y, { allowOriginal: true, minRadius: 22, maxRadius: 128, attempts: 16 }); - if (!spot) return { type, x, y, r, blocked: true }; - x = spot.x; - y = spot.y; - blocked = circleOutside(x, y, Math.max(14, r * 1.55)); - } + let tmp = { type, x, y, r, dead: false }; if ((type === "fence_v" || type === "fence_h") && world.fenceRect) { - const raw = { type, x, y, r }; - const rawRect = world.fenceRect(raw); - blocked = rectOutside(rawRect); - const tmp = { type, x, y, r }; - const rect = world.fenceRect(tmp); - if (rect) { - const dx = Math.max(pad - rect.left, 0) - Math.max(rect.right - (world.w - pad), 0); - const dy = Math.max(pad - rect.top, 0) - Math.max(rect.bottom - (world.h - pad), 0); - tmp.x += dx; - tmp.y += dy; - return { type, x: tmp.x, y: tmp.y, r, rect: world.fenceRect(tmp), blocked: blocked || world.fencePlacementBlocked?.(raw) || world.fencePlacementBlocked?.(tmp) }; - } + const rawRect = world.fenceRect(tmp); + return { type, x, y, r, rect: rawRect, blocked: rectOutside(rawRect) || world.placementBlocked?.(tmp) || world.fencePlacementBlocked?.(tmp) }; } if (type === "nest_box" && world.nestBoxBaseRect) { - const tmp = { type, x, y, r, dead: false }; const rect = world.nestBoxBaseRect(tmp); - return { type, x, y, r, rect, blocked: rectOutside(rect) }; + return { type, x, y, r, rect, blocked: rectOutside(rect) || world.placementBlocked?.(tmp) }; } - if (!blocked) blocked = circleOutside(x, y, Math.max(14, r * (type === "bed" ? 1.55 : 1.25))); + if (type === "grass") { + blocked = !world.grassSpotOpen?.(x, y, { avoidTarinai: true }) || circleOutside(x, y, Math.max(14, r * 1.55)); + } + if (!blocked) blocked = circleOutside(x, y, Math.max(14, r * (type === "bed" ? 1.55 : 1.25))) || world.placementBlocked?.(tmp); return { type, x, y, r, blocked }; } @@ -773,7 +752,8 @@ function drawNestBoxTooltip(ctx, world) { const info = world.pointerNestBoxInfo?.(); if (!info) return; const box = info.box; - const title = "\u5de3\u7bb1"; + const capacity = info.capacity || world.nestBoxCapacity?.(box) || 5; + const title = `\u5de3\u7bb1 (${info.occupants.length}/${capacity})\u5339`; const lines = info.occupants.length ? [title, ...info.occupants.map(t => t.name)] : [title, "\u4e2d\u306b\u306f\u8ab0\u3082\u3044\u306a\u3044"]; @@ -823,10 +803,9 @@ function drawSelectedCard(ctx, world, lighting) { const child = t.juvenile && t.parentToFollow?.() ? " / \u5b50" : ""; const zHint = t.digest > 4.9 ? " / \u305a\u3093\u3061" : ""; ctx.fillText(`${stateLabel(t.state)}${child}${zHint}`, x + 10, y + 35); - const personality = t.personalityLabel ? t.personalityLabel() : (t.personality || "\u4e0d\u660e"); - ctx.fillText(`\u6027\u683c ${personality}`, x + 10, y + 52); const genLabel = (t.displayGeneration && t.displayGeneration()) ? ` \u4e16\u4ee3 ${t.generation}` : ""; - ctx.fillText(`\u6c17\u5206 ${fmt(t.mood)}${genLabel} \u4f53\u529b ${fmt(t.energy)}`, x + 10, y + 68); + ctx.fillText(`\u6c17\u5206 ${fmt(t.mood)}${genLabel} \u4f53\u529b ${fmt(t.energy)}`, x + 10, y + 52); + ctx.fillText(`\u30b9\u30c8\u30ec\u30b9 ${fmt(t.stress)} \u7a7a\u8179 ${fmt(t.hunger)}`, x + 10, y + 68); ctx.restore(); } diff --git a/js/sim_core.js b/js/sim_core.js index 89706e0..43fb3bb 100644 --- a/js/sim_core.js +++ b/js/sim_core.js @@ -64,19 +64,189 @@ function stableUnit(seed, salt = "") { return ((h >>> 0) % 100000) / 100000; } -const PERSONALITIES = { - timid: { label: "\u81c6\u75c5", desc: "\u9003\u3052\u3084\u3059\u304f\u3001\u55a7\u5629\u3092\u907f\u3051\u308b", fear: 1.42, fight: 0.48, social: 0.96, relation: 1.04, sleep: 1.00, zunda: 1.00, play: 0.78 }, - glutton: { label: "\u98df\u3044\u3057\u3093\u574a", desc: "\u305a\u3093\u3060\u9905\u3092\u512a\u5148\u3057\u3084\u3059\u3044", fear: 0.92, fight: 0.82, social: 1.00, relation: 1.00, sleep: 0.95, zunda: 1.42, play: 0.84 }, - sleepy: { label: "\u7720\u305f\u304c\u308a", desc: "\u65e9\u3081\u306b\u5bdd\u5e8a\u3078\u5411\u304b\u3046", fear: 0.96, fight: 0.72, social: 0.92, relation: 0.96, sleep: 1.34, zunda: 0.92, play: 0.68 }, - lonely: { label: "\u5bc2\u3057\u304c\u308a", desc: "\u4ed6\u306e\u305f\u308a\u306a\u3044\u3078\u5bc4\u308a\u3084\u3059\u3044", fear: 1.02, fight: 0.70, social: 1.34, relation: 1.38, sleep: 0.96, zunda: 1.00, play: 1.08 }, - irritable: { label: "\u6012\u308a\u3063\u307d\u3044", desc: "\u55a7\u5629\u304c\u8d77\u304d\u3084\u3059\u3044", fear: 0.82, fight: 1.82, social: 0.78, relation: 0.78, sleep: 0.90, zunda: 0.94, play: 0.82 }, - playful: { label: "\u904a\u3073\u597d\u304d", desc: "\u30dc\u30fc\u30eb\u3084\u52d5\u304f\u3082\u306e\u306b\u5f15\u304d\u5bc4\u305b\u3089\u308c\u3084\u3059\u3044", fear: 0.92, fight: 0.74, social: 1.10, relation: 1.04, sleep: 0.94, zunda: 0.96, play: 1.72 }, - calm: { label: "\u30de\u30a4\u30da\u30fc\u30b9", desc: "\u53cd\u5fdc\u304c\u7a4f\u3084\u304b\u3067\u5b89\u5b9a\u3057\u3084\u3059\u3044", fear: 0.82, fight: 0.58, social: 1.02, relation: 1.08, sleep: 1.02, zunda: 0.94, play: 0.86 }, -}; -const PERSONALITY_IDS = Object.keys(PERSONALITIES); +// Legacy named personalities were removed. Keep these stubs only so old save data +// and old UI fallback references cannot revive the pre-four-axis personality model. +const PERSONALITIES = Object.freeze({}); +const PERSONALITY_IDS = []; function personalityForSeed(seed) { - return stableChoice(seed, "personality", PERSONALITY_IDS) || "calm"; + return ""; +} + +const PERSONALITY_KEYS = ["aggression", "openness", "sociability", "neuroticism"]; +const PERSONALITY_DAILY_LIMIT = { perAxis: 0.08, total: 0.20 }; +const FRIEND_AFFINITY_THRESHOLD = 16; +const PERSONALITY_LABELS = { + aggression: { label: "\u653b\u6483\u6027", low: "\u304a\u3060\u3084\u304b", high: "\u6012\u308a\u3063\u307d\u3044" }, + openness: { label: "\u958b\u653e\u6027", low: "\u4fdd\u5b88\u7684", high: "\u904a\u3073\u597d\u304d" }, + sociability: { label: "\u793e\u4ea4\u6027", low: "\u4e00\u4eba\u597d\u304d", high: "\u4ef2\u9593\u597d\u304d" }, + neuroticism: { label: "\u795e\u7d4c\u8cea\u6027", low: "\u7121\u9813\u7740", high: "\u7e4a\u7d30" }, +}; + +function clampPersonalityValue(value) { + return clamp(Number(value) || 0, -1, 1); +} + +function normalizePersonality(source = null) { + const out = {}; + for (const key of PERSONALITY_KEYS) out[key] = clampPersonalityValue(source?.[key]); + return out; +} + +function randomBirthPersonality(seed = "") { + const out = {}; + for (const key of PERSONALITY_KEYS) out[key] = clampPersonalityValue(stableUnit(seed, `personality-${key}`) * 1.2 - 0.6); + return out; +} + +function personalityFromParents(a, b) { + const pa = ensurePersonality(a).currentPersonality; + const pb = ensurePersonality(b).currentPersonality; + const out = {}; + for (const key of PERSONALITY_KEYS) out[key] = clampPersonalityValue(((pa[key] || 0) + (pb[key] || 0)) / 2 + rand(-0.2, 0.2)); + return out; +} + +function getTraitStrength(value) { + const v = clampPersonalityValue(value); + if (v >= 0.75) return { direction: 1, strength: "strong" }; + if (v >= 0.5) return { direction: 1, strength: "slight" }; + if (v <= -0.75) return { direction: -1, strength: "strong" }; + if (v <= -0.5) return { direction: -1, strength: "slight" }; + return { direction: 0, strength: "neutral" }; +} + +function personalityBand(value) { + const t = getTraitStrength(value); + return t.direction === 0 ? "neutral" : `${t.direction > 0 ? "high" : "low"}-${t.strength}`; +} + +function personalityEffectValue(value) { + const trait = getTraitStrength(value); + if (!trait.direction) return 0; + return trait.direction * (trait.strength === "strong" ? 1 : 0.5); +} + +function personalityReasonText(reason = "") { + const key = String(reason || "").replace(/[.\u3002]+$/g, "").trim(); + const map = { + "after winning fights": "\u55a7\u5629\u306b\u52dd\u3063\u305f\u5f71\u97ff\u3067", + "after losing fights": "\u55a7\u5629\u306b\u8ca0\u3051\u305f\u5f71\u97ff\u3067", + "after being petted": "\u64ab\u3067\u3089\u308c\u305f\u5f71\u97ff\u3067", + "after staying near family": "\u89aa\u5b50\u306e\u8fd1\u304f\u3067\u904e\u3054\u3057\u305f\u5f71\u97ff\u3067", + "after staying near friends": "\u53cb\u9054\u306e\u8fd1\u304f\u3067\u904e\u3054\u3057\u305f\u5f71\u97ff\u3067", + "after having no friends": "\u53cb\u9054\u304c\u3044\u306a\u3044\u6642\u9593\u304c\u7d9a\u3044\u305f\u5f71\u97ff\u3067", + "after repeated contact with poop": "\u305a\u3093\u3061\u306b\u6163\u308c\u305f\u5f71\u97ff\u3067", + "after repeated contact with corpses": "\u6b7b\u9ab8\u306b\u6163\u308c\u305f\u5f71\u97ff\u3067", + "after being hurt": "\u75db\u307f\u3092\u899a\u3048\u305f\u5f71\u97ff\u3067", + }; + return map[key] || key; +} + +function personalityBecomeText(label = "") { + const text = String(label || ""); + if (text === "\u6012\u308a\u3063\u307d\u3044") return "\u6012\u308a\u3063\u307d\u304f"; + return text; +} + +function personalityAppearanceText(label = "") { + const text = String(label || ""); + if (text === "\u6012\u308a\u3063\u307d\u3044") return "\u6012\u308a\u3063\u307d\u3044\u69d8\u5b50"; + return `${text}\u306a\u69d8\u5b50`; +} + +function getPersonalityTraitTags(tarinai) { + const p = ensurePersonality(tarinai).currentPersonality; + const tags = []; + for (const key of PERSONALITY_KEYS) { + const trait = getTraitStrength(p[key]); + if (!trait.direction) continue; + const label = PERSONALITY_LABELS[key]?.[trait.direction > 0 ? "high" : "low"] || key; + tags.push(trait.strength === "slight" ? `\u5c11\u3057${label}` : label); + } + const cowardly = (p.neuroticism || 0) >= 0.75 && (p.aggression || 0) <= -0.5; + if (cowardly && !tags.includes("\u81c6\u75c5")) tags.push("\u81c6\u75c5"); + return tags; +} + +function personalityDailyState(tarinai) { + const day = tarinai?.world?.day || 1; + const state = tarinai.personalityDaily || {}; + if (state.day !== day) { + tarinai.personalityDaily = { day, total: 0, byKey: {} }; + return tarinai.personalityDaily; + } + state.byKey = state.byKey || {}; + for (const key of Object.keys(state.byKey)) { + const v = state.byKey[key]; + if (typeof v === "number") state.byKey[key] = { up: Math.max(0, v), down: Math.max(0, -v) }; + else state.byKey[key] = { up: Math.max(0, Number(v?.up) || 0), down: Math.max(0, Number(v?.down) || 0) }; + } + state.total = Math.max(0, Number(state.total) || 0); + tarinai.personalityDaily = state; + return state; +} + +function ensurePersonality(tarinai) { + if (!tarinai) return { birthPersonality: normalizePersonality(), currentPersonality: normalizePersonality() }; + if (!tarinai.birthPersonality) tarinai.birthPersonality = randomBirthPersonality(tarinai.id || Math.random()); + tarinai.birthPersonality = normalizePersonality(tarinai.birthPersonality); + tarinai.currentPersonality = normalizePersonality(tarinai.currentPersonality || tarinai.birthPersonality); + personalityDailyState(tarinai); + return { birthPersonality: tarinai.birthPersonality, currentPersonality: tarinai.currentPersonality }; +} + +function personalityThresholdLogText(tarinai, key, value, reason = "", previousBand = "") { + const trait = getTraitStrength(value); + const name = tarinai?.name || "\u305f\u308a\u306a\u3044"; + if (!trait.direction) { + const oldSide = String(previousBand).startsWith("low") ? "low" : "high"; + const oldLabel = PERSONALITY_LABELS[key]?.[oldSide] || key; + return `\u300c${name}\u300d\u306f${personalityAppearanceText(oldLabel)}\u304c\u76ee\u7acb\u305f\u306a\u304f\u306a\u3063\u305f\u3002`; + } + const label = PERSONALITY_LABELS[key]?.[trait.direction > 0 ? "high" : "low"] || key; + const visible = trait.strength === "slight" ? `\u5c11\u3057${personalityBecomeText(label)}` : personalityBecomeText(label); + const prefix = personalityReasonText(reason); + return `\u300c${name}\u300d\u306f${prefix ? `${prefix}\u3001` : ""}${visible}\u306a\u3063\u305f\u3002`; +} + +function adjustPersonality(tarinai, key, delta, reason = "") { + if (!tarinai || !PERSONALITY_KEYS.includes(key)) return 0; + ensurePersonality(tarinai); + const requested = Number(delta) || 0; + if (!requested) return 0; + const state = personalityDailyState(tarinai); + const dir = Math.sign(requested); + const used = state.byKey[key] || { up: 0, down: 0 }; + const dirKey = dir > 0 ? "up" : "down"; + const keyRoom = Math.max(0, PERSONALITY_DAILY_LIMIT.perAxis - (used[dirKey] || 0)); + const totalRoom = Math.max(0, PERSONALITY_DAILY_LIMIT.total - (state.total || 0)); + const allowed = Math.min(Math.abs(requested), keyRoom, totalRoom); + if (allowed <= 0) return 0; + const before = tarinai.currentPersonality[key] || 0; + const beforeBand = personalityBand(before); + const applied = dir * allowed; + const after = clampPersonalityValue(before + applied); + const actual = after - before; + if (!actual) return 0; + tarinai.currentPersonality[key] = after; + state.byKey[key] = used; + used[actual > 0 ? "up" : "down"] = (used[actual > 0 ? "up" : "down"] || 0) + Math.abs(actual); + state.total = (state.total || 0) + Math.abs(actual); + const afterBand = personalityBand(after); + if (beforeBand !== afterBand) { + const text = personalityThresholdLogText(tarinai, key, after, reason, beforeBand); + tarinai.world?.log?.(text, "observe"); + tarinai.addRecord?.(text, "observe"); + } + return actual; +} + +function shouldApplyPersonalityBehavior(tarinai, key, direction = 1) { + const p = ensurePersonality(tarinai).currentPersonality; + const trait = getTraitStrength(p[key]); + if (trait.direction !== Math.sign(direction || 1)) return false; + return trait.strength === "strong" || Math.random() < 0.5; } function relationDefaults() { @@ -321,4 +491,3 @@ function drawHeartShape(ctx, x, y, size, opts = {}) { ctx.stroke(); ctx.restore(); } - diff --git a/js/tarinai.js b/js/tarinai.js index 84b6eb1..3cfdd80 100644 --- a/js/tarinai.js +++ b/js/tarinai.js @@ -19,19 +19,23 @@ class Tarinai { this.world = world; this.id = opts.id || (crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}`); this.name = opts.name || makeName(world); - this.personality = opts.personality || personalityForSeed(this.id); + // Legacy string personality is intentionally ignored. The game now uses only the four-axis personality model. + this.personality = ""; this.type = opts.type || baseSpriteId(); const typeMeta = SPRITES.find(s => s.id === this.type); if (typeMeta?.actionOnly || typeMeta?.displayOnly) this.type = baseSpriteId(); + this.birthPersonality = normalizePersonality(opts.birthPersonality || opts.personalityBirth); + if (!opts.birthPersonality && !opts.personalityBirth) this.birthPersonality = randomBirthPersonality(this.id); + this.currentPersonality = normalizePersonality(opts.currentPersonality || opts.personalityCurrent || this.birthPersonality); + this.personalityDaily = opts.personalityDaily && typeof opts.personalityDaily === "object" ? JSON.parse(JSON.stringify(opts.personalityDaily)) : null; + ensurePersonality(this); this.trait = makeTrait(this.type); - const pdef = PERSONALITIES[this.personality] || PERSONALITIES.calm; - this.trait.social *= pdef.social ?? 1; - this.trait.stress /= pdef.fear ?? 1; - this.trait.sleep *= pdef.sleep ?? 1; this.x = opts.x ?? rand(100, world.w - 100); this.y = opts.y ?? rand(100, world.h - 100); this.vx = opts.vx ?? rand(-12, 12); this.vy = opts.vy ?? rand(-12, 12); + this.impulseVx = opts.impulseVx ?? 0; + this.impulseVy = opts.impulseVy ?? 0; this.scale = opts.scale ?? rand(0.22, 0.33); this.radius = 56 * this.scale; this.age = opts.age ?? rand(0, 20); @@ -109,6 +113,11 @@ class Tarinai { this.fightDiseaseCooldown = opts.fightDiseaseCooldown ?? 0; this.lastBleedAt = opts.lastBleedAt ?? -999; this.favorite = Boolean(opts.favorite); + this.insideNestBoxId = opts.insideNestBoxId || null; + this.nestFade = opts.nestFade ?? (this.insideNestBoxId ? 1 : 0); + this.nestBoxEnteredAt = opts.nestBoxEnteredAt ?? (this.insideNestBoxId ? (world?.time || 0) : -Infinity); + this.nestBoxStayUntil = opts.nestBoxStayUntil ?? (this.insideNestBoxId ? ((world?.time || 0) + 10) : -Infinity); + this.focusPulseTimer = opts.focusPulseTimer ?? 0; if (this.isZunchiSlave) this.name = "\u305a\u3093\u3061\u3069\u308c\u3044"; this.tempComfort = opts.tempComfort ?? 0.62; this.tempTimer = opts.tempTimer ?? stableUnit(this.id, "temp-start") * 0.55; @@ -167,7 +176,7 @@ class Tarinai { birthRitualRole: this.birthRitualRole, birthRitualLeader: this.birthRitualLeader, pokeFlashTimer: this.pokeFlashTimer, zunchiStain: this.zunchiStain, zunchiStainSeed: this.zunchiStainSeed, totalFightLosses: this.totalFightLosses, totalFightWins: this.totalFightWins, isZunchiSlave: this.isZunchiSlave, formerName: this.formerName, loveMochiTimer: this.loveMochiTimer, fightMochiTimer: this.fightMochiTimer, - sleepDisease: this.sleepDisease, sleepDiseaseCooldown: this.sleepDiseaseCooldown, explosionDisease: this.explosionDisease, explosionDiseaseTimer: this.explosionDiseaseTimer, fightDisease: this.fightDisease, fightDiseaseCooldown: this.fightDiseaseCooldown, lastBleedAt: this.lastBleedAt, favorite: this.favorite, insideNestBoxId: this.insideNestBoxId || null, nestFade: this.nestFade || 0, sleepDiseaseAnchorX: this.sleepDiseaseAnchorX, sleepDiseaseAnchorY: this.sleepDiseaseAnchorY, records: this.records ? this.records.slice(0, 42) : [], + sleepDisease: this.sleepDisease, sleepDiseaseCooldown: this.sleepDiseaseCooldown, explosionDisease: this.explosionDisease, explosionDiseaseTimer: this.explosionDiseaseTimer, fightDisease: this.fightDisease, fightDiseaseCooldown: this.fightDiseaseCooldown, lastBleedAt: this.lastBleedAt, favorite: this.favorite, insideNestBoxId: this.insideNestBoxId || null, nestFade: this.nestFade || 0, nestBoxEnteredAt: this.nestBoxEnteredAt, nestBoxStayUntil: this.nestBoxStayUntil, focusPulseTimer: this.focusPulseTimer || 0, sleepDiseaseAnchorX: this.sleepDiseaseAnchorX, sleepDiseaseAnchorY: this.sleepDiseaseAnchorY, records: this.records ? this.records.slice(0, 42) : [], zunchiDisease: this.zunchiDisease, zunchiDiseaseSeverity: this.zunchiDiseaseSeverity, zunchiDiseaseCooldown: this.zunchiDiseaseCooldown, tempComfort: this.tempComfort, tempTimer: this.tempTimer, parents: this.parents, parentNames: this.parentNames, children: this.children, birthTime: this.birthTime, @@ -176,7 +185,8 @@ class Tarinai { nextHeadbutt: this.nextHeadbutt, digest: this.digest, poopCount: this.poopCount, stretchTimer: this.stretchTimer, grassEatTimer: this.grassEatTimer, hurtTimer: this.hurtTimer, defeatedTimer: this.defeatedTimer, defeatedById: this.defeatedById, fightWinnerId: this.fightWinnerId, - relationships: this.relationships, personality: this.personality, fallTimer: this.fallTimer, fallMax: this.fallMax, fallDir: this.fallDir, + relationships: this.relationships, fallTimer: this.fallTimer, fallMax: this.fallMax, fallDir: this.fallDir, + birthPersonality: normalizePersonality(this.birthPersonality), currentPersonality: normalizePersonality(this.currentPersonality), personalityDaily: this.personalityDaily || null, blastSpinTimer: this.blastSpinTimer, blastSpinMax: this.blastSpinMax, postBirthPeaceTimer: this.postBirthPeaceTimer, lastMealColor: this.lastMealColor, aiTimer: this.aiTimer, envTimer: this.envTimer, nextCursorHeartAt: this.nextCursorHeartAt, cursorPetting: this.cursorPetting, entryTimer: this.entryTimer || 0, @@ -225,9 +235,9 @@ class Tarinai { } - addRecord(text, kind = "note") { + addRecord(text, kind = "note", options = {}) { if (!text) return; - if (this.world?.shouldHideFromObservationRecords?.(text)) return; + if (options.hiddenFromObservation) return; if (!Array.isArray(this.records)) this.records = []; const entry = { time: this.world?.time || 0, text: String(text), kind: kind || "note" }; const head = this.records[0]; @@ -237,13 +247,33 @@ class Tarinai { } personalityProfile() { - return PERSONALITIES[this.personality] || PERSONALITIES.calm; + const base = { label: "\u4e2d\u7acb", fear: 1, fight: 1, social: 1, relation: 1, sleep: 1, zunda: 1, play: 1 }; + const p = ensurePersonality(this).currentPersonality; + const e = { + neuroticism: personalityEffectValue(p.neuroticism), + aggression: personalityEffectValue(p.aggression), + sociability: personalityEffectValue(p.sociability), + openness: personalityEffectValue(p.openness), + }; + return { + ...base, + fear: clamp((base.fear || 1) * (1 + e.neuroticism * 0.38), 0.55, 1.85), + fight: clamp((base.fight || 1) * (1 + e.aggression * 0.55), 0.35, 2.35), + social: clamp((base.social || 1) * (1 + e.sociability * 0.24), 0.62, 1.52), + relation: clamp((base.relation || 1) * (1 + e.sociability * 0.24), 0.62, 1.60), + play: clamp((base.play || 1) * (1 + e.openness * 0.45), 0.45, 2.10), + }; } personalityLabel() { - return this.personalityProfile().label || this.personality || "\u4e0d\u660e"; + const tags = getPersonalityTraitTags(this); + return tags.length ? tags.join(" / ") : "\u4e2d\u7acb"; } + personalityTags() { return getPersonalityTraitTags(this); } + adjustPersonality(key, delta, reason = "") { return adjustPersonality(this, key, delta, reason); } + shouldApplyPersonalityBehavior(key, direction = 1) { return shouldApplyPersonalityBehavior(this, key, direction); } + fightWinCount() { return this.totalFightWins || 0; } @@ -253,17 +283,17 @@ class Tarinai { } maybeBecomeTimidAfterDamage(cause = "") { - if (this.dead || this.personality === "timid") return false; + if (this.dead) return false; const losses = this.totalFightLosses || 0; const wins = this.totalFightWins || 0; if (losses <= wins) return false; if (Math.random() >= 0.05) return false; - this.personality = "timid"; + const changedA = this.adjustPersonality?.("neuroticism", 0.025, "after being hurt") || 0; + const changedB = this.adjustPersonality?.("aggression", -0.015, "after being hurt") || 0; this.fearTimer = Math.max(this.fearTimer || 0, 1.2); this.stress = clamp((this.stress || 0) + 5, 0, 130); - this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.35, "こわい…", "rgba(90,80,120,0.78)"); - this.addRecord?.(`${this.name}は痛みで臆病になった。`, "health"); - return true; + this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.35, "\u3053\u308f\u3044\u2026", "rgba(90,80,120,0.78)"); + return Boolean(changedA || changedB); } relationTo(id) { @@ -285,7 +315,7 @@ class Tarinai { strongestRelation(kind = "friend") { let bestId = null; - let bestScore = kind === "fear" ? 5 : 8; + let bestScore = kind === "fear" ? 5 : FRIEND_AFFINITY_THRESHOLD; for (const [id, rel] of Object.entries(this.relationships || {})) { const score = kind === "fear" ? (rel.fear || 0) : (rel.affinity || 0); if (score > bestScore) { bestId = id; bestScore = score; } @@ -299,7 +329,23 @@ class Tarinai { return { friend, fear }; } - bestFriendLive(minScore = 10, maxDist = Infinity) { + currentFriendCount(minScore = FRIEND_AFFINITY_THRESHOLD, liveOnly = true) { + let count = 0; + const liveIds = liveOnly ? new Set((this.world?.tarinai || []).filter(o => o && !o.dead && o !== this).map(o => o.id)) : null; + for (const [id, rel] of Object.entries(this.relationships || {})) { + if ((rel.affinity || 0) <= minScore) continue; + if (liveIds && !liveIds.has(id)) continue; + count += 1; + } + return count; + } + + sociabilityFriendScale() { + const friends = this.currentFriendCount ? this.currentFriendCount(FRIEND_AFFINITY_THRESHOLD, true) : 0; + return clamp(0.82 + Math.min(6, friends) * 0.16, 0.82, 1.78); + } + + bestFriendLive(minScore = FRIEND_AFFINITY_THRESHOLD, maxDist = Infinity) { let best = null, bestScore = minScore; for (const [id, rel] of Object.entries(this.relationships || {})) { const score = rel.affinity || 0; @@ -369,6 +415,24 @@ class Tarinai { normalizeDeathReason(reason = "", opts = {}) { return HEALTH.normalizeDeathReason(this, reason, opts); } damage(amount, reason = "") { return HEALTH.applyDamage(this, amount, reason); } + wakeFromDamage(reason = "") { + if (this.dead) return false; + const wasSleeping = this.state === "sleep" || this.sleeping || this.insideNestBoxId; + if (!wasSleeping) return false; + const box = this.nestBoxById ? this.nestBoxById(this.insideNestBoxId) : null; + this.sleeping = false; + this.state = "panic"; + this.target = null; + this.thought = "\u30c0\u30e1\u30fc\u30b8\u3067\u76ee\u304c\u899a\u3081\u305f"; + this.fearTimer = Math.max(this.fearTimer || 0, 0.85); + this.hurtTimer = Math.max(this.hurtTimer || 0, 1.2); + this.nestBoxStayUntil = -Infinity; + if (this.insideNestBoxId) this.leaveNestBox(box); + this.vx += rand(-34, 34); + this.vy += rand(-26, 8); + return true; + } + recoverHealth(amount) { if (this.dead) return; this.energy = clamp(this.energy + Math.max(0, amount || 0), 0, 100); @@ -406,7 +470,7 @@ class Tarinai { } targetIgnoresFence(target = this.target) { - return Boolean(target?.type === "sweet" || this.state === "panic" || this.state === "fight" || this.state === "intimidate" || this.state === "birth_ritual" || this.state === "cursor_enemy"); + return Boolean(target?.type === "sweet" || target?.type === "nest_box" || (target?.type === "bed" && (this.state === "seek_bed" || this.state === "sleep")) || this.state === "panic" || this.state === "fight" || this.state === "intimidate" || this.state === "birth_ritual" || this.state === "cursor_enemy"); } shouldAvoidTarget(target) { @@ -647,9 +711,9 @@ class Tarinai { this.fightDisease = true; this.fightDiseaseCooldown = 18; this.fearTimer = Math.max(this.fearTimer || 0, 0.35); - this.thought = "きずつき病\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + this.thought = "\u304d\u305a\u3064\u304d\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.20, "?", "rgba(150,78,44,0.80)"); - this.world?.log?.(`${this.name}\u306fきずつき病\u3092\u767a\u75c7\u3057\u305f\u3002`, "fight"); + this.world?.log?.(`${this.name}\u306f\u304d\u305a\u3064\u304d\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "fight"); return true; } @@ -657,10 +721,10 @@ class Tarinai { if (!this.fightDisease) return false; this.fightDisease = false; this.fightDiseaseCooldown = 20; - this.thought = reason || "きずつき病\u304c\u6cbb\u3063\u305f"; + this.thought = reason || "\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f"; this.stress = clamp(this.stress - 12, 0, 130); this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "\u306f\u3046", "rgba(82,126,88,0.76)"); - this.world?.log?.(`${this.name}\u306eきずつき病\u304c\u6cbb\u3063\u305f\u3002`, "fight"); + this.world?.log?.(`${this.name}\u306e\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "fight"); return true; } @@ -684,34 +748,112 @@ class Tarinai { return true; } - updateNestBoxPresence(dt = 0) { - const previous = this.insideNestBoxId || null; - let box = null; - if (previous) box = this.world?.items?.find?.(it => it && !it.dead && it.id === previous && it.type === "nest_box") || null; - if (!box && this.target && !this.target.dead && this.target.type === "nest_box") box = this.target; - if (!box) { - this.insideNestBoxId = null; - this.nestFade = clamp((this.nestFade || 0) - dt * 1.8, 0, 1); - return null; - } - const d = distXY(this.x, this.y, box.x, box.y); - const occupants = this.world?.nestBoxOccupants ? this.world.nestBoxOccupants(box, Infinity) : []; + nestBoxById(id) { + if (!id) return null; + return this.world?.items?.find?.(it => it && !it.dead && it.id === id && it.type === "nest_box") || null; + } + + isInsideNestBox() { + return Boolean(this.insideNestBoxId); + } + + wantsNestBox(box = null) { + if (!box || box.dead || box.type !== "nest_box") return false; + if (this.insideNestBoxId === box.id && (this.world?.time || 0) < (this.nestBoxStayUntil || -Infinity)) return true; + if (!(this.state === "sleep" || this.state === "seek_bed")) return false; + return this.target === box || this.insideNestBoxId === box.id; + } + + enterNestBox(box, dt = 0.016) { + if (!box || box.dead || box.type !== "nest_box" || this.dead) return false; const capacity = this.world?.nestBoxCapacity ? this.world.nestBoxCapacity(box) : 5; - const occupantIndex = occupants.indexOf(this); - const hasRoom = occupantIndex >= 0 ? occupantIndex < capacity : occupants.length < capacity; - const canEnter = hasRoom && (this.state === "sleep" || this.state === "seek_bed") && d <= Math.max(18, box.r * 0.58); - if (canEnter) { - this.insideNestBoxId = box.id; - this.nestFade = clamp((this.nestFade || 0) + dt * 2.4, 0, 1); - const pull = clamp(dt * 4.2, 0, 1); - this.x = lerp(this.x, box.x, pull); - this.y = lerp(this.y, box.y, pull); - this.vx *= Math.pow(0.45, dt * 60); - this.vy *= Math.pow(0.45, dt * 60); - return box; + const occupants = this.world?.nestBoxOccupants ? this.world.nestBoxOccupants(box, Infinity) : []; + const alreadyInside = this.insideNestBoxId === box.id; + if (!alreadyInside && occupants.length >= capacity) return false; + if (!alreadyInside) { + this.nestBoxEnteredAt = this.world?.time || 0; + this.nestBoxStayUntil = Math.max(this.nestBoxStayUntil || -Infinity, (this.world?.time || 0) + 14); + } + this.insideNestBoxId = box.id; + this.target = box; + if (this.state === "seek_bed") this.state = "sleep"; + if (this.state === "sleep") this.sleeping = true; + const inner = this.world?.nestBoxInnerPoint ? this.world.nestBoxInnerPoint(box, this) : { x: box.x, y: box.y }; + const pull = clamp(dt * (alreadyInside ? 10.0 : 13.5), 0, 1); + this.x = lerp(this.x, inner.x, pull); + this.y = lerp(this.y, inner.y, pull); + if (this.nestFade >= 0.88 || distXY(this.x, this.y, inner.x, inner.y) < 3.5) { + this.x = inner.x; + this.y = inner.y; + } + this.nestFade = clamp((this.nestFade || 0) + dt * 5.8, 0, 1); + this.vx = 0; + this.vy = 0; + this.impulseVx = 0; + this.impulseVy = 0; + return true; + } + + leaveNestBox(box = null) { + const b = box || this.nestBoxById(this.insideNestBoxId); + if (b && this.world?.nestBoxEntryPoint) { + const entry = this.world.nestBoxExitPoint ? this.world.nestBoxExitPoint(b, this) : this.world.nestBoxEntryPoint(b); + this.x = clamp(entry.x, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding); + this.y = clamp(entry.y, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding); + this.vx = rand(-8, 8); + this.vy = rand(6, 18); } this.insideNestBoxId = null; - this.nestFade = clamp((this.nestFade || 0) - dt * 1.8, 0, 1); + this.nestFade = 0; + this.nestBoxEnteredAt = -Infinity; + this.nestBoxStayUntil = -Infinity; + return true; + } + + updateNestBoxPresence(dt = 0) { + const currentBox = this.nestBoxById(this.insideNestBoxId); + const targetBox = this.target && !this.target.dead && this.target.type === "nest_box" ? this.target : null; + const box = currentBox || targetBox; + if (!box) { + this.insideNestBoxId = null; + this.nestFade = clamp((this.nestFade || 0) - dt * 3.0, 0, 1); + return null; + } + + if (currentBox && !this.wantsNestBox(currentBox)) { + this.leaveNestBox(currentBox); + return null; + } + + if (currentBox) { + if ((this.world?.time || 0) < (this.nestBoxStayUntil || -Infinity)) { + this.state = "sleep"; + this.sleeping = true; + this.target = currentBox; + } + this.enterNestBox(currentBox, dt); + return currentBox; + } + + if (!this.wantsNestBox(targetBox)) { + this.nestFade = clamp((this.nestFade || 0) - dt * 3.0, 0, 1); + return null; + } + + const entry = this.world?.nestBoxEntryPoint ? this.world.nestBoxEntryPoint(targetBox) : { x: targetBox.x, y: targetBox.y }; + const base = this.world?.nestBoxBaseRect ? this.world.nestBoxBaseRect(targetBox) : null; + const r = targetBox.r || 42; + const entryD = distXY(this.x, this.y, entry.x, entry.y); + const centerD = distXY(this.x, this.y, targetBox.x, targetBox.y); + const inDoorColumn = base && this.x >= base.left + r * 0.18 && this.x <= base.right - r * 0.18 && this.y >= base.top + r * 0.06 && this.y <= base.bottom + r * 0.48; + const captureRange = Math.max(118, r * 2.05, this.radius + 82); + const nearEnough = entryD <= captureRange || centerD <= Math.max(104, r * 1.90) || inDoorColumn; + if (nearEnough) { + this.enterNestBox(targetBox, dt || 0.016); + return targetBox; + } + + this.nestFade = clamp((this.nestFade || 0) - dt * 3.0, 0, 1); return null; } @@ -756,7 +898,7 @@ class Tarinai { if (this.recoverZunchiDisease("\u81ea\u7136\u306b\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u81ea\u7136\u306b\u6cbb\u3063\u305f\u3002`, "accident"); } if (this.fightDisease && Math.random() < dt * 0.00070 * (this.energy > 58 ? 1.4 : 1.0)) { - this.recoverFightDisease("\u81ea\u7136\u306bきずつき病\u304c\u6cbb\u3063\u305f"); + this.recoverFightDisease("\u81ea\u7136\u306b\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f"); } if (this.fightDisease) { this.stress = clamp(this.stress + dt * 0.16, 0, 130); @@ -849,7 +991,7 @@ class Tarinai { if (["fight", "panic", "cursor_enemy", "hurt", "defeated", "fight_sick"].includes(this.state)) return false; if ((this.fearTimer || 0) > 0.18 || (this.intimidatedTimer || 0) > 0.04 || (this.intimidateTimer || 0) > 0.04) return false; if (this.mood < 46 || this.stress > 64) return false; - return this.affection > 12 || this.mood > 58 || this.goodMode === "smile" || ["lonely", "calm", "playful", "teary", "cry"].includes(this.personality); + return this.affection > 12 || this.mood > 58 || this.goodMode === "smile" || this.shouldApplyPersonalityBehavior("sociability", 1); } applyCursorContactCare(dt) { @@ -861,6 +1003,7 @@ class Tarinai { const p = clamp(1 - d / touch, 0, 1); const relief = dt * (1.35 + 2.65 * p); this.stress = clamp((this.stress || 0) - relief, 0, 130); + this.adjustPersonality("openness", dt * 0.006 * (0.4 + p), "after being petted."); this.moodLiftTimer = Math.max(this.moodLiftTimer || 0, 0.5); this.cursorPetting = clamp((this.cursorPetting || 0) + dt * (1.0 + p * 2.4), 0, 1.75); this.goodMode = "smile"; @@ -914,6 +1057,7 @@ class Tarinai { } } this.pokeFlashTimer = Math.max(0, this.pokeFlashTimer - dt); + this.focusPulseTimer = Math.max(0, (this.focusPulseTimer || 0) - dt); this.cursorPetting = Math.max(0, this.cursorPetting - dt * 1.2); if (this.freezeSleepDiseaseMotion(dt)) { this.checkLife(dt); @@ -1035,9 +1179,16 @@ class Tarinai { if (parent && dist(this, parent) < 96) { this.stress = clamp(this.stress - dt * 0.42, 0, 130); this.loneliness = clamp(this.loneliness - dt * 0.32, 0, 110); + this.adjustPersonality("sociability", dt * 0.004 * this.sociabilityFriendScale(), "after staying near family."); + } + const friend = this.bestFriendLive ? this.bestFriendLive(FRIEND_AFFINITY_THRESHOLD, 92) : null; + const friendCount = this.currentFriendCount ? this.currentFriendCount(FRIEND_AFFINITY_THRESHOLD, true) : 0; + if (friend) { + this.stress = clamp(this.stress - dt * 0.36, 0, 130); + this.adjustPersonality("sociability", dt * 0.004 * this.sociabilityFriendScale(), "after staying near friends."); + } else if (friendCount <= 0 && this.loneliness > 72 && this.age > 8) { + this.adjustPersonality("sociability", -dt * 0.0018, "after having no friends."); } - const friend = this.bestFriendLive ? this.bestFriendLive(12, 92) : null; - if (friend) this.stress = clamp(this.stress - dt * 0.36, 0, 130); let grassComfort = 0; for (const it of this.world.nearbyItems(this.x, this.y, 105)) { if (it.type !== "grass" || it.dead) continue; @@ -1054,7 +1205,7 @@ class Tarinai { if (grassComfort > 0) { this.stress = clamp(this.stress - dt * Math.min(0.32, grassComfort * 0.08), 0, 130); if (this.state === "panic") this.fearTimer = Math.max(0, this.fearTimer - dt * Math.min(0.22, grassComfort * 0.06)); - if (this.need === "\u9759\u3051\u3055" || this.personality === "timid") this.affection += dt * Math.min(0.06, grassComfort * 0.012); + if (this.need === "\u9759\u3051\u3055" || this.shouldApplyPersonalityBehavior("neuroticism", 1)) this.affection += dt * Math.min(0.06, grassComfort * 0.012); } } @@ -1080,10 +1231,44 @@ class Tarinai { return target?.type === "nest_box" ? "\u5de3\u7bb1" : "\u5e72\u8349\u5bdd\u5e8a"; } + isServingFoodItem(it) { + return Boolean(it && typeof isServingFoodType === "function" && isServingFoodType(it.type)); + } + + foodItemHasServingLeft(it) { + if (!it || it.dead) return false; + if (!this.isServingFoodItem(it)) return (it.amount || 0) > 1.2; + this.ensureFoodServings(it); + return (it.foodServingsRemaining || 0) > 0; + } + + ensureFoodServings(it) { + if (!this.isServingFoodItem(it)) return; + const max = typeof foodServingsForSize === "function" ? foodServingsForSize(it.toolSize || "medium") : 5; + if (!Number.isFinite(it.foodServingsMax) || it.foodServingsMax <= 0) it.foodServingsMax = max; + if (!Number.isFinite(it.foodServingsRemaining)) { + const original = { food: 85, sweet: 62, love_mochi: 62, fight_mochi: 62, sleep_drug: 58 }[it.type] || 62; + const ratio = clamp((it.amount ?? original) / original, 0.05, 1); + it.foodServingsRemaining = Math.max(1, Math.ceil(it.foodServingsMax * ratio)); + } + it.foodServingsRemaining = clamp(it.foodServingsRemaining, 0, it.foodServingsMax); + it.amount = it.foodServingsRemaining; + } + + consumeFoodServing(it, nutrition) { + this.ensureFoodServings(it); + if (!this.isServingFoodItem(it) || (it.foodServingsRemaining || 0) <= 0) return 0; + it.foodServingsRemaining = Math.max(0, (it.foodServingsRemaining || 0) - 1); + it.amount = it.foodServingsRemaining; + return nutrition; + } + sleepSpotFor(bed) { if (!bed) return { x: this.x, y: this.y }; if (bed.type === "nest_box") { - return { x: clamp(bed.x, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding), y: clamp(bed.y, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding) }; + if (this.insideNestBoxId === bed.id && this.world?.nestBoxInnerPoint) return this.world.nestBoxInnerPoint(bed, this); + if (this.world?.nestBoxEntryPoint) return this.world.nestBoxEntryPoint(bed); + return { x: clamp(bed.x, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding), y: clamp(bed.y + (bed.r || 42) * 0.24, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding) }; } const angle = stableUnit(this.id, `bed-angle-${bed.id || bed.seed || "bed"}`) * Math.PI * 2; const baseRing = bed.r * 0.52; @@ -1128,6 +1313,7 @@ class Tarinai { const d = dist(this, z); const push = clamp(1 - d / 90, 0, 1); this.stress = clamp(this.stress + push * dt * 1.2 * this.personalityProfile().fear, 0, 130); + if (push > 0.2) this.adjustPersonality("neuroticism", -dt * push * 0.0035, "after repeated contact with poop."); this.vx += (this.x - z.x) / Math.max(d, 1) * push * dt * 40; this.vy += (this.y - z.y) / Math.max(d, 1) * push * dt * 40; } @@ -1182,12 +1368,12 @@ class Tarinai { this.fightWinnerId = null; } - const friendNearby = this.bestFriendLive ? this.bestFriendLive(12, 170) : null; + const friendNearby = this.bestFriendLive ? this.bestFriendLive(FRIEND_AFFINITY_THRESHOLD, 170) : null; if (friendNearby && friendNearby.state === "panic" && friendNearby.target) { this.state = "panic"; this.target = this.panicDestination(friendNearby.target); this.fearTimer = Math.max(this.fearTimer, 0.32); - this.thought = "\u4ef2\u826f\u3057\u3068\u4e00\u7dd2\u306b\u9003\u3052\u3066\u3044\u308b"; + this.thought = "\u53cb\u9054\u3068\u4e00\u7dd2\u306b\u9003\u3052\u3066\u3044\u308b"; return; } @@ -1245,11 +1431,11 @@ class Tarinai { if (this.hasZundaCurableDisease?.() && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { const cureFood = this.world.nearest(this, ["sweet"], 700); - if (cureFood && cureFood.amount > 1.2 && !this.shouldAvoidTarget(cureFood)) { + if (cureFood && this.foodItemHasServingLeft(cureFood) && !this.shouldAvoidTarget(cureFood)) { this.state = "seek_food"; this.target = cureFood; this.foodReactTimer = Math.max(this.foodReactTimer, 0.42); - this.thought = this.fightDisease ? "きずつき病\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u7206\u767a\u75c5\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b"; + this.thought = this.fightDisease ? "\u304d\u305a\u3064\u304d\u75c5\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u7206\u767a\u75c5\u3067\u305a\u3093\u3060\u9905\u3092\u63a2\u3057\u3066\u3044\u308b"; return; } } @@ -1257,14 +1443,14 @@ class Tarinai { if (this.fightDisease && this.fightTimer <= 0.04 && this.birthRitualTimer <= 0.04 && this.defeatedTimer <= 0.04) { this.state = "fight_sick"; this.target = null; - this.thought = "きずつき病\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + this.thought = "\u304d\u305a\u3064\u304d\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; if (Math.random() < dt * 0.45) this.wanderAngle += rand(-3.4, 3.4); return; } if (!this.isZunchiSlave) { const specialMochi = this.world.nearest(this, ["love_mochi", "fight_mochi", "sleep_drug"], wasSleeping ? 520 : 390); - if (specialMochi && specialMochi.amount > 1.2 && this.hunger > 10 && !this.shouldAvoidTarget(specialMochi)) { + if (specialMochi && this.foodItemHasServingLeft(specialMochi) && this.hunger > 10 && !this.shouldAvoidTarget(specialMochi)) { this.state = "seek_food"; this.target = specialMochi; this.foodReactTimer = Math.max(this.foodReactTimer, 0.34); @@ -1286,7 +1472,7 @@ class Tarinai { const zunda = this.world.nearest(this, ["sweet"], zundaRange); const zundaHungry = this.hunger > Math.max(7, 18 - 10 * (this.personalityProfile().zunda - 1)); const zundaReward = this.affection > 8 && this.hunger > 7; - if (zunda && zunda.amount > 1.2 && ((wasSleeping && this.hunger > 7) || zundaHungry || zundaReward)) { + if (zunda && this.foodItemHasServingLeft(zunda) && ((wasSleeping && this.hunger > 7) || zundaHungry || zundaReward)) { this.state = "seek_food"; this.target = zunda; this.foodReactTimer = Math.max(this.foodReactTimer, 0.36); @@ -1306,7 +1492,7 @@ class Tarinai { if (keepSleeping || (personalSleep && this.energy < 90 + 8 * sleepBias) || this.energy < 28 + 8 * sleepBias) { let bed = this.isSleepFurniture(previousTarget) ? previousTarget : null; if (!bed && friendNearby && this.isSleepFurniture(friendNearby.target) && (friendNearby.state === "sleep" || friendNearby.state === "seek_bed")) bed = friendNearby.target; - if (!bed && !wasSleeping) bed = this.world.bestBedFor(this, 360); + if (!bed) bed = this.world.bestBedFor(this, wasSleeping ? 480 : 420); if (bed && !wasSleeping && this.energy > 18) { const spot = this.sleepSpotFor(bed); if (distXY(this.x, this.y, spot.x, spot.y) > this.radius + 10) { @@ -1323,7 +1509,7 @@ class Tarinai { this.nextSleepBubbleAt = this.world.time + 4.5; this.world.spawnBubble(this.x, this.y - this.radius * 1.18, "Zzz...", "rgba(65,70,92,0.72)"); } - this.thought = bed ? "\u30d9\u30c3\u30c9\u306e\u8fd1\u304f\u3067\u7720\u3063\u3066\u3044\u308b" : "\u7720\u3063\u3066\u3044\u308b"; + this.thought = bed ? (bed.type === "nest_box" ? "\u5de3\u7bb1\u306e\u4e2d\u3067\u7720\u3063\u3066\u3044\u308b" : "\u30d9\u30c3\u30c9\u306e\u8fd1\u304f\u3067\u7720\u3063\u3066\u3044\u308b") : "\u7720\u3063\u3066\u3044\u308b"; return; } @@ -1355,19 +1541,21 @@ class Tarinai { } const playTrait = this.personalityProfile().play ?? 1; - const ballRange = this.personality === "playful" ? 540 : 240 + 60 * playTrait; + const openPlay = this.shouldApplyPersonalityBehavior("openness", 1); + const closedPlay = this.shouldApplyPersonalityBehavior("openness", -1); + const ballRange = openPlay ? 540 : (closedPlay ? 170 : 240 + 60 * playTrait); const ball = this.world.nearest(this, ["ball"], ballRange); if (ball && this.energy > 26 && this.hunger < 98 && !this.shouldAvoidTarget(ball)) { const ballSpeed = Math.hypot(ball.vx || 0, ball.vy || 0); const chasers = this.world.countBallChasers ? this.world.countBallChasers(ball, this) : 0; - const baseChance = this.personality === "playful" ? 0.74 : 0.08; + const baseChance = openPlay ? 0.74 : (closedPlay ? 0.025 : 0.08); const movingBonus = clamp(ballSpeed / 120, 0, 0.42); const socialBonus = this.loneliness > 48 ? 0.10 : 0; - if (chasers < 5 && (this.personality === "playful" || ballSpeed > 7 || Math.random() < baseChance * playTrait + movingBonus + socialBonus)) { + if (chasers < 5 && (openPlay || ballSpeed > 7 || Math.random() < baseChance * playTrait + movingBonus + socialBonus)) { this.state = "play_ball"; this.target = ball; this.goodMode = "smile"; - this.thought = this.personality === "playful" ? "\u30dc\u30fc\u30eb\u306b\u5f15\u304d\u5bc4\u305b\u3089\u308c\u3066\u3044\u308b" : "\u8ee2\u304c\u308b\u3082\u306e\u304c\u6c17\u306b\u306a\u3063\u3066\u3044\u308b"; + this.thought = openPlay ? "\u30dc\u30fc\u30eb\u306b\u5f15\u304d\u5bc4\u305b\u3089\u308c\u3066\u3044\u308b" : "\u8ee2\u304c\u308b\u3082\u306e\u304c\u6c17\u306b\u306a\u3063\u3066\u3044\u308b"; return; } } @@ -1388,7 +1576,7 @@ class Tarinai { this.state = "seek_food"; this.target = friendNearby.target; this.foodReactTimer = Math.max(this.foodReactTimer, 0.24); - this.thought = "\u4ef2\u826f\u3057\u3068\u4e00\u7dd2\u306b\u98df\u3079\u306b\u884c\u304f"; + this.thought = "\u53cb\u9054\u3068\u4e00\u7dd2\u306b\u98df\u3079\u306b\u884c\u304f"; return; } @@ -1404,8 +1592,10 @@ class Tarinai { } } - if (this.loneliness > 63 - (this.personality === "lonely" ? 16 : 0)) { - const other = this.world.nearestOther(this, 300); + const socialSeek = this.shouldApplyPersonalityBehavior("sociability", 1); + const lonerSeek = this.shouldApplyPersonalityBehavior("sociability", -1); + if (this.loneliness > 63 - (socialSeek ? 16 : 0) + (lonerSeek ? 10 : 0)) { + const other = this.world.nearestOther(this, socialSeek ? 390 : (lonerSeek ? 190 : 300)); if (other) { this.state = "seek_friend"; this.target = other; @@ -1446,14 +1636,13 @@ class Tarinai { const d = dist(this, it); if (d > this.radius + it.r + 12) continue; - if (((it.type === "sweet" && canSweetBite) || (it.type === "food" && canBite)) && it.amount > 1.2) { - const eating = Math.min(it.amount, it.type === "sweet" ? 7.2 : 8.5); + if (((it.type === "sweet" && canSweetBite) || (it.type === "food" && canBite)) && this.foodItemHasServingLeft(it)) { + const eating = this.consumeFoodServing(it, it.type === "sweet" ? 7.2 : 8.5); if (eating > 0) { this.state = "eat"; this.target = it; this.vx *= Math.pow(0.25, dt * 60); this.vy *= Math.pow(0.25, dt * 60); - it.amount -= eating; this.hunger -= eating * (it.type === "sweet" ? 0.75 : 0.95); this.recoverHealth(eating * (it.type === "sweet" ? 0.28 : 0.46)); this.affection += it.type === "sweet" ? eating * 0.03 : eating * 0.012; @@ -1461,7 +1650,7 @@ class Tarinai { this.stress = clamp(this.stress - eating * 0.42, 0, 130); this.fearTimer = Math.max(0, this.fearTimer - eating * 0.035); if (this.explosionDisease) this.recoverExplosionDisease("\u305a\u3093\u3060\u9905\u3067\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"); - if (this.fightDisease) this.recoverFightDisease("\u305a\u3093\u3060\u9905\u3067きずつき病\u304c\u6cbb\u3063\u305f"); + if (this.fightDisease) this.recoverFightDisease("\u305a\u3093\u3060\u9905\u3067\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f"); } this.eatTimer = Math.max(this.eatTimer, 0.32); this.eatCooldown = it.type === "sweet" ? rand(0.34, 0.62) : rand(0.44, 0.78); @@ -1482,13 +1671,13 @@ class Tarinai { } } - if (canSweetBite && (it.type === "love_mochi" || it.type === "fight_mochi" || it.type === "sleep_drug") && it.amount > 1.2) { - const eating = Math.min(it.amount, 6.8); + if (canSweetBite && (it.type === "love_mochi" || it.type === "fight_mochi" || it.type === "sleep_drug") && this.foodItemHasServingLeft(it)) { + const eating = this.consumeFoodServing(it, 6.8); + if (eating <= 0) continue; this.state = "eat"; this.target = it; this.vx *= Math.pow(0.25, dt * 60); this.vy *= Math.pow(0.25, dt * 60); - it.amount -= eating; this.hunger -= eating * 0.82; this.recoverHealth(eating * 0.24); this.affection += eating * 0.04; @@ -1497,12 +1686,20 @@ class Tarinai { this.loveMochiTimer = Math.max(this.loveMochiTimer || 0, 42 + rand(4, 12)); this.bubble("\u2661", 2.4, "rgba(190,82,132,0.78)"); this.lastMealColor = "#ff7bab"; - } else { + } else if (it.type === "fight_mochi") { this.stress = clamp(this.stress + eating * 0.22, 0, 130); this.fearTimer = Math.max(this.fearTimer || 0, 0.32); this.fightMochiTimer = Math.max(this.fightMochiTimer || 0, 52 + rand(10, 18)); this.bubble("!", 2.0, "rgba(180,86,52,0.80)"); this.lastMealColor = "#e07c43"; + } else { + this.stress = clamp(this.stress - eating * 0.10, 0, 130); + this.energy = clamp(this.energy - eating * 0.20, 0, 100); + this.fearTimer = Math.max(0, (this.fearTimer || 0) - 0.18); + this.fightMochiTimer = Math.max(0, (this.fightMochiTimer || 0) - 2.5); + this.bubble("Zzz...", 2.3, "rgba(104,84,168,0.78)"); + this.lastMealColor = "#b89cff"; + if (!this.sleepDisease && Math.random() < Math.min(0.98, 0.35 + eating * 0.075)) this.infectSleepDisease(it); } this.eatTimer = Math.max(this.eatTimer, 0.30); this.eatCooldown = rand(0.38, 0.68); @@ -1521,7 +1718,8 @@ class Tarinai { } if (canBite && it.type === "grass") { - const bite = Math.min(it.amount, rand(4.2, 7.2)); + const servingScale = Number.isFinite(it.foodServingScale) ? it.foodServingScale : (it.toolSize === "large" ? 1.18 : (it.toolSize === "small" ? 0.82 : 1)); + const bite = Math.min(it.amount, rand(4.2, 7.2) * servingScale); this.state = "eat"; this.target = it; this.grassEatTimer = Math.max(this.grassEatTimer, 0.22); @@ -1548,10 +1746,14 @@ class Tarinai { if (it.type === "zunchi") { const touch = clamp(1 - d / (this.radius + it.r + 12), 0, 1); - if (!this.isZunchiSlave) this.stress = clamp(this.stress + touch * dt * 3.4, 0, 130); + if (!this.isZunchiSlave) { + this.stress = clamp(this.stress + touch * dt * 3.4 * this.personalityProfile().fear, 0, 130); + if (touch > 0.08) this.adjustPersonality("neuroticism", -dt * touch * 0.0045, "after repeated contact with poop."); + } this.zunchiStain = clamp((this.zunchiStain || 0) + touch * dt * (this.isZunchiSlave ? 5.2 : 9.5), 0, 100); if (canZunchiBite) { - const bite = Math.min(it.amount, this.isZunchiSlave ? rand(4.8, 7.4) : rand(3.4, 5.8)); + const servingScale = Number.isFinite(it.foodServingScale) ? it.foodServingScale : (it.toolSize === "large" ? 1.18 : (it.toolSize === "small" ? 0.82 : 1)); + const bite = Math.min(it.amount, (this.isZunchiSlave ? rand(4.8, 7.4) : rand(3.4, 5.8)) * servingScale); this.state = "eat"; this.target = it; this.vx *= Math.pow(0.18, dt * 60); @@ -1559,7 +1761,8 @@ class Tarinai { it.amount -= bite; this.hunger -= bite * (this.isZunchiSlave ? 0.66 : 0.18); this.recoverHealth(bite * (this.isZunchiSlave ? 0.10 : 0.02)); - this.stress = clamp(this.stress + bite * (this.isZunchiSlave ? 0.06 : 0.52), 0, 130); + this.stress = clamp(this.stress + bite * (this.isZunchiSlave ? 0.06 : 0.52) * this.personalityProfile().fear, 0, 130); + if (!this.isZunchiSlave) this.adjustPersonality("neuroticism", -bite * 0.0015, "after repeated contact with poop."); this.zunchiStain = clamp((this.zunchiStain || 0) + bite * (this.isZunchiSlave ? 0.75 : 1.75), 0, 100); this.lastMealColor = "#6b8d3f"; this.eatTimer = Math.max(this.eatTimer, 0.24); @@ -1604,7 +1807,7 @@ class Tarinai { if (it.type === "ball") { const touch = clamp(1 - d / (this.radius + it.r + 12), 0, 1); - if (this.state === "play_ball" || this.target === it || this.personality === "playful") { + if (this.state === "play_ball" || this.target === it || this.shouldApplyPersonalityBehavior("openness", 1)) { this.goodMode = "smile"; this.stress = clamp(this.stress - dt * (0.9 + touch * 1.8), 0, 130); this.loneliness = clamp(this.loneliness - dt * (0.4 + touch), 0, 110); @@ -1612,9 +1815,17 @@ class Tarinai { } } + if (it.type === "splat") { + const touch = clamp(1 - d / (this.radius + it.r + 16), 0, 1); + if (touch > 0) { + this.stress = clamp(this.stress + touch * dt * 2.8 * this.personalityProfile().fear, 0, 130); + if (touch > 0.06) this.adjustPersonality("neuroticism", -dt * touch * 0.0042, "after repeated contact with corpses"); + } + } + if (it.type === "trace") { this.loneliness -= dt * 0.25; - this.stress += dt * 0.06; + this.stress += dt * 0.06 * this.personalityProfile().fear; } } this.hunger = clamp(this.hunger, 0, 115); @@ -1663,12 +1874,12 @@ class Tarinai { this.loneliness -= dt * 1.65 * this.trait.social; this.affection += dt * 0.28 * this.trait.social; this.adjustRelation(o, dt * 0.18 * pdef.relation * (rel.fear > 10 ? 0.35 : 1), -dt * 0.018, "nearby"); - if ((rel.affinity || 0) > 10) { + if ((rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD) { this.stress = clamp(this.stress - dt * 0.62 * this.trait.social, 0, 130); this.affection = clamp(this.affection + dt * 0.18, 0, 80); if (this.world.relationNotice(this.id, o.id, "friend-calm", 55)) this.world.log(`${this.name}\u306f${o.name}\u3068\u3044\u308b\u3068\u5c11\u3057\u843d\u3061\u7740\u304f\u3002`, "relation"); } - if ((rel.affinity || 0) > 8 && this.world.relationNotice(this.id, o.id, "friend", 32)) { + if ((rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD && this.world.relationNotice(this.id, o.id, "friend", 32)) { this.world.log(`${this.name}\u306f\u3088\u304f${o.name}\u306e\u8fd1\u304f\u306b\u3044\u308b\u3002`, "relation"); } if (this.type === "angry") this.stress += dt * 0.08; @@ -1711,10 +1922,14 @@ class Tarinai { const relB = o.relationTo(this.id); const battleDrug = this.hasFightMochiEffect() || o.hasFightMochiEffect(); const loveDrug = this.hasLoveMochiEffect() || o.hasLoveMochiEffect(); - const fightRisk = (this.mood < 55 || o.mood < 55 || this.stress > 46 || o.stress > 46 || this.type === "angry" || o.type === "angry" || closeCount > 3 || this.personality === "irritable" || o.personality === "irritable" || battleDrug || o.isZunchiSlave || this.isZunchiSlave); + const aggressiveThis = this.shouldApplyPersonalityBehavior("aggression", 1); + const aggressiveOther = o.shouldApplyPersonalityBehavior?.("aggression", 1); + const calmThis = this.shouldApplyPersonalityBehavior("aggression", -1); + const calmOther = o.shouldApplyPersonalityBehavior?.("aggression", -1); + const fightRisk = (this.mood < 55 || o.mood < 55 || this.stress > 46 || o.stress > 46 || this.type === "angry" || o.type === "angry" || closeCount > 3 || aggressiveThis || aggressiveOther || battleDrug || o.isZunchiSlave || this.isZunchiSlave); const fearBrake = battleDrug ? clamp(1 - ((relA.fear || 0) + (relB.fear || 0)) / 220, 0.74, 1.15) : clamp(1 - ((relA.fear || 0) + (relB.fear || 0)) / 120, 0.34, 1); const friendBrake = battleDrug ? clamp(1 - Math.max(relA.affinity || 0, relB.affinity || 0) / 180, 0.72, 1.12) : clamp(1 - Math.max(relA.affinity || 0, relB.affinity || 0) / 90, 0.48, 1); - const personalityRisk = this.personalityProfile().fight * o.personalityProfile().fight; + const personalityRisk = this.personalityProfile().fight * o.personalityProfile().fight * (calmThis ? 0.62 : 1) * (calmOther ? 0.62 : 1); const conflictBias = (battleDrug ? 2.9 : 1) * (o.isZunchiSlave ? 2.2 : 1) * (this.isZunchiSlave ? 1.15 : 1); const birthPeace = (this.postBirthPeaceTimer || 0) > 0 || (o.postBirthPeaceTimer || 0) > 0; const familyFightBlocked = this.world.areParentChild ? this.world.areParentChild(this, o) : false; @@ -1723,7 +1938,7 @@ class Tarinai { this.world.startConflict(this, o); } - if (!this.isZunchiSlave && !o.isZunchiSlave && d < (loveDrug ? 44 : 36) && this.reproductionTimer <= 0 && o.reproductionTimer <= 0 && this.fightTimer <= 0 && o.fightTimer <= 0) { + if (!this.isZunchiSlave && !o.isZunchiSlave && !this.sleepDisease && !o.sleepDisease && !this.fightDisease && !o.fightDisease && d < (loveDrug ? 44 : 36) && this.reproductionTimer <= 0 && o.reproductionTimer <= 0 && this.fightTimer <= 0 && o.fightTimer <= 0) { const enough = loveDrug ? (this.hunger < 90 && o.hunger < 92 && this.energy > 18 && o.energy > 18) : (this.hunger < 55 && o.hunger < 60 && this.energy > 44 && o.energy > 44); const lonelyBond = loveDrug ? (this.loneliness > 4 || o.loneliness > 4 || this.affection > 0 || o.affection > 0) : (this.loneliness > 24 || o.loneliness > 24); if (enough && lonelyBond && Math.random() < dt * (loveDrug ? 0.72 : 0.25)) { @@ -1733,7 +1948,7 @@ class Tarinai { } if (closeCount > 8) { - this.stress += dt * 0.9; + this.stress += dt * 0.9 * this.personalityProfile().fear; this.energy -= dt * 0.25; this.fearTimer = Math.max(this.fearTimer, 0.18); } @@ -1755,6 +1970,12 @@ class Tarinai { this.energy = clamp(this.energy + dt * (this.target ? 1.8 + bedComfort * 1.35 : 2.1), 0, 100); this.stress = clamp(this.stress + dt * (crowdedSleep ? 0.18 * Math.max(1, bedCrowd - 5) : -0.12 * bedComfort), 0, 130); this.hunger = clamp(this.hunger + dt * 0.018, 0, 115); + if (this.target && !this.target.dead && this.target.type === "nest_box") { + this.updateNestBoxPresence(dt); + this.vx = 0; + this.vy = 0; + return; + } if (this.target && !this.target.dead && this.isSleepFurniture(this.target)) { const spot = this.sleepSpotFor(this.target); const dx = spot.x - this.x; @@ -1828,9 +2049,13 @@ class Tarinai { const bedDx = this.target.x - this.x; const bedDy = this.target.y - this.y; const bedDist = Math.hypot(bedDx, bedDy); - if (d <= Math.max(this.radius + 8, 26) || bedDist <= Math.max(this.target.r * 0.58, 20)) { + const reachedSleepFurniture = this.target.type === "nest_box" + ? (this.insideNestBoxId === this.target.id || d <= Math.max(this.radius + 34, this.target.r * 1.08) || bedDist <= Math.max(this.target.r * 1.05, 62)) + : (d <= Math.max(this.radius + 8, 26) || bedDist <= Math.max(this.target.r * 0.58, 20)); + if (reachedSleepFurniture) { this.state = "sleep"; this.sleeping = true; + if (this.target.type === "nest_box") this.enterNestBox(this.target, dt); return; } } @@ -1890,8 +2115,13 @@ class Tarinai { this.vy = this.vy / v * maxV; } - this.x += this.vx * dt; - this.y += this.vy * dt; + const impulseVx = Number.isFinite(this.impulseVx) ? this.impulseVx : 0; + const impulseVy = Number.isFinite(this.impulseVy) ? this.impulseVy : 0; + this.x += (this.vx + impulseVx) * dt; + this.y += (this.vy + impulseVy) * dt; + const impulseDrag = Math.pow(0.58, dt * 3.2); + this.impulseVx = Math.abs(impulseVx) < 0.35 ? 0 : impulseVx * impulseDrag; + this.impulseVy = Math.abs(impulseVy) < 0.35 ? 0 : impulseVy * impulseDrag; if (this.entryTimer > 0) { this.entryTimer = Math.max(0, this.entryTimer - dt); @@ -1914,7 +2144,7 @@ class Tarinai { reason = this.dominantDeathCause("", { lowHealth: true }) || "\u4e8b\u6545"; } else if (this.hunger >= 108) reason = "\u98e2\u9913"; - else if (this.age >= this.lifeSpan) reason = "天寿を全うした"; + else if (this.age >= this.lifeSpan) reason = "\u5929\u5bff\u3092\u5168\u3046\u3057\u305f"; else if (this.stress >= 124) { reason = this.dominantDeathCause("\u30b9\u30c8\u30ec\u30b9\u904e\u591a", { stressDeath: true }) || "\u30b9\u30c8\u30ec\u30b9\u904e\u591a"; } @@ -2032,7 +2262,7 @@ class Tarinai { const style = { parent: { color: "rgba(86,142,232,0.86)", label: "\u89aa" }, child: { color: "rgba(93,170,92,0.88)", label: "\u5b50" }, - friend: { color: "rgba(240,91,135,0.90)", label: "\u4ef2\u826f\u3057" }, + friend: { color: "rgba(240,91,135,0.90)", label: "\u53cb\u9054" }, enemy: { color: "rgba(214,82,66,0.90)", label: "\u6575\u5bfe" }, }[observeKind] || { color: "rgba(255,250,220,0.78)", label: "" }; ctx.save(); @@ -2070,27 +2300,40 @@ class Tarinai { ctx.restore(); } - - ctx.rotate(angle); - ctx.globalAlpha *= nestHideAlpha; - if (insideCardboard) ctx.globalAlpha *= 0.58; - - if (this.world.selected === this) { ctx.save(); - ctx.globalAlpha = 0.85; - ctx.strokeStyle = "rgba(165, 220, 98, 0.92)"; - ctx.lineWidth = 2; + const pulse = 0.5 + 0.5 * Math.sin(this.world.time * 7.5); + const jumpPulse = clamp(this.focusPulseTimer || 0, 0, 1); + ctx.globalAlpha = (0.82 + pulse * 0.12) * nestHideAlpha; + ctx.shadowColor = "rgba(124, 210, 76, 0.92)"; + ctx.shadowBlur = 14 + 18 * Math.max(pulse, jumpPulse); + ctx.strokeStyle = "rgba(112, 198, 70, 0.98)"; + ctx.lineWidth = 4.2 + jumpPulse * 2.0; ctx.beginPath(); - ctx.ellipse(0, drawH * 0.14, drawW * 0.62, drawH * 0.48, 0, 0, Math.PI * 2); + ctx.ellipse(0, drawH * 0.14, drawW * (0.74 + jumpPulse * 0.10), drawH * (0.56 + jumpPulse * 0.08), 0, 0, Math.PI * 2); ctx.stroke(); - ctx.setLineDash([5, 4]); - ctx.lineWidth = 1.2; - ctx.strokeStyle = "rgba(255,255,255,0.86)"; + ctx.shadowBlur = 0; + ctx.setLineDash([9, 5]); + ctx.lineWidth = 2.0; + ctx.strokeStyle = "rgba(255,255,255,0.96)"; ctx.beginPath(); - ctx.ellipse(0, drawH * 0.14, drawW * 0.72, drawH * 0.56, 0, 0, Math.PI * 2); + ctx.ellipse(0, drawH * 0.14, drawW * 0.88, drawH * 0.68, 0, 0, Math.PI * 2); ctx.stroke(); ctx.setLineDash([]); + ctx.fillStyle = "rgba(255,252,232,0.94)"; + ctx.strokeStyle = "rgba(112,198,70,0.88)"; + ctx.lineWidth = 2; + const focusLabel = "\u6ce8\u76ee"; + ctx.font = `${Math.max(11, this.radius * 0.54)}px Yomogi, ui-rounded, sans-serif`; + const lw = ctx.measureText(focusLabel).width + 18; + const ly = -drawH * 0.64; + tarinaiRoundRectPath(ctx, -lw / 2, ly - 11, lw, 22, 11); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = "rgba(72,126,42,0.96)"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(focusLabel, 0, ly); ctx.restore(); } else if ((this.world.performanceLevel ? this.world.performanceLevel() : 0) < 2 && this.world.pointer?.inside && distXY(this.x, this.y, this.world.pointer.x, this.world.pointer.y) < this.radius * 2.0) { ctx.save(); @@ -2103,6 +2346,11 @@ class Tarinai { ctx.restore(); } + ctx.rotate(angle); + ctx.globalAlpha *= nestHideAlpha; + if (insideCardboard) ctx.globalAlpha *= 0.58; + + if (this.eatTimer > 0.02) { ctx.save(); ctx.globalAlpha = 0.46 * (this.eatTimer / 0.32); @@ -2235,16 +2483,17 @@ class Tarinai { }; if (stressActive) { const pct = clamp((this.stress || 0) / 130, 0, 1); - drawMeter(baseY - (hpActive ? 11 : 0), pct, pct > 0.72 ? "rgba(178,74,110,0.92)" : "rgba(212,126,84,0.90)", clamp((this.stressBarTimer || 0) / 0.7, 0.35, 1)); + drawMeter(baseY, pct, pct > 0.72 ? "rgba(178,74,110,0.92)" : "rgba(212,126,84,0.90)", clamp((this.stressBarTimer || 0) / 0.7, 0.35, 1)); } if (hpActive) { const pct = clamp(this.energy / 100, 0, 1); - drawMeter(baseY, pct, pct > 0.45 ? "rgba(118,190,80,0.88)" : (pct > 0.20 ? "rgba(232,172,68,0.90)" : "rgba(218,82,70,0.92)"), clamp((this.hpBarTimer || 0) / 0.7, 0.35, 1)); + drawMeter(baseY - (stressActive ? 11 : 0), pct, pct > 0.45 ? "rgba(118,190,80,0.88)" : (pct > 0.20 ? "rgba(232,172,68,0.90)" : "rgba(218,82,70,0.92)"), clamp((this.hpBarTimer || 0) / 0.7, 0.35, 1)); } } } contains(x, y) { + if (this.insideNestBoxId || (this.nestFade || 0) >= 0.92) return false; const hit = this.world.screenSizeToWorld ? this.world.screenSizeToWorld(this.radius * 1.9) : this.radius * 1.9; return distXY(this.x, this.y, x, y) < hit; } diff --git a/js/text_catalog.js b/js/text_catalog.js index 1fb771b..7e58f38 100644 --- a/js/text_catalog.js +++ b/js/text_catalog.js @@ -1,76 +1,54 @@ "use strict"; const TEXT_CATALOG = { - toolTips: { - observe: "\u500b\u4f53\u3092\u9078\u629e\u3057\u3001\u72b6\u614b\u30fb\u6027\u683c\u30fb\u75c5\u6c17\u30fb\u304a\u6c17\u306b\u5165\u308a\u3092\u78ba\u8a8d\u3059\u308b\u3002", - delete: "\u7f6e\u3044\u305f\u9053\u5177\u3084\u6c5a\u308c\u3092\u6d88\u3059\u3002", - poke: "たりないをつつく。", - pinch: "たりないや物を移動させる。", - new: "\u753b\u9762\u5916\u304b\u3089\u65b0\u3057\u3044\u305f\u308a\u306a\u3044\u3092\u547c\u3076\u3002", - zunchi: "たりないのうんち。病気を生み出すかも。", - sweet: "たりないの大好物。一部の病気を治せる。", - love_mochi: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u7e41\u6b96\u884c\u52d5\u304c\u8d77\u304d\u3084\u3059\u304f\u306a\u308b\u3002", - fight_mochi: "食後しばらくの間けんかが起きやすくなる。", - water: "\u98f2\u3080\u3068\u6c17\u5206\u56de\u5fa9\u3002\u305a\u3093\u3061\u75c5\u3068\u7206\u767a\u75c5\u3092\u6cbb\u3059\u3002", - water_bowl: "衛生的な水が入った皿。一部の病気を治せる。", - sleep_drug: "\u98df\u3079\u308b\u3068\u306d\u3080\u308a\u75c5\u306b\u306a\u308b\u3002\u30c0\u30e1\u30fc\u30b8\u3067\u5b8c\u6cbb\u3059\u308b\u3002", - grass: "食べ物。たりないが安心する。", - stone: "あぶない。", - bed: "\u8fd1\u304f\u3067\u7720\u308b\u3002\u4f53\u529b\u304c\u56de\u5fa9\u3059\u308b\u3002", - nest_box: "\u3044\u308b\u3060\u3051\u3067\u30b9\u30c8\u30ec\u30b9\u4f4e\u6e1b\u3002\u7720\u308b\u3068\u7761\u7720\u306e\u8cea\u304c\u4e0a\u304c\u308b\u3002", - water_hose: "ドラッグで汚れをきれいにする。", - ball: "たりないが遊ぶたのしいおもちゃ。", - firecracker: "爆発を起こす。", - fence_v: "たりないを通せんぼする。", - fence_h: "たりないを通せんぼする。" - }, + toolTips: toolTipsFromDefinitions(), ecologyCards: [ - { - "title": "\u305f\u308a\u306a\u3044\u3068\u306f", - "image": "assets/sprites/tarinai_01_smile.png", - "text": "\u5ead\u3067\u52dd\u624b\u306b\u66ae\u3089\u3059\u5c0f\u3055\u306a\u751f\u304d\u7269\u3002\u304a\u306a\u304b\u3001\u7720\u6c17\u3001\u6c17\u5206\u3001\u30b9\u30c8\u30ec\u30b9\u3001\u4f53\u529b\u3067\u884c\u52d5\u304c\u5909\u308f\u308b\u3002" - }, - { - "title": "体力とストレス", - "image": "assets/ui/ecology_hp_stress.png", - "text": "体力はけがや衝突、爆発、空腹などで減り、0になると死亡する。ストレスは恐怖、混雑、汚れ、けんかなどで増え、高すぎると行動が乱れたり命に関わる。体力バーとストレスバーは、状態が変化した直後や観察時に表示される。" - }, - { - "title": "\u66ae\u3089\u3057\u3068\u6b32\u6c42", - "image": "assets/sprites/tarinai_05_drool.png", - "text": "\u98df\u3079\u7269\u3001\u6c34\u3001\u5bdd\u5e8a\u3001\u5de3\u7bb1\u3001\u4ef2\u9593\u3092\u63a2\u3057\u3066\u52d5\u304f\u3002\u96e8\u3084\u6c17\u6e29\u3001\u8349\u3001\u6c5a\u308c\u3001\u9053\u5177\u3082\u65e5\u3005\u306e\u72b6\u614b\u306b\u5f71\u97ff\u3059\u308b\u3002" - }, - { - "title": "\u6027\u683c\u3068\u500b\u6027", - "image": "assets/sprites/tarinai_21_normal_happy.png", - "text": "\u81c6\u75c5\u3001\u98df\u3044\u3057\u3093\u574a\u3001\u7720\u305f\u304c\u308a\u3001\u5bc2\u3057\u304c\u308a\u306a\u3069\u306e\u6027\u683c\u304c\u3042\u308b\u3002\u6027\u683c\u306f\u6050\u6016\u3001\u55a7\u5629\u3001\u7761\u7720\u3001\u4ef2\u9593\u3078\u306e\u5bc4\u308a\u65b9\u306b\u73fe\u308c\u308b\u3002" - }, - { - "title": "\u5bb6\u65cf\u3068\u95a2\u4fc2", - "image": "assets/sprites/tarinai_27_birth_ritual.png", - "text": "\u89aa\u5b50\u3001\u5171\u540c\u89aa\u3001\u4ef2\u826f\u3057\u3001\u82e6\u624b\u3001\u6050\u6016\u3092\u8a18\u9332\u3059\u308b\u3002\u5b50\u306f\u89aa\u306e\u7247\u65b9\u306e\u6027\u683c\u3092\u7d99\u304e\u3001\u5bb6\u7cfb\u56f3\u306b\u4e16\u4ee3\u304c\u6b8b\u308b\u3002" - }, - { - "title": "\u75c5\u6c17\u3068\u6cbb\u7642", - "image": "assets/sprites/tarinai_24_stress_dizzy.png", - "text": "\u305a\u3093\u3061\u75c5\u3001\u306d\u3080\u308a\u75c5\u3001\u7206\u767a\u75c5\u3001きずつき病\u304c\u3042\u308b\u3002\u6c34\u3067\u6cbb\u308b\u75c5\u6c17\u306e\u500b\u4f53\u306f\u6c34\u3092\u3001\u305a\u3093\u3060\u9905\u3067\u6cbb\u308b\u75c5\u6c17\u306e\u500b\u4f53\u306f\u305a\u3093\u3060\u9905\u3092\u512a\u5148\u3059\u308b\u3002" - }, - { - "title": "\u55a7\u5629\u3068\u4e8b\u6545", - "image": "assets/sprites/tarinai_26_intimidate.png", - "text": "\u5a01\u5687\u3001\u6d41\u8840\u3001\u7206\u7af9\u3001\u30dc\u30fc\u30eb\u3001\u843d\u4e0b\u7269\u3067\u50b7\u3064\u304f\u3002\u6b7b\u56e0\u306f\u55a7\u5629\u3001\u98e2\u9913\u3001\u75c5\u6c17\u3001\u30b9\u30c8\u30ec\u30b9\u904e\u591a\u3001\u7206\u7af9\u3001\u4e8b\u6545\u306a\u3069\u306b\u5206\u304b\u308c\u308b\u3002" - }, - { - "title": "\u9053\u5177\u3068\u4ecb\u5165", - "image": "assets/sprites/tarinai_18_fear.png", - "text": "\u3064\u3064\u304f\u3001\u3064\u307e\u3080\u3001\u9905\u3001\u6c34\u3001\u6d17\u6d44\u3001\u5de3\u7bb1\u3001\u67f5\u3001\u7206\u7af9\u306a\u3069\u3067\u74b0\u5883\u3092\u4f5c\u308b\u3002\u9053\u5177\u306f\u52a9\u3051\u306b\u3082\u5371\u967a\u306b\u3082\u306a\u308b\u3002" - }, - { - "title": "\u89b3\u5bdf\u306e\u65b9\u6cd5", - "image": "assets/sprites/tarinai_11_weak.png", - "text": "\u305f\u308a\u306a\u3044\u9054\u306e\u72b6\u6cc1\u3092\u89b3\u5bdf\u30c4\u30fc\u30eb\u3001\u661f\u30de\u30fc\u30af\u3001\u89b3\u5bdf\u30ed\u30b0\u3001\u5bb6\u7cfb\u56f3\u3001\u6b7b\u56e0\u7b49\u304b\u3089\u77e5\u308b\u3053\u3068\u304c\u51fa\u6765\u308b\u3002" - } - ] + { + title: "\u305f\u308a\u306a\u3044\u3068\u306f", + image: "assets/sprites/tarinai_01_smile.png", + text: "\u5ead\u3067\u66ae\u3089\u3059\u5c0f\u3055\u306a\u751f\u304d\u7269\u3002\u7a7a\u8179\u3001\u7720\u6c17\u3001\u6c17\u5206\u3001\u30b9\u30c8\u30ec\u30b9\u3001\u4f53\u529b\u3067\u884c\u52d5\u304c\u5909\u308f\u308b\u3002", + }, + { + title: "\u4f53\u529b\u3068\u30b9\u30c8\u30ec\u30b9", + image: "assets/ui/ecology_hp_stress.png", + text: "\u30d0\u30fc\u306f\u4e0a\u304c\u4f53\u529b\u3001\u4e0b\u304c\u30b9\u30c8\u30ec\u30b9\u3002\u4f53\u529b\u306f\u3051\u304c\u3084\u4e8b\u6545\u3067\u6e1b\u308a\u30010\u3067\u6b7b\u4ea1\u3002\u30b9\u30c8\u30ec\u30b9\u306f\u6050\u6016\u3001\u6df7\u96d1\u3001\u6c5a\u308c\u3001\u3051\u3093\u304b\u3067\u5897\u3048\u3001\u9ad8\u3044\u3068\u884c\u52d5\u304c\u4e71\u308c\u308b\u3002", + }, + { + title: "\u66ae\u3089\u3057\u3068\u6b32\u6c42", + image: "assets/sprites/tarinai_05_drool.png", + text: "\u98df\u3079\u7269\u3001\u6c34\u3001\u5bdd\u5e8a\u3001\u5de3\u7bb1\u3001\u4ef2\u9593\u3092\u63a2\u3057\u3066\u52d5\u304f\u3002\u96e8\u3001\u6c17\u6e29\u3001\u8349\u3001\u6c5a\u308c\u3001\u9053\u5177\u3082\u72b6\u614b\u306b\u5f71\u97ff\u3059\u308b\u3002", + }, + { + title: "\u6027\u683c\u3068\u500b\u6027", + image: "assets/sprites/tarinai_21_normal_happy.png", + text: "\u653b\u6483\u6027\u3001\u958b\u653e\u6027\u3001\u793e\u4ea4\u6027\u3001\u795e\u7d4c\u8cea\u6027\u304c\u7d4c\u9a13\u3067\u5c11\u3057\u305a\u3064\u5909\u308f\u308b\u3002\u95be\u5024\u3092\u8d85\u3048\u308b\u3068\u6027\u683c\u30bf\u30b0\u3068\u884c\u52d5\u5dee\u306b\u51fa\u308b\u3002", + }, + { + title: "\u5bb6\u65cf\u3068\u95a2\u4fc2", + image: "assets/sprites/tarinai_27_birth_ritual.png", + text: "\u89aa\u5b50\u3001\u5171\u540c\u89aa\u3001\u53cb\u9054\u3001\u6575\u5bfe\u3001\u6050\u6016\u3092\u8a18\u9332\u3059\u308b\u3002\u5b50\u306f\u89aa\u306e\u73fe\u5728\u6027\u683c\u3092\u53d7\u3051\u7d99\u304e\u3001\u5bb6\u7cfb\u56f3\u306b\u4e16\u4ee3\u304c\u6b8b\u308b\u3002", + }, + { + title: "\u75c5\u6c17\u3068\u6cbb\u7642", + image: "assets/sprites/tarinai_24_stress_dizzy.png", + text: "\u305a\u3093\u3061\u75c5\u3001\u306d\u3080\u308a\u75c5\u3001\u7206\u767a\u75c5\u3001\u304d\u305a\u3064\u304d\u75c5\u304c\u3042\u308b\u3002\u75c5\u6c17\u3054\u3068\u306b\u6c34\u3084\u305a\u3093\u3060\u9905\u306a\u3069\u3092\u6c42\u3081\u308b\u3002", + }, + { + title: "\u3051\u3093\u304b\u3068\u4e8b\u6545", + image: "assets/sprites/tarinai_26_intimidate.png", + text: "\u5a01\u5687\u3001\u6d41\u8840\u3001\u7206\u7af9\u3001\u30dc\u30fc\u30eb\u3001\u843d\u4e0b\u7269\u3067\u50b7\u3064\u304f\u3002\u6b7b\u56e0\u306f\u3051\u3093\u304b\u3001\u98e2\u9913\u3001\u75c5\u6c17\u3001\u4e8b\u6545\u306a\u3069\u306b\u5206\u304b\u308c\u308b\u3002", + }, + { + title: "\u9053\u5177\u3068\u4ecb\u5165", + image: "assets/sprites/tarinai_18_fear.png", + text: "\u3064\u3064\u304f\u3001\u3064\u307e\u3080\u3001\u9905\u3001\u6c34\u3001\u6d17\u6d44\u3001\u5de3\u7bb1\u3001\u67f5\u3001\u7206\u7af9\u306a\u3069\u3067\u74b0\u5883\u3092\u4f5c\u308b\u3002\u52a9\u3051\u306b\u3082\u5371\u967a\u306b\u3082\u306a\u308b\u3002", + }, + { + title: "\u89b3\u5bdf\u306e\u65b9\u6cd5", + image: "assets/sprites/tarinai_11_weak.png", + text: "\u89b3\u5bdf\u30c4\u30fc\u30eb\u3001\u661f\u30de\u30fc\u30af\u3001\u89b3\u5bdf\u30ed\u30b0\u3001\u5bb6\u7cfb\u56f3\u3001\u6b7b\u56e0\u7d71\u8a08\u304b\u3089\u500b\u4f53\u306e\u5909\u5316\u3092\u8ffd\u3048\u308b\u3002", + }, + ], }; window.TEXT_CATALOG = TEXT_CATALOG; diff --git a/js/ui.js b/js/ui.js index abaa975..c172696 100644 --- a/js/ui.js +++ b/js/ui.js @@ -136,6 +136,100 @@ function relationIconHtml(id) { return ``; } +function relationEntries(t, kind = "friend") { + const rows = []; + const liveIds = new Set((world?.tarinai || []).filter(o => o && !o.dead && o !== t).map(o => o.id)); + for (const [id, rel] of Object.entries(t?.relationships || {})) { + if (!liveIds.has(id)) continue; + const score = kind === "enemy" ? (rel.fear || 0) : (rel.affinity || 0); + const threshold = kind === "enemy" ? 0.5 : FRIEND_AFFINITY_THRESHOLD; + if (score <= threshold) continue; + rows.push({ id, score, name: relationDisplayName(world, id) }); + } + rows.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name, "ja")); + return rows; +} + +function relationListHtml(t, kind = "friend") { + const rows = relationEntries(t, kind); + if (!rows.length) return "\u306a\u3057"; + const sign = kind === "friend" ? "+" : ""; + return `
    ${rows.map(r => ` + `).join("")}
    `; +} + +function focusTarinaiById(id) { + const t = world?.tarinai?.find(o => o && !o.dead && o.id === id); + if (!t) { showToast("\u305d\u306e\u500b\u4f53\u306f\u3082\u3046\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002"); return false; } + world.selected = t; + t.focusPulseTimer = Math.max(t.focusPulseTimer || 0, 1.25); + selectTool("observe"); + if (Number.isFinite(t.x) && Number.isFinite(t.y)) { + world.cameraX = t.x - (world.visibleWorldW ? world.visibleWorldW() : (world.viewportW || world.w)) / 2; + world.cameraY = t.y - (world.visibleWorldH ? world.visibleWorldH() : (world.viewportH || world.h)) / 2; + world.clampCamera?.(); + } + uiCache.selectedSnapshot = ""; + renderSelected(); + renderStats(); + render?.(); + showToast(`\u300c${t.name}\u300d\u3078\u79fb\u52d5\u3057\u307e\u3057\u305f\u3002`); + return true; +} + +function quoteNameInRecordText(text, name) { + const raw = String(text || ""); + const n = String(name || "").trim(); + if (!n) return raw; + const parts = raw.split(n); + if (parts.length <= 1) return raw; + let out = ""; + for (let i = 0; i < parts.length - 1; i++) { + const before = parts[i].slice(-1); + const after = parts[i + 1].charAt(0); + out += parts[i] + ((before === "\u300c" && after === "\u300d") ? n : `\u300c${n}\u300d`); + } + return out + parts[parts.length - 1]; +} + +function renameSelectedTarinai(rawName) { + const t = world.selected; + if (!t || t.dead || !world.tarinai.includes(t)) return false; + const next = String(rawName || "").replace(/\s+/g, " ").trim().slice(0, 18); + if (!next) { + uiCache.selectedSnapshot = ""; + renderSelected(); + return false; + } + if (next === t.name) return false; + const oldName = t.name; + t.name = next; + if (t.isZunchiSlave) t.formerName = next; + world.recordFamily?.(t); + world.markFamilyTreeDirty?.("rename"); + uiCache.archiveFamilyVersion = null; + uiCache.selectedSnapshot = ""; + renderSelected(); + renderArchive?.(); + render?.(); + showToast(`\u300c${oldName}\u300d\u3092\u300c${next}\u300d\u306b\u6539\u540d\u3057\u307e\u3057\u305f\u3002`); + return true; +} + +function personalityValueText(value) { + const n = clamp(Number(value) || 0, -1, 1); + return `${n >= 0 ? "+" : ""}${n.toFixed(2)}`; +} + +function personalityRowsHtml(personality = {}) { + const p = normalizePersonality(personality); + return PERSONALITY_KEYS.map(key => `${escapeHtml(PERSONALITY_LABELS[key]?.label || key)}: ${personalityValueText(p[key])}`).join(""); +} + function renderSelected() { const t = world.selected; if (!t || t.dead || !world.tarinai.includes(t)) { @@ -150,17 +244,28 @@ function renderSelected() { ui.selectedCard?.classList.remove("hidden"); uiCache.selectedEmpty = false; + const activeNameInput = document.activeElement?.matches?.("[data-selected-name]") && document.activeElement?.dataset?.selectedId === t.id; + if (activeNameInput) return; const rel = t.relationSummary ? t.relationSummary() : {}; const fightRecord = relationFightRecord(t); + const generationDisplay = t.displayGeneration ? t.displayGeneration() : ((t.hasPaired || t.parents?.length || t.children?.length) ? t.generation : ""); + ensurePersonality(t); + const personalityTags = t.personalityTags ? t.personalityTags() : getPersonalityTraitTags(t); + const personalitySnapshot = [ + ...PERSONALITY_KEYS.map(key => personalityValueText(t.birthPersonality?.[key])), + ...PERSONALITY_KEYS.map(key => personalityValueText(t.currentPersonality?.[key])), + personalityTags.join(",") + ].join(","); const snapshot = [ - t.id, t.type, t.name, (t.displayGeneration ? t.displayGeneration() : ((t.hasPaired || t.parents?.length || t.children?.length) ? t.generation : "")), t.state, t.personality, t.thought, targetLabel(t.target), + t.id, t.type, t.name, generationDisplay, t.state, t.thought, targetLabel(t.target), fmt(t.age), fmt(t.lifeSpan), fmt(t.hunger), fmt(t.loneliness), fmt(t.energy), fmt(t.stress), fmt(t.mood), t.parentNames?.join("+") || "", t.children?.length || 0, fmt(t.lack), - rel.friend?.id || "", rel.friend?.score || 0, rel.friend?.id ? tarinaiSpritePathForId(rel.friend.id) : "", rel.fear?.id || "", rel.fear?.score || 0, rel.fear?.id ? tarinaiSpritePathForId(rel.fear.id) : "", fightRecord, + relationEntries(t, "friend").map(r => `${r.id}:${fmt(r.score)}:${r.name}`).join(","), relationEntries(t, "enemy").map(r => `${r.id}:${fmt(r.score)}:${r.name}`).join(","), fightRecord, t.isZunchiSlave ? 1 : 0, fmt(t.totalFightLosses || 0), fmt(t.loveMochiTimer || 0), fmt(t.fightMochiTimer || 0), t.zunchiDisease ? 1 : 0, fmt(t.zunchiDiseaseSeverity || 0), fmt(t.zunchiStain || 0), t.sleepDisease ? 1 : 0, t.explosionDisease ? 1 : 0, fmt(t.explosionDiseaseTimer || 0), t.fightDisease ? 1 : 0, t.favorite ? 1 : 0, + personalitySnapshot, (t.records || []).slice(0, 6).map(r => `${Math.round(r.time || 0)}:${r.kind || ""}:${r.text || ""}`).join("~") ].join("|"); if (uiCache.selectedSnapshot === snapshot) return; @@ -168,21 +273,36 @@ function renderSelected() { ui.selectedInfo.className = "selected-info"; const effectBadges = []; - effectBadges.push(`\u6027\u683c ${escapeHtml(t.personalityLabel ? t.personalityLabel() : t.personality || "\u4e0d\u660e")}`); if (t.isZunchiSlave) effectBadges.push(`\u305a\u3093\u3061\u3069\u308c\u3044`); if (t.favorite) effectBadges.push(`\u2605`); if (t.zunchiDisease) effectBadges.push(`\u305a\u3093\u3061\u75c5 ${fmt((t.zunchiDiseaseSeverity || 0) * 100)}`); if (t.sleepDisease) effectBadges.push(`\u306d\u3080\u308a\u75c5`); if (t.explosionDisease) effectBadges.push(`\u7206\u767a\u75c5 ${fmt(t.explosionDiseaseTimer || 0)}`); - if (t.fightDisease) effectBadges.push(`きずつき病`); + if (t.fightDisease) effectBadges.push(`\u304d\u305a\u3064\u304d\u75c5`); if ((t.loveMochiTimer || 0) > 0.1) effectBadges.push(`\u3078\u3053\u9905 ${fmt(t.loveMochiTimer)}`); if ((t.fightMochiTimer || 0) > 0.1) effectBadges.push(`\u3051\u3093\u304b\u9905 ${fmt(t.fightMochiTimer)}`); - const recordHtml = (t.records || []).slice(0, 8).map(r => `
  • ${escapeHtml(world.clockString ? world.clockStringFromTime ? world.clockStringFromTime(r.time || 0) : formatRecordTime(r.time || 0) : formatRecordTime(r.time || 0))}${escapeHtml(r.text || "")}
  • `).join("") || `
  • -\u8a18\u9332\u306a\u3057
  • `; + const personalityTagHtml = personalityTags.length + ? personalityTags.map(tag => `${escapeHtml(tag)}`).join("") + : `\u4e2d\u7acb`; + const personalityHtml = ` +
    \u6027\u683c\u30bf\u30b0${personalityTagHtml}
    +
    \u8a95\u751f\u6642\u6027\u683c${personalityRowsHtml(t.birthPersonality)}
    +
    \u73fe\u5728\u6027\u683c${personalityRowsHtml(t.currentPersonality)}
    + `; + const recordHtml = (t.records || []).slice(0, 8).map(r => { + const timeText = world.clockString ? (world.clockStringFromTime ? world.clockStringFromTime(r.time || 0) : formatRecordTime(r.time || 0)) : formatRecordTime(r.time || 0); + const recordText = quoteNameInRecordText(r.text || "", t.name); + return `
  • ${escapeHtml(timeText)}${escapeHtml(recordText)}
  • `; + }).join("") || `
  • -\u8a18\u9332\u306a\u3057
  • `; ui.selectedInfo.innerHTML = ` -
    ${escapeHtml(t.label())}${escapeHtml(t.name)}${(t.displayGeneration ? t.displayGeneration() : ((t.hasPaired || t.parents?.length || t.children?.length) ? t.generation : null)) ? `\u4e16\u4ee3 ${t.generation}` : ""}${effectBadges.join("")}
    -
    \u6027\u683c${escapeHtml(t.personalityLabel ? t.personalityLabel() : t.personality || "\u4e0d\u660e")}
    +
    + +
    + ${effectBadges.length ? `
    ${effectBadges.join("")}
    ` : ""} +
    \u4e16\u4ee3${escapeHtml(generationDisplay || "\u4e0d\u660e")}
    \u72b6\u614b${escapeHtml(stateLabel(t.state))}
    \u7406\u7531${escapeHtml(reasonLabel(t))}
    + ${personalityHtml}
    \u5bfe\u8c61${escapeHtml(targetLabel(t.target))}
    \u5e74\u9f62${fmt(t.age)} / ${fmt(t.lifeSpan)}
    \u7a7a\u8179${fmt(t.hunger)}
    @@ -191,8 +311,8 @@ function renderSelected() {
    \u30b9\u30c8\u30ec\u30b9${fmt(t.stress)}
    \u305a\u3093\u3061\u6c5a\u308c${fmt(t.zunchiStain || 0)}
    \u6c17\u5206${fmt(t.mood)}
    -
    \u4ef2\u826f\u3057${rel.friend ? `${relationIconHtml(rel.friend.id)}${escapeHtml(`${rel.friend.name} +${fmt(rel.friend.score)}`)}` : "\u306a\u3057"}
    -
    \u907f\u3051\u308b\u76f8\u624b${rel.fear ? `${relationIconHtml(rel.fear.id)}${escapeHtml(`${rel.fear.name} ${fmt(rel.fear.score)}`)}` : "\u306a\u3057"}
    +
    \u53cb\u9054${relationListHtml(t, "friend")}
    +
    \u6575\u5bfe${relationListHtml(t, "enemy")}
    \u55a7\u5629\u8a18\u61b6${escapeHtml(fightRecord)}
    \u7d2f\u8a08\u6557\u5317${t.totalFightLosses || 0}
    \u89aa${escapeHtml(t.parentNames?.length ? t.parentNames.join(" + ") : "\u4e0d\u660e")}
    @@ -218,7 +338,7 @@ function stateLabel(s) { play_ball: "\u30dc\u30fc\u30eb\u904a\u3073", seek_water: "\u6c34\u3092\u63a2\u3059", zunchi_sick: "\u305a\u3093\u3061\u75c5", - fight_sick: "きずつき病", + fight_sick: "\u304d\u305a\u3064\u304d\u75c5", system: "\u305a\u3093\u3061\u75c5", seek_friend: "\u4ef2\u9593\u3092\u63a2\u3059", follow_parent: "\u89aa\u306b\u3064\u3044\u3066\u3044\u304f", @@ -243,7 +363,7 @@ function reasonLabel(t) { if (t.state === "birth_ritual") return "\u5b50\u304c\u73fe\u308c\u308b\u524d\u306b\u4f53\u3092\u3086\u3059\u3063\u3066\u3044\u308b"; if (t.state === "seek_food") return "\u304a\u8179\u304c\u3059\u3044\u3066\u3044\u308b"; if (t.state === "seek_water") return t.explosionDisease ? "\u7206\u767a\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b" : "\u305a\u3093\u3061\u75c5\u3067\u6c34\u3092\u63a2\u3057\u3066\u3044\u308b"; - if (t.state === "fight_sick") return "きずつき病\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; + if (t.state === "fight_sick") return "\u304d\u305a\u3064\u304d\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; if (t.state === "zunchi_sick" || t.state === "system") return "\u305a\u3093\u3061\u75c5"; return "\u5468\u56f2\u3092\u898b\u3066\u3044\u308b"; } @@ -251,7 +371,7 @@ function reasonLabel(t) { function targetLabel(target) { if (!target) return "\u306a\u3057"; if (target.name) return target.name; - if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", sleep_drug: "\u306d\u3080\u308a\u85ac", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", fight_sick: "きずつき病", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; + if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", sleep_drug: "\u306d\u3080\u308a\u85ac", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", fight_sick: "\u304d\u305a\u3064\u304d\u75c5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; if (Number.isFinite(target.x) && Number.isFinite(target.y)) return "\u30ab\u30fc\u30bd\u30eb"; return "\u4e0d\u660e"; } @@ -366,8 +486,14 @@ function applyToolTips() { document.body.appendChild(pop); } const showTip = (btn) => { - const tip = btn?.dataset?.tip || ""; - if (!tip) return; + const baseTip = btn?.dataset?.tip || ""; + if (!baseTip) return; + let tip = baseTip; + if (btn?.dataset?.tool === "nest_box") { + const count = world?.nestBoxToolTipCount?.(); + if (count) tip = `${baseTip} +(${count.current}/${count.max})\u5339`; + } pop.textContent = tip; pop.classList.remove("hidden"); const rect = btn.getBoundingClientRect(); @@ -487,7 +613,7 @@ function syncTopButtons() { if (ui.soundBtn) ui.soundBtn.textContent = audio.enabled ? "\u97f3 ON" : "\u97f3 OFF"; } -const SCALABLE_TOOLS = new Set(["zunchi", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass", "stone", "firecracker", "fence_v", "fence_h"]); +const SCALABLE_TOOLS = new Set(scalableToolIds()); const SIZE_ORDER = ["small", "medium", "large"]; const SIZE_LABELS = { small: "\u5c0f", medium: "\u4e2d", large: "\u5927" }; @@ -569,7 +695,13 @@ function bindUI() { const t = world.tarinai.find(x => x.id === id && !x.dead); if (!t) { showToast("\u305d\u306e\u500b\u4f53\u306f\u3082\u3046\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002"); return; } world.selected = t; + t.focusPulseTimer = Math.max(t.focusPulseTimer || 0, 1.15); selectTool("observe"); + if (Number.isFinite(t.x) && Number.isFinite(t.y)) { + world.cameraX = t.x - (world.visibleWorldW ? world.visibleWorldW() : (world.viewportW || world.w)) / 2; + world.cameraY = t.y - (world.visibleWorldH ? world.visibleWorldH() : (world.viewportH || world.h)) / 2; + world.clampCamera?.(); + } renderStats(); showToast(`${t.name}\u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002`); }); @@ -582,6 +714,12 @@ function bindUI() { } ui.selectedInfo?.addEventListener("click", (e) => { + const focusBtn = e.target.closest("[data-focus-tarinai-id]"); + if (focusBtn) { + e.preventDefault(); + focusTarinaiById(focusBtn.getAttribute("data-focus-tarinai-id")); + return; + } const btn = e.target.closest("[data-selected-action=\"favorite\"]"); if (!btn || !world.selected || world.selected.dead) return; world.selected.favorite = !world.selected.favorite; @@ -590,6 +728,17 @@ function bindUI() { render(); showToast(world.selected.favorite ? "\u304a\u6c17\u306b\u5165\u308a\u306b\u3057\u307e\u3057\u305f\u3002" : "\u304a\u6c17\u306b\u5165\u308a\u3092\u89e3\u9664\u3057\u307e\u3057\u305f\u3002"); }); + ui.selectedInfo?.addEventListener("change", (e) => { + const input = e.target.closest("[data-selected-name]"); + if (!input) return; + renameSelectedTarinai(input.value); + }); + ui.selectedInfo?.addEventListener("keydown", (e) => { + const input = e.target.closest("[data-selected-name]"); + if (!input) return; + if (e.key === "Enter") { e.preventDefault(); input.blur(); } + if (e.key === "Escape") { e.preventDefault(); input.value = world.selected?.name || ""; input.blur(); } + }); ui.selectedCloseBtn?.addEventListener("click", () => { world.selected = null; uiCache.selectedSnapshot = ""; diff --git a/js/ui_charts.js b/js/ui_charts.js index 23996d9..caf9f7b 100644 --- a/js/ui_charts.js +++ b/js/ui_charts.js @@ -37,7 +37,7 @@ function updateColonyHistory(values) { uiCache.environmentInitialRow = null; uiCache.lastChartDraw = ""; } - const objectKeys = ["grass", "zunchi"]; + const objectKeys = ["grass", "zunchi", "trace"]; const makeBucket = (start) => ({ start, end: start + interval, @@ -90,7 +90,7 @@ function updateColonyHistory(values) { function chartRows(values) { const bucket = uiCache.chartBucketAccum; - const objectKeys = ["grass", "zunchi"]; + const objectKeys = ["grass", "zunchi", "trace"]; const preview = bucket && bucket.count > 0 ? { t: Math.max(world.time || 0, bucket.start || 0), pop: bucket.sums.pop / bucket.count, @@ -182,6 +182,7 @@ function chartSeries(mode = "population") { if (mode === "objects") return [ { key: "obj_grass", label: "\u8349", color: "#5b9d61" }, { key: "obj_zunchi", label: "\u305a\u3093\u3061", color: "#6f8a3f" }, + { key: "obj_trace", label: "\u6b7b\u9ab8", color: "#8a7054" }, ]; if (mode === "environment") return [ { key: "security", label: "\u6cbb\u5b89", color: "#d65e46", percent: true }, diff --git a/js/ui_family.js b/js/ui_family.js index 9035671..a6bff5d 100644 --- a/js/ui_family.js +++ b/js/ui_family.js @@ -152,6 +152,167 @@ function liveFamilyComponents(family) { return comps; } +function lineageIdleSchedule(fn, timeout = 180) { + const schedule = window.requestIdleCallback || ((cb) => setTimeout(cb, 0)); + schedule(fn, { timeout }); +} + +function lineageSameFamilyToken(token) { + return uiCache.archiveRenderToken === token; +} + +function lineageBuildComponentsIdle(family, token, onProgress, onDone) { + family = lineageEdgeFamily(family); + const entries = Object.values(family || {}).filter(n => n?.id); + const known = new Set(entries.map(n => n.id)); + const parentsByChild = new Map(); + const childrenByParent = new Map(); + const relatedIds = new Set(); + const graph = new Map(); + const comps = []; + let stage = "relations"; + let entryIndex = 0; + let nodeIndex = 0; + let nodes = []; + let sortedNodes = []; + let dfsIndex = 0; + const seen = new Set(); + + const addParent = (childId, parentId) => { + if (!childId || !parentId || childId === parentId || !known.has(childId) || !known.has(parentId)) return; + if (!parentsByChild.has(childId)) parentsByChild.set(childId, new Set()); + if (!childrenByParent.has(parentId)) childrenByParent.set(parentId, new Set()); + parentsByChild.get(childId).add(parentId); + childrenByParent.get(parentId).add(childId); + }; + const addGraphEdge = (a, b) => { + if (!a || !b || !graph.has(a) || !graph.has(b)) return; + graph.get(a).add(b); + graph.get(b).add(a); + }; + const validParentChild = (childId, parentId) => { + const child = family[childId]; + const parent = family[parentId]; + if (!child || !parent) return false; + const childListsParent = Array.isArray(child.parents) && child.parents.includes(parentId); + const parentListsChild = Array.isArray(parent.children) && parent.children.includes(childId); + return childListsParent || parentListsChild; + }; + const finishEmpty = () => { + lineageRelationIndexCache = { family, version: world.familyVersion || 0, index: { parentsByChild, childrenByParent } }; + onDone([]); + }; + + const pump = () => { + if (!lineageSameFamilyToken(token)) return; + const started = performance.now(); + while (performance.now() - started < 6) { + if (stage === "relations") { + if (entryIndex >= entries.length) { + lineageRelationIndexCache = { family, version: world.familyVersion || 0, index: { parentsByChild, childrenByParent } }; + stage = "related"; + entryIndex = 0; + onProgress?.("\u95a2\u4fc2\u3092\u6574\u7406\u4e2d", 0, entries.length); + continue; + } + const n = entries[entryIndex++]; + for (const parentId of n.parents || []) addParent(n.id, parentId); + for (const childId of n.children || []) addParent(childId, n.id); + } else if (stage === "related") { + if (entryIndex >= entries.length) { + nodes = Array.from(relatedIds).map(id => family[id]).filter(Boolean); + for (const n of nodes) graph.set(n.id, new Set()); + if (!nodes.length) return finishEmpty(); + stage = "graph"; + nodeIndex = 0; + onProgress?.("\u5bb6\u7cfb\u3092\u7d50\u5408\u4e2d", 0, nodes.length); + continue; + } + const n = entries[entryIndex++]; + const parents = parentsByChild.get(n.id) || new Set(); + const children = childrenByParent.get(n.id) || new Set(); + if (parents.size || children.size) relatedIds.add(n.id); + for (const id of parents) relatedIds.add(id); + for (const id of children) relatedIds.add(id); + } else if (stage === "graph") { + if (nodeIndex >= nodes.length) { + sortedNodes = nodes.slice().sort(lineageNodeSort); + stage = "components"; + dfsIndex = 0; + onProgress?.("\u5bb6\u7cfb\u3092\u5206\u5272\u4e2d", 0, sortedNodes.length); + continue; + } + const n = nodes[nodeIndex++]; + const parentCandidates = new Set((n.parents || []).filter(Boolean)); + for (const parentId of parentsByChild.get(n.id) || []) parentCandidates.add(parentId); + for (const parentId of parentCandidates) { + if (parentId !== n.id && graph.has(parentId) && validParentChild(n.id, parentId)) addGraphEdge(n.id, parentId); + } + const childCandidates = new Set((n.children || []).filter(Boolean)); + for (const childId of childrenByParent.get(n.id) || []) childCandidates.add(childId); + for (const childId of childCandidates) { + if (childId !== n.id && graph.has(childId) && validParentChild(childId, n.id)) addGraphEdge(n.id, childId); + } + } else if (stage === "components") { + while (dfsIndex < sortedNodes.length && seen.has(sortedNodes[dfsIndex].id)) dfsIndex += 1; + if (dfsIndex >= sortedNodes.length) { + comps.sort((a, b) => { + const ag = Math.min(...a.map(n => n.generation || 1)); + const bg = Math.min(...b.map(n => n.generation || 1)); + const at = Math.min(...a.map(n => n.birthTime || 0)); + const bt = Math.min(...b.map(n => n.birthTime || 0)); + return ag - bg || at - bt || b.length - a.length; + }); + onDone(comps); + return; + } + const start = sortedNodes[dfsIndex++]; + const stack = [start.id]; + const comp = []; + seen.add(start.id); + while (stack.length && performance.now() - started < 6) { + const id = stack.pop(); + const item = family[id]; + if (item) comp.push(item); + for (const next of graph.get(id) || []) { + if (seen.has(next)) continue; + seen.add(next); + stack.push(next); + } + } + if (stack.length) { + const continueComp = () => { + if (!lineageSameFamilyToken(token)) return; + const resumedStarted = performance.now(); + while (stack.length && performance.now() - resumedStarted < 6) { + const id = stack.pop(); + const item = family[id]; + if (item) comp.push(item); + for (const next of graph.get(id) || []) { + if (seen.has(next)) continue; + seen.add(next); + stack.push(next); + } + } + if (stack.length) return lineageIdleSchedule(continueComp, 180); + if (comp.some(x => x.alive)) comps.push(comp); + lineageIdleSchedule(pump, 180); + }; + return lineageIdleSchedule(continueComp, 180); + } + if (comp.some(x => x.alive)) comps.push(comp); + } + } + onProgress?.( + stage === "relations" ? "\u95a2\u4fc2\u3092\u6574\u7406\u4e2d" : stage === "related" ? "\u8868\u793a\u5bfe\u8c61\u3092\u9078\u5225\u4e2d" : stage === "graph" ? "\u5bb6\u7cfb\u3092\u7d50\u5408\u4e2d" : "\u5bb6\u7cfb\u3092\u5206\u5272\u4e2d", + stage === "graph" ? nodeIndex : entryIndex, + stage === "graph" ? nodes.length : entries.length + ); + lineageIdleSchedule(pump, 180); + }; + lineageIdleSchedule(pump, 160); +} + function familyStatusText(n) { if (!n) return "\u4e0d\u660e"; return n.alive ? "\u751f\u5b58" : "\u6b7b\u4ea1"; @@ -163,8 +324,8 @@ function familyDeathReasonLabel(rawReason, entity = null) { if (text.includes("\u3067\u8870\u5f31")) return text.length > 12 ? `${text.slice(0, 12)}\u2026` : text; if (/\u55a7\u5629|fight/.test(text)) return "\u55a7\u5629"; if (/\u7206\u7af9|firecracker|explosion/.test(text)) return "\u7206\u7af9"; - if (/仕様により画面外で削除|画面外で削除|out.*bounds|offscreen/.test(text)) return "仕様により画面外で削除"; - if (/衝突|collision/.test(text)) return "衝突"; + if (/\u4ed5\u69d8\u306b\u3088\u308a\u753b\u9762\u5916\u3067\u524a\u9664|\u753b\u9762\u5916\u3067\u524a\u9664|out.*bounds|offscreen/.test(text)) return "\u4ed5\u69d8\u306b\u3088\u308a\u753b\u9762\u5916\u3067\u524a\u9664"; + if (/\u885d\u7a81|collision/.test(text)) return "\u885d\u7a81"; if (/\u3064\u3064\u304b\u308c|\u3064\u3064\u304d|poke/.test(text)) return "\u3064\u3064\u304b\u308c\u3059\u304e\u305f"; if (/\u305a\u3093\u3061\u75c5|zunchi_sick|zunchi.*\u75c5/.test(text)) return "\u305a\u3093\u3061\u75c5"; if (/\u75c5/.test(text)) { @@ -173,7 +334,7 @@ function familyDeathReasonLabel(rawReason, entity = null) { } if (/\u98e2|\u7a7a\u8179|\u98df\u3079\u7269|hunger/.test(text)) return "\u98e2\u9913"; if (/\u30b9\u30c8\u30ec\u30b9|stress|\u6c17\u5206/.test(text)) return "\u30b9\u30c8\u30ec\u30b9\u904e\u591a"; - if (/\u5bff\u547d|天寿を全うした/.test(text)) return "天寿を全うした"; + if (/\u5bff\u547d|\u5929\u5bff/.test(text)) return "\u5929\u5bff\u3092\u5168\u3046\u3057\u305f"; if (/\u30dc\u30fc\u30eb|\u843d\u3061|\u843d\u4e0b|\u77f3|\u9053\u5177|\u4e8b\u6545|\u5f53\u305f|ball|drop|stone|accident/.test(text)) return "\u4e8b\u6545"; return "\u4e8b\u6545"; } @@ -196,9 +357,7 @@ function lineageTreeNodeHtml(n, x, y) { const rawReason = !n?.alive && n?.deathReason ? String(n.deathReason) : ""; const briefReason = familyDeathReasonLabel(rawReason, entity); const reason = briefReason ? ` / ${briefReason}` : ""; - const personality = live?.personalityLabel ? live.personalityLabel() : ((PERSONALITIES[n?.personality] || {}).label || n?.personality || ""); - const personalityPart = personality ? ` / \u6027\u683c ${personality}` : ""; - const title = escapeHtml(`${n?.name || "\u4e0d\u660e"} / \u4e16\u4ee3 ${n?.generation || "?"} / ${status}${personalityPart}${reason}`); + const title = escapeHtml(`${n?.name || "\u4e0d\u660e"} / \u4e16\u4ee3 ${n?.generation || "?"} / ${status}${reason}`); const deathLine = briefReason ? `${escapeHtml(briefReason)}` : ""; const cls = n ? ((live || n.alive) ? "alive" : "dead") : "missing"; const childCls = (n?.parents || []).length ? " child" : ""; @@ -485,7 +644,8 @@ function lineageRowsForLayout(nodes, generations, idToNode, idSet) { const partnerEdges = lineagePartnerEdgesByGeneration(nodes, idToNode, idSet); const totalNodes = nodes.length; const maxRow = Math.max(0, ...rows.map(row => row.length)); - const passes = totalNodes > 180 || maxRow > 32 ? 2 : (totalNodes > 90 || maxRow > 18 ? 3 : 6); + const veryLarge = totalNodes > 220 || maxRow > 44; + const passes = veryLarge ? 1 : (totalNodes > 180 || maxRow > 32 ? 2 : (totalNodes > 90 || maxRow > 18 ? 3 : 6)); for (let pass = 0; pass < passes; pass++) { let rank = lineageRankMap(rows); @@ -495,9 +655,11 @@ function lineageRowsForLayout(nodes, generations, idToNode, idSet) { const childRank = new Map(rows[i + 1].map((n, index) => [n.id, index])); rows[i] = lineageOrderParentsByChildren(rows[i], idSet, childRank); } - rank = lineageRankMap(rows); - rows = rows.map((row, i) => lineageOrderPartnerClusters(row, partnerEdges.get(generations[i]), rank, idToNode)); - if (totalNodes <= 90 && maxRow <= 16) rows = lineageOptimizeRows(rows, idSet); + if (!veryLarge) { + rank = lineageRankMap(rows); + rows = rows.map((row, i) => lineageOrderPartnerClusters(row, partnerEdges.get(generations[i]), rank, idToNode)); + if (totalNodes <= 90 && maxRow <= 16) rows = lineageOptimizeRows(rows, idSet); + } } return rows; } @@ -880,6 +1042,32 @@ function lineageHydrateFamilyHtml(html, index) { .split("{{LINEAGE_MASK_ID}}").join(`lineage-node-mask-${index}`); } +function lineageCaptureArchiveScroll() { + const root = ui.archiveContent; + if (!root) return null; + const familyScroll = {}; + for (const el of root.querySelectorAll(".lineage-family-tree[data-lineage-key]")) { + const key = el.getAttribute("data-lineage-key"); + if (key) familyScroll[key] = el.scrollLeft || 0; + } + return { top: root.scrollTop || 0, left: root.scrollLeft || 0, familyScroll }; +} + +function lineageRestoreArchiveScroll(state) { + const root = ui.archiveContent; + if (!root || !state) return; + const maxTop = Math.max(0, root.scrollHeight - root.clientHeight); + const maxLeft = Math.max(0, root.scrollWidth - root.clientWidth); + root.scrollTop = Math.min(state.top || 0, maxTop); + root.scrollLeft = Math.min(state.left || 0, maxLeft); + for (const el of root.querySelectorAll(".lineage-family-tree[data-lineage-key]")) { + const key = el.getAttribute("data-lineage-key"); + if (!key || !Object.prototype.hasOwnProperty.call(state.familyScroll || {}, key)) continue; + el.scrollLeft = Math.min(state.familyScroll[key] || 0, Math.max(0, el.scrollWidth - el.clientWidth)); + } +} + + function lineageExpectedChildEdgeCount(component, family) { family = lineageEdgeFamily(family); const idSet = new Set(component.map(x => x?.id).filter(Boolean)); @@ -1113,6 +1301,73 @@ function lineageCleanComponent(component, family) { return expanded.filter(n => lineageMutualParentIds(n, family, idSet).length || lineageMutualChildIds(n, family, idSet).length); } +function lineageFastLayoutNeeded(nodes, idSet, family) { + const edgeCount = nodes.reduce((sum, n) => sum + lineageParentIds(n, idSet, family).length, 0); + const maxGenerationWidth = Math.max(0, ...Array.from(new Set(nodes.map(n => n.generation || 1))).map(g => nodes.filter(n => (n.generation || 1) === g).length)); + return { + edgeCount, + fast: nodes.length > 140 || edgeCount > 260 || maxGenerationWidth > 34, + }; +} + +function lineageLayoutRowsFast(rows, idSet) { + const NODE_W = 132; + const NODE_H = 68; + const SIBLING_GAP = 22; + const ROW_GAP = 116; + const LEFT_PAD = 82; + const TOP_PAD = 44; + const RIGHT_PAD = 48; + const BOTTOM_PAD = 30; + const positions = new Map(); + let width = 420; + rows.forEach((row, rowIndex) => { + const y = TOP_PAD + rowIndex * (NODE_H + ROW_GAP); + let x = LEFT_PAD; + for (const n of row) { + positions.set(n.id, { x, y, rowIndex, node: n }); + x += NODE_W + SIBLING_GAP; + } + width = Math.max(width, x - SIBLING_GAP + RIGHT_PAD); + }); + const height = TOP_PAD + Math.max(0, rows.length - 1) * (NODE_H + ROW_GAP) + NODE_H + BOTTOM_PAD; + return { positions, width, height, nodeW: NODE_W, nodeH: NODE_H, topPad: TOP_PAD, rowGap: ROW_GAP, fastMode: true }; +} + +function lineageBuildLinksFast(nodes, idSet, layout) { + const { positions, nodeW, nodeH } = layout; + const partnerLinks = []; + const childLinks = []; + const seenPartners = new Set(); + let childLinkGroups = 0; + let childLinkEdges = 0; + for (const child of nodes) { + const childPos = positions.get(child.id); + if (!childPos) continue; + const parents = lineageParentIds(child, idSet).map(id => positions.get(id)).filter(Boolean).sort((a, b) => a.x - b.x); + if (!parents.length) continue; + childLinkGroups += 1; + childLinkEdges += parents.length; + const childX = childPos.x + nodeW / 2; + const childY = childPos.y; + const fromY = Math.max(...parents.map(p => p.y + nodeH)); + const joinX = parents.reduce((sum, p) => sum + p.x + nodeW / 2, 0) / parents.length; + if (parents.length >= 2) { + const left = parents[0]; + const right = parents[parents.length - 1]; + const partnerKey = parents.map(p => p.node?.id).filter(Boolean).sort().join("+"); + if (partnerKey && !seenPartners.has(partnerKey)) { + seenPartners.add(partnerKey); + const y = ((left.y + nodeH / 2) + (right.y + nodeH / 2)) / 2; + partnerLinks.push(`M ${(left.x + nodeW).toFixed(1)} ${y.toFixed(1)} L ${right.x.toFixed(1)} ${y.toFixed(1)}`); + } + } + const laneY = Math.min(childY - 18, fromY + Math.max(28, (childY - fromY) * 0.48)); + childLinks.push(`M ${joinX.toFixed(1)} ${fromY.toFixed(1)} L ${joinX.toFixed(1)} ${laneY.toFixed(1)} L ${childX.toFixed(1)} ${laneY.toFixed(1)} L ${childX.toFixed(1)} ${childY.toFixed(1)}`); + } + return { partnerLinks, childLinks, childLinkGroups, childLinkEdges }; +} + function buildLineageTreeLayout(component, family) { family = lineageEdgeFamily(family); const cleaned = lineageCleanComponent(component, family); @@ -1121,12 +1376,13 @@ function buildLineageTreeLayout(component, family) { const idSet = new Set(idToNode.keys()); const generations = Array.from(new Set(nodes.map(n => n.generation || 1))).sort((a, b) => a - b); const rows = lineageRowsForLayout(nodes, generations, idToNode, idSet); - const layout = lineageLayoutRows(rows, idSet); - const links = lineageBuildLinks(nodes, idSet, layout); + const perf = lineageFastLayoutNeeded(nodes, idSet, family); + const layout = perf.fast ? lineageLayoutRowsFast(rows, idSet) : lineageLayoutRows(rows, idSet); + const links = perf.fast ? lineageBuildLinksFast(nodes, idSet, layout) : lineageBuildLinks(nodes, idSet, layout); const labels = generations.map((g, rowIndex) => ({ generation: g, y: layout.topPad + rowIndex * (layout.nodeH + layout.rowGap) + 18 })); const renderedNodes = nodes.map(n => ({ node: n, ...(layout.positions.get(n.id) || {}) })).filter(n => Number.isFinite(n.x) && Number.isFinite(n.y)); - return { ...layout, labels, nodes: renderedNodes, childLinks: links.childLinks, partnerLinks: links.partnerLinks, childLinkGroups: links.childLinkGroups, childLinkEdges: links.childLinkEdges }; + return { ...layout, labels, nodes: renderedNodes, childLinks: links.childLinks, partnerLinks: links.partnerLinks, childLinkGroups: links.childLinkGroups, childLinkEdges: links.childLinkEdges, fastMode: perf.fast, edgeCount: perf.edgeCount }; } function lineageFamilyHtml(component, index, family, signature = "") { @@ -1146,7 +1402,7 @@ function lineageFamilyHtml(component, index, family, signature = "") { const nodeHtml = layout.nodes.map(p => lineageTreeNodeHtml(p.node, p.x, p.y)).join(""); const empty = !layout.childLinks.length ? `
    \u89aa\u5b50\u95a2\u4fc2\u306e\u7dda\u306f\u307e\u3060\u3042\u308a\u307e\u305b\u3093\u3002
    ` : ""; - const html = `
    + const html = `

    \u5bb6\u7cfb {{LINEAGE_INDEX}} / ${uniqueComponent.length}\u5339 / \u751f\u5b58 ${aliveCount}

    \u751f\u304d\u3066\u3044\u308b\u69cb\u6210\u54e1\u3092\u6301\u3064\u5bb6\u7cfb\u306f\u307e\u3060\u3042\u308a\u307e\u305b\u3093\u3002
    `; - uiCache.archiveRenderRunning = false; - world.familyTreeDirty = false; - uiCache.archivePendingDirtyAfterRun = false; - return; - } - - ui.archiveContent.innerHTML = `
    \u5bb6\u7cfb\u56f3\u3092\u63cf\u753b\u4e2d\u2026 0 / ${components.length}
    `; + ui.archiveContent.innerHTML = `
    \u5bb6\u7cfb\u56f3\u3092\u6e96\u5099\u4e2d\u2026
    `; + lineageRestoreArchiveScroll(scrollState); const status = ui.archiveContent.querySelector(".lineage-render-status"); const forest = ui.archiveContent.querySelector(".lineage-forest"); - let index = 0; - const pump = () => { + const renderComponents = (components) => { if (uiCache.archiveRenderToken !== token || !forest) { uiCache.archiveRenderRunning = false; return; } + const splitComponents = components.flatMap(lineageSplitByActualEdges).filter(c => c.length); + uiCache.archiveRows = splitComponents; + if (!splitComponents.length) { + ui.archiveContent.innerHTML = `
    \u751f\u304d\u3066\u3044\u308b\u69cb\u6210\u54e1\u3092\u6301\u3064\u5bb6\u7cfb\u306f\u307e\u3060\u3042\u308a\u307e\u305b\u3093\u3002
    `; + lineageRestoreArchiveScroll(scrollState); + uiCache.archiveRenderRunning = false; + world.familyTreeDirty = false; + uiCache.archivePendingDirtyAfterRun = false; + return; + } + if (status) status.textContent = `\u5bb6\u7cfb\u56f3\u3092\u63cf\u753b\u4e2d\u2026 0 / ${splitComponents.length}`; + let index = 0; + const pump = () => { + if (uiCache.archiveRenderToken !== token || !forest) { + uiCache.archiveRenderRunning = false; + return; + } const started = performance.now(); let nodeBudget = 28; let renderedThisSlice = 0; - while (index < components.length) { - const component = components[index]; + while (index < splitComponents.length) { + const component = splitComponents[index]; if (renderedThisSlice > 0 && component.length > nodeBudget) break; - forest.insertAdjacentHTML("beforeend", lineageFamilyHtml(component, index, family, signatures[index])); + const signature = lineageComponentSignature(component, family); + activeCacheKeys.add(lineageFamilyCacheKey(component, family, signature)); + forest.insertAdjacentHTML("beforeend", lineageFamilyHtml(component, index, family, signature)); nodeBudget -= Math.max(1, component.length); index += 1; renderedThisSlice += 1; - if (index < components.length && (nodeBudget <= 0 || performance.now() - started > 6)) break; + if (index < splitComponents.length && (nodeBudget <= 0 || performance.now() - started > 6)) break; } - if (status) status.textContent = `\u5bb6\u7cfb\u56f3\u3092\u63cf\u753b\u4e2d\u2026 ${index} / ${components.length}`; - if (index < components.length) { - const schedule = window.requestIdleCallback || ((fn) => setTimeout(fn, 0)); - schedule(pump, { timeout: 220 }); + lineageRestoreArchiveScroll(scrollState); + if (status) status.textContent = `\u5bb6\u7cfb\u56f3\u3092\u63cf\u753b\u4e2d\u2026 ${index} / ${splitComponents.length}`; + if (index < splitComponents.length) { + lineageIdleSchedule(pump, 220); } else { if (status) status.remove(); + for (const key of Array.from(uiCache.archiveHtmlCache.keys())) { + if (!activeCacheKeys.has(key)) uiCache.archiveHtmlCache.delete(key); + } + lineageRestoreArchiveScroll(scrollState); const renderDirtiedAgain = uiCache.archivePendingDirtyAfterRun || (world.familyVersion || 0) !== familyVersion; uiCache.archiveRenderRunning = false; world.familyTreeDirty = renderDirtiedAgain; if (uiCache.archiveDiagnostics) { uiCache.archiveDiagnostics.renders = (uiCache.archiveDiagnostics.renders || 0) + 1; uiCache.archiveDiagnostics.lastMs = Math.round((performance.now() - renderStarted) * 10) / 10; - uiCache.archiveDiagnostics.lastFamilies = components.length; - uiCache.archiveDiagnostics.lastNodes = components.reduce((sum, component) => sum + component.length, 0); + uiCache.archiveDiagnostics.lastFamilies = splitComponents.length; + uiCache.archiveDiagnostics.lastNodes = splitComponents.reduce((sum, component) => sum + component.length, 0); } if (renderDirtiedAgain) { uiCache.archivePendingDirtyAfterRun = false; @@ -1294,8 +1541,16 @@ function renderArchive() { } } }; - const schedule = window.requestIdleCallback || ((fn) => setTimeout(fn, 0)); - schedule(pump, { timeout: 160 }); + lineageIdleSchedule(pump, 160); + }; + lineageBuildComponentsIdle( + family, + token, + (label, done, total) => { + if (status) status.textContent = `${label}\u2026 ${Math.min(done || 0, total || 0)} / ${total || 0}`; + }, + renderComponents + ); } function validateFamilyTree() { diff --git a/js/world.js b/js/world.js index 4ac8673..c5dbe67 100644 --- a/js/world.js +++ b/js/world.js @@ -1,4 +1,4 @@ -"use strict"; +"use strict"; class World { constructor() { @@ -276,12 +276,12 @@ class World { } toolSizeFor(type = "") { - if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return "medium"; + if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "food", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return "medium"; return (this.toolSizes && this.toolSizes[type]) || this.toolSize || "medium"; } toolSizeScale(type = "") { - if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return 1; + if (!["firecracker", "fence_v", "fence_h", "stone", "grass", "food", "sweet", "love_mochi", "fight_mochi", "sleep_drug", "zunchi"].includes(type)) return 1; return { small: 0.68, medium: 1.0, large: 1.48 }[this.toolSizeFor(type)] || 1; } @@ -292,7 +292,16 @@ class World { item.toolSize = size; this.toolSize = size; item.r *= scale; - if (["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass", "zunchi"].includes(item.type)) item.amount *= scale * scale; + if (typeof isServingFoodType === "function" && isServingFoodType(item.type)) { + const servings = typeof foodServingsForSize === "function" ? foodServingsForSize(size) : 5; + item.foodServingScale = scale; + item.foodServingsMax = servings; + item.foodServingsRemaining = servings; + item.amount = servings; + } else if (["grass", "zunchi"].includes(item.type)) { + item.amount *= scale * scale; + item.foodServingScale = scale; + } if (item.type === "firecracker") item.blastScale = scale; return item; } @@ -368,12 +377,13 @@ class World { let changed = false; const nextParents = uniqueIds(t.parents || []); const nextChildren = uniqueIds(t.children || []); + const nextPersonalityTags = getPersonalityTraitTags(t); if (!this.family[t.id]) { this.family[t.id] = { id: t.id, name: t.name, type: t.type, - personality: t.personality || "", + personalityTags: nextPersonalityTags, generation: t.generation, hasPaired: !!t.hasPaired, parents: nextParents, @@ -389,7 +399,7 @@ class World { const nextAlive = !t.dead; if (entry.name !== t.name) changed = true; if (entry.type !== t.type) changed = true; - if ((entry.personality || "") !== (t.personality || "")) changed = true; + if (!sameList(entry.personalityTags, nextPersonalityTags)) changed = true; if (entry.hasPaired !== !!t.hasPaired) changed = true; if (entry.generation !== t.generation) changed = true; if ((entry.deathReason || "") !== (t.deathReason || entry.deathReason || "")) changed = true; @@ -398,7 +408,8 @@ class World { if (!sameList(entry.children, nextChildren)) changed = true; entry.name = t.name; entry.type = t.type; - entry.personality = t.personality || entry.personality || ""; + delete entry.personality; + entry.personalityTags = nextPersonalityTags; entry.alive = nextAlive; entry.generation = t.generation; entry.hasPaired = !!t.hasPaired; @@ -449,7 +460,7 @@ class World { id, name: live?.name || n.name || id, type: live?.type || n.type || "smile", - personality: live?.personality || n.personality || "", + personalityTags: live ? getPersonalityTraitTags(live) : [...(n.personalityTags || [])], generation: Math.max(1, live?.generation || n.generation || 1), hasPaired: !!(live?.hasPaired || n.hasPaired), parents, @@ -565,7 +576,7 @@ class World { if (this.family[t.id].alive !== false || this.family[t.id].deathReason !== finalReason) { this.family[t.id].alive = false; this.family[t.id].deathReason = finalReason; - this.family[t.id].personality = t.personality || this.family[t.id].personality || ""; + delete this.family[t.id].personality; this.familyVersion = (this.familyVersion || 0) + 1; this.markFamilyTreeDirty("death"); } @@ -629,6 +640,7 @@ class World { startBirthRitual(a, b) { if (!a || !b || a.dead || b.dead) return false; if (a.isZunchiSlave || b.isZunchiSlave) return false; + if (a.sleepDisease || b.sleepDisease || a.fightDisease || b.fightDisease) return false; if (a.birthRitualTimer > 0.04 || b.birthRitualTimer > 0.04) return false; const aJoined = a.familyJoined ? a.familyJoined() : Boolean((a.parents || []).length || (a.children || []).length); const bJoined = b.familyJoined ? b.familyJoined() : Boolean((b.parents || []).length || (b.children || []).length); @@ -659,10 +671,15 @@ class World { finishBirthRitual(a, b) { if (!a || !b || a.dead || b.dead) return null; + const reproductionBlockedByDisease = a.sleepDisease || b.sleepDisease || a.fightDisease || b.fightDisease; a.birthRitualTimer = b.birthRitualTimer = 0; a.birthPartnerId = b.birthPartnerId = null; a.birthRitualLeader = b.birthRitualLeader = false; a.state = b.state = "idle"; + if (reproductionBlockedByDisease) { + a.birthRitualRole = b.birthRitualRole = 0; + return null; + } a.fightTimer = b.fightTimer = 0; a.fightTargetIds = []; b.fightTargetIds = []; a.fightTargetId = b.fightTargetId = null; @@ -707,8 +724,10 @@ class World { canStartFight(t) { if (!t || t.dead) return false; if (t.sleepDisease) return false; - if (t.explosionDisease || t.fightDisease) return true; - if (t.zunchiDisease) return false; + // Disease fight rule: explosion disease and zunchi disease can lash out; + // sleep disease cannot fight or be challenged, and other diseases cannot start fights. + if (t.explosionDisease || t.zunchiDisease) return true; + if (t.fightDisease) return false; return true; } @@ -723,10 +742,11 @@ class World { spawnChild(a, b, index = 0, total = 1) { const inherited = Math.random() < 0.56 ? a.type : b.type; const mutation = Math.random() < 0.18 ? baseSpriteId() : inherited; - const inheritedPersonality = a.personality === b.personality ? a.personality : (Math.random() < 0.5 ? a.personality : b.personality); + const childBirthPersonality = personalityFromParents(a, b); const child = this.addTarinai({ type: mutation, - personality: inheritedPersonality || personalityForSeed(`${a.id}:${b.id}:${this.time}:${index}`), + birthPersonality: childBirthPersonality, + currentPersonality: childBirthPersonality, name: makeName(), age: 0, x: (a.x + b.x) / 2 + rand(-14, 14) + (index - (total - 1) / 2) * 18, @@ -822,8 +842,10 @@ class World { if (this.areParentChild(a, b) || this.areCoParents?.(a, b)) return; if ((a.postBirthPeaceTimer || 0) > 0 || (b.postBirthPeaceTimer || 0) > 0) return; if (a.fightTimer > 0.04 || b.fightTimer > 0.04 || a.intimidateTimer > 0.04 || b.intimidateTimer > 0.04) return; - const scoreA = a.energy * 0.38 + a.mood * 0.18 + a.stress * 0.12 + (a.type === "angry" ? 12 : 0) + (a.personality === "irritable" ? 8 : 0) + ((b.relationTo(a.id).fear || 0) * 0.65) + (a.isZunchiSlave ? -10 : 0) + ((a.fightMochiTimer || 0) > 0.04 ? 9 : 0) + rand(-5, 5); - const scoreB = b.energy * 0.38 + b.mood * 0.18 + b.stress * 0.12 + (b.type === "angry" ? 12 : 0) + (b.personality === "irritable" ? 8 : 0) + ((a.relationTo(b.id).fear || 0) * 0.65) + (b.isZunchiSlave ? -10 : 0) + ((b.fightMochiTimer || 0) > 0.04 ? 9 : 0) + rand(-5, 5); + const aAggressiveIntent = a.shouldApplyPersonalityBehavior?.("aggression", 1) ? 1 : 0; + const bAggressiveIntent = b.shouldApplyPersonalityBehavior?.("aggression", 1) ? 1 : 0; + const scoreA = a.energy * 0.38 + a.mood * 0.18 + a.stress * 0.12 + (a.type === "angry" ? 12 : 0) + aAggressiveIntent * 8 + ((b.relationTo(a.id).fear || 0) * 0.65) + (a.isZunchiSlave ? -10 : 0) + ((a.fightMochiTimer || 0) > 0.04 ? 9 : 0) + rand(-5, 5); + const scoreB = b.energy * 0.38 + b.mood * 0.18 + b.stress * 0.12 + (b.type === "angry" ? 12 : 0) + bAggressiveIntent * 8 + ((a.relationTo(b.id).fear || 0) * 0.65) + (b.isZunchiSlave ? -10 : 0) + ((b.fightMochiTimer || 0) > 0.04 ? 9 : 0) + rand(-5, 5); const actor = scoreA >= scoreB ? a : b; const target = actor === a ? b : a; if (!this.canFightPair(actor, target)) return; @@ -843,7 +865,7 @@ class World { if (!actor || !target || actor.dead || target.dead) return false; if (actor.lowHealthSprite && actor.lowHealthSprite()) return false; const fearLoad = (target.relationTo(actor.id).fear || 0) * 0.72 + target.personalityProfile().fear * 8; - const resistance = target.energy * 0.30 + target.mood * 0.16 + (target.personality === "irritable" ? 5 : 0) + rand(-5, 5); + const resistance = target.energy * 0.30 + target.mood * 0.16 + (target.shouldApplyPersonalityBehavior?.("aggression", 1) ? 5 : 0) + rand(-5, 5); const successChance = clamp(0.62 + (actorScore - targetScore + fearLoad - resistance) / 76, 0.50, 0.96); actor.surpriseTimer = Math.max(actor.surpriseTimer, 0.20); target.surpriseTimer = Math.max(target.surpriseTimer, 0.32); @@ -902,8 +924,10 @@ class World { b.fightTargetIds = b.fightTargetIds.slice(-4); a.fightTargetId = a.fightTargetIds[0]; b.fightTargetId = b.fightTargetIds[0]; - const aScore = a.energy * 0.52 + a.mood * 0.30 + (a.type === "angry" ? 10 : 0) + (a.personality === "irritable" ? 5 : 0) + ((a.fightMochiTimer || 0) > 0.04 ? 12 : 0) + (a.isZunchiSlave ? -14 : 0) + rand(-7, 7); - const bScore = b.energy * 0.52 + b.mood * 0.30 + (b.type === "angry" ? 10 : 0) + (b.personality === "irritable" ? 5 : 0) + ((b.fightMochiTimer || 0) > 0.04 ? 12 : 0) + (b.isZunchiSlave ? -14 : 0) + rand(-7, 7); + const aAggressiveIntent = a.shouldApplyPersonalityBehavior?.("aggression", 1) ? 1 : 0; + const bAggressiveIntent = b.shouldApplyPersonalityBehavior?.("aggression", 1) ? 1 : 0; + const aScore = a.energy * 0.52 + a.mood * 0.30 + (a.type === "angry" ? 10 : 0) + aAggressiveIntent * 5 + ((a.fightMochiTimer || 0) > 0.04 ? 12 : 0) + (a.isZunchiSlave ? -14 : 0) + rand(-7, 7); + const bScore = b.energy * 0.52 + b.mood * 0.30 + (b.type === "angry" ? 10 : 0) + bAggressiveIntent * 5 + ((b.fightMochiTimer || 0) > 0.04 ? 12 : 0) + (b.isZunchiSlave ? -14 : 0) + rand(-7, 7); const loser = aScore <= bScore ? a : b; const winner = loser === a ? b : a; loser.defeatedById = winner.id; @@ -987,9 +1011,12 @@ class World { ny = Math.sin(a); } const distanceBoost = p * p * 0.55 + p * 0.45; - const power = (260 + distanceBoost * 820) * rand(0.78, 1.24) * (it.blastScale || 1); - t.vx += nx * power + rand(-95, 95) * (0.6 + p); - t.vy += ny * power + rand(-95, 95) * (0.6 + p); + const power = (260 + distanceBoost * 920) * rand(0.78, 1.24) * (it.blastScale || 1); + this.applyImpulse(t, nx * power + rand(-95, 95) * (0.6 + p), ny * power + rand(-95, 95) * (0.6 + p), { + panic: true, + target: { x, y }, + fearTimer: 1.7 + p, + }); t.fallTimer = Math.max(t.fallTimer, 1.45 + p * 1.85); t.fallMax = Math.max(t.fallMax || 0, t.fallTimer); t.fallDir = (dx >= 0 ? 1 : -1) * (Math.random() < 0.5 ? 1 : -1); @@ -1012,8 +1039,7 @@ class World { dx = Math.cos(a); dy = Math.sin(a); d = 1; } const blast = 430 + p * 960; - ball.vx = (ball.vx || 0) + dx / d * blast + rand(-80, 80); - ball.vy = (ball.vy || 0) + dy / d * blast + rand(-80, 80); + this.applyImpulse(ball, dx / d * blast + rand(-80, 80), dy / d * blast + rand(-80, 80)); const speed = Math.hypot(ball.vx || 0, ball.vy || 0); ball.spinVelocity = clamp((ball.spinVelocity || 0) + rand(-24, 24), -38, 38); ball.lastPokedAt = this.time || 0; @@ -1050,9 +1076,12 @@ class World { nx = Math.cos(a); ny = Math.sin(a); } - const diseaseBlast = (190 + q * 560) * rand(0.80, 1.22); - o.vx += nx * diseaseBlast + rand(-64, 64) * (0.5 + q); - o.vy += ny * diseaseBlast + rand(-64, 64) * (0.5 + q); + const diseaseBlast = (190 + q * 620) * rand(0.80, 1.22); + this.applyImpulse(o, nx * diseaseBlast + rand(-64, 64) * (0.5 + q), ny * diseaseBlast + rand(-64, 64) * (0.5 + q), { + panic: true, + target: { x, y }, + fearTimer: 1.0 + q, + }); o.hurtTimer = Math.max(o.hurtTimer || 0, 1.2 + q); o.fearTimer = Math.max(o.fearTimer || 0, 1.0 + q); if (!o.dead && Math.random() < 0.020 * q) o.infectExplosionDisease?.(t); @@ -1088,7 +1117,7 @@ class World { cleaned += p * 0.55; } for (const t of this.nearbyTarinai(x, y, radius + 70)) { - if (!t || t.dead) continue; + if (!t || t.dead || this.isTarinaiHiddenInNestBox(t)) continue; const d = distXY(t.x, t.y, x, y); if (d > radius + t.radius) continue; const p = clamp(1 - d / (radius + t.radius), 0, 1); @@ -1187,12 +1216,19 @@ class World { return Boolean(it && (it.type === "bed" || it.type === "nest_box")); } + isTarinaiHiddenInNestBox(t) { + return Boolean(t && !t.dead && t.insideNestBoxId); + } + bedOccupancy(bed) { if (!this.isSleepFurniture(bed)) return 0; + if (bed.type === "nest_box") { + return this.nestBoxOccupants ? this.nestBoxOccupants(bed, Infinity).length : 0; + } let n = 0; const radius = Math.max(86, bed.r * 2.45); for (const t of this.nearbyTarinai(bed.x, bed.y, radius)) { - if (t.dead) continue; + if (t.dead || this.isTarinaiHiddenInNestBox(t)) continue; if (t.state === "sleep" || t.state === "seek_bed" || t.target === bed) n += 1; } return n; @@ -1205,23 +1241,27 @@ class World { } bestBedFor(t, maxDist = 360) { - let best = null; - let bestScore = Infinity; - for (const bed of this.nearbyItems(t.x, t.y, maxDist)) { - if (bed.dead || !this.isSleepFurniture(bed)) continue; - if (bed.type === "nest_box" && t?.insideNestBoxId !== bed.id) { - const occupants = this.nestBoxOccupants ? this.nestBoxOccupants(bed, Infinity) : []; - if (occupants.length >= this.nestBoxCapacity(bed)) continue; + const choose = (kind) => { + let best = null; + let bestScore = Infinity; + for (const bed of this.nearbyItems(t.x, t.y, maxDist)) { + if (bed.dead || !this.isSleepFurniture(bed) || bed.type !== kind) continue; + if (bed.type === "nest_box" && t?.insideNestBoxId !== bed.id) { + const occupants = this.nestBoxOccupants ? this.nestBoxOccupants(bed, Infinity) : []; + if (occupants.length >= this.nestBoxCapacity(bed)) continue; + } + if (t?.shouldAvoidTarget && t.shouldAvoidTarget(bed)) continue; + const d = dist(t, bed); + const occ = this.bedOccupancy(bed); + const comfort = this.bedComfort(bed); + const crowdPenalty = bed.type === "nest_box" ? Math.max(0, occ - this.nestBoxCapacity(bed) + 1) * 120 : Math.max(0, occ - 3) * 34; + const score = d - comfort * (bed.type === "nest_box" ? 72 : 46) + crowdPenalty; + if (score < bestScore) { best = bed; bestScore = score; } } - if (t?.shouldAvoidTarget && t.shouldAvoidTarget(bed)) continue; - const d = dist(t, bed); - const occ = this.bedOccupancy(bed); - const comfort = this.bedComfort(bed); - const crowdPenalty = Math.max(0, occ - 3) * 34; - const score = d - comfort * 46 + crowdPenalty; - if (score < bestScore) { best = bed; bestScore = score; } - } - return best; + return best; + }; + // Prefer an available nest box, then fall back to a hay bed. + return choose("nest_box") || choose("bed"); } relationNotice(aId, bId, kind, cooldown = 30) { @@ -1233,6 +1273,52 @@ class World { return true; } + applyImpulse(entity, vx = 0, vy = 0, options = {}) { + if (!entity || entity.dead) return false; + if (!Number.isFinite(vx) || !Number.isFinite(vy)) return false; + if (entity instanceof Tarinai || "impulseVx" in entity || "impulseVy" in entity) { + entity.impulseVx = (Number.isFinite(entity.impulseVx) ? entity.impulseVx : 0) + vx; + entity.impulseVy = (Number.isFinite(entity.impulseVy) ? entity.impulseVy : 0) + vy; + } else { + entity.vx = (Number.isFinite(entity.vx) ? entity.vx : 0) + vx; + entity.vy = (Number.isFinite(entity.vy) ? entity.vy : 0) + vy; + } + if (options.panic && entity instanceof Tarinai) { + entity.state = "panic"; + entity.target = options.target || null; + entity.fearTimer = Math.max(entity.fearTimer || 0, options.fearTimer ?? 0.55); + } + return true; + } + + applyKnockback(entity, sourceX, sourceY, strength = 0, options = {}) { + if (!entity || !Number.isFinite(strength)) return false; + let dx = (entity.x || 0) - sourceX; + let dy = (entity.y || 0) - sourceY; + let d = Math.hypot(dx, dy); + if (!Number.isFinite(d) || d < 0.001) { + const a = Number.isFinite(options.angle) ? options.angle : rand(0, Math.PI * 2); + dx = Math.cos(a); + dy = Math.sin(a); + d = 1; + } + const random = options.random || 0; + return this.applyImpulse( + entity, + dx / d * strength + rand(-random, random), + dy / d * strength + rand(-random, random), + options, + ); + } + + applyImpactDamage(target, amount, cause = "\u885d\u7a81", options = {}) { + if (!target || target.dead || !Number.isFinite(amount) || amount <= 0) return false; + const normalized = options.cause || cause || "\u885d\u7a81"; + if (target.damage) target.damage(amount, normalized); + else if (Number.isFinite(target.hp)) target.hp -= amount; + return true; + } + resolveFightOutcome(winner, loser) { if (!winner || !loser || winner.dead || loser.dead) return; const key = `${winner.id}:${loser.id}:${Math.floor(this.time / 2)}`; @@ -1250,6 +1336,8 @@ class World { loser.relationTo(winner.id).fightsLost = (loser.relationTo(winner.id).fightsLost || 0) + 1; winner.totalFightWins = (winner.totalFightWins || 0) + 1; loser.totalFightLosses = (loser.totalFightLosses || 0) + 1; + winner.adjustPersonality?.("aggression", 0.018, "after winning fights."); + loser.adjustPersonality?.("aggression", -0.018, "after losing fights."); if ((loser.totalFightLosses || 0) >= 5 && loser.becomeZunchiSlave?.(winner)) { const oldName = loser.formerName || loser.name; this.spawnBubble(loser.x, loser.y - loser.radius * 1.20, "\u3076\u308a\u3085\u2026", "rgba(74,91,50,0.78)"); @@ -1272,7 +1360,7 @@ class World { const push = isStone ? rand(145, 210) : rand(54, 92); let hit = 0; for (const t of this.nearbyTarinai(it.x, it.y, radius + 48)) { - if (!t || t.dead) continue; + if (!t || t.dead || this.isTarinaiHiddenInNestBox(t)) continue; const d = Math.max(1, distXY(t.x, t.y, it.x, it.y)); const p = clamp(1 - d / (radius + t.radius), 0, 1); if (p <= 0) continue; @@ -1315,8 +1403,8 @@ class World { for (const [ball, arr] of groups) { if (arr.length <= 5) continue; arr.sort((a, b) => { - const ap = a.personality === "playful" ? -120 : 0; - const bp = b.personality === "playful" ? -120 : 0; + const ap = ((a.currentPersonality?.openness || 0) >= 0.5) ? -120 : 0; + const bp = ((b.currentPersonality?.openness || 0) >= 0.5) ? -120 : 0; return dist(a, ball) + ap - (dist(b, ball) + bp); }); for (const t of arr.slice(5)) { @@ -1355,7 +1443,8 @@ class World { ball.amount = Math.max(ball.amount || 999, 999); audio.poke(); this.effects.push(new Effect("ring", ball.x, ball.y, { size: Math.max(16, ball.r * (0.95 + ball.pokeCombo * 0.05)), life: 0.22, color: "rgba(255,255,255,0.58)" })); - // 繝懊・繝ォ繧偵▽縺、縺・◆繧、繝吶Φ繝医・隕ウ蟇欟I縺ク谿九&縺ェ縺・€・ return true; + this.log("\u30dc\u30fc\u30eb\u3092\u3064\u3064\u3044\u3066\u8ee2\u304c\u3057\u305f\u3002", "observe", { eventType: "ball_poke", hiddenFromObservation: true }); + return true; } resolveBallBallCollisions(dt) { @@ -1368,7 +1457,7 @@ class World { const avx = a.vx || 0; const avy = a.vy || 0; const aSpeed = Math.hypot(avx, avy); - const range = ar * 2 + Math.min(560, aSpeed * Math.max(0.016, dt || 0.016)) + 52; + const range = ar * 2 + aSpeed * Math.max(0.016, dt || 0.016) + 52; for (const b of this.nearbyItems(a.x, a.y, range) || []) { if (!b || b === a || b.dead || b.type !== "ball") continue; const key = a.id < b.id ? `${a.id}:${b.id}` : `${b.id}:${a.id}`; @@ -1460,7 +1549,7 @@ class World { const sy = ball.y - py; const segLenSq = sx * sx + sy * sy; for (const t of this.nearbyTarinai(ball.x, ball.y, range)) { - if (!t || t.dead || t.state === "sleep") continue; + if (!t || t.dead || t.state === "sleep" || this.isTarinaiHiddenInNestBox(t)) continue; let hitX = ball.x; let hitY = ball.y; if (segLenSq > 1) { @@ -1492,11 +1581,14 @@ class World { const bvy = ballSpeed > 0.01 ? (ball.vy || 0) / ballSpeed : ny; const damage = clamp((ballSpeed - 285) / 18, 3.5, 38); t.lastBallDamageAt = now; - t.vx = (t.vx || 0) * 0.35 + (ball.vx || 0) * 0.20; - t.vy = (t.vy || 0) * 0.35 + (ball.vy || 0) * 0.20; - t.damage(damage, "\u885d\u7a81"); - const timidStress = t.personality === "timid" ? 1.55 : 1.0; - const stressGain = clamp(damage * 0.55 * timidStress, 3, t.personality === "timid" ? 26 : 18); + this.applyImpulse(t, (ball.vx || 0) * 0.20, (ball.vy || 0) * 0.20, { + panic: true, + target: { x: ball.x, y: ball.y }, + fearTimer: 0.95, + }); + this.applyImpactDamage(t, damage, "\u885d\u7a81"); + const sensitiveHit = t.shouldApplyPersonalityBehavior?.("neuroticism", 1) ? 1.35 : (t.shouldApplyPersonalityBehavior?.("neuroticism", -1) ? 0.82 : 1.0); + const stressGain = clamp(damage * 0.55 * sensitiveHit, 3, sensitiveHit > 1 ? 24 : 18); t.addStress ? t.addStress(stressGain, { threshold: 8 }) : (t.stress = clamp(t.stress + stressGain, 0, 130)); t.state = "panic"; t.target = { x: ball.x, y: ball.y }; @@ -1513,14 +1605,14 @@ class World { ball.vx = (ball.vx || 0) * 0.58 - nx * Math.min(110, ballSpeed * 0.10); ball.vy = (ball.vy || 0) * 0.58 - ny * Math.min(110, ballSpeed * 0.10); ball.spinVelocity = clamp((ball.spinVelocity || 0) + (nx >= 0 ? -1 : 1) * 8.5, -38, 38); - if (t.dead) continue; + continue; } const relVx = (t.vx || 0) - (ball.vx || 0); const relVy = (t.vy || 0) - (ball.vy || 0); const relativeSpeed = Math.hypot(relVx, relVy); const playIntent = t.state === "play_ball" || t.target === ball; - const playful = t.personality === "playful"; + const playful = t.shouldApplyPersonalityBehavior?.("openness", 1); const impulse = clamp(48 + relativeSpeed * 0.72 + (playIntent ? 52 : 0) + (playful ? 24 : 0), 48, isDangerous ? 360 : 260); ball.vx = (ball.vx || 0) * (isDangerous ? 0.78 : 0.92) + nx * impulse + (t.vx || 0) * 0.52; ball.vy = (ball.vy || 0) * (isDangerous ? 0.78 : 0.92) + ny * impulse + (t.vy || 0) * 0.52; @@ -1534,8 +1626,8 @@ class World { t.vy -= ny * Math.min(22, impulse * 0.10); t.energy = clamp(t.energy - (playIntent ? 0.20 : 0.08), 0, 100); const playRelief = playful && playIntent ? 2.8 : playful ? 1.5 : playIntent ? 0.75 : 0.20; - const timidBump = t.personality === "timid" && !playIntent ? clamp(ballSpeed / 190, 0.9, 3.8) : 0; - t.stress = clamp(t.stress - playRelief + timidBump, 0, 130); + const sensitiveBump = t.shouldApplyPersonalityBehavior?.("neuroticism", 1) && !playIntent ? clamp(ballSpeed / 230, 0.6, 2.6) : 0; + t.stress = clamp(t.stress - playRelief + sensitiveBump, 0, 130); if (playful && playIntent) { t.loneliness = clamp(t.loneliness - 0.9, 0, 100); t.affection = clamp(t.affection + 0.18, 0, 100); @@ -1556,7 +1648,7 @@ class World { const now = this.time || 0; if (!this.tarinaiCollisionMemo) this.tarinaiCollisionMemo = new Map(); for (const a of this.tarinai || []) { - if (!a || a.dead) continue; + if (!a || a.dead || this.isTarinaiHiddenInNestBox(a)) continue; const avx = a.vx || 0; const avy = a.vy || 0; const aSpeed = Math.hypot(avx, avy); @@ -1568,7 +1660,7 @@ class World { const segLenSq = sx * sx + sy * sy; const range = (a.radius || 22) * 2.5 + aSpeed * Math.max(0.016, dt || 0.016) + 64; for (const b of this.nearbyTarinai(a.x, a.y, range)) { - if (!b || b === a || b.dead) continue; + if (!b || b === a || b.dead || this.isTarinaiHiddenInNestBox(b)) continue; const key = a.id < b.id ? `${a.id}:${b.id}` : `${b.id}:${a.id}`; if (now - (this.tarinaiCollisionMemo.get(key) || -999) < 0.42) continue; const bvx = b.vx || 0; @@ -1601,12 +1693,15 @@ class World { ny = Math.sin(aa); } const damage = clamp((relSpeed - 118) / 26, 1.2, 22); - target.vx += ivx * 0.20 + nx * 28; - target.vy += ivy * 0.20 + ny * 28; + this.applyImpulse(target, ivx * 0.20 + nx * 28, ivy * 0.20 + ny * 28, { + panic: true, + target: { x: impactor.x, y: impactor.y }, + fearTimer: 0.55, + }); impactor.vx = ivx * 0.72 - nx * Math.min(56, relSpeed * 0.10); impactor.vy = ivy * 0.72 - ny * Math.min(56, relSpeed * 0.10); - target.damage(damage, "\u885d\u7a81"); - if (!impactor.dead) impactor.damage(damage * 0.35, "\u885d\u7a81"); + this.applyImpactDamage(target, damage, "\u885d\u7a81"); + if (!impactor.dead) this.applyImpactDamage(impactor, damage * 0.35, "\u885d\u7a81"); for (const t of [target, impactor]) { if (!t || t.dead) continue; t.state = "panic"; @@ -1639,7 +1734,7 @@ class World { let best = null, bestD = maxDist; const candidates = Number.isFinite(maxDist) ? this.nearbyTarinai(entity.x, entity.y, maxDist) : this.tarinai; for (const o of candidates) { - if (o === entity || o.dead) continue; + if (o === entity || o.dead || this.isTarinaiHiddenInNestBox(o)) continue; if (predicate && !predicate(o)) continue; if (entity?.shouldAvoidTarget && entity.shouldAvoidTarget(o)) continue; const d = dist(entity, o); @@ -1707,6 +1802,47 @@ class World { return this.nestBoxSolidRects(it)[0] || null; } + nestBoxEntryPoint(box) { + const base = this.nestBoxBaseRect(box); + if (!base) return { x: box?.x || 0, y: box?.y || 0 }; + const r = box.r || 42; + // Move the approach point to the center of the open middle cell. The + // collision resolver also ignores this nest box for active sleepers near + // the door, so tarinai can cross the threshold instead of sliding off posts. + return { + x: clamp(box.x, CONFIG.worldPadding, this.w - CONFIG.worldPadding), + y: clamp(box.y + r * 0.02, base.top + r * 0.46, base.bottom - r * 0.18), + }; + } + + nestBoxExitPoint(box, occupant = null) { + const base = this.nestBoxBaseRect(box); + if (!base) return this.nestBoxEntryPoint(box); + const r = box.r || 42; + const side = occupant ? (stableUnit(occupant.id || "nest", `nest-exit-${box.id || "box"}`) - 0.5) * r * 0.36 : 0; + return { + x: clamp(box.x + side, CONFIG.worldPadding, this.w - CONFIG.worldPadding), + y: clamp(base.bottom + r * 0.22, CONFIG.worldPadding, this.h - CONFIG.worldPadding), + }; + } + + nestBoxInnerPoint(box, occupant = null) { + const base = this.nestBoxBaseRect(box); + if (!base) return { x: box?.x || 0, y: box?.y || 0 }; + const occupants = this.nestBoxOccupants ? this.nestBoxOccupants(box, Infinity) : []; + let index = occupants.indexOf(occupant); + if (index < 0) index = Math.min(occupants.length, this.nestBoxCapacity(box) - 1); + const r = box.r || 42; + const slots = [ + [0.00, -0.02], [-0.22, 0.04], [0.22, 0.04], [-0.11, 0.16], [0.11, 0.16], + ]; + const slot = slots[index % slots.length]; + return { + x: clamp(box.x + slot[0] * r, base.left + r * 0.46, base.right - r * 0.46), + y: clamp(box.y + slot[1] * r, base.top + r * 0.34, base.bottom - r * 0.18), + }; + } + solidObstacleRects(it) { if (!it || it.dead) return []; if (this.isFenceType(it.type)) { @@ -1717,6 +1853,20 @@ class World { return []; } + shouldIgnoreNestBoxCollisionFor(t, box) { + if (!t || !box || box.dead || box.type !== "nest_box") return false; + if (t.insideNestBoxId) return true; + if (t.target !== box || (t.state !== "seek_bed" && t.state !== "sleep")) return false; + const entry = this.nestBoxEntryPoint(box); + const base = this.nestBoxBaseRect(box); + const r = box.r || 42; + const entryD = distXY(t.x, t.y, entry.x, entry.y); + const centerD = distXY(t.x, t.y, box.x, box.y); + const aroundDoor = entryD <= Math.max(128, r * 2.25) || centerD <= Math.max(116, r * 2.0); + const inDoorColumn = base && t.x >= base.left + r * 0.18 && t.x <= base.right - r * 0.18 && t.y >= base.top + r * 0.02 && t.y <= base.bottom + r * 0.58; + return Boolean(aroundDoor || inDoorColumn); + } + nearbySolidObstacleRects(x, y, radius, { include = null, exclude = null, maxChecks = CONFIG.maxFenceCollisionChecks ?? 24 } = {}) { const rects = []; let checked = 0; @@ -1764,10 +1914,11 @@ class World { } resolveSolidObstacleCollision(t) { - if (!t || t.dead) return; + if (!t || t.dead || this.isTarinaiHiddenInNestBox(t)) return; const rr = Math.max(8, t.radius * 0.74); let pushed = false; for (const rect of this.nearbySolidObstacleRects(t.x, t.y, rr + 150)) { + if (rect?.type === "nest_box" && this.shouldIgnoreNestBoxCollisionFor(t, rect.item)) continue; if (this.pushTarinaiOutOfRect(t, rect, rr)) pushed = true; } if (pushed) { @@ -1833,7 +1984,7 @@ class World { grassOnTarinaiAt(x, y, minGap = 24) { for (const t of this.nearbyTarinai(x, y, minGap + 36)) { - if (t.dead) continue; + if (t.dead || this.isTarinaiHiddenInNestBox(t)) continue; if (distXY(x, y, t.x, t.y) < Math.max(minGap, t.radius * 1.15)) return true; } return false; @@ -2041,12 +2192,12 @@ class World { observeHighlightKind(t) { const s = this.selected; - if (!s || !t || t === s || t.dead) return ""; + if (!s || !t || t === s || t.dead || this.tool !== "observe") return ""; if ((s.parents || []).includes(t.id)) return "parent"; if ((s.children || []).includes(t.id)) return "child"; const rel = s.relationTo ? s.relationTo(t.id) : null; + if (rel && (rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD) return "friend"; if (rel && (rel.fear || 0) >= 8) return "enemy"; - if (rel && (rel.affinity || 0) >= 10) return "friend"; return ""; } @@ -2066,8 +2217,22 @@ class World { if (d < bestD && d <= Math.max(80, it.r * 2.1)) { best = it; bestD = d; } } if (!best) return null; - const occupants = this.nestBoxOccupants(best); - return { box: best, occupants }; + const occupants = this.nestBoxOccupants(best, Infinity); + const capacity = this.nestBoxCapacity(best); + return { box: best, occupants, capacity }; + } + + nestBoxToolTipCount() { + const pointed = this.pointerNestBoxInfo?.(); + if (pointed?.box) return { current: pointed.occupants.length, max: pointed.capacity || this.nestBoxCapacity(pointed.box) }; + const boxes = (this.items || []).filter(it => it && !it.dead && it.type === "nest_box"); + if (!boxes.length) return { current: 0, max: this.nestBoxCapacity() }; + let current = 0, max = 0; + for (const box of boxes) { + current += this.nestBoxOccupants(box, Infinity).length; + max += this.nestBoxCapacity(box); + } + return { current, max }; } blastZunchiFrom(x, y, radius, strength = 1) { @@ -2100,7 +2265,11 @@ class World { dt = Math.min(dt, 0.12 * this.speed); this.time += dt; + const previousDay = this.day || 1; this.day = Math.floor(this.time / CONFIG.dayLength) + 1; + if (this.day !== previousDay) { + for (const t of this.tarinai || []) if (t) t.personalityDaily = { day: this.day, total: 0, byKey: {} }; + } if (this.pointer) this.pointer.motion = Math.max(0, (this.pointer.motion || 0) - dt * 2.4); this.updateWeather(dt); this.rebuildSpatial(); @@ -2242,7 +2411,7 @@ class World { t.vx = 0; t.vy = 0; t.entryTimer = 0; - t.die("莉墓ァ倥↓繧医j逕サ髱「螟悶〒蜑企勁"); + t.die(HEALTH?.CAUSES?.outOfBounds || "\u4ed5\u69d8\u306b\u3088\u308a\u753b\u9762\u5916\u3067\u524a\u9664"); } else if (result === "moved") { t.x = clamp(Number.isFinite(t.x) ? t.x : this.w * 0.5, pad, this.w - pad); t.y = clamp(Number.isFinite(t.y) ? t.y : this.h * 0.5, pad, this.h - pad); @@ -2289,11 +2458,104 @@ class World { return false; } + placementBlocked(item) { + if (!item || item.dead) return true; + const pad = CONFIG.worldPadding || 30; + const rects = this.solidObstacleRects(item); + if (rects.length) { + for (const rect of rects) { + if (rect.left < pad || rect.top < pad || rect.right > this.w - pad || rect.bottom > this.h - pad) return true; + } + } else { + const radius = Math.max(14, (item.r || 12) * (item.type === "bed" ? 1.55 : 1.25)); + if (item.x - radius < pad || item.y - radius < pad || item.x + radius > this.w - pad || item.y + radius > this.h - pad) return true; + } + if (item.type === "grass" && !this.grassSpotOpen(item.x, item.y, { avoidTarinai: true })) return true; + if (this.isFenceType(item.type) && this.fencePlacementBlocked(item)) return true; + if (item.type === "nest_box") { + const margin = Math.max(8, (item.r || 42) * 0.18); + for (const it of this.nearbyItems(item.x, item.y, Math.max(120, (item.r || 42) * 3))) { + if (!it || it === item || it.dead) continue; + for (const rect of this.solidObstacleRects(it)) { + for (const own of rects) { + const separated = own.right + margin < rect.left || own.left - margin > rect.right || own.bottom + margin < rect.top || own.top - margin > rect.bottom; + if (!separated) return true; + } + } + } + } + return false; + } + + placementClampPointFor(item, x = item?.x || 0, y = item?.y || 0) { + const pad = CONFIG.worldPadding || 30; + const rects = this.solidObstacleRects(item); + if (rects.length) { + let left = 0, right = 0, top = 0, bottom = 0; + for (const rect of rects) { + left = Math.max(left, (item.x || 0) - rect.left); + right = Math.max(right, rect.right - (item.x || 0)); + top = Math.max(top, (item.y || 0) - rect.top); + bottom = Math.max(bottom, rect.bottom - (item.y || 0)); + } + return { + x: clamp(x, pad + left, this.w - pad - right), + y: clamp(y, pad + top, this.h - pad - bottom), + }; + } + const radius = Math.max(14, (item.r || 12) * (item.type === "bed" ? 1.55 : 1.25)); + return { + x: clamp(x, pad + radius, this.w - pad - radius), + y: clamp(y, pad + radius, this.h - pad - radius), + }; + } + + placementProbeItem(item, x, y) { + return { ...item, x, y, dead: false }; + } + + findPlacementSpot(item, { allowOriginal = true, maxRadius = null, attempts = null } = {}) { + if (!item || item.dead) return null; + if (item.type === "grass") { + const spot = this.findGrassPlantingSpot + ? this.findGrassPlantingSpot(item.x, item.y, { allowOriginal, attempts: attempts || 42, maxRadius: maxRadius || 170, avoidTarinai: true }) + : null; + if (!spot) return null; + const probe = this.placementProbeItem(item, spot.x, spot.y); + return this.placementBlocked(probe) ? null : spot; + } + + const start = this.placementClampPointFor(item, item.x, item.y); + const original = this.placementProbeItem(item, start.x, start.y); + if (allowOriginal && !this.placementBlocked(original)) return start; + + const solid = this.isFenceType(item.type) || item.type === "nest_box"; + const searchRadius = maxRadius || (solid ? Math.max(150, (item.r || 42) * 4.2) : Math.max(90, (item.r || 16) * 3.2)); + const count = attempts || (solid ? 72 : 36); + const golden = Math.PI * (3 - Math.sqrt(5)); + let best = null; + let bestD = Infinity; + for (let i = 0; i < count; i++) { + const t = count <= 1 ? 1 : i / (count - 1); + const radius = Math.max(8, searchRadius * Math.sqrt(t)); + const angle = i * golden + stableUnit(`${item.type}:${item.x.toFixed(1)},${item.y.toFixed(1)}`, "place") * Math.PI * 2; + const rawX = item.x + Math.cos(angle) * radius; + const rawY = item.y + Math.sin(angle) * radius * 0.74; + const p = this.placementClampPointFor(item, rawX, rawY); + const probe = this.placementProbeItem(item, p.x, p.y); + if (this.placementBlocked(probe)) continue; + const d = distXY(item.x, item.y, p.x, p.y); + if (d < bestD) { best = p; bestD = d; } + if (d < Math.max(18, (item.r || 12) * 0.75)) break; + } + return best; + } + findGrabTargetAt(x, y) { let foundT = null; for (let i = this.tarinai.length - 1; i >= 0; i--) { const t = this.tarinai[i]; - if (!t || t.dead) continue; + if (!t || t.dead || this.isTarinaiHiddenInNestBox(t)) continue; if (t.contains ? t.contains(x, y) : distXY(x, y, t.x, t.y) <= (t.radius || 22) * 1.4) { foundT = t; break; } } let foundItem = null, foundItemD = Infinity; @@ -2324,10 +2586,10 @@ class World { showToast("\u67f5\u304c\u591a\u3059\u304e\u307e\u3059\u3002\u5148\u306b\u4e00\u90e8\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044\u3002"); return null; } - if (this.fencePlacementBlocked(item)) { - showToast("\u305d\u3053\u306b\u306f\u67f5\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002"); - return null; - } + } + if (this.placementBlocked(item)) { + showToast(this.isFenceType(item.type) ? "\u305d\u3053\u306b\u306f\u67f5\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002" : "\u305d\u3053\u306b\u306f\u914d\u7f6e\u3067\u304d\u307e\u305b\u3093\u3002"); + return null; } if (dropped) { item.dropMax = item.type === "stone" ? 0.72 : 0.58; @@ -2345,7 +2607,7 @@ class World { if (tool === "observe") { let found = null; for (let i = this.tarinai.length - 1; i >= 0; i--) { - if (this.tarinai[i].contains(x, y)) { found = this.tarinai[i]; break; } + if (!this.isTarinaiHiddenInNestBox(this.tarinai[i]) && this.tarinai[i].contains(x, y)) { found = this.tarinai[i]; break; } } this.selected = found; if (found) this.log(`${found.name}\u3092\u9078\u629e\u3057\u305f\u3002`); @@ -2398,31 +2660,19 @@ class World { this.compactItems(); this.updateItemCounts(); this.rebuildSpatial(); - const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", sleep_drug: "\u306d\u3080\u308a\u85ac", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[best.type] || best.type; + const label = toolLabel(best.type); this.log(`${label}\u3092\u524a\u9664\u3057\u305f\u3002`, "observe"); return; } - const itemType = { - zunchi: "zunchi", sweet: "sweet", love_mochi: "love_mochi", fight_mochi: "fight_mochi", sleep_drug: "sleep_drug", water: "water", water_bowl: "water_bowl", grass: "grass", - stone: "stone", bed: "bed", nest_box: "nest_box", ball: "ball", firecracker: "firecracker", fence_v: "fence_v", fence_h: "fence_h" - }[tool]; + const itemType = toolItemType(tool); if (itemType) { let px = x, py = y; - if (itemType === "grass") { - const spot = this.findGrassPlantingSpot(x, y, { allowOriginal: true, minRadius: 22, maxRadius: 128, attempts: 48 }); - if (!spot) { - showToast("\u8349\u306b\u306f\u7a7a\u3044\u305f\u571f\u304c\u5fc5\u8981\u3067\u3059\u3002"); - this.log("\u305d\u3053\u306b\u306f\u8349\u304c\u690d\u3048\u3089\u308c\u308b\u7a7a\u304d\u5730\u304c\u3042\u308a\u307e\u305b\u3093\u3002"); - return; - } - px = spot.x; - py = spot.y; - } const rawItem = this.applyToolSize(new Item(itemType, px, py)); - // 譟オ縺ッ隕九◆逶ョ縺ョ遏ゥ蠖「縺後ヵ繧」繝シ繝ォ繝牙、悶↓縺ッ縺ソ蜃コ縺吩ス咲スョ縺ォ縺ッ鄂ョ縺九↑縺・€・ // 驟咲スョ繝励Ξ繝薙Η繝シ縺ョ襍、陦ィ遉コ縺ィ螳滄圀縺ョ驟咲スョ蜿ッ蜷ヲ繧剃ク€閾エ縺輔○繧九€・ const placed = this.placeItem(rawItem, true); + // Placement uses the same footprint that the preview validates. + const placed = this.placeItem(rawItem, true); if (!placed) return; - const label = { zunchi: "\u305a\u3093\u3061", food: "\u98df\u3079\u7269", sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", sleep_drug: "\u306d\u3080\u308a\u85ac", grass: "\u8349", stone: "\u77f3", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", firecracker: "\u7206\u7af9", fence_v: "\u7e26\u306e\u67f5", fence_h: "\u6a2a\u306e\u67f5" }[itemType]; + const label = toolLabel(itemType); this.log(`${label}\u3092\u914d\u7f6e\u3057\u305f\u3002`); } } @@ -2441,22 +2691,25 @@ class World { return "note"; } - shouldHideFromObservationRecords(text = "") { - const s = String(text || ""); - return [ - "\u30dc\u30fc\u30eb\u3092\u9023\u7d9a\u3067\u3064\u3064", - "\u30dc\u30fc\u30eb\u3092\u3064\u3064\u3044\u3066", - "\u3092\u907f\u3051\u305f", - ].some(part => s.includes(part)); + shouldHideFromObservationRecords(entry = {}) { + const type = typeof entry === "string" ? "" : (entry.eventType || ""); + return type === "ball_poke" || type === "avoid_relationship"; } - log(text, kind = null) { - const entry = { time: this.time, text, kind: kind || this.inferLogKind(text) }; + log(text, kind = null, options = {}) { + const entry = { + time: this.time, + text, + kind: kind || this.inferLogKind(text), + eventType: options.eventType || "", + hiddenFromObservation: Boolean(options.hiddenFromObservation), + }; + if (this.shouldHideFromObservationRecords(entry)) entry.hiddenFromObservation = true; if (!this.eventCounters) this.eventCounters = {}; this.eventCounters[entry.kind] = (this.eventCounters[entry.kind] || 0) + 1; for (const t of this.tarinai || []) { if (!t || !t.name || !text || !String(text).includes(t.name)) continue; - if (!this.shouldHideFromObservationRecords(text) && t.addRecord) t.addRecord(text, entry.kind); + if (!entry.hiddenFromObservation && t.addRecord) t.addRecord(text, entry.kind); } this.logs.unshift(entry); this.logs = this.logs.slice(0, 100); From 10fbeb2327978ccd7145729d0e4687c75679f8b5 Mon Sep 17 00:00:00 2001 From: 33333-33333 Date: Sat, 20 Jun 2026 21:41:15 +0900 Subject: [PATCH 4/5] git --- PATCH_NOTES.md | 19 ++ assets/objects/ant_corpse.png | Bin 0 -> 15067 bytes assets/objects/ant_queen.png | Bin 0 -> 48421 bytes assets/objects/ant_worker.png | Bin 0 -> 15218 bytes assets/objects/ant_worker_mid.png | Bin 0 -> 20383 bytes assets/objects/ant_worker_small.png | Bin 0 -> 13888 bytes assets/objects/ant_worker_small_b.png | Bin 0 -> 13797 bytes assets/ui/tool_ant_nest.png | Bin 0 -> 1094 bytes assets/ui/tool_ball.png | Bin 1568 -> 1471 bytes assets/ui/tool_nest_box.png | Bin 3135 -> 1857 bytes css/styles.css | 29 ++ index.html | 15 +- js/ants.js | 403 ++++++++++++++++++++++++++ js/data.js | 6 + js/health.js | 2 + js/items.js | 93 +++++- js/tarinai.js | 76 ++++- js/world.js | 167 ++++++++++- 18 files changed, 794 insertions(+), 16 deletions(-) create mode 100644 assets/objects/ant_corpse.png create mode 100644 assets/objects/ant_queen.png create mode 100644 assets/objects/ant_worker.png create mode 100644 assets/objects/ant_worker_mid.png create mode 100644 assets/objects/ant_worker_small.png create mode 100644 assets/objects/ant_worker_small_b.png create mode 100644 assets/ui/tool_ant_nest.png create mode 100644 js/ants.js diff --git a/PATCH_NOTES.md b/PATCH_NOTES.md index 8582fe4..8c5ba5c 100644 --- a/PATCH_NOTES.md +++ b/PATCH_NOTES.md @@ -33,3 +33,22 @@ - Shortened ecology cards and added the HP/stress meter placement note: upper meter is HP, lower meter is stress. - Raised the friendship threshold to 16 affinity and reused the same threshold for friend count, friend behavior, friend UI, and observe highlights. - Observe mode now highlights friends of the selected tarinai as well as parents, children, and enemies. + +## Ant nest update +- Added a new placeable `ant_nest` object and tool button. +- Added ant sprites cropped from the provided source image: queen, worker variants, and upside-down worker corpse. +- Each ant nest starts with 6 workers, caps at 10 workers, and sends at most 3 workers outside at once. +- Worker ants spawn above their home nest, random-walk, search for tarinai, and drag found tarinai back to the nest. Multiple workers dragging the same tarinai increase carrying speed. +- Dragged tarinai struggle automatically and can kill workers. Dead workers become edible `ant_corpse` items and slightly reduce hygiene. +- If a nest below capacity brings back a tarinai, its worker count increases by 1. +- If a full nest brings back another tarinai, a queen ant appears and creates a new ant nest in an open spot. +- Ant health does not recover. +- Added the requested Irasutoya credit entry. + +## Ant nest follow-up v5 +- Increased ant movement and hauling constants by 1.5x from the previous slow tuning. +- Kept queen spawning to at most one queen per nest per in-game day, while making spawned queens keep retrying until a new ant nest is built somewhere. +- Reduced the ant nest object radius from 34 to 17. +- Removed the separate ant corpse sprite asset. Ant corpses now render by flipping the worker ant sprite vertically and remain stationary while decaying. +- Added shared ant damage handling for firecracker explosions and dropped-object impacts. +- Kept ant worker HP in the nest worker pool so damaged workers remain damaged after returning to and leaving the nest. diff --git a/assets/objects/ant_corpse.png b/assets/objects/ant_corpse.png new file mode 100644 index 0000000000000000000000000000000000000000..2f192128b2cf46cc4ff698f6c6c346c176d46ae5 GIT binary patch literal 15067 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 literal 0 HcmV?d00001 diff --git a/assets/objects/ant_queen.png b/assets/objects/ant_queen.png new file mode 100644 index 0000000000000000000000000000000000000000..e26b998d6f872aa65e4add3836aaf7b820ecdfa7 GIT binary patch literal 48421 zcmW(+bx>4o7hgiU1jMC5I;6Wx8VPw3mS*Yh?v$367GVi>32EtCq`O(GpaI`!dx~*DpyqugIcaV0oc$J` z9OHLs0*~5LhOPQXOFR4IDm0ih^uMr7HHnE$C*^u)TryUh@i>kKMb}Sx%_%%6E7FG?qUQAKx6i~9Au zlfolD!){=sPFcGlBn(i)X+PUZA@zgeO5oi=U!aj-8h4$F-B4b@<(%Gy??cLs|Kr1k zD=GXfoX%^-^9u7UA^U2x>_c(D&Kz9-TXb}^$zHX-%fDtH=CqjEItNjRzCO3xrfOV# z{5J!RUImK4aO3jSHeM(qZp72wT}=PSl&`|x#r^i-(id^RO9H5UXlqbkGQ;x1%A;qU z_1GJBNDT&v9;*5<$GAHx#P=A5bD7Z^j1pfFaA3C8w?4X4Ud$!J>ItM?(7Il;G7v7)gPKVBgQ_F5#$tBS7T2>aG`~T;QTLA6z{;) z)V=@8QpU!nL#*m0usdG-{{4FuUE-U3_~oT1af}az*CJb`&BR2I-)3e>kn2%ihYbn} z3Ye1eX6Vm$cUzwCZuH~A@@3r@?mFLsQ14l1&OU&{CL^*(d&m^6@I7Ml6&@3LLJXOq+!1zb1)eq1gVNA`gTPekh_}jMqkBTe`5tMS0%%%I|W5wmL$llLljU&;Oo8gcC zE0Uh`=cHC_EG{GBS0)GZ=v5n;LrKS|z!OpQYADlX4BVKAY{v19ocY6ug|muXtKJvYTZ4#2VK-;s4MI(vSL-I;OFmRhYwggv2U+F$6r+6wLvKe!o1zc}Co5L> z47emHs{%)1_!8ICT!U?P{{CW*7Zrj3EjGGs2}7Y!Z_BgI$fFzf7_#{@v2atcExZF9 zM)2l=3-PtqGbo%uL)rA3Sco$0Zy+9+ZgP1UZw0$um>1D!G}J1uqKvt6)d6;sd@Uno zcM!LDeeF%BM2Im=`dTKxay$HZYO9&-EJ5USdd|&Cav5UVay}vm|NnD&-Ou5sPiMW= zuZydI)G9;5oc)8I4(%k*GDlQ(lR3 zULr$H=D{3g#6p70Q`^_fWVk2{Nn0;KxsbzTLY=>75Ps|q1Jrd;>aTO#8|X7+UDr`5a1kreulahS?G zW8-`Y)M0Ai;5!l}vpdEi)#%jzqx#L>E;t}jufzS;vxKHR|KkF5ecLI>@itxJHv<+G z9tu-17K}KR2hr~%4Jt}4J8`*;k+yk(cJ?S=7$RSoAWz(Ar$|WTv5D+9;O zNO_B)YoQT+c1C`V%_bf9DPU+KQu}sE+y%2u;x^tm5McimbdzQ&7KR2B#lNVU6oq5fG&r(S zbdB5Juv=2zOW2&hR5h7(V&me zzxeo!Ud=M?9IJo9p0uOO^O0OQxq@ic&Ky5aco4lvyK%Ct>jh(5cJTO@>zg8tT(m5P z_2XEf*j#zY=kf9=Q0V&Q9f&KkeE5C0CWTs_n6UTL-AdwRU7hHA(T5tp6#6j-2M6jI zh#wbekL>j{@W#y%`3&^;k5_?Tomwt*#Lh=$@f$NUu=ZeJBts^-rOCv7J@6|4dN?O zUGkKZv-W5xmr_@an_$G@asbC@-DE@ z(9l}lrv6(I-2tXyhp7wkjj|p7JQx*5Tr>S=!_C^x#!auzfFsJR3_~3p+_YR;2q{Cx z!JE-i7PePL2}a(H7eO!~3W|6tHo^@ve;TQ%U?WRbF0#LX;mW@=O4GvPNlO3T4vJNA z8Sb!0B+1C4S6Y=4hZ`n!C?}&%*}fv$!1SsJ@4%!Totm>~7Glv%+*RT>)?i{c>Q0bc z^A74GwfdPa>gAZf<&!`6%RhZbz;IcK3JS^qR075pH(z9I3rO+^C5 zAtEArx=Qj$^#9wm@-Q+@De6`EX!!6c1*}ON;&wRx)M$VQzz>Wr0^mc03{sETOPE$4 zDTvF&PQ!g=cae2NrNG1+IdTG!w5gEA>WBH`UyrYkHUt=U)lVki| zU6>Md4yEq#*=jj_h^so9wm)c7l(z+2tz&R} zpDi%tZ2;-G^0#03{p!tmM+Xw@bLr#&k`^IL$f_w=#EjVjudh@%EA&BvR*38ZEtG~! zPYOo!#W}NGj!6ST>Xb-S2g^AbgA^`Xf7PiFM#*Q+FV4w)DIb&w!*Fd(j|;S_FlfcDJ1y7wJ~MY! zxN0N!U;0qRM0|r*+Lcp!zN3AB3hN9%nX7|cce#`q6_NGDbm>QEU6uIo!fD$i}CsM;? zyvXtSib)e>VbZ)$PgMhhK^b!&luhmJanh7ugoTCKpb?TOZw`yHv;^{YD#oAbo zhxk5jQ3z_g`(>(W&bDKfI@c-X#_vv3b3i!?9yVSrW3B)E!?(sycmaWzp?wx(9Dady zgRBfA3FGYWhPot6LHdz#;lzYZ1?xhdq#~fwsqbIDd96(Ifx9ev}e0~S}lr&&d* z7@?pZnU3MGx>QWu%pwa3ftAe2o;XqU4~#LmxVSefx6}39ewRNh92e>yk^x*6WMXFa z_u=X2>7i|+?HtBQc{dA9WQeN@K4kEtUSD4am=-?3+3 z8Y2~kgSarVa|d1fY%j7nNMiOEXIe=VhD3ke#~MF=J3q^Rq5yaZCUg)*>znH#4!xvrg)u1U{cbK?QQ1M zl(S*5`HeF1dknkM8Udr(<72K=Eo(VkfC4s^mAT84_e&L6%lx4MRp*nVBKi9Hy^N$K zi;qOPAO)rMu_jx|Ju&`9BAuc+)?`iN(#%toRfKEQ#}Md=sbGZoOC*j)=FgL4o~B2u_LpB}Dy zSMHXt5;k(4`~hIH1u_9<9TJrN+g^rN-tqN%qF|o)-{=bNNH+mTe==Z}p(7CTFZtg9 zJ)M--a#%{;Yorj60sd^ADQbr;Q4qH1;_Ef>>3S*!-E7S7na({ z_3Is8Y*7Hp&Xn(~P&ex#niN!N@Yj;2-Zc$nJ1&qWMF$a8g2*m&O>He*0-aU(PpSNM zQwF6_dZio%g+*={e~rZ|J}&-RW=Vde7MUs7%-(;{g0$L5vsFW?N+Z0ofD%m8plJ8T zp^hs7`f(a60~r}Yd1>3hLnsuDx{ed?O9?zd&+P1Mp!kmm3FmdSD!pn;ao>lF8RN^C zkIiOpq4rVJw^K^Vsg7+Amp45!JJnuG9!ykz``lvHH>B5rpH92OHwT$5N6(V9c;K~{ z;pmKCcz<>qR?~{PWg44q!eEo3zVHP9Dv;EATC6dkRJlw|P4#53>z&T7?@>RU`#1@4 z3f&)f(ScDee(Z}=B{`+VMTRF?SsyrK!Y)iUXB1Fs{1b2KlR+is; zNBXnYZswMflJcq2W_=>xaB3#%j>@~8fX2eic2_8B8fzU2EuGqPT;~}c(_$^qW|i)n z^ve`*AoKN&3!&8!1}XeGzn?^+08_MIIxHZ8)h*oZi7$MY(x$-)AE(IT6;b z%ssKi4AWpH=Js)|xM_SV{9TZYSv}S8`XgKick}i2s1|KBQA(2e;!r*TvJ0{4-SEL| zlh=_nDV%*{{ckKMB9*1Z%fNjs+mV8r{ONx4t-kZtf!E*irbA^Rt3Mm3omT>e?yCR#)n1)EBCJBKar^GSnqouSou{4w*acfQCHdtkC z;~@R>ui=)f za9suKr)giZV6UsIE5SO)rQ3+Hv9YIm^S)#S?1)bM+uPgjUls#KgtUL9qrypW;+=rI zG7`9>Vr;v=RQ(aa@`<+FVAVbqVg*I>WM9tt)P7VWkR<{3XDO-(ucf6WW@4;Q>kXI_ z(d*#ARj9KG!9u-L)Hqh&F#%Im*#Re&L`LnrP2t9MTuX97$&`(<|FAgKJf1# z2^}FEb#w=&qC$+WR-R?`Z@Ad~oTyCJz5i1xHTpmt`))9cpZx9HND*2K(=9l2*_TKQu1oug5!rCvy-EN4IV&JT={L%5$bfLj=1OK#_R8bRGGanZghox*ZJ|$ z@DUyqw0G6!{Ci%SDzN;rYNIcfNM`o9hrXa#Ejw~&qC`|S zonKk%`#ROTNOomYT2givhC2JX(5fnK3|ftf8E!tYf4i^ynt*QE0$);M`%s!Wu)*bZ zXz=gMrzCV2(^Tf8r6muBte_V_*Zr>crJoL$hPQ>k<~5ki2VVoE)!TJF#d>m&)4B%q z^)sgl&}OY2Y}8VxS@Sus^O(R4l8eZF>3A+_= zWMlwnwRUiL2h)Qc3~o3@%!8uK=Hg?`=Bm* zk*V(gmq_KRMerNsUY+0QZlJ~%t`AEUJX~!2aMwB#c$U4AbKi0lkm$7Z`xOA^XMb5> zdmb&Tp$(yHhyqo2mSN<(^Y*o&`WhxA{+wS-sf4y5xe6IEg}kG43yn zpDyYH0Vvyiw%b=BoQ@Itg@LO>^F1_`Ym})XAAQ^4%>`1HFVS~Z0jT8;5 z)-1JBcJXFa!5nkA@K^mCJgjNT-(3rc$>Pyi)3A0gL~5onLTSF%UQT{c?*kfFXL+vT;5yyj7l{!3M}+1n-h?-|}NHvi!p)37*j)xe@cRY=2&Bfz9A zStwG48qC4mLc#f)iI4AfjiwcS^P&z99RWs*8j|?fR2#YIiD37_0h{SLXp?tX`mhLcF*)b!6vze)ZI$*aV2*SHXi zjtC||Cv&gRQA1eZ0Q1WSEJrK_tnU-`e$%TIFYZTm}bf~{nf%Oax`W_K4H zv#~(<<%Y2UYh5``uW#0~gC|l`P*4CDU~c2^J_yui_v}m^)UV`O!xR0t3!;{vZKt5W z&y?@5?dkC=P{VX|bgu61sX|UUZigr=is zaHj$4bDbmXwhI7H7*qbD_h7EqA`2;v|B9CsYjrZ`Kkl)rdW`9f2AM-Y0qg3Dx06%ro8zKU0!H!qHx$qU;2yP>bE zpJ%Txm~byIvg0>BquOo+0hOoyiX*+NZVZzRe9cc{enAw_K4Tz}HP~Nf(qb3}zeoT* z8A(gOR%ZgaQXWbgTC;z^SK(5ZC@Vu z*kbxmtH=O;0*L5mrBLQ*Zf=Q?f&y9;Ztz?H2Tt32l=kj!)Ih%hr@1bC$-(7^LoYa6 zZK~(8|Jl%y_|>AD8z`^~Y&VMJUzxqW!K3q2cTF5UdxU5z#O`}a`Im% zzwY4-M1pAtYX`}VW(}C7POoW56MO=6Ev@tObATB>l@=y+0tnEl_E5L{3}5nOayt^?phbs{X?dbgI+F&`;(@$6MV zR0{!m3>AgLJq-p$(toV7GZ@U>!)m&VTK3WeXouDN{+&cr&m^Kq zDa8Qo?VhHFt{SNl@{c~}v8@PGye6+JXm7%SiO#M(%R1Z@u^L5-c6HeEAv^EaNW0j# zgakZ_z}X}WfBfiVwINYHzF)b~rRK~{4KTi=wa}(LkE0o~_&?r=C~8k35fPEBU#&72 zuge9=aIafen=bp|NHR^fec5`Y2HH{3V_yBN%RKL;H0u{7!jSzgiGW1%y z7}_gu;uwRtu`rZuLGh^>VD`wv2S*!yO!+yIkJsze*#HrC0&x3ZHrThm6s9x4&y(l` zH$ljg!ZH}Q%i*YffByW*1fY@rLz0T5*4x?|VleM6a&$6cpsGZ4iz3bT1t3MJO^d!J z^D>@AwqzFKjFFM)H2)MMWxz2{0U<3U82|&)P?|Dq$DJg!5MGO$XNBZAob%f1aMZab z&gj4Dx>pX`$kA6rZ+@SP3ZkW*FA!y#czc86<+~!<;z;9)wOL6cwAg%PDOjz)HZ_s+ zS`Ip^dYww8(5L+OA4`*@{@)ZMY}r~!&*g!r#*Zn3za3zLl#u_FO&99m%pdz1J7~oy z1h%+Rm0^r@wm8kWD+dos78vm1S#RWcUvqBR<$uzwHZnT8J#qBWW1==Zmcuza(=S4{ zP)n_9&#Lui_x-JcR>H6J3aQ?`1O}75ynH2~SUA(R?_b=t;v-0Rr+z2=W#-6WJLRwN z@pz1XZRGv%!^mTI;_chFPhX9Ty74Gi2h!i7fY=Rx6aUbGC(pIGR_0%nfLER#uU0Oz zSMDwQct^zC`Tz<`j!i2D=Pwjb&RtJYmmsyu52*8FRG<#v12jp3$h8!!92W#RDKz^r z`RY^#+D2ROUuk#S!$KSGwA}^0@gF}&x`mV+i+-(C7_YhBvb-s66BjA5ipK)~_-BpX z)F#<~{i%gTxpFRrnnCX|)_f#7xn4A|$h{cHp|1`=jV3g4w#dDSs|mvku(BnHNGUA9 z(KBbT+75(i|Jgvk&O165?9qaj)VN~dqH=tALmTUs`F@(kkVd8PYeA|EM}`8>8EYZ@ zXO`mFw^X#KmV;lSm0`$hF0#~>4P>N@(B^2)9xd_PxG}~sJEQEE5|d>o>EoYu<8x}F zlEz-T*LZz}x4>Dt6wT*;zAPRg%8^A;L!{zSe^>JuQLsx@W*}C1S5sFP>Xy*rcZH0V z(9B8{&Gq^h*K4$cgM)^xJip|+%gfl!A<<`1*&G|XPuTBI-Az?sU+6~wy!Xy$uP}T1 z)&(&e^_asF^j9uzV586Pa=-CeYqaqP95$b+_I4>#K*g^j=o}G~#04p{2mqM18IX@w zFjkWj1NNbT6uo`3v*694>=KYONFNNs) z3q@ylf^Vt5378u=6J3U&V3lgKl}_0L6im&P=Pvzh^bVF zGM7K!Q3+`;%ONNJdpFi>wa2rA|JgT<*J@Y}(D=~M(YbkelBWx8cQ${)v`-Ips~H22 zJ8E|q-Hfa6fu1vYwmEdi6>PrIpSCO2t*AvWyp`kj-UzU8@Htzr|9YF7cLVko2S?+- zbMC~4KFZ!0eRvz#L7oBClSj0ZDAfD$uz)Op!f1d%|8R9kd-^Yt(*MYaQtpTE- z?i{z3Wyz&jq1)}k6TzS}!9HLDc>;=OV+ju;vh^h1Y5(dBUax!iVY!Q11P`MKm~QD~ zBR}u$7i94zQAg^_?6D&!Ec*ps0yC8V`wOl)9$Fzlh02+c_QoY`Dt>1zD1E8@D$g40 zWl<_PAME83T;qJ!*u3{!c7wY74lj3^^y_QI_{CQFSTSasDcR~lzxHqiV4hifWAG@Y zsnnuD0PB_{c5_~Pw{c9q#JNwzD>6O!oyeCz+veiDR&geTAOQdO z{Oe13`A#!MA?=}QS_en7h(W~^ETg<5N68W``|kMMPehT~?g2p6ree~Pt?!b(F|EZ~|>G9;Plh44%iBgj%=)rs~lcC!Xf7@OE$JX&w&1^v@BiDAw6?rSm& zTt-sij)@|v=>fAr#nwr?O_A-aA%qE_Ofs&cNpV|btMJhXp@iLtaR?!Ld#eKOJb}*S zop+R_H`?r-x5ZUyz+u&_RwSpE!jQ(%)VD7^UMi6H!F6(eJd6ALywAIu%<5U)={;H$ zdKlkQ#oLT{94v1#LQC>6jbCBP1)hhC(Llf>FONzv>L0_n>F0yLYEz(8hhlz(X!PHQ z?Byjjk*b8&QRoQyy*L;c9FV@{GdgMylu5(U<6U!G;DT|`hUmvY1SPi7xFSfcu1j)U`-gx@nMA1r&NUgr zSHn~G^+ixD|LFjeS<9KsGAUg8lUdb2fmQ-~#op{}7-S@7_g|@G0RaG7K354Jkb4vk zf8GdsAst+vz;PXNB%=*F7H7-1k52e^GJ0n~H#yh`FVf_BwHT=%ZjogAo*r4UUCsxY zu8>a6ln&ZnbZA5u4V9J6RFu<1>9@q#5l!Ry#gpRa$L%)F9&WnLR}*Zh#-U}xaP$f1 zrxq44U!;SAB-;lgsVK>7^)yq!m|X-14hN1@e;Pi!cwr*#2@3~LGm3y!Ttt7X%j(p+ z<2aJpT3ZR_Ex40#rA7jtZg?XBFyO46?7Z>>9whAKkisy>TPA1<>o_mbi;VOe4G=&u z?`V`}-6?0?`UP z|LK0qW#Dan!zlk<3uN!QVLbtmWS{Pj@_~N&B*ewVRcSxRBinpUhX=nHGrsP89eBa{ zbjs=0zwyf~4inO()nC-qBno6&VqKqgj}qYQXGccw9w$A5A$C=^Q>@R~ya!98+G!P1 z=#QA5H~kx@42crArOf~;?cSfOc6q$nLIF7ffsw%+VIn}=EYwO%1~D6ScyyK} z_Vd3VIwychssLyQ3utKQB1nAPpLd8SAtf8kiWY%Gp|3Ppk%ZjVNLxm7e_pyU_M4bQ zD-UiR*Bqozlc`#DvgRtkobVFqwm6=B2@YZ`jzal9)V`u@rYv62aQ22`ZGFx3d$7yOJ|%7%3m1CW-kIXefRJoE zGT^Fef0rk%(}C0GbAD}U84^$2CkwMAnD&E7p5NIIF>Ngp_wHG;%7MWV_#KKHB#dh* z%*@Q!Ax^fGg{ZAZXF%8GfmBMMAQU7Qkz%)`OvhUAetcda6Z9#vxXn! zedyJCmfN`DD*RH$TU#WZKH3*xXNM1Gl26rwKog06F7UIUE3cr}d4ab(^R~GUWARgf zW#1AKf)sGGk->}oXMkQwf+c+0sKu9G2aptjJ7o;~(>FsvG=h%$eigmVXOO#BwG}{Y z%dUVY0gx+7z-EX>5hYfZ?8hdr{$dT@pp*%iJrxmAAz`+?b+Adqj(!r4{?O z6H+t%tdy5&*h2QvvECV6zPC}ZQmoeN4D2OHE^6F+58zjovL62u2m4*JEUY78A#H&( z`JfWMhSXot!tdug>_1u!3r8wMj+F{#$&><3I$U}-^_LZi9kLI{;wauPT7t49K%)9q zQi2Y^2YG$g1hvvXA2LZ+1dZrmr@g(s1*x6a-9q1|b|uD#i_=|0WcX^CoqR|nV7}a%A+<#Fi_-hWp6M1@#DA;?pj;T zZ(LjV9R_rG5F9AM9(&UPn}8Z={G@JdY+Rb^>sZIcYbApb0Gts0M1R{jsmYlg@IV}nhzBqA&)C2 zha-*N_%DyT@)W{gFXFfXTe%vbrD)ZbL#_-q3X~qi&-#!O6-c2t_S-f!&^@L{#2yAG zv{-tCx8h_76liMZ1m|fqb3D5XaLFT!v8WZ*UHZSWFwi(tk?n4w$T@=2)z8dT# zxf$F-Lcy+$p-D+EMYj+b9~!X@pIY;rr=ez*^3$$;rKiEMs>M@|jv4>egmp@dSOiY| z6Bz&n+0LTCQ8wc?Tt90}bnri6LAJy!WemsRDP)O0I#x&$nejl^Dhh zZ8xrWG(=us;RX2ubU+*VpVQnghB`@n8+dZn8->U`hWMduK?MM0dOj`J+P!{Umwa6J zq5_E>x1$)?E&bZ<{js^?f9Av`B*Yv>L$G-cV~^EyuhB@;axActhFa(TmC8JhZ+BpE zn6X3){<4qrzA9MXHtY^Bo5SgnBu?|ZVP-NnQ)`J>heftiFq;)BglnZZo1bYnKEFy4 zULaf%lhlkOJLI`V%SoR=^zW>U9WTlOiU5tMcV*Elsm2$jnvl@_4W0WZ9fJ?NjG5>g z2Ov}CwmJN+K%*U?hLKTGG`yxlRuu82^TfNzHq&pL2*BX>%xovb7tBndMYofHl_cws z)MA=6_Z;EgreE^H)!(HZ2L22nt3+U6{w%RG&5^FG!Bh|!)5v2k)GF5cq>n3@#;G(i>?Eh!22tIylZ>% zdyF-{fAf8c6&hFdy8q3%n6byyf4^Wbi>&Ee(n~+*j6b?SVgV`jIp5zaaZ#r3VM+HA zq~zpOan*qz$n|UouCN<496PN58sN=kOAwcF%yAQ^{~GqL72sXOt$XhRO5%NoR@r$F zP`-q4-KsYYhrjnuQ#HzTegr4gUH+vE5U2FA&rJ6?!c;Fr>5J$!^YICJ+h~53Z zm1Opw-qH6!01CA6C!H>NEqho2&dS>oOq>})sRj;U<|lmfII5fkk~AbFMwrv_OQ_dk5opJc8QWSsXTO#O{*x&~i{%%M1SxsOgI46X zHNC%OgR4Swdo*Jrmb{^QiwYLauR3o*G%O11I5D(V5-M^>RjUj#(WiNtpey0o`Qt8B(M{Y{d0b0bC`GlpKKBYEP${OCVgYI+UW=4vsyUeW?c&O8hM zT#!KdVm`mrqoTHa03`u%)_M@}f|}$OI%jpC?Mx@tb?8gA8opOp>R6=&Y8# zo&tFOyvWmLEIL7s?c39y=nMG?BCE?|8~AY|wi5cMI6~~L{mPYE%%Y1Y`v-_hm*pmo z0oPWKjc(#Q6*-sP4cFnHB^|5it!WTV4Q+P&D*{uk7#l8&4ZpWz{|yj(Z^en49eK^kk6(WbqpG`p!N~=Vyy%^_FOhq~VA&-l?sMeo@$PyR5#mo3MM9b1> z9NoTi#9(-o&D`vmVGYxYd4gah>y6)tl36Kh_y%d09UjIAwgKAbP8O_;#?|-l!ti4D zLm1M+<5WG(^o{S5A|h-|V-FQr@4w zX4fTHap|ReT4}o|);KGZjV6tI98;lak$k{5M^&v1ZQ9JebnJ27z=851pPiq`JO*3+~#fNY7_ zFE+f?B&Nmb`mr!S4>a)lni`Y4%LDJJA4X}}5&^dhp8K;Q00#jaQ~Q-x$~bO!clXt@ zk~|rJ(`*iAhGBCyYbde=ZR&0AV*-{x5LZ9+BP*betXXYX4SwTl>W0MK;L?bRO{2;h zdxRRuDw`5%TehG`Dmzq4!PsMl`kKJtOZw3;-RN<+(tm!PZbu&2$=O`!WW}&%{$qJs z+Kb~$zZM*t3Lb{~ENVt2v#wUv+m%S7vKgq}txj=dmdmK6&S3Z`)fGj(QknLtkevnv zVv{>#jcz1dW~y`ykRw$pW*iOB*i8Y@q+dS{`blv_ll6r0yzeGL7ZYUTK!A8FJzPisV^BQw5s|13uRS#-HtKdvJ zrwy$gV9=|yg{L?E>%EeX+@eqSXH)2s*Bu9d3^ty(m_LU>KV2LodFj1`<92xg_D0N>WI9p8@-C&a%l&c_1DzS zWCoRc!ImAhFMKwHyB=L1>}_oH+<-Q_QWN;#o5(HTI&V`FV7GGAdO2@bP#cH}x;$Kp z1rB?1&tsyhMVDCAbN@52rUq9oyG>G{x^Wx6Y4Zg+19$2O(iSM&2?ketC$4rzVn+7m znzwr*RFB%^$ECu4ZwPVH$P+6Zi&K-KS$)+=PMzPB4j#jOxrjCAOPgB$Cl!Fr+7r?l{02e6MOXep{1-t2DuWDN_{;Dcq#D zNWGAWPX0Qi>DY$4V`&=MmRj2F9xz?DHW)ge5Qub8S#6It;zKqVJg-S%wMp+ns{ZE4 zwWC8kk7vSxM1VYb%)mR3`6g#0WQ?n_Js?jzbm@*$f#&5{PT)Qllnm+r3SHt50GFA8A>OB!8T# zoiWO$SNf|rA}M^*P1FJ?BLR}A#}nC(zgb#=LnQ()ZsQlcuLPQXW%aNK+ZaUs8BGOx z0w+K!Tw1`Q9JS&AWYs9pC)-*wAcu>$ zN`;s;@|}2=Sw24ocE40GnJ5M_ykL#Es-S?7#vAT9)8)XPS0AtQrhRuSf;_rBfYmgw zMjb6@jvUjm@f_>%x}sD6k-T}tso^10lix#9q zEH;)Q8dX{;?@070JcKsEjPINL2PM3VkU?LDcwZD?p+b=*3EPc;DvHVfhl0iXYkNiie2Jv~U$U>Tw(UE5!?2^wuvl-C)Zh>Sm|^P{c_QWzJ@id0A<3@iszh6gRw!NW zh!D@WSQo-fb9D4zzOJ%V+C@v10;9oE$PcDG?>9j}bsJ-?qS%wJ>%PFWqqq!s0Kz?J zh%b;@+ce!;+y80;?k;`mmworv08iV4Hr#3JzsI4K`*^Q@mXe>)IKvfy!|%5|8X;Jr zQWug>XOeqKNlBN_hC|!kMMaRf-8v#37X;*rO*b1^W2;Yr?Z@>Tw_(#~O797q+{@rF z><3xXc0=!=@CxHLiH5twCVmjRaqD6l`;z;F+T0!{K(~%_t~h{IL||7gh8s~gYW3Ej zf$J3X4@ki9Fug|mrB&vt^1F`{v%;W=)>F7R0*Vlo90VJ`DUi*uU6L-LxMo_tc znl(ePBVu;-@lz4o$8uE7mw$xD9Q$S{-j3PEfrqv*uFFPlUHS#NyhwDQ^H>%r6xEKx1D|yu- zV5P2MYE}^5jnN=j0J+VKPA#2`8*crxRZ!$pd?AklRBa~_kV_IEMhhKXP1B^vB*-a6 zGZ1>i{9(|v(7-LKDk(|{F>>X9-6{Bm#=_*Ca(rL;Yb+w0fN_5!B>^SENn3sZuJjtK z5dNq!#W#6VMR@ohYuc!2nOECTu#F=Un<_YRl?$`99lt?a84nk4s2NBCR_s{sd7Jm? zspvfJer)sI8qDOSR!9tIWSyoAn`5!U<5eC=^?|s~_b~MeZ2i&H@IpsNYc5 zLcM|CP%RGza>u76hXD&A^$;`M1Mr42Svo%{zh5P6q*PdN z`CfUA3Vxi}C0`F(UQ(ymi(Wot@QD#}uW7%7z9jvu#Q^jun zrpn6%KbamkzDS!n4GY*eWE_F52}IwiG8lH!C~5Vhu4#^^AApUL``#zd$g{h|YX=R4 zf0UxL{c4F>=#CF8l)<#hqG{M*z=`XMFyXcF%<1s>cdwbTPpu(?!83m%e8K}kx?`=b zjb<;R@vbA#Yy`EA3te}Oyy0$a_l$Q)T zt*gZ!3vC3M;4fAB`jz__rCMOHp0b!xekl}DPy60!JVxUZ*~?-tm7ip5x=-a4>lGhq}lPy@1~^g%_9`QF$>37uqRGX(zqA)3V!9Ir85U zy#P{91O6EzfJAze_R;93dko0fKH(=-j6tfOQFuox%ZKC->f#rE`FD$3k2CeH7jO(I zsVggSHkNQjj)v9H;~-#*BObUNyVXE?;adCBZQt!iwz68%+Iz+zAigbNB!L*D1CskL z{VqG&z^@w2&w7FNx7d+;uwWcXO(Fy#S7W(LP{;s0K3#D)0DPZ%t$ybK{xvvA&(!kW;S_^n-^ zygkFr3vEhR*Kmry1?pwsbaQ>$K zUjz4PY##*x3$NnlIo(tTXyziPVw_*Q`epcb0S)@q(=q-N4WoMAeeOr#Zv&|d&Ivj1(HgV)M*hpf zcbw2F(!e|8E#Xe|?my+yTk65x4!hUG{NLoicbhO7+M?jyr~+e z)ON-G0)OJJnQm9g)GV{+@S)`gb=rP1TJ=GqLH+XT&7=Udr#(wdS>5~d=V4K3T<}c| z+BgGY&J1QZsglKQ064rDH><@-mo9T4^H=)5xVgBhuP3nG*_ze_>~f5L{yOiy&QOen zy-Bu~SD-yUimDx&p1gy*#N-92=72}5^Dmo!MHAPACDD&cqYet%$&VP^Jb-)o)Md9g+j^7Q4@3!>qu zNC;S(S@PUUxDb`9DQ4hwI|!vTbga-Kdk$J-#(N)((? zuKexv@5bo?`~d!Y6#y_@KZi=K4xxB6H1}8e*c17_UN8R6M4bM;NVua3bq>Bx=^i6q zfJsLuw~c8UbEH0?Y%h_namJ-Oj8(uY5bT+fuvQXNo z1s&LIDFM-HQ;jTc3BRS|lzqg(aaV^TiyPbA2hC@^hMzI2GQTXRDZd5`*jg+@j>%PM zM0^cyF+q^luQn)aF%&LZOaEX-z`EkA5+UEM9l@=-FQ5_i-LsdJ?d zRA)9K@E{jrkP&7I*!;*2$gYMv4Gakj*}hO#X3)SUE-`A<{S65*`Tiz0Jp?4)&U%cM zaw@>{=NoEr^1mN-be6>My25T>u~3YX&I9)Hv(HcPZ|ra9X$O0_4NUp62y%Ygbs+Ir z4wlDTS2s63F}y-8VCi2ELY)^Q){7S-)SJD%+q~C4R6S>e#X_lfGn3glG8{i;${^)a zZ?Q^HvC!-G(`1XWX>xSMr-~bF95NY*^>=V1nZqEo(9}5^bOTm2i|;Jr%5foN=I+fc z9G=-4hzdt1Q41^?__%>MWNrT32R1ic*EMY_g@i^{{}AD~taFp2bJmtJ=r8fe%wC5l z?6X#dFh650ub^6v$`D52(fqkA!K`O|NUQ~>s0e6^95WWEBejubv>c$&$;CC@~m zURApsVh4T5N0t+estor;R{_N+l!-n-XcGd-@dTRO^Io=0t3{W_8s=P zSn^19JUs}@-sR|l8-9zgZ~?72o+$5hnE}_!*H|v5xShR1FI{rP)1W-!J3;K>JoyTR z?|_g5s3LIzQ^3AedQlH(d!EKkOvZJvm=-_}U%A%ES6HKE57r+;GUO21y(ElK|F zD2~s%{R&31?cn5y{N(cxy`12`4(j5{#u)_9Aw!$pz5yNp;rRRr7@BCWGL26uP%eYE zw|)Rhr+nY#buj=&uq1rL%@4!4g=sw;08W3r85cac(3%;2LbmP)*6aPJ7RwuT%2!Hl!Fw(>G$6_Tg* z5F#3*hLE#n=lC)W)k@bQq2Do#k<9(0`zytP<1r*4E19lPZ_JQW)yzg}Hi{x*ow2Ad zu(h}HJi2TQWqyKDI~4!i53h#@K6e!7ldKm?Z_0$x#;m$rp~fz}nv#+_>DpHUo7|+F z3qj>+%N~DAj2@thgCLRKgl0+_zF2HAW$fD@65O}hfUgLL%EGnn2si-L-cDnMS(`c* zDr6E*Jf6X8h6*G-8@D!ajoMavbQx@192q?&1`wlUTxAD=u()BjH3n4a$og5{`zz*G zVNlFgxX}i%S@c{sf=r;zM6THF7jT{^5xmY>)L(3b>ixV2sjYtlPX0gjo!Y=iz>HQ- z3N0js@9_Be3S`*+PCUtSiZkJ|O=k}=O`KxOJ0Cngxb!2YK*P5y=F70|Oj#>^Cv&Y5 zhh7`}9-2W8?Yz}fU{HcJy~mg4de8<=LdEUuK*rb8C)RB|chBVu)IS^c;-VHz9lzc7*XDV28sb9x8_u+EsJ^ z7+{j5Dhn?3L7Y2H+EZgagkOAsrxj?MW!XrT6@}#;wA(XGy4a~y^^p={Sbo(s&#~m~ z3tWVlGjjx|ny#EMFrv&W=T5I*vz56>=s8 zd&?7NmTpGkBen^{pm>%R-$Mj#(Evd&r`aidyUzDoAJFJ-~KIpaUDV0 zj>4moZx~;R;+sCNLZw=`+v-9ki08D76 zzo!OZ+s`^MDLJeC49GyOF#NEI$7rj`tmg)g_3g7+O z);2>x(FZ-6@g@z!^H8fdx0cn>>K_Lx$4Lnr|8Yw6TGk);Gec>~L?SpXoN0Xwg|g?h zWJgpxqD`AzX@&x61byZeP=EFW(PI~Whn)**z zb1e!q3wg9-H z#^Mg=Cgh13KUIsC{}VB{L)+-KLo(2Gm%3G0XXk7d(hn3cm#JJu zDl2R_C+Ad~b*bTZG%BBAEGF6Yb*Cf(Q5VYM(&iyd{xZQF$lDq%KoGUEx?{`uabqS+FhPL=H>t^t($XYdIs zuy%JBP4V;{E+;}mBdhH*1#OATBl{>X};UcDw|}C?Lvv5DD4E%Hp)I8gK3Zv$}7=_beiLlkOyM{VM1ve%@<&4R;PV# zWHN|tdR_>(J76YHre{yIERx5u@NK}lv?>yL1Vz34w*aFc2GTk?<7HYPS6W;nmYA*3 zr%^X_1FwQR7N4qPgwIdNbrEwu>VqAhpWUSx-cyN z6Cqn^uXz@^&bYg(Nxu(D8c{ZiPa$No8H+!PK+217_QhQGRN634db2ylmyhw#vVlnu z3Wq@S^EQG(0170ZP*?TVvV`qI4{fY>m2AvzM(fZ_B7KT?cJ-n-^42qdn_NrkaSE&CeiLCVd)a)|AeSwVg^w7sh;B1IIT zi6Pq1w9TwSjU6)41Cu z!$kG$tZOt$gWS@%iSE@XUaBw7Z2A2zjQCet+_)PYA0J=)?>yp___x15Yu^YT^lWg8 zV#_`;e+eH?-SWl4c!ey*4!e$HpF_M14L889z)et9iI~1#UKu}XuD&LY+?+HV#H`f} z;PSP^bbxb*P`!}71h$TKHi94cunE5*dbGJai3I*`MXe|H~DY_p9PpQF_4 zLwJ)S0&i48;S;^;#@*8y4@a;J`GOseg20T!FDVo*Pic16OYP~VX9os#PeH;A(GTQh zZ*uo}2)KmZVc{BC2*DR+`1bFgy@sb;N;NE@_l9xKR6e8s6j7`y6#@oe25J@p(9D65 zq%6e7shFgx!njj$(pufrV7|cRh=MUPq+P^d899}P524Uh;gBP2EhgQ5(hy_HtZZji zbu1nI7XMZ<=W+Pm z@4n#9c{p;TK0f}@8}N7#AoP{KrMY=WGyiYOyC&<|;@Em#efx(70d2_k*CYAftsmH> z6IPH#EW{G^-Zq|@Bor6HYK^z!t_e_VOdc{Bf*Jbr<>xi437!Sj%9{6kA|htAq;1MB z&q`JKBYW}YoHa8ES%xr-8^ach8_1QhQ4N@!0*&7IahGEy2-rK@yYkg3#%bGcp}i}% z96~CEfi3@F&13FcsFlILg%B-elLJ8Eky6O|S}}KYcF;2T*IX3z^SB$;ERwqrz4Q)) zDu=wXkg;>%ua-j9Ng7u?#qTMBI^j!cmJ#w4qKDZcH+1qmbEXm8V3+WfRpBMmXiTFc zF@2e&P#Cw_BhWA(`a%gT$_XeXZ#Ao+pjiiQdlQ`s;Y z_kU&E_w5)W{d$cNjr@x@c{cyvAq|J(lTuPHETCTNHunGHdVrtZx$dSv#By!-wV^;HT{liS1sVa@y5}h zR+Kex#y#~tWOb0B9mak$N+S7<<)gY#n6lpwf4&ASgkc)OWCvybWDL?T#x!XTYUTA` zT$NLgVn*ca7Y@QND2I};5^zXQ_1~~xpH9#vEw|f|fEB>Xgrj6HX*TJITq*XH2>ARr z_N{Fh3N^FPEE3UQ7MdO~IceDO&E{uW(5Ip^2i~ zh$9D4-s=hv8#1E!GWD`IcCnz_<@ISGP(CA zJL=GI$wuXvfZ`@1PHyh(^!Qkgi$q2*CuM)o`yL$54;Mt(BDd|myokVUxBrK~$5fFD zceg+epvkl09sMeKE$1==6y)S7&3bB~?UbYkmTtwFTXLjR6Uk((3S-8Qg=iBf+x*VsG0DVf3=c=;6|TE2h<#3GSxN*x ze~dTi0Bq>6OV}kfDD`U{RbDqA5V95y@6aH-hUTD&!V~0<3WNIu$<-v-lX)4vEp}}( z2)Aw@%Dy?k5lSuQX-)a^#_<^)riF&9+0X=&Ufc3)Y$bh*O>uFn_8;!ESD+=Iie$!| z;8#K(<7^38sB^YdesAsX>X=aq0(5%pJl|Rn7{+4!xXxHu^>oK0M$LmbxzO`|%{2Il z>9GSCvie1Ko$C@Vp*M06;TEznZmLqU55gLC9A7)@_3)GvT{bcu#(P!s;GLakIvh@a zT*jWjzH>n3bx;NdWF`f9|DmV`Av4YOf4xXP0Px_zmid8Q9@Z~>AX?=fLY4;`!z2)* zFO@6Rb9pC4SWp?4!g;VxM(^{6m>#B=MIEp@gOx+ad@vKpzM`mQdbMxzEnpIXGZjnL zMi$?T8;(-?5e1r$Lc9SBqt1!`;7 z0_VqzR?nC*L|4V;<~O7Fm6R~BjxZqUbu>X@HL;Ea-? zK`&B*mFPXP5pJ%v<4*{66>y{Wk}9-|2icbX%{k*vQ)b!wb;DDKL07iE8WFsU1j{g4 z3_*bgz1A`8Q$36?#$HK;xy8>2c@|o2&2A!WT^gcYaro04-rYD$A0e=pZlh3-f5%Ww z88K|pQzpB;x&pz2-(M>=%RdtJN`Lt0ErQ)+yc5jN)pahTUA4$iUpuB^E2;}?vq4lt zH&%4jEy!9P+(Qwjj&pQOI`tCaQ1k3eOhnHmPPz7<4)bk7jQiN`Y$OF6jD$6EO7%fpMx=4uT?h+mRx7eC>u`WkM65KdtoyO1t}h@ z(1p;ip-Ij^gJq=ta;%Q#l)I-?7yc5Tp8XHqk|!G~`W*G>!(kV1KN)9bnt1=9YbyaO zZS`PW%k5TO*u49Ty|3PMCmboGDWllE&yvP2O&1B%`CK>xvTp6a1>*`G9IoDxQ@oHZ zg++hxkpW6EqXPzk$ybx*L#HX)HO}jd(HYP5OHAVGyY^rzzn_-jTWAoFA-Vl0238ck z`g(eK86s}OjwZxei^?x8iqP+r$W|&x128GG{>{@d;bAM1RL6|)Q{=0EWl*vk`%x&e znRuY@6w@E%-%;^n!Hz~eq9zQYM`KZ86?-D7cHInMuEY@nStYKd(D zS#M5WdFz{Qb7CgNxL^r!4r=+$7!BI%EQ|2tpA;?wEKD<=F)5B_;?Cdo0!8LnUt&-b zgbAQB!_`Vd1nM(2IxPF&h8Z#kyA2o_+l1~IBk0Rkp%c&8geDF~@!y0eRaIGup|+DA4d-5kzXP$PYF5be}(wS-$c=ebLM1iU19T&XV{Bt;?Per04Txq zn%SfY?M}XniG!W>lOzsn+V{lntn+*8=eS@VbQWI)EIO4ohiAm_C2gVr$dKCVh z(Sqy}#JK@CEvukl^~q#PM2kQg9hVlWD#E7KC8TLXal#nIcWBcv2a4%g(&vfK^z8O7|7?%5er64ehZNe$q=<*b1h_L;385s{&>`!S)y#aXG7i8kX!I! zT$Q={i+5|2NFT)VT&*%CTj$bG_$Usw#c?efTrj}y%@d>6+}avs6Ti5qJx@VHXr#ni zm?0ug16@UdBeb4oaMD?kL+yHd%JgbGmNGurobsk~2WtG${$y$Vf)ZLR9l<40uF8~3 zhlY#${x{dIDo${vWcqf9e`7#TKBfkua}}b}4(P?2}dGj#X7QP4cdTi>Q=UOvYL?0!kje1FmsOZ|)iW zEr;2vTkA4~-a@v{gyT7e z^(Fjh(1NaqRN!rujs{$d-zb5X1=uLtX#(k1v9QBmD`BKoEX?az+ny(VEn#l3A}B8u z?4trB6$T8Z;oHv0YY$H@tx@9(>*-@=Us zKpJlLbLWft{{~7PW2HKx)*oj1p=5qToBZ9((RA~#nWF36mT*;7RZEVDg*drLBhve# zCaliOoHxUQiSjJ}GW+!N=bNPJW-{HsF4lvS+w4so@K`Rqr_ey^{OkEGNnr`-E*J1a zHSL+cPt{+2WbL8jNM5AlSmKUPPJ!5e{(|L4q{4`{Iln$rxCbNQuo%&_fIwQ+!|-d| z@D9IN4cyqz(Z-vpE}u`H6dK@4;|n#5730r)`;g=Ex%kQ}gB_rWwb#ri?FV9-JvV0|_-^pEQ4(Een4FpI@uR&vb`{yPKs`|5ido_O4OwQ31Zuvg z;MVpG&G7Ir&@U8T1LBbg_xkos=FKz%bC~^ACxh+RtjgpoUA;RSN91cgoa+wOHi?luf<(Hp;rd-jq_%CC#z=+GL93vy)qT$? zR+3Vo#pVSFNMQQrMIV4n%wbogCG|1MSI_4-kfaNim2n9vHGb3<5y;1j&3W0J*jQW2 zCxGdFi-S^07p#kkO2%-iA5x(yXrur^K`LY`3zVSB!&mdg7R`MnN*Rk8(O&+JJeD(> z?wD#huDYw?qQ+<9E>ub#Jr+CRNB+NWBo~0GJgTXwX>3{yNR+&P@8dlD?%or`;R^AK z&I%)5{5^`zeE*XkN;Kr4k#GB*AYLU3f1RWH<*uAA=E^ zCTKx`k^ELq$p0k*T)t3RG%rb|YOSVEt4G!r;VSd4CAa9-^54wuTWjl8DPFtk;d7bc zXx{Ltcy;#=A4E_Bb@{DKfSc;av3)DWw=gsZ>rx_cxY4LxI=RloZ`rJ%SN|s9K5fiZ zY-UDEPHp=)=OIp>zJH2JjMhOZ5y`9BarK7_5q%5U>kj{J5tv{O6%{ypzJ&7XpVNf*ma^4&&GMKl@H3+QepZcMqQYQ~ea*)=L#{FDmx;CzYu zwcT%1j!{4d``umd>h^xNqfs4zHJpI1lUw+f`+ML2{4vI{^*^p_Khp#(n?zjLmdap; zPZ}FD2^2-Bow8n309g^-=w-hZoti$9bFg2ODh=V9;Y!Et`jO)^QasDZaK0oi0Y;J> z8LHPMeX3qkwZ%Ut5l7_R69g{?8YpysHqjY5H!c%m4Tcxm>PJMkuEjIT4RecV@~vR}vK&^+**EwfzBUrk?%6J0W4 zk-bhDSotR0w>>lSTQ{J{vOHi4e8wARA3f&)g=+M0)VP%6y$?GAG9_0R%BtgV&wIRn z-q8B(8rDHcsXF~1gNF@)92Uv3Y0o{Gbty+s1EBJl;mbo%CdiwWYc3V0SU>yiyLb$T zqh%-=As>;W*}K|dZ*?L1l%cY3EGz-HVs+t1P(%T+|=~s4pd=<~QSS=g>`I{j?kE?v_xK@9O<=b~bW; zUT1bsfwwB)@&PRf2VOiHI3y=E>FAu!yAaFc`*I7YWRy^;)*pnPT(#IZIPD>db|*rP zMFi<##aqvYb*nP_KYALoAsHOFc`G%Awn*o( zPeMz1h90rqDTe?y4UT4m_cr}I23m=w8ND+yH@OO*Fv^*te>-M5as@B%FkVaaowB6M2p9DH@CLScQh|aJg5pB?oh1Im2?S;Zd zBm|CdjyF2duJyW=&^W|c%vRRK$P9B0? z(?*-lH)Vjfzq4baswxoD#eKg*=y)1A1zDb1X@xXePxYMYdn$LaOsdMK@>xQ&j9?}i zVn2K>VrkXsuFf`5lve+7424E=9Fh9OB=V~=V|n9v&Q7OBs0)dM~XX$`jvi{ z@b0(MQ>jePOPdqsmGRw5nY|RplO~lsc&xb27%)gu!fmTAne5f8h4JopZ67x}ET~1e z?_?gBA0&LW6%^zXpZl+N>9hNaMY;)~*0~+~xvXU*WoVhaAvt?7u_@FY#0+wT0a$^P~HKp&S>YE z2Q#?_c2ngmbK`hcd*?uVWno#9-bWH*Z!~jpVg5 zL$J;?4#_kIj3QywsDEK5kwC0%I($XOJ#L+uDD+*KQRAC48I8qvAbXOFBT1(urv&`{ z@5pQgW>9g`=t zRHnxooc|~CG8&(YAW6rYSoI2m4PF93IM%T!iGJT}L0M@V#{Zpm!BiZsjTcmtB^{c9~a3LI3ByvcA4ijJ~t06fYP~O-2+<|S(ZXo4;)`n0URzW&h#>%5gzpK(^R&t#Mm zlWdd#|{K zWvEOr`He0787eI>`k@-Xrnb=QCqhQpYP5R8Cob-{FN-H}^$+9=IZl86^mTbRsA4Vv zw;aw`EJGU6)Ngf^umy=KypIod@41^&^u%!{D+hZ~$EUuGg~xCZy3X22JM=dW%h-Hh z5Im$k%`T*q9TrjGnlPcus|#xlZ2A7;&X(AMm#eS3;1%}txQ!@6O(#ySmwWe&6lplV zjPXHyE*SZXS42%5`~oR>ehNKSom1(hl_K0efW zrM=d0RWC~w7byMudcjvCR4uw^UzQo|&=Zv#1H9rrQAksvTbC1;Ov^|%U!{|KK3~%` z&w)B8yR3Zq1)#Niva2DK?6mrGYw8_l@>>y=zsdjDwwUFx+H`0PTi|ZLpgfP`Ez_wr zIsx3gT_f~YGjI%H5wNx&R#|?tNggv662M0fnL#)U)SUr~Yz-%Y(hmqf4QbSTk(_lI zZ;kD{@+tJ43pWepcG?y!?&kuRu6FsQQj3Gy%lCk2mMf zYX1C@S5QC$&Q!}kGSyLk3~HC+n9Fx~@Y&)^|6w<-Tk~Dt+!U2}cG}2_=X>gKrRN@F zLeeL(?jdjo2Q~O2t_L95we0@We`_!Medc9ww9rB+YoSOBVX6`Lm%x!lG-Vj+SH0_k zi>6~^V{qoIs|rZ}Nhz0Q>yBUM zbGai8%Wm&vc#KqZi@N=+X_k#vfqml^hb}StK(Dx1p2nw9%3i6giGoBibyEeM!e`;q zpK=PbvC2daDs+A>cl+XHSPsPUHoF~6rI+@tI(0ekXId#ko|o1l(QM6(4P{l}nUqQu zDAB+@ElFskq`+)Gx<*C(ywf2?n4uOr%#jE2HBC})V_%YHim{3-jXeUijKqIU95)3!a4f;v-J7nDi$IxuA%-^jtgm|w`l?D~ehJqZ|U7vK!zK{X*f1RZEK zZP_vQEElG+axjJ`2gMstywJ0Dx#*S9g>R}znaTOke=sGT`oy7o)j~IRusVL*x?u)l zKR1$}QZdI<`9xRO;!abitUs|r`n}AW^`3(qk|@ST0MSTzanp1k6QND-@7Si+ZSCbG zUd6SOh=$!*-tx28*Hy@}iS?tFq`JfJ=C*UPA5748ay2M}Z1v|&KiY;^HsnN1OHfWb z`Vz;5+r;y^?c2LIeURa&cg}nOWjAfx_u=oi3PQI>tl%hqoyPmN3ih@9~7QwD?HZWiOU`lMS8LBPE=a zBl6@CHiyuih5y!B(Ui4|TP_2v_zGhBjLnlPooIqdh%z^nx~R$xd0V|zIEq*DvEP6; zaOHf~EwBlSsXl35h(JJB}WwOf3Y;7->wm_)>5BAQTWONu}M@OdyM+)WR517(;we-CFbU$kg z8M;-OrjLRG^V53<7E9y5v6=El6qRysg;vaXP3lbs!YecqrYp5F@q?qDUesx228@Y&$q{2xGO>#)OuwbjdGBk?vRj zGGE0HBzC1#*ygCK^okmtdlA`+;wWUWjdIHH#gvgRinCQY#6QWa z$%3phh8i`T^6yodnq%V&YaUC<+Qvr0xQZYHt^=7;4(*Z5KIe+Ji){~N(*r&xxLXaS zR3`Xz>0b(qi;=pMeJ&>W-anRqvz=J!$r#dUO*|{ABX#^cpZJ)n+ zbtw?9>s3wfH|IwnNmnZHA&53KUymS zaWcg~YjgwjHI}7NU2}$5jc>#+p;J|*w^sGq83fuR-ELz<@B+aQ(A@7ZWExZmlE(wrlagwJ_q$BXv&kt(yY3{QUN$(}eD78Mhn-CV?_k)Sb1 zrxUnrD`I(?Ef6E;t=H|;yFfsHA9tty&LzPpshKOdv;Q}|+yRXAZrs2k2M0FBLhA)` zzN9Ev)B+JAbOj|04ONUUtUS=en8917=YSU7&#bp8e359l_kNw6)5jkl6*PD_ppKEr z5>O1k$cnEPVy92E0@8})mWWGD<;-%{!&+PczY{>@+g0>DZU=H)*wHxL@fLtC- z{|m_<%J=Oup7I6WKIQD-F)F>EW9q+jFYncSNj#?w|#_%syjDc*PmD!#-u`2g}KpKqIw#pD&_-=3UGTVG@?^p^bn zC(yL07AKIB5}7>8@Jx|DuUyxL$1M=iSH}!d8dqG;e2MadZY8UN&C}tGUOnT#0qzsvp$8{>-msmVY-hQ zGMmX{w^zb_EZx}Q_N;iaFa*MrYeC*@GAlJbnMxh`x@?rCsI)%eo8yg;T(Q=d{-;6m z_2*rm{MStl~(XpR=*>SYT_n8>ka=>g`dv9rFtB z{%0lL@*|bm?-uL*Zy8~$n`3TZq0 z5Rwe%Az5`L#mmvJMIC2-Z(T}jBKV0WOZ{V`w?Mxiy3v&T{mMT*G3yC6WgGM0NSN_U zU%~lwm-iF%WJDPUa&Gzmm8m6TI^T0T(ni`RHP2ehjw1nT*W$14xFuzhkGx_bW~JIB zy+vZ<(zkv3!NTzn%oly7mpAM2hM=+1?wb7ObS30LuyuV}?p@{% zz6<3`e~*Poj_DCoZ@o;_a>M(nidA2*O6MURc6evjzc_GR>L4xg^ygZWG752l#)U~Pe1VE=vXEZ&ziGDUSR-&g&i3DlSua4$52m~shO3{ zC@@XO`)#<#XhWIPw+fV7;2Z#?m(^Kv=GdgN$r=o?kqh>f^v$f;@wsy{#3OVx>nX{+ z*29Hl&=Xe6--cIzS)$kP8k^AgoOM|SsG8QV+$X-l9bX8Gzbj+w7$^E3GJtTuAjMFx zfgMHYoB?I)r4)}+-A1Ecl<1m@V(Otxr7)tzS&awPV7{M$SNguS`^4epQ*!c5*kl&t zRrmKa{k;J^2@XMg9$YKzM5PyKAGae@A-xi(>Xe8$jVk}yppbnj3qJJYN{I3*V*UD_ z>kX+o&TY1o=e+MUHhj`X{=HOAYA;@$85sPhFykJ%pIO@}SXrTc`f5vNj!kJTR@#ms3fT&AfPSE(RO=hCYD8RKl1%&?0&L@l!W04!c6loJ zBphD8MeutMx*Ptd5ajvE$kH0P`utxG1r1M z?`$FNZcJ$O+Do^^w^eLgm+iB8&ss$stQq?;rV| zk_8R?dY{w#M8Aw`F+BaL|C_IXhLELvm*KR;_$|9xpb21l_(tFUWVaFk{BZ6=A&f@FN&W?Fs zKguR+d5+&dvCYSLCldXbSIN*{;B<}bwm(sc6u7A8_we)mEveboDrgKk_ddu?e+6W- z?qKj%_SAQ5GF_tNw^*$Ux?Zp4-N<4W$-!g}?2;YUS`g57CS%{k7B_BMl)Mw49W>;R zGWdc(*mamG)CdoPRz9~s+e9JqLi;+d}Q`lG7kQO|5xv@_T<F8dHevk#}B1VNda0^T$=KEs7;(aB|W;V+h5&O)p>gE`HH?%>0vVQecGfb zbr|v=gS_rtr_G&QuW#%xUIEMe)*$H`Mg~(xY`v%<8h>;W)b50TxCSNg$tdQ!^yjAa zvqaDCl-OIY@<1_%MCh!!9`mjGFzCPnc}=4ko~NR*%l&eft63}>njGnZ^P&1%erg;I ziUzgUSbzEvKFgvH=>9x9k{{`X+~6KN^h@8qY+59xB$cwOd=A(_8jM{7E;ODW!qJ7z z;9$Nve_ZLj0t_>=n?bsbRs)wv zNJ{3IzZ=^!xBH#jn?h$O^~!0jDM!*2H`c8gDCqcxb4>UshwURO4ulw)vSOd1;#VMe zfwsS1lmvty>Ditr_d%#wkf#7btx@-?S*!&5wlw@YtL8NC7Jcf~Mf-FBR{)Ul+mfja zNlZ1(o%`qWP6HvZ>27wM9}hBKawRbcEE|wMRARK-%A1}fxEkAXxBNVd{Ew4-jH3M`Nxe7o$%qL z)Zc<#G$?(7H@K(XMgxje`OI(ffMgUoxn!olfG8h2fwQMivsj7IwW3pu|l(?EHN6@7uQVYv#WXB(IBa|{fo)obp zI|;O#Kosx|tik0=juNor8K9pJ_xwTnM>*IfoCiJR;==VR%Wb;5TDuB9eQ;@~4JJdm z*L(ywcOf{$#ximaa(x13_UVg%-5`=r1qipkPZv`*ux>d+rJo+#M$etKScs7lym7N# zIXvDikvj9$awQKy&-vobikVN9<;7zdd3eSb3%vUvT92@B@QDApKv{+qIfLI<=vNrx zQL`um_AQ6bC}j*YB93_Va)bs!a+6qVc*9y3eTf z+MIVpaxSU#?5f|@2Xg~88;X)jEN|;FC~R7On%aVqZUfWy64xH6>Dj%%oF)Wb<{_Yy ze;y_c+Av6nL?yOZ-X%btQJvRrMKxb3=M^u^xoi_;E}xGsKo{-MB#EpE0o#TK?C=NU zuskPg__HA##QEg*h{@|}qg8nbeA?09qd~O(~20R&ya-GzHSXDWr)S^vdGX1Hg?$MjVZTPWuT6+O{@7?%fyntk2H5 zvO@!N;0Eo#UN3oF-`+NYyE7x;R1%7+N33N9{Kpv6>z;m8t(%~z)6dKLcXj^bp6Kxr zV7K5%cQd%ZR|vnmfL)a-;Ny06Eu>6+BxTT%KN|Dp8HnIMyUg6(rLqQgI<9nZvO|31 z1%@r8zCj-o1fJ$ngoGErRJbmlT1b6Ulw0y#$61~J0h`}>S~Fg?VYB7r3FwB#Y!twC z{E1A}V>9qUnGT&6pZOW;&8dHUJz{K-qn({B$OixTQ88=xhCsaeLWv0TH5OTku~(Y% zH_;e+tcVKL7$Hq}2OnaA2!94lMcNX4d2<+#v2x(sQpLqD@!v9DU2V&L>MXzeK_%wl z{-nJa$@rLg&30c*#z9W@Hw1j8grLrvV7t;Hc=qq02rZxY&)WTaqgtql)P z0#;D(tu%8FG%bk>ipUri3VDl;6>j1f7q=sl34<9(o*n(A^mtuP)imGF^axwW z2k22#bF1jg9BaJoWtL1~pfyAALK$V~n#@kcvmq!O=LjJaVI>J=BTa^wXFSlv{{cVI z#{|}HO|}Rsmt}h9+^g{_gkn=Kx>!YuZUU9*(^O=iNne!UK z9OrGv;E|lE(2DKR*+%04SB(5)q7v3b(7w$86)bbS<@*JI(C*aXfA<`cp5%#E*PjzV^dXGOM|4r;C zjt2TjpJv;@uM1O)j@Rv8vjj?U+lAL@UaK@OCy~i((vADC2}(!9yaHSZ=+XTHyv!>e zJC^e9S`8vQwQCH#Cs9ZYwvoIZ(Jl$d1KdMWslc#2`AOvs8Tj+A&KLpoWO(xjW;ZY1 zs^*G*uX}0qdwBZa?^U}#k&&s~&hxAJH(x+IgF(iw`ZJi-RgL`;j0PP)yinzkFQyXT zMUZ6Q9wYIrU#(vYnIzHzyNpy`K7zMCU&iWh=h@wPo7LJ77R?v~Zo#u~d260%Gefwx z7LqX#(+-*_{N{9k3)`QX2>U#0{KyqJR3Bam;56!5c5-t1$K;LH*c;TGZ&Vburou@rN zp98QE^DdpT!GOB4kL;i(P*@+LHb7{^#y+U{QBUejrD)A+p}51Qk&$o@3+4Am5Ydw& z7@ThB;<5g*_qEnraPz9{^WQO`KiIs4JNd7jot#X9Qn1&APvBIl7D2P#B#XDT{3!lBta)AKttIeGkRNFD=Qb93`%cnzv_{a zICX);m-8CDwGa-+(V#3es?xkA#37|82t}})^;df`(*_!v|*u)N})98ADqq@JU~HEQB@Tocx3O} zSIg!m%O%~o%4(dREzfNX_3lL-UZ%dg*aUhcLEvOs=-bvp;|H~-f)GmYy(C|&={)#Z z+b-@nm#A5T^(!0ZYR z?oUev;7Vi~2V!0z&9p&TS`TxK<=2^#GkRs*ri+-9!&bh8TJotmhe9=lr@FdwXNQBLR28ed0=zdumKfGVms3?#(;Rv@Rn`F+MGVn8S-&+2{F z@P!M>>{tkXy>YXI*vmlc^`*+_`V-p7u)GFaa~(j2yFE^1KbAs4FOH)uTw`ExIh5mh z3~044(u0%YYQdRe!VpP!)!U|0w9)&>WV@+ZX@z%#`KN@#!^7W>y(PEiZB0>b=ENdIbd#tR_AR8Nhm+} z2_D$`sY@3@WrGLwh2NWie!*9V$+-K*dR^w5zW z492hXRl>mL!@9_2;X1AueC1z4T$n;FQQ!qIPTL8p)`pqVekG&%;}vct|JFCv!8b9B zbZGM3d~IkZo@Vu=lpt%PYF9|z%7_yLvNbjRHsPj`#1?SrR!?ER0oqs`#AG(=Gm#9N zlaUc@u*?@Wz1JS?ugl+luMRfa77NK8L^ugp64141 ze6zCJg_!qrEEMr3VpV9 zSztR1AxtK$H(6xQbd)o+1E_&+u$#j{#zEL(@YVYy z4V^<9K0%P=eFLf2)p4)TEX0rljl+aI`}7+;XJGC}5n9^|x7L6|&>hmnMf?t~9g!}2 zL-DC&rs3151kB1Ri5)8_#N}PV{&IA1kP*@xDpk9!QY|V}F`xV?6~W#!m?-r7+N@F{ z^eTQ;Y7IT5PN})7h^&)SFZ^{kx-YCIR-}S zKO$)L>r0tj)7uW55Xnb!BwWEp1KHmK!#_#LuMQ8_O0lzL4Y~(l(p@JuKxU+k4M+Y+ zK8ME}Rg+h*NMRZ+_waF0%)y#AUn49E`QUM<-2Iqv9$APDhA+6sx-o8=YGjJm%95wK}IOsHhU|<1?*fEQ! zds**np(!2n;BZ_Y>Y(3F%keB0B|h7&rv0hENs#O4Mt+8y=#Po4vowkfBA*qRZh}5l zqKW$DCjX1ZV|PDDS{kp&@l#+loOW6+c+X(nUUdIWWC_GCi6Y!t!^l4PXpLJu+WWXo zR^t9W3|7ou+BNaCyVR2j5fCq-3`KdlX>py9`i(C!d8fbma-<{^W?lW)HE*DG-<=>~ zmG-ofZz{d1$NfHO^7~MegHp7H?T@G>zkA&2#tubNcZ%=fn6b0pe)<}x|LD^;4~|*I zwAAisZYUphhv@x0cJc*Cj(R7$wy3sjQ}h4|bc0L!G?sIi;8OhHV$445f!89k-vF0o zD@9V*Wt0p+WC&TVp|l9tI=Pznn8EUcVd=}ynguLT_tF}%kW=uHdUknQGV4k9(pKa; z08IU7nz-S0@Y>JIhP4XVM)^o70L**T>+9qu7LaZPI|4xfd_3FxVEnK^O-Urg#l_{~ z{`;Qje_j#@t3n+la*T|PxpiCzJtW1z!T1&u9dw!H0zpFlls!xQawj${5*%9uT-JyE zhIOyn_#hZr<0Tpc3AW)blaFv&Nlo0keAhTI4BB5W^@2hchsD zcfo4ZgvR&y552X$eX}0*XtVQc2;WAE1k`XY+og1VyR7JkCVqQH%!l|7huMzyR(+|N z^R}^}?zq!!$)B30-ng|L9M;!Y{O*f&fVj=O&j~D#o!@pjQaXIuC+e@E5yH4VQD|(* zSg6C1YDw|sP{PxGfR+8R9v>M8DGr7o_@`LoF85zOK$;uC;KA?J&UbS9ZjwuO8Numt zW(`6Fj`wm?$R=ORI$0cq0A7?>@k?RIr(kL0J!e3?PkIa=c>u)iv1?rGK=LbdSy~o0;?%+gDzotB`>y#e@F675YrL9zXa^mb>&ULO_mO z$A@vO@iA!9S&$og?!8xzXhz+hfxqy1K*(nMw-DTk{k0)k z;6-0FxE7`DbXoCse4wMJx8GP@os-wWVO`l4<`cGvpHIfYDJ38yr_r^pbbAGPjxbk7 zn_zu_p>xEKBOR0}n%LxnOGy!SWF>KTh$@y(O%Q!tS;<;UM51VuV!_D&0B2}3`^Ow> z%!@9gh(10W>SX6(>#Ew!iieHs`CA4D9bg^pavcE*XEQ;-KfiV3Xsycr{{64wXm|rY z;7klTNRGR-ZqqwM;J7&U8+s#W*;@;-zWbS%5G8S51_tMgDDMoF?Cu-=yIM}NFD9~Q zZ_q|5Ws4XX9Tn8Exfl=lrk=Q-`WJJX1*wH4u|-cu_s`nOijp93?vZEFf#p}P^o>DX zaS!mp-87GSh=)YWEL8hljQKSMI6oRO_ev5g^4MGc^WkO8jsK&rPCBm`zvYj(`B7z- z&iq?oUz z?!=fI=imRiGPT;*B>tja#vp+M-vsZZkr>w>^BeEt^M_R`O-o$%I*_kC{R7ONmXXy3 z1J(sIt5O2jYmUh6)vH{{z@yQX zSV!gV;iDW8V?{5HCPC8ReGVdrDCAfto(Z9G9XAHuqrB~nCaiO@C+=hCtyuJ=kP^Z| z@$zVB>wfaR?~1gU&7hKCZQFyN_0rT-im$^CJ?j1N?Ce&E@$rWhj|JV0HRO<`io{Rp z8UWfA>NjYbJ+$ulU~nB_UH>Xit7Pl|$`gfZqgK@G19PjhBI76*Y^;pnktdB7>wEnJ zUORM3R#qk!T&!w#0kg)3WX-$j5Js3q41NwgD=|$HO z8CR~LvlxP$owDZbd6oyzXK1S&)rQ=Qqt#VQw>mw$QXhZ*4hs1!lF6wl!gao)GG+f( ztQ!qICQ^s9Sjl&as=zgv?Aj_CMOoKI>0{?bwB%j-*|DP!> zw%gSTA+J||!ss=p+-xnB47nDbv9oEtm#5P9XLnxvw=PqrEOqry9|(d+3_=A36}WG` z?tsZQGi6K4_B~x^b*JlAx=ic4d-2Rci^b2_{p8mtEmg)e4)o@; z-&>~8NFqe3ECxeD9cYC0bP$}^9F#(+?PL3$`R_Z>NIvQ5_q*Klw6#?q}~Cv_N2#`~Iy=+;`V`fHw=1HYH8lV0!bWRF6eeCxl2QCakPIapqha z^Cjn__1w&PG!JdC2y2Ddo$Z`sgYsWnx(%-X?I#K~uU%*vUid%^okenasGdAV#~=Rb z%3n&@_wk;%r-lKK&aBE5LA4!3G=OvBP51Tcs^;jgqsqwIRsYJgIfB8%;Ph6(fP|M+ zYWtRQli+ZrLr}N9`KJt@3dMq=sw(4Zt`}7TdsB(o&DE8owAF=NJXs=^5ygS==}u(Q zQs@}%0d>heduK2EEX-RJbbowbzVJ+W{|#@&yD!-})#FkB%0=TWl`<)%tzgn^?bjK( z<-h*!im89nd5r$8yk)5G#)!AH3aOFs$O|<`)&*{Dnl>a_Lyu1U2V;g=4{g;~QQ&OWz0j)+xvN1I5g8clP z$A?q)F9>Ob9i)9ERY<+hcRC-YL66f!vTMcH*Vo(a7eC_hCz(qIL46i3buO;L+I zd?-OIEK!vnq(zq_ViQw9^?w+qS#A zE6$}~zn=o9zcuYzIgV6tTwL5}czAdv9MVn3{8V-D?RHtXi>MQ0V?rgev2+>Ca;tZn z6|hkXM(*CnYtz!u@R?g$auI&`FeN00tK11mSJ%?ADCeBQ`kV4o3!SrI1P2X^03Gq_ zUnq&r&1I9z8FB>jMdxIh+P*ZLtzq}WCg-d73?Y9t7cAfMGb)8KJIFI|$jQiI2Wb|ABBh$^Xh@;60|x_euvTf<|d1}$ZL{jU7%$^ zx}2KFwcR0eFwIjrxi?Rzsz2EU6c%zyVwa7Mj5KK}E4L&mvVMF-gTyGRnp1@S=;@hy zj-3ZFC_+PT-bH81#xfx-kcha^)7@R{F&!62giS#3)og(wm`z7V2SM<6GUpBTnthvy zZqc#o7HNK0LMeTbAabl|&EQBR+PdQr$Sj{dEluSwjl$D4i-J7qJZ)u0Rd_ZrAm-_qP{qjuxjw&`K4NHBY&Yclg+Oa~V zc;-@_LI$~fb-b!Cw_}{qkR049W)Umw_%BF_- z24cih0b$Wf@P?3<+~HfD*+Xj-Qj4!dX)R!VzaVS3OY+yy)@I|>E^WarL&B$@%r^m;@$iqLUc=$-(;aZ_}mi$L8J77?w&I)Lcq)ZKGOt@@eUC z#dr`NY^B$?m1%kh)d!xxAq(41tH2DK+uDlFl!+#3YHZYd9xdX1TzU>>)Y7BF!-Y76 zgf*L!RSHS(-*?_-V!wNr1a`lBP%DF}sc9EGJA3?H*-Qo#8m5l?7s&=CTG)*71|{!T zqn0$$i>6Exh%|JFGY2Wo;S!3T1zrd5a5PHrlPr|n3o|}P`n7v~4|0eke};Fx>dZ^$ z_>`1H@39aqL~|aq_N*ful3vJ)hMh_ONaqIGB{Jlq7N%#gqD_3weEuqYtXqvbE z7|%k<97nUlsZj1b8=-br#+CG+hs3B=NN0JWPr`t-BkB#&rr>@Q~ ze#e=hva+&PNn|2R;r(5_HYpfnTQ1hAFxR-Y#y~xs?o}C+ZvRkTUY-kL4>tCTEpU982)i@U8%T zJp$r4xBm`{RFs!%HyQAR1qbhoL)pCv6B9a=p@X%Gv8FnSH`;g~%+Jpg@Cyq5D$IXT zI#Gfp*_Ay#JuO)1idbZ8=;`6X1~nskL&Jm*e-#LSivp*Bw0)C8^=Ry?QH+3ATL z?IUk@a}AAz%&8!vZ-PQXFF+KtMLenkP6T+G#B;EL70i(7&i# zB|%ZZSNabp+S*vV{A!Xoef5g=;<;!_jEarOPbdp#P9X%?mZo#3xSX+^GjeThZ4!Kk zw+?rAb#d0!Yi~#P*Wh%<()(4yNsxq0RwpXEdwD$p;El^DB_}V>w6wHDEBf`uP1Y7r zFEEIRO#B=0#@GAmP00y{P@w^$!Yg$G&yfV?NuRfRek;P>xIr(1 zJ5wLH*(qphYN~2#CO%CYGW6^f6)+lP*EwtX{K&oS8S795q(yk=S5+PO5E8~71jmV0 zOq_>=g>|Z*8Z;S{fG~MtVgkd^_ry$5K>@ew?`NR^Vc&E2zfWLH={JOKH?>;wA3jx5 zvTM?GENfuo=Kg00Jj1M14nwgTIx?5^>67h`A3rLf82Jd5_1C&gpVifOrKP3Y^)s>M zoNaZ^hZ);NbH@5uwXT14cmCGQ9%5q?j1T`Z`R5}n?$-gd-Und#iA^a*xH^eU-V0?{ z0}#mg?l_kIr@J-dyW2XNgnFb1RXWWpESdidrM)-^Q3G3W8L&~uZ3RnpizKuglrx@` zW6nif2%FjZ>rN085*EQBy&Lz#l#1VBPQnS2ig3dSXahBKP%)f$7v*yE@?I08GqMT^ zX&LJr&IAUcYULARAyml9d;-TTAu+}&Ri~q*ukY7mumojA$G{*nH8Yd`WkKWj`BF0n zgY)iDZW-#< zV=BDRQ)mN4i-?Hmzy%tboSa7Jf>dgAc3^-AX!i<>euC)XS5*0fmc^nnS_2y2UbMEIvUBQI zcI`qMlxJc>f;R~b32EllUK;)HN~^d1Wf?CQz5gp}FXe>%&^G@HrKc6{-x=d&{mu0B zY_MN$sW9)O*iVs2v19S`Wu|w3j>r&p*H_O;aVnKcT4n2NC_WX@3&f{v1&wqPc{n-W8G5c|J$Rlhtl|d&8n@9f@jm1}+7myc+^qD^y7lO`p~q6f zct!@(?D@I(_WnM)PU0V!M+}0Lxu6WT^buE{;~-lF(=yxNKYlazRwOyb8Hmg&m&_ZNj@ z_My4$I*|U@g6IvP;#aFDLz2xCwu#Jg^~+_qnV1;F#2VW=M(Eak9t)T*qqH=_DgWQq zPAC0s>;4q_O1RP3I5{gl+}*c1E#B*zzt*L=lizT^tieRBU!KwoVUDrNWX`MK;jZG) zdgd0!h*|sLpKg)s-i`OS80BrVW`h0(-C#UajJbn)e6WFaTlRZoM4=@%qh^ZIQK~_S zVG~?czcn;87GUSI#4NZAV5=CAA&6T@Z04s{!=jTZfzrV=%24B2+6UQ<5cB5)kHd2| zlILqJCGiTp9e$>agB7tzTDnrp0V3(0uTR1VVC>xa&f?0-P+iH!4I%`I{2qu%3|Hf$ zBPRDhZZ}_Dlx&O%1YWddt5V%Zo&wk&5(DYpj~Ln+^Hv!IvvlU@gyB;?Cvip z6#E~LNS~~RvM-W|cDK5_<^PkH@9zC!aVZJM@=e4aZaEB`K!;w^f+h`Za^wasu7b2w zG+RWHBxW!kI~P0cY00ys(z4Hk>kA8+#@abGj4I)oC^|&wXRq**ad7uP)!v%0YLTqs z>eSE)z!Z;JKs0`_x0Mrws8Us$z6(Im@SaSf-_%H?0tapeC=727TX1l2L}DOMpFR8S z2;R;Ous3xeZp-zv2NGkZGb*60l6yvmB4Mnf`J}(~plMx%J)A9nYegjHB@ywX%j1^? zKTJP?Rb$2-RaMnXV0bm{k=kFM5AO{85i3kirnyC22Y69{yRKw7}_c+EvxWgVMQYlN!d)f&l%-sKp&nFD{B%r`wh ze!RhW{4|M|QD7l&qGHC={PG-^a*dKo`Y|<&`&~1)^SckGk!Vr}3?=jbV)XXp`4>w*x($mu^Ho@g2x(9TsGVO`exFfyIi{BAq4%U zmnZ#x@$cS|-s9r>`^wC0$syD@ydd?UYT&Z!P<#mW3@DJ6oa}5nUm(W6G6j1p8eVEV z&%g~JG9gC)^ZI%+#bd4|;5p<~s)BX98maWo{{Eu8fcFq zht}?1FzcXBnA?B;Y$rmX@=%JQJ!E~(gzYi5iq78Mir?mH>U-F89x)84pPOPi+a?ay z^rMVvH{HMaOEJ%3r0#DH-fV1Y3Y~DXU!lp5pBG~^)qp}R1nTG5-Cd`9Y;2bB)TO&W zKMAunip7trw_gKF6j#XnCk0SFJ}%b3zR1xF@bkC87cktp6UObt4lcYu&rkNAlai8h zLX1iqeAz)iJ#=IIp-b>uFe$oX!q#E2>&-CWU>^;bci!CEYW5#bFtw+kr7BhLC@d;2 z{#PU&c?{5^OpXOkh>dGrF)WC=#2Te^=SzIE0eNyR$8+Y5Ls^&m*Xl%KtyzI1RCV>E)=Qgy) zq$D%K4gg^o2qy#e&v04>k-y3URa2ucw+x!FkqKO6Rkw{LI6S{`KWASIU{(#F*`tDs zv!mF&{QN+mHzdHIu$+^_!_(6VDKW<%k{P^*6ztgoGL4={4 z^DV??Ci?)}bcJ$=_Afd-eEhoXInz*AZ<)QibgNEJmjDE;NW*8YI1e4_mEW6HtEK)~ z-5U|{%xjO%HY>medsjh6g;b`gl%%J8I*O9-3oHz74h{t?OG`^W{j6D~Kn9}8pRdDn z%`L0L!?77fMNb_R6@PBsVALEbC~3IMJIyOEFHeNL1JFKrNFys~b^l{}X{j=!>p$I` zFFfWIlqiU`jZOc`^0EOR0|?GL{d?FH@thPeHbe3QH-h!`z9%-3l>Q97cM}5gB^{F0tWa9y#K@$HPtT6R zAhw|5`%r<~{?V*`6{LE%WrT8V4%Hm-xg3z&UZ9=guGrZ8XeiLcty;06TsIsKwL{Pg zH94%S=$ve9Hgc^0%j;Eq2}^b!hP97BeWF4~I;N)1P?=^x8%wS+(h(qACp7h>oUgrA?k%VxCj4`^YF7=zUrOorjP zy356f!aaE^&eOP!>Nnqh<2v7o7)(19P#E^ji=TvH6aok*p{0!uBc%U#2J;=bimY$( z4#S?l4iBG$6ms7o@N{#Xz3x)Il9v7+1=8SgD2_2a9}}zW9vmcW)vcuFM?~OA69u+!A}dvcoe8K zFW-mU`>3ee-Nc?;lD4%yH#dj#{z-GY1?EPq2rr5RK2wL3w6qV)RF?B45i#)_8z5w$r^E|& z2lImm)O`2vr{?G8&UqegejIQ1yW)e*l?SKimtD?{k>6tsCZ1AK?Jpo)+98)MViK2} z`xU3!v3cC5Px&ZFEojdZF)%T^kpUVS8qU7dhc9M8Z8!Suns2|XEMo~t-zL9xvx%kg~n9Z0m zFnIh-BpS_|5ep0^$Df~ggxz`OE)f+=%@V6b6Lce!FVYZoCa1&RG8Q=r8xUaXayL;^)_(&H}TJ`~O>_TxdLqkqpvk5bC3m|X$%o1$d zd^F=l4`b#h`EayNzfVo=%h11@-Q)XU7H2@?7ko!I(zmRO_@}2cfPm34B4WYiR;6wc z|EpEyZdc6Hk_@(Mm8vfwu#2)Jxr@r29}G;e6hvHxvU759;hepaf4mem+7?vR{5=oz zam8J^@(mjl#DO!CE|t!xOk0UqlK1|7)r37~Ng(-x=!(@2@%@FNR z)GE@=@|b^phi(F@D=V0dsHoKa+i@KvAveF@o0*;V0>!A{)US?0LuX`*Y_)Z|_*6W&q**AMU8sSpZ z`ZvFaMdNF?s@;8UN*1WpuO*Uxp%@5vD6~b&WuHx zk0u(TtfMp0fhEu7Z*8ZQI)d-dVA8MO;7Z%L5c7ZtAq_QN75W4>ucWQD^(kh{SN>T_ zH1!K~9Vr??yXo4yiDqO-oJdR?7QOetOh9X}#0ZlC}9@VX@f@fH-m2wvPQXY)i!j^j?Xm+HTSG(X=zD?Cm6s?U)#fz{)RW`Wg#n~cG1KrL}HF6IL1(%2|= zX|1B!Tj@{4L@fE$u*tKEj9AXy-JP0FMP5FF-+g;7O?s#KnLpC9va-^trLOMJkrPdX z3dv>ZZ1OqicX5DPk&=-q4~~<3{`~pPPDk{XuXwY=!%|e#)V;`DWVjG#|CGK2Hh70w zCTa1MJR!`vdSpF$C6@2*acE>Jr^;p#u^=2K6~!!<&XA!MOXmRl20xgHor7Z|!ar+f zOHo2XB83548n6?wy7C)lIT@+7)-byEJE_NMH+$amG~4o0i233t1Q!Pq#5TfFdw=pQ zq3d9n=PxM-b9mSMf8%J!9H?;LCmj0vgJnXR0G z7z0PYyTp=*p%Tx{9n&1H{fA9LlA{W-EUD<+h#P`sGrxi47YyNtAKqHVcc0TYGpd zXHe@Lkm!S1lUTm&qAVKBT5sOfb(|>|J*x{EaoHYtLU`{)!SXl4( z#KhI$JV;UD8CZLz=UFavCYPv+snrm2b13)1>v|1|1mJdk(Y9v+)o<9>y~ z&CN}4etvE$W$NVQl+G7*ANp2ujACNbP+?y}nfn(02O|s(wb#2P0NCDr`}WPQsKD>` zz{bI^YtZxK?G}%^Xgo$ECD(CW$6l5*|HvfMh4PTnm%IreSDnQ00jkQEQRT& zBy+bqG&gR|YM(AYOii8i*lOI1+3>1Qh&+jIp)IW!ACHeG5%#+jLxj;ZwY4dN!6=YK zk~DL0oc&`D6cSRIgI)LVD%OGge#6;AfYA_uqVFAG(Bye<%z3CT1;izKgGRjAO`aaK zV(!~Uo|2L#lIrS^iZ_@@TypX>JEfwGOz3r2!%9t6 z^$_^zT6L9oY)BkMsIlJfDA+`Pd}^0bQFuwM{+qcf%;bm@@x3dknBj$<`9qp2+^_wf z9#*bIlFTj<-oN{0vQ8b$%*;0DT7&)rd{JYTp5cI1Xon|d3hW&L6&~g(pU-QW2d;`t z!J8;*XuQ8&hl;D zXK8GKr1~PX1nQa_1hk^VlLcBlSPwqhU5f-1^#eqdUN}Q1rW$|{BNG0OqobS?4&=;9 z!igMb*+~&)tyZ0&))sgjiNz6ahqd*0rztgs(6c-~C}#hm7PKYmHLt+(i7xK~1WG{D z>Ed}WNl=_RTBa7507RHf#Z0GTdRp(-@Ngy8rcdTy4GVj(I6J$=sli&V_iyaofZlON zkgBSxE1ep(s55_5v+Kpuu(hNu#>Y_{k{oEBL|M8dlFQ4tAk?GK2n>@A_`TJCA-BW?s9 zbT!Y{>dHznj-K5O;A5-X!U%07B_+3Eao&WU>S~$W){Fp{hj0M&8B|Ll5e@$kOq83S zA0LKC>GXxKZ^?6YwprY<_mr*au}kow5LI+y%&RQdHhdvFlJKs)tI*r?xxhb&RRaya z29%vKEO@9*7!jjp--`k8mbiD(Fqy4%W9iEmX21lFah~Byy`@BNlqGrLis54Pc zViYbenz9QC9d$z4zc^`I-I$%7JzKXKx`wkdA4=V<;ea4e?f>}t_3QmM-dm!*xY*b& z&;VPgbzD#;3KpbP2WN&y02Arqdoh5PmMN`hlSY)`5^#Vtq+KXQQe~wGMVB^l(qHOS z+voPQyw9cd9V3k^o6Bh(iIM}eO((oa9LN6 zii&CnfPM}gf*7Xx3gj?!vhQJ2HC&y^N;xk_OAHMk*pBm>QY`Coq}>1A5k(mUihyex zX#_q>5j^6x{1uI8g=vSj=og4Q-b3iG;0Z)72@{~STnn>gZMxyrycK!bfrsu7wO{k) z>4y8|`AIW^KyRK4X@ObPt5fI!*%?%r_m&fgzez$43eKPrf5pSjo<}x0GUsdZ7Ie>! z0Nw6X+s|Gq!=dfxQq%arq3%yd5f%!Possd)0@fJ^N((BI?Kb0q6-y(s>kG|FSv$L8 zSr?as)vNOraTbu;eixc?M+5j`fL2OPg$M^BA=a)FOIo9ljSv98GS-j1dlR0IVPGRf zu&^9Kop%iJq*feEUo%D~X=m+ZYiQx2-&eNb#bY`Y_c|Uv@C<86*(odNEJjEP%_HYNd0_!R`x51QUDLUpjvg`NDz zvKiH!mtq_W?(M&P1^@8Y=O2PHCj`6`u#rS|wd|)LB>9k<8iOzxMpNK&Pb7Xy&@t~% z<${4t&i;^Ze+(YKf)5)*$`s0`O!6mXAR#fCsMs}k)p??q`o+*QJ$`Q;=>q&2xGA`at4-$K)sCxO(M9!^7%(A-LqwqxpKn$nDd=NJ^CDV|SngWlRJtUcEmIar%0$gVO z((TuJma3AAx<8@RcIT7nxWvg+U6{~ry%kGw4;4jX_vok-Gz0U{)40dP1plB?!S$oR z|G6h*I1=jDIxwo3eRDHyVQS7=gXrh;?9b-9RAX4F+`OdZk{4H*Sk6eMUEeS zS5L^EvF!X-^Z&jg8%rXEfKrXUQgcEyO?vwI?KQcou`NWrX=!TN?F+-F+e~koG}$H3 zy!2T7jn_d;MDyn3$B*Ben-@k}2&G#c)1}HAPkO_vtE<1e2xrvT57g&`;ZnMKD0p?T zDD+UFAo8@VdD!EguthpKIq8cMn3`y497&62CRf-@4(79#H#+szI<8K3{p^LP6q)%dnH zHoV$}L|WTKWC~xcVcwMPx4+4}ujjA`@xnge+;}oV zF_xl54w7#dybd2ZMoCC2y)Ny!5Uql7>5lNhI;{wTx>y04UjooIfoy)+NFLQ<(3S=ze;@QB^ zQTp_^HL4=+UA_GG1`0tj)QgnY#^f-}?(Qz9clji^S+ zrP!XMSm4wN)phsv1?^8QMaeMdB@EoBV8EY2l$haz;2v1zYP-6+YT2umaev&=A#=Ms zb{HQ|zg`SN!>wmdP%`iNN-v*ZgBjLA1~IL7VJ<2z*3{E0fLZLYrgl7PpGdIa5I7=| ztJttP8;{zb#XN2w7weT73H>T=FvOz1@?Sw>V`N14@bKWmK@k%ZQ_Rx>-_TG=w&x0b zGq?y?FqDaf4SADH7B!EEhyZ3(!4?d$!0FL>s#I_D0s|GQ{%2%l1amMzgDVm_0J6Tm ze$1?$Z?=;A$-&5FB&2{F@qGp*w8PxQ)b#PUlegSS3RX@+NH~^5<1vD9qRhbUM1j&L zSYMO@i6O8Jf|mw|q2ZBXjPWg-zc@QPGwTS&g&Jiy<=__n!bSKu&WWNTBPlYQr!s&M zFoU7RYbpLARGhVD%A4bQf>ubE`!!rXM?*;pBLJzh6B>%dXxF!(Z?wL#k!+QIT&maN zwctis{Nu+JAp}oSjwY7CZPDja-PHHm^5cTX=BFpv&*u=Z+o{t;mQ#`>4&z?%Q@&THAb9QJ5WETyOqh z;E)MI)1CdkvG<*HD6$dA%&2uZlC5p5(GX#^#p1EBuxJ<=MVWD7v~~(^yO55&C-S;H zkmE@RUP4}jeizdeP(kV*91Mk`DH62Sbq@>>Y`eT}J{w(B+uGU^T>ivJ>O3e^un`a= z@o+V)%-M8yU9;e6^VZPtMSXpJg~MXA1xi4xAOdD%YfH2{QEG91elDy+ULk-L)`7S> zUMW7yxH9qCKD^G3{Q#+=N}k=0yj4Se*3xbK}ANbLL!`w*46+NB;>$0Dm;-rE?6ki zY&B9XR!;maS*1RXVU1mg7FLh!)7UZ$49V7C8ag^_ern855G1I?X6Zu5`spzgys3Ia z>2*8H3KSGgAO04RL8>pkd0;qb94&VzVTX;UgUV+Hgue z#i}ony^jwol(TT|o+vb2Ut627ys*$b^0}DvyhV(-XU9aTp{1^C^?Mr|IhF)zfP_xY z&YC(p!H%m4>I}7@a3}_@L%Y;;PbiOY!^JP0R;0|zTV7w+-Nv#Hhi%iMK(?T`D75!?H;$oUk7Vj z2P@H%8ivvOOJ!|ig9eI2!^+BmGGs8g1%gX~xGz5xVZI|=A^jQXZMmXaN7({4b&W{RM6t^NXH+%`A zk_?A|RYKMk07VwQ=f^<-i~ipw$z=`9%%p%1#%5*3fB^?jcG=P(A|h&aBwLi(pZQTmCg5&vf1YxMpx+!#7IY}sqz!! zXXVr|-hk#!A;wbE7T-A;d@&azb#--Xo|N<+A%V@o46l(CtITV?3@YzfuWPIvl5v3l zgaF3`B8eqxk~cRtNTo3*NVX+e5<<;kOdKr8u%NG45kx8-!PY6^T`L@#U4k_81i53( z!P3-Vn53AW^i@&epjhVRF|n|m@G|bp+0G&uv%CW{-{T862%FFH2L@1~5#jsOlCQ0; zT~T~?#-m1M>qEA{xxLu$xY(Zs&rlf))_H29TP`n3a5=r!7No3cqFV-mGv`^r(0;N- z5)#ltRXXUOg1r_@rF=Bm_OUEZDAyOIJh0J+JFCSi%6@cl;p&P7utWp40kEgMet9tL zNNMUi9VpV<+qI08MwK*{XIxbEZQ(0c-eA2pgI&o`toG^ z=b-RzOjPAiyC5pW^jALtURWL4{^h)z>H5FPH9c&)Tu4?;t*)NqmB2SB^@C#XLm_j9SG@p8VD+F&* zI6>?E;d=$1lweB(u-MQx=UPYz0LF z(Ys~W!g#wJ%~H`^_dg&On!N5+><$;i;AH5Qmg@)ZB+iHG5auUblCRdSJR#I}vjFWo zh9kb+BT5hH^UiwY(Kc4g_h)O0-}5O!+^Jw@>z37QVc93Gi&iZnpXvN_JZi`p=V- zlbYh<;>joqvDY{xJa1=(Hq)JRRt3cu`TU^zz3agFXs4*AhDS@Yp@_(#!fnt-+g(RKgy7U>%ZhADH}{J6Po?&*EsrQ1V-p4v(V-jt@diWx0aUI z)W7TMNWicLnZrh_$>WofB6=MY4r5+OEEfP?c(A)5-Dk$7XqDx2(V#AR{AY@U_ubm# z8lyzr=D4#Wg&j1mm!ncY~Nccx+rWD9Op2<-33re;Zl3#09cmRfHU8m!v(8Z~s8 zr3{Lk?kr&IL7~Ly$@W}Elp@UXHRRhOjg6dnKRr50@}q}w*;2ZN-YJJ{jwTT?aZW`A zG|{|vY+sCXbB>XMcROfeLRXO)Y#0r0HG+0_`(vqwsiq%nZSP)zKjvlQ-5&2RTU_Qp zPLgM;6%0(8cnw(F*%=>oP(B>h-Q3*hNwCUYR#E*dD;vD-GktK{$V)Q0SqsH|!2}?T zF~db`@)dY&TTe25;I}C8dAPey7IMzlG&aVC9K~yROimc2AMkgh`vax*bg-_@b$_PN zu-X<==fD5VR}r6KFFz0!6&0Caq6HB^Fu{A*AkaLH@jY8joo{d}F41`ImRr1bfGT1Z zMGM2YdYhKXC5NR%AZW#fi(RNw#M!8yU#?=WIf83G^9Fb9s3X>dNyM(9oCFQ011^TL z3c1v_vYo3X0C>X0&MwD9BuxeNx0?-@rTO>WwW`PvC!RlgIc5^Yd%#-gD^D#;DX`Y` zheW~33LS8}FL7}}b7TT9ejz9NnGP7e$X8~%koCGlE(*KGfeZo^{yaK5nijs*85$az zb5Oe)o%4N!i5o#=5mjpN6Ct<~PV1{It1Zq-=dr4;p2ol5Taf9wGl=_we<~y-WaA03 z(a~bd?fjuH0%rKJ^O@fJ#@s}9!wojWYLzguoaSbemoHzwIuufV&S@gL*GX)e?zS94 zoLTd3fK*;K;4M#&;AY!fo=+M~sI%3vNl9TkEPr$2ogyM4OkRGlv010Z7jxQYG!#$y zqEtXe9sJEPP(TMt5ZDHVT)_hCW|m%)5ri8do*#XXi3;Mz8#EFqU))93jUm5iCt!ZE zy-d$_H60WGG?c5g6>uzXIXi1>N8=Xj?2=zN$L?e!nM{%#nIn@>66!yCE^W8Z#6zgP zIddxUEpQ@;1o6Q{o*_JA!x^a(Py+yG$+rYso)jD@k8aeuf$~$25IU@tL?Ey&+w-yM z@+XDQS>+^!@6~byz-s0}p;Jjg$d8vc6J(^HpB9gLT-v~9Y?_~%c_7QmSnunuuA@0ZH0s@kYq4jgi zFJii4g-4MvmI6DV@>$ZJ6gshiUk|KM+92^digbh+Ph`ePw%?}l+nqTYhi<}^l$4_W z;S~PvWO)|8e+;FB336-w$6Z+;pC;$i0fDU3tJRoCkMo_s+jY*HuZfLaMiL6Ld~Z6U zD#stXr89&HHIF_EEL<(93e3Cg^d_*X&(=6(J!X!MYJtg=Qu?HsBkxn;cDN9O)8UQ} zA^$k8`M1pst^!04ecUS^)t@d`N6QW`I7KhptzS$yuwkGgE5*KvUiHUDl7Ve~J`Z$O z7iyFnRm$O|F!o{CdLRybRw3EjDapZW({T*PAZWu$eb|IqRM@>pzhqXYf*v7NLXo3b z6%B995tn!i_hL5EqOtJ9?Yuv^7(KtzJke1o7?cXYN(4f{J7i4vNh|tz%5<78e`!S& zw*c>3f3tSli*(9zjbB)GAMP^G-;x1*&T&bw8<_Eg`jptrv zmjte7o;eKQz^QJz3432}Z$E2U?TSDbrQcms6!*3D#zX_dX}sm|Wy|9|qh5(VxAWhk z{~-QVRXk*#Ti+@jyjNeSN0A9R{gop&J~Lr^?i>*r`Iwm^2ZmPceQLhnfDTK-5Nwx! zRBb1hLV%pE%hd?`EW+D+n(L8VphlNsMLBQbk5V;_e|g z-m=UE3O7d*1rrk>o}7&F!ZF&+hPw=um;pHnB^xsPb&{Nq*}->L6}np6OH&J%5_1cH z|6<&6RAc~N0?=C?+e=!uiGSk?dAk4`bkXLA|S60gX__8=(z>*>+J-xp;&Jyu`us==USFCpBpS+cyFJwcPo%quoDJ8fz0`(ALMl$wA z8A^F~8_b1t$tDmaMFnX%5(ny%suM#N6}el${qTxGnRRMKiGPFp$d5yM6(Ht<-9@8a zgg?6ox!1qsmajSDH76zr{I*W9MdQD;g{XfOEsjE(6F-RaKR~Z~_{P<>6$K(KjP4E~uo$Hg}Yn&G+DXAx6NV z*Pz9>sidTYi1%Ip6^TVjLuKX2o2WeAguLqN#4u^<>EYp{B?rITS!JM!73%8hl6kGv zcEM%=pPaVJy5GG$Y@q~X4e#Axx^;YfyoRbOE^tfk`mLv{ET^)zCZIVr0qsW?)`o^hf)hXAx~qL)8&EQ zuU)2i*;u&{v3M$DdwSvH)N&qwQkKXPEzePG$|7B**cy9zW0enY&650t)0`^5s5f|J zxN)d|zlk_p^X={;(D*{p{3a@hYJPEglpdup1~!gs9PMI8$`BD5G5?{K8j4d-K_ehQ z3@kk=eCL$V?NHY83K9%7@1a5)y_rbM6$TDerW{LT|1?*_=T*|v52CVO-vR#sz63pr zG6e09g(HTH89-DfCbnP~vTBP>Jc7^iKAq}$TB!aZ(o)AGMKR-l^-NDAW$?+}JZWOD zT)AL#^=56zKY#s-2W-Fag?;UEn+R}izF%BioPD8|sp6>L`uV5~0fU%ZfGYk{-cX)Ho8N)^N5wS(XH+ z()lWYx!Ft266?$OTvsIVx+=ysfo2sMzZ|xGz6Ew%Xn79S9)5HwRVHS6DZ&~o*@{J_ zPZmr|jv;fULqf&9}7m- z=KWDgy!5LPNg{mM(!2i*3}9~Eg0|Ohv1evxsmMPa9N42lt~qQ5C(8{vYit*I9A~Td zci#;Z*?TVqpbw(^10`f!<$k;pIWs%E3bb{vFmS;)P2J`{;+uener!h5A5&M>%Sy}~ z?u*Dm(KSa}9=W8auj*B@i{>2|sL>#yn-Rd=F(-ZaE;8zfRAzmZ_#=K-vk?~#Q529n zS56}QggQ}T9F)=E>W;noTC|&XLGV)K6u1J^HyBen$hHn?kIv}jj~Nu}Cu6o1ndJ-m{rE{99@oA%7c~oH(J>7yb zKw2T|LX78)!{r<1n~Xd>ApT}dOgJ4Hl%+RJM*wD1E{jd);h*hh870n!WhA_S%uNTV zQ=+XVw0;Xad85txqf6xvZOh^v;FYCn_&Kx|oWhdYDSRAT4!rSZS$X zeo35vDJsAVn>n!En9CvdxBN2LA6d#XQ%fQZd@jkTOH0oil8>BG%B|dAlDN@=q_Wo0w6oeZ@{3!Q z0(cHJG-dJH1@T_z3o+-vG4+j8`-ZoYK-#KpNV4*y)~PLjJ8F0me!6(Ldn; z4|fiB-W-+-(aAi@edCz96pIG#h7zyj^=u!I7TG$$bdvt8Qahc8B|0RMN z8+;kCqy(O5y&W{tigr%wBwBcD8Hz_ah2-yK(d-MQPe{9WCyPRhKj7u1)O%mFU`P-n z^>UbeA5pep{6KZM|qpr~vE)yVMiK?A>Q& ztJr$NiZS*O7;wp9BO$VUaInbKhhbV$;q{6Tzv;jOX%x_Rnw=@kL+@&5_p z2b1oO*V1snCoo+P<^ohH9sY!Ve$lw&Wr{-NVKSOn-3RlUgql=iAchx40@$-`5%s@q zD(&ZA|EjL`Btp3nq&;k&GaT1v+u-SyrV?SD-6wFpsekUGKan}2%1=fq+h7>E%)2+E z(cLGV;1b~F;J^tvGUH;>D>w0(isWo|e`XQ2v$Jy{VQs2)HTQGFo{ZaR%@kk>%tB=c zClmv^ApJ_=M&xOp4m{V;AvW`Ti%6Tdp}t(sFoc8X27BG0I)Cirhjg`qe>q=^R*?aO9kn&$jO_0 zU-nZ?rgl2lIu)MYyvIusQ&*mbhTJA8q5eaeGggriScV|53dJQKblaPg>Pu`smZ4!O zDKAel4M|!?ZU1GhoeF%(2p3`1=3NwzZz0+0mT=?xomB}QtXSd3_wxG68~pl%9xb}a zft#_7J-d5*{&ofTJp`cv+!lC_UfS4^@TuSqE_ZmLm7R~Xl{Q)k)$wY~PHj+Px zn0dS(rL>aag0}rByqhifB)l8tz+K2+735Fe<&pVD6}M><@h#Qq$&1v2KdaQ?;GQYFbHf z>MfsjtU90B*cZy2u|{rreC%WOA=BMxN%_28y&t$zQo@Eo4YTM6arRyizHa6#S+=L2 z$h?w@wE^xLwg z5)svG5?+pRJjtP-fMNQrsi|qPeQkZ6TB2px>K%#mm`j%<7YI6VDEZsj<-f-q?;jjU z>*@Wu6@#kNQT_M$R%$im;-cDjI#ey;+>6gF=0cVrvI{AjGJ4pY_UZQ7Px7p+lbyGK zv9?JLU$$0T+$t?AqJv+{hE{Q9lMIWkDr3@I(6e3F6qBC?HRzBpaTz%YYAzo?@^-x% zdWjSCoJ}9DF*UEU46?zZ%F0-Buf4VE(~S(bSAUoPnM>Gi#38ax!0=;IenvD3$Iw>|U?$kO=A`1wO33$5=+Tn*USk#^5xl zX<`x`ODhk8C}r02uUeYwd^^r8^;s5vqkreuzgi_?_VL`qQw%aDGbIb}FJCD$R|1;Z z@*E9$)RpwpTWJxBmamygd1j>fhf;S(D;^Y=%P)_a?@3K`brTQQ^R$||odyZ8Ld{-3 zKRLyoyXMACR4aHtKXYywy^3?ZahkmX!>jeONMtj3qmm`=v%a462$%YJt}1CyB6@(;K+s)MP6TXRhg`0Uvto5c628L|&w|@Pqa{kwc$KOa> z`QQ6(wsyG?(8%-eIXNBpox+WZ+ZO|0^j!XKH^P1aI+`_(1u zIZb=nMusBY)1`E;-cdcg;i1VFyZbg{cR14xZsn$(gLFti0ohpytBIkxW}1UAN(uT+ zpXuCZ7}>S%5M-o2&b}>=E#;29MX9C98;Bxv4_6f5(e*5`c=_3wxDVA(?yI=Wriaj7 z1#;fit=(wB6$}cT5O-i{*mg0@RxeMfwP2NTplsRm)dpR}qlo`k_J}0|C=!a-#ldy~ zTcYJR@Nbf9*8fzJOC;{v_F+p9eU`U_yg6Cx5j)*5=6bB2wHLXo-z{r6%Z*c0Qq2-? zI&JjWoHy3hMT7K;y|093JqPBQ;-C4>Gku*3@$9nr6M=2(p1Zms!*iNg#VxilvMx>E z!dAF4@wUs%A+}TbY9b8g#*CSCyRD7ke&4~?VdjGFAM@msnFwC)&MqxKPJr=1!;~^- z<5>b%(<59wD$M#%wp5TO(p;m>WZ6N>-TJ5EMUUHzkzIk3FuU0ZZuvw@$MVzpRmwR` z0K-5dDbmMneY&8MkZ3W*giuWXot{3%4bJk9;Y|?@ZdBx1_K5Uj3 zp9`|stYI3OUv4hh!y+VoFOd%%?48~4&d!^;xS~j3k~X;R%l0e({@w28;z}hVVmNJ` zhK?fj?sY!?ca;8lEL!sI$!)UjY!H0R8yhoma3Fy4qpCgXBYkZRJM25SD-v|BB*<>i zGp5zi3MBeQ)dJCuPCkiw?gV|?f{x{J>q7!D(bOD~l#OXR9rQ{PeYmm^IGk+|n3^V$ z($gc(jgN)~Vsa!y15qHf#I`_M(qx9y65+I;;gQnNv?S3j1z3wMqoCvbXQC5s6tI$Kf3^&tM$n}h2eqQm50bPRKlh9PUDOW<4$xOT&t$-FGb3Sf?q|VzL}`{S`I2iVWA;}qzGk_={AS59OP*T&X0f(E{z_w zr)UMR!JJ;3SzHEwx>3<-}BYx$%PVdc7v}DP(I^evi+#d}SyY z-XnSTQNG@1*q%1pD_zNx4^m=SbCCV+)ni;c1WbRzzub`vA%5X|FHZ1M^n6_V)X;F2 zp$w$^PQnQkB#~Xi3loF?=@Ca@MSM|Y0HMU)guf0;Uf?&X82Oy{cJt_V0Xg!Y`GI6M zgXJgjB(*uFFPL{I*jDV1uUJG2y*s>YzHG_^9<(z{Lc6-(gEolCu?~}?d@FB2)=dRD zv68r*c3i0AW@BaTBjGY@9aAbS7!q8KA|_^keWseH6X9&nET_oul#RR>870nM{=oh( zl_X|HqSWM6Fcw-M8z*PhM>jX-@=FAXAUyly8MlHdF$StGDE+Jwir-OnpB>Yt{P(WQ z5vqQ6EG&%yVpG(nN)x_ATQGFbe6M9InvZhgPgvLTYsAp}W5|1W`MVsGYl>Zjh9A?L zgQy>M%o{(^K=240AwSB>HliwhAZ3>nq78tnIDvM|Gk{BCc}>5461n8Mx+onM>{BL~ z2L>7xmHy+ho#JYC-i#i9(YJ^*6|D+9!M!_=O$DLN$Xpt)l|Psz1q}taN6gyw5fNC4 zDj;aGW2Ogrin)>datP#xoca-eE!?dln(liQ$O0&Ufys@S0y8N+Bz|klZ^8DELwUb7 z35p+els;!8+@9LRt11aeNvDc*G;_2gxr3R(3j^C?jL)7uJFcp7QW4#&IKbES{nFyJ zt^^A;|4boPkKURH>^8@pPX+cy^=qFGK+wGIH25*Dx>>$u^p$dCAAGi&;g~GAge@lb zbVd}HsynEnZvP{8k#AJ>LPuVVGocX`v|Cui_{!*{j!0fP^d;+#2u&o+f*W$^<(I|q zT~b$9mnBxwKO8HO!#F~ghI=_}@$Q|Rot>TF%)Ac<|<>HSc@7 z@8^DhJ{eP9R7A@6ZmyP6y|8FzX0&QEDa&^Hd-dTIK}6ST7%a4sV}>x}=_gr;?XeFzRn4rU_WsSF9*VvO=_$a7iY}kiE{MW709T67gEe|*Pkiwog zM)ZeOiHB8P#MB@*M=e#Y&#h}geZBDM^WIs>hq|s`zW1K;vU{LylLB&h9U+3v~0&oA@^(m*v z$MGMUoE|le163unx$(8@iH1Vq)fo$K-o0O`f{ltV8)H0+Sh3@PPKo9?1O6(D*3!m+R*F8zdO%6C>R8c@9VnF z!_#hJ-DH*H_<}_S_~E5i*6967AE&9)^?K6K?!kc?HZ`(ESG3Q5FrnJ}BmP)W(L6Iq z`ypOV^!&LKBDwM5X1CyQwkD=yKG+_YTzLF)C^P9Tq!vAWb}3X?7c3YHcEl6|Wa>9) z`}Vh+(!_S#fp#CQLiAe8{l3G0pi+Y*DM%&{(zX+#ui;zE86vI=R|OLHLhmtxh~lES z(M0y2dWS`e5V5m2jEv2qwm6;J2!|+5w|$_3dGv3U1Ej`dU_NwiQaN`h+wqlF4G~qN3?bj@Amq;~rYsEsxE~CQevkL21S3-bPyP-M zn+>K5jSVA2Z6?^PfD(^>Fvya<7+O;f$pttF`gfAmF56lqrY)KOqL~>vOUt|;<>l&+ zAiCB+x|nsy`l?nCmuUH<<+AC}#|6}4U$W$Z{MY_e<*F5M_68D_ zl*YJ15ahy*$)VeqnlAy{SZn8iA56#>G&4hS8=WUehaXh>YHC&%IRex z|M(gn)d8Al^#JvmArrxvgsJ7VD-n?nP3O8JQ&ZtHGc!R5f-SGZsmh%C(o)q!Aq2>q z4aJ}jA)ZE{D>rl{v0~!TFA*1&D@kT(?6bNHplgCxUE;Jm!flZ}MUi1IeUB{Yrr8fG z)cQt*F&RO}lk+GSYnt3YCssJLsksoK1_~ZxR^Gc&rGAgMi;Ta2|1Jd8zLOF|`?~dO zF|P|8K2_&-;2D2Bi+IKwnv$QAk&*E^Ffb5Es#jt+TRFt0@U|zMo~LIip?7l6LMJCC zdVxE)ngmj)qPn_i9#v;|0|SG0$8-%*3cuSwgz9sS57(QE;I<%^AzGjpZ>eYMa~=p1 z2p>>wJx%Z_o+&PGzDZvdJY8n){-K$pHuuYV30}6S)&x_B`NVi-=+M*&GVOa}z1 zy10ib==_L*!wNTi#hebq%kX5vSoe!*E6z-A3;9X#dERdgf78*>kOWom9MA|Yln?b8qFLFGXf z_T2U*f#w0I=FTj67LS8w0^7s3AHgCTh#@D?EqpTc2i>bFLClzX4ED3DVZb3xP#%Ui7kCEl9GJ4=S+= zFXVzif$Uo|sO~H{jmQzd6uX$RK)>BPpZdQ+TiK{4E}uuW>MS1+9n-kBt zqz`Ah2YcQj*_V})xg3@!|5?nDiXO!-B zP&w#gMiXFM90m}ZAfPAOvB994k;QZ~K(cHuY|2}xX zLI+EsWgdvr+15ydiO>088Boz0@Vi^3T*NVR zMhHEc>hoaN0|<|*TTGlqf?O^-KL*`i{5JkOS|yT^kYEY=NAEBK0D3cnfgJ+1B>_+% z8*u>z|HwLzy7@sh#^ks-LJZUrLlTQLaj|9~1x99OdSMoRlP#wUV_4bG;G09cic?RP z^s-1dlj5Q}Hz}6K)L-zmj!B-GQs0;WS+qCT+pC29MHCcPGW6M8N#RRW&-}re9ji=_ zjZ?_h-RV#aRFmXry{YfvkA+buu-jtjZU$aJjx z-x{MFRkc3e4Luq;u3$2PcH})C4G)<5KUN;jG&|^bVw{tQ2HVU8^YPVak!Z+pqsQq?IMZ6wx^s+zX=Jz>Sj?=L{$fsR-Q&(fVs1o7 ze@O!c9HPSAjpxfV>yNyMN4UpgzMXCwOU8(vgqL&8FqwkJ&8~gJd37jY7G%KByxz35 zeH@B3`6KaoJ!BP4CiGQs(`8ImpefZ{4*fgV+^t)`fmOy|T*+ukiA)eUM5Eq_Zt2le zeEeo3ern&ijJQ2)+FStMe;R9}qtC?8JLS)3e!u&(BotJma^4sYqx5yBnq;h10_WbE zk(P)YCe5d%{J#3}M62MfWx0?(D6jdkN@~f*xA@-Q2!Y-6Fw1kNkd*^e$zH}WsCt@% znjMxuI4ooqNz7@2Q@f9b?irNAYsG^|wlkRE_vwB^6AP1(H2~%OgGXoO$JgRv|ICXq zzT+v27-KPqg+@id5NU&tY-krupR}e3I<6FfN~!l*0<(C{+qW!j|LQ=jOz`ni-c;JROpYjsuefJ@`e{R^pBqneA{I zticQsw~)zePEd4P84|mkdkK68Mr)2DaNfYXRPZtL4HrVgz~I^fvi(ga%=O_UspZbg z)s=sJb92nW_cZO67#!c&#Ux}Hb_12wbs!iLZfWzy%iqi0g5y1Y>P$pmA*0e5q}*>% zK`;6r7CLqP91<6iZh2fp`r^xeF9#pg)Ycvov_Rn0|2w20ExWQ3$+_?lM0vMlNrMGx z9nDiN*cPASq)m-9sCU`^)J5S{V(*j$pGD2JGyt8%XZJnozE0{qDWY_zyrz9E0q?PW zLD8|;)NB8@N22BSBIpXJZd?Rh1raa+d<`~->4W0?kkF>n-PN&EmTP4|eM7Z+JWboe=mKAGg(Dy1ISS`9#cN-DYMDHWpU*tOqj^ z-OsA3Ep@+}vF9|Tp4rA%3sWr@Dy9kVX_OyJcvH)Fd>7uFyyx>g1C9IMPu=xE>?Ee; z7lQJVpzzuk84Q1Cz_PkNZ5>4od9#~FvdYH$f%gH}ifRp@8TW68v!(bPS7fc`>pym( spl_^$ognkJ9h;ME)A(|cLh#W~>PxjoEefOzoTY`ll2el{lQs+dAEKDl!Td@bE=;sF_JoKAho(B~GP_dGe64&s~KkK$_vK-eW zdz2m$JXCfLd~##UkVgy$+b}IwV1>c*@bI9a5p*6IRXAEm^4swKx!3Cht+qMVnT8OD z72CRmxtbHwSaItFkNlXbs+u6u&}3T7m)w6j_%iCQJakTu`H^a7l7BrdQqZzjA)S{pFeS1;EQv`~Q#qJ4&-<{tds`fU<-)A=JRn$&Zg$qhx^xGHedoJ#CgY z!(A5}&q#oHPWaMf%hU`d!JJoqPkBq~L)6qDFQsnl&K&Q2rj%h4bPdAA2O zeiySb372}jZYFIwm;zju43-d+N2=xph>v8er1T-E2>HI;q8Z%O_+yUE)fmVEDNo56 zY07YtCHe?p%z5H}N)W$#%10Y_zyEnqG8)Xq0@(d|PqTmQGHi#lw26D#cqXTigr_L_ z1^KLuL?xk{2>>|q%+s)z;q+?Y?UUb&;}-^=4oyl1M!;U80X9H=fHsU^co)n*6hI(( z-}Ply3v+8jyhTh|G6fhA94#jG#w!UA0*z#AeBVP@;PH#1x*6zx*m$=eO(ga4jZS*k z1H6O#h=KmJ!BemPWPL&Ks-Q<=K&R;deh4bL`9=UalI^C^F&2gQ(hS~b#1I;}^-ZQI za8^RGbpoHL=k2oOC}0krTo}033%WD~7=ujEwM97afkLQT48chtZ`-EH^$dL_nL*C+ zx5(c_BLvQzF^KYvvW%~r4r&o#z|gm{zR`Q~)teLY*H=-drGVQgzzbq9`=*sJjLyju z{rT(DWmY?LYc6Va_QU3b(fq1e4$JB91Wu6y#Z*{zc>?pI=E!7FjJ!!aV_d_dW$9h5 zu7#N>DoKLuLHJSBXgw&P`&6>u$YJoSnh`1;~Sdf?5 z2rwl)ZZI2fY>7Z7-FVvT+ty>6itrT%U_A~qIYhPq?y?u?jo7zZ(d+;I^-BIuYT3vEwB zPt%_5i52QCSG^Jlt_98+zYlEllW8G5kO?t_|AXf`@M0Y1N1?>P<^c2EAYi7r9Ei$c zkq5fSmL$mNrb9SoK2TDH{??W9I33r&qK61@OXGmFjigeNrHp zdaX=3^lbXKGaTm&7!whewrqNHeXvo4rQRQqH^vC@PaU<#lPLN{8_$<40gwQx<)ant zD8)9^`GJ07tN((4YlAP#lCN>gmmjF6N>d6A2an_t~Y82 zU@m;-7V!A1+PY|WSC-x=fmq8@Wm6?vRVL5a8!2Bha*;8>%*tH&b7bV#$m8s98Oba@ zxh(aNF)_vnmPsZ8_9*_Ut(Vq)!lHC_Jg^S;>PrOd8;{&VGxccV%e1ER1S=bK?V@_# z$+4KV{HfuBtF&%JRZ?MJ1Ievt3x*?5@QVz}p?fnTiOLeN#d-)`w9Dg4YZ*QN(v7|l z7z7Ss-UQ#$Z5$N|`)5N~5JM5dNwuLrsXQaGww^RFq)6ecUbioj)7;!VyP#lXe=>_x zR5VGeGUDjSR#8c*cm3c8>{^h4Ov&c^0=+>U4lRo>X1lBBz=R3#e;_?P!jwrKQCIeFg+V zi(?7g?oqZ!gJ6m2Ov0I;oPL|lA8B{Dj?$am+oM4z??Bt##inS;R20*&d%#1cK#ZzK zMkL@evQ4A8dSvcZuEQ&+)URs${P}bC*RR9N%h?I!aiCXm@&w<(kw4PFY6SvwR?~t* zo7Ob~RCw8iUuQ{%`mJlyy_*l5tikfxeb06eKf-?>B&EyGFwTK6`jmz3S0`x?rSbj6*;7~yXC0q;4$xP6vRw- zGc!=L-ZZ_pTxtg^ z38_=1YiOBSIeN%?m-X%aqB*|%0MJOMzb6v&_TIfPB$tt;RI6R$h-?055C6yd7 z)=*_exxjNb4s^Cd?Y=BznXGGRiOez%MDj5bW8CLdqYA|VsWak8hb(+k*}i_+XZ~IH z<-%y)>k+MD(T?)FTMjSS0FsU@26&+;z)0kbM!Ik1kFXU@j~al@p8cb zd=Za}3Q))I*z-9zrHjlaIUp1!2?mSD2$t`6=M@%y`nDjhhO>eEe4HCr_4uXK`)OAq z`cSi^AYDR4bj&Y_zwOZyngo{y90U~|mn;BbwBm>BJk z)TUudR9Mx@B_SfrULz!*eBM?+oH-}>w&f8#^E15;;K6+eo=v8O>flt5GRif3Y+B^ebQEf3! zxuqaqBkt>ql9OYk3J#Tv9bP7vY??-(7&tOIDy)d}ZaUkSL9NAu&aN?}pCF7ls9II= z5&+%PIeb6uT8f%wTGxh|YrD+MRkhD)F$ECG?3;^cc`)B%)W-+@JgmQ7(P(BR3VGjV zRRU4f)__)WFT*eZ?tVzf!Dk^SW?@#{qLNTTUtyHatElZeLS>a7vVcX_X zPOCE%`wQ8QiBQC7P#|-X1gG8 z)GZy9#c6>-!CSh&cgr@Usk_cmz~=$YdT4s~&|=B}xxAia4~tI5xZZLl0c~M_Ahsg` zgGKXy=%I}Wy(c^b{;?JfJWX3F$tMgZa%KNOGt+!S;QcDq1<+m5lIWuJrZeKci$^-Q=*Jy&X?lOs_ zX5ujcNT~2IdEphXOlo-SIP<0j;xOV2Sb{%#E~ZY3?<*ObL0hyCJBeb%7`A{_uOy`zVnPhtiw{X!J~5meq@g;`D)E zzi`sky|0GxUk^tw4%ImT!E@lgJh{1ECCjsg$SG#P+dg7PF~A?t*9s!|BAORxB#N;W z|NPuBi5P3UNo1YNi5+F%pKp78;=t&W25FMV-SnWWGUGZJuutBhTbws%3)ob?MMqjv_G-BcgvPOLoST?}8&@##nz}RKOs6nySU{ndA)? z1`rW)Oacik`_&tGF%%Wfn7rVwTAP0S=90XhQ z5QR4Xr-no4nwsj8r89T4bJodUd%tjbp8$y;|Bgl=zxdsg2dfS+=Y8pX@vB)#tESct z3a_Jtr&oA+7UNZB@r=>a8te~4Fpck@nnDG5OK(4nI8+K$nZj*Ef9gwK_$R#gfG-^a z{g?S4zx*CBOKiv0-VMhI3^Ehav==tc9Hy4meXGQ#Cwsl6YxN~+A%wOdFNJFr!$K^L zC-n8eyGuO_n>e4h0XQ4;x}f(!3*AVg+9(=1rYpme4z0tZ!fUoMnP+d(xlqXX>7m-!b$l9>UW|5ft|a%bZG5o6@yY|JwLS1X`i9Y zL^72oG{6*f@DH zRP~*=TB-uWJf=elseA{D8lmfZ+uQ`yJbQu}fORE0mETZ3CPDcdj3j(zWu>aTPaJ!= zSf(Y%ND=REiN>F|7(9~V(rQIom6UR+@>EAlKWN5M%vR6%*bF-?m?h=CnaQGvTnV-0 zA|&uLlBEz`*%5nvpzI)MA%*(W4%S*Xpa*V|#`>cmBC-1h`j#eO38Lm~GrZ@m$QS{A z|0wuuCZ3+SQ0$ig*k+nK&5}S79W<<9&%(x5w033+rK@HI6f`jdCduZ>7&Xz`W;(Q5 zKjar90L3imWBjRU=oIoqRPnqs-Wl#b^BIf*5(wKxEI-l(v9lgsm%asC)-!{s(m~av>I!;*CE&RvM*PCpiRpBV@WmjCv7(alppry%Qr{UGdr_N$B{t zaJ8>ugbyYgB51jRJxF+CAJV5ChXLqtZUVQy{n;#?Fsyq#@U)*J*5gdzo15b}mvOi1 z?&><_zq$RsAmDvTflm4XmTF*P0y#4iuUPOLyAE7k*K7lPWJ<;*Ci%@3cj)F%Uvb>> zVh;v0wFx3VZj|1sqK~y3?bxZQ$`*al4G;Q+jFie}YW5>vePXAE0fz5bK6`Ptelu;c z;qnzyO;zuPBONoDb?CU6&b-oa(&CbOCbFL*M56D$K8~c9FYx4Ttj9y8`F%9@jLTnk zfn&h`Zw<6;WEJ?`KdotftXyyQ<>i7yVI~E-7#`nBGSlg|_M2?g3y$o}^E6AvNIiKg z$gkai+)!ygdtUIpVS{TFYnqkNM@B||+VFwKL&KwD;wh6WCx#a3YrZIGNx){066`Vy zR*5;_=C~tCVF1GsZqW#xGlVYBxZY^wg0XN>X0;0AubLfa5*0p24k>cPNJeZtN6*#w zq-H{NP39)+yfC7U>~xp?C}GDE#?&%o9;!8a^&79F3mdzcH~fmZ^r7j5sTW<*=IcSoI~@N%<-yNRU3A zH?tK`7$zkkY%0KHgd33@@PJ?;SY>j@OVdKC-^*J4<9$+Hkr^bBGBFXC1Y@LV#~M(> z`uno*0t}b{B|j7_>4dp|l*LwfpI|i-?7~*5MKjA3Y@MzOEfax&*;&c58e1^XT~;yF z@lK<3n*Z6nd^TV3X4|RO51_p%Kb<;=Uem?~)o{3OO`1Yt*C{$PvQst3%f|-FC6SMIXG2)m>A8iq;Xgx~-FcLtMBcur>nRaTyM> z@T5%%KXpi{;fd5(F2^9@x=N2Q{%bg+CssX^O&=kZ=T0k@TRVxg1J;)M*wDccJ`A{e<~79D>N1Txr-ozXGL>(c zqiw=CKte|ckt)R#ulr4ZkK-`>`0gr$8j}2{Q&krEh@8i2hP#+XO-|LM$jr6-*{YIZ zOAQ!Ugi0tY>)~gpzaLxE&VYRTPdME&My5Nly}jFprv@eBh9=m3X*WzJmJ@=E&6i38 zgjM}J&AN3Z8vJyd>6U{rF9<>EV_p+8)RSFJ6I@n+Q*pi^nFVc$YDkbbu%GJ{e-la zPHUWbr!baJ)iLs_x!@KKRWeZ*PU|$uaT+;QJWVTgHJnTekQHHu4iw-DFaY61U7Q*r zxn=4Vi(EDVv`bq|duu>{{NN;m69hCz&SpkQ2~1ji2i;@d$!Vs~XEZ`o`1Yu5 z@4@4{f4HZ&;v!UU(1@aN$c%0E&x;2&95^klte+=$fN!@< z-+!;{7NeqWtp#-|#U8IatYjBW1^EkEgI@Nk9m;H^!fBKODpKe);r*w6?wzg??CL%O zOePSKT;kaeFzZrlnwR`FS*^;EC{=40O9ji3pxw&V2>-^m`H_7(xeP&v-y)Y#-+2*! zrOEjbeH=At(VGMPm*W#AS%+!N9}?}PWm@rNWQFxq3PV9IcI2w6s-m9`|H$qGd&$>v zi_JU%6zuZ1zQWIQG&xFj29r`odkk^&yA9yqs}{QOl#T{%JrDYb+iB4R@333rQ)Jg6 zmu#7=&bej3KaK$oA3*@huBF#PLIW};E(rSxayWq}2SL&11@#wd|EdzK@QTEN?@K2Y zOUEMXSP~|7cE||#?>)u#sz zF`h@-BnI&R+V>4Sh7YQ@#n*P#SvF&^6^s7$8;<#Aslg-!rVuAfjcK$4Qm`ZAR90q` zF{RUn;U+dN2X1`IwA?sr$S^cC40G`iuBqVQ%Nv8GJ>`|9?1otA8tWp5Tkh&!Wvq7J zyh_0;t?m|a9jlpbpX^6vRvK&^(;HK;?Op+oo%vdaGe*&rcL>FJDJk`NOdGo zUsWz^`U7|8OS-$e%Mb^G@*!^S#^29>-5QK4-{Z%pF>nS*WTk(%KNLKZamk1lmJyN) zUT?9ZmO4{6YYh<}{zRTO6T^-w8Ul8BB zQ9LrVSj?8iTAKNTJ})fDrr|)jNrErTs*Q?kettf3F*t={P8{gUA+OpCl1Tok2WWeX z{hkhL7a=n0;@uzFd=YrIj7%IBwjA~x;tvT*;*W9up@9Vzu|k*0h?`HpXek@PDCCx_ zs+ZiNUd(k_EfE>iIu}yxrhr=N{utrILe(az609=Yo#L{5w?0*AMsvNqS49ckggd|VFy{*hxb$gpnwDI=4{n#rfrqUVmB|mK*%QypF2>ID2 zvHb3*fD&8l?e2dc{3;et1nS-aR@PQ(mC}}Gm>&qdFLsd$%-h~LkQxG6dQ{fNWt;dj zD*o<})*RUV;T+5zqXnyr*=*ZSbt}(m^X^nFe;$-aV_o;)v1P`GN&-J^ik41F7)m&! zr~rq70rJHw4ia*Cln>7Vd(uV`j(u#uf5TVX?@@^`S@wJRLHqIe=8>0V7V-~LxU60` zr}MkS5Ul-Jlnys+bDZEYfW^c2rHkSP+pr3|C#1b2uPd^l82r9JzU(j$jqquJRUvtq9)BRGU$;FQ}D@MI@h8QdBfCGaGQHKhtvz#IiK-*zh-BPu~t&fx?>z=Kq4w=R@xd^Pyit4k!j97+r;<# zN>5?#*F+-XxP&Fa57=0C$!7}>#{yZZ^${GIcD8wRe2q`eh@vQDbcsaeiJ&i3$Z)`9 z!V5=jVtb*xIfTd^TWh*?FYiVtwiT60BFWm1TgG zOBsk(Eu{kY(#qWM^>r-sW~4~{@;?mf!G(?ZtF4CK_Q)S94RQ23oRFp=jCt6c@W)BL zkJ?@yi==YJv$>+1FgpWGZ#wo<%wpfxLcpNrsz@FM=F{Bl`VG70Wc>DC%KTS%w0vti z*Em>hADwQ13C9=={^w;5Nk9Ses3~lam0~Big}?MC#BJbZ+t<+E(Z42|JI%gdF3eZO zjMSiJLuxtWJWaDCZGMVLq_#oU#hou-B%g*_ZbMVI;*WBYkFiYlDNa<4obdli(FFx9 zu}6rrBg;n5dfkbWS?p`w9#K1qKk^4hvk{g4`7h)!w_|2csT3pZ$a#O+75%&{hwrs) zo1xmjc~r@hc-!}G4YxIp-_vq7fMQkr%{I1uMbO4v_h7w}htqVIt@KP*3chkTQ93ba zWOQUbSPO=Ba7@C8T9wxL^5QvuO^1znP(s8s<{TTFThE*|x~3x8K%ybDji3QGX^xPb z_*1TB@be5!gSxsrB5Rd4b)Es9Wr$NNvHAJ-vtYcNsmv*50w0Abb_dh}INj_ehdKj5 z-Z-rUK3@?lGn`Zluz^`O2Ya+i!~s5JH#Jf;h7w7C*Fpws(DeD0f1 zsiOle%acwPF_UKnepKF2W?p+jylBH^9~;3?3Gsbs&}==BTfp`hZNR2~`G-q9q3BmdEO?3T zTz(d#I2^vnP*fUZx>%hmPL1Nn&QzK!gDINktl4o)6KiHm-N<1GoN=Kw90%0y;Y8>= z&S8Zo&_Qt;+bON`mS~fN1Mk?(Brd_+bQzIjNwIe1pF(VpS&2GrDvETfnjkG*YJo-n zUPYjch&T;f6^;DjTTX)9AIaf|{)N+cvC2h>%yNcOyX;G?d^D5`-PrHn8E<_J0VNW9 zJx;NV5lt}>`W~s_DeMl60%DmG5;R!z!-WtwW^<(WBV2-T#@U>-B@N6TB zw*=UA|4- zb6SAbhKGGe2>KZDTg`|5Byv!M5Q@?7d}fI=N8a?nJBZm^YKh97L#XxBoPmou7S+nl6A6 z2~7Ppz-6iS&vn7y{P?cJd^}u_WfMRNQ#!&2i69ss@d3&Gpumj89pX=NCSd+9=I>Dy zfI)9X(nvSaP~28Faq6pF;BP?OtW_bU$-)yvZ#^oKkI5I$!J(}~mT393ogugLXU!L{ zJ*vuk8T7-IlG(w)mTFomB^g%Uw*TFz_e+F?+nB2JFUpKiN|bD30s=!26%Sy<@=&1s zP#tTpph*7$^^ z1b^y@<0|RJDulUlhUzWivqnfJy&L1v)4X5N@YuBQ7N=H6>u`?W$mCs-5IQ*ul(p;6 zL3pcfhS^*_PWbfYw#R;+%elkn_=qN5uR=(v6@2-$6Z!!c5mE#<)5XXa=Dka`!B0S9 z2*=lzww&9pC^nu3(jS=in+X*;IrXTI(1u5*6f=VP{sSI9KGaG6Z$OdB>L@`?(Hxb{ zs4G~!Hwk(`;#HPWvsks%@Ya2_W44#4ho^9RuA23#?Q8|Mbunf>N@J^2V5X$1g_lwd z1-Ld3i3-6QtMgjq6Qkc5X>rZC?CSpQ{{Sl$tVmHeq(~aH&WM!F-{6I@o-_gj~aQEHP8b2Ee{ znU*~?qcjGg5rqF<>%^x*lZc?p)O@wb z(!+Q)MsO~i^v5M$K|MVl@lbA=R>8D3=j7Qy1P;n3!a9@EBod$2@u}G3>Z~bFd?Tc6 zC*--XTueh`s0VfIS>kPl|cK2x;LVVqexzZ){*Fn_9hW)hS5mw$Rqd ztA#d8n$YU{vv54A$fS}{J=MP-xXgAIIX;7egZs;KoknBwI}%b1id(Rkv*F-5OQa*0 zKlAA!UWWsqLPeQPVxh?DEsn;*2c13%gGd(jKFd$lyim71p9?-ZTKrn8689kY2S+zS z@I^b7`O0-D%iidE7)J{yM}GFj(M4~nIAf{VK%LuStS$eqt*IRDu^Z6B!a_DdVKhrJ zJjPBdX*$SK_bU&}`ZR@jploQAoXPt^3_++AV1uv>53u9F?>k@~H^rtL3xGx7s!kvs zU+%eeOhUSK7baYgLNbMooo|?F=Zv>bkpHGr zRRuAJxaTV&Dv}#t@6=Sz z&Hlq9&20@QjcK!>B2s-dEuBQ|r|+5Pemhw7eR4WB_y=vABd8ha!N}GRb=OFJZZeeB zB}i(z#GRXukuK`PjnVPwl!>F1a6;pP==f!g_aw7nCak0@KO=h%Wpv)eQ}EwDzLH%P zP%wQb3gZe5Z>nFe#t1U7)pe;NZ02y+#jn7E>|VfZbuTm2y!@DX(q)$lj~IsQ^1r6t z3lq<#En^WH0J;f1ZhpC!i*(p(RMndBmf~fu>V34ir7%x-AO&hvX`K2Bd&!5`n0_}h zWfmyboAuh6{tdZxy|_KQOa^2*Z;aG85ZQ z%r#qmu4s6yGUzAn9rNbBD~GPgwJWv&&LXArHem*9f#pWEhs8MNsPim$x*oKOE+=8} z9QsrWiLN!O_GfZqpkjh;eN_PsGh#`+2oo&%s%$-b25VFSn(ZN4nUB9EmFoxUOElqS z35Yj|%>AhihMS4KE9`aJYhsZAwFN%7t($K$JVc(_YA6XWJx8c&j$g&UWYwkDT#2N_ zT>P22A(@<<^xlRXnl|l&&eu9Ire&~W`zkaidLPaq_PVON5?A&g)5L&)E+a ze^SG{C$IzR98$knh-?^B1+SN->s6mWPH?*4RP&?Nc&f0%1KT3B=aPLu`i~(yL)y{PIG#_XX$4hx!1nW_`kSeahzvNIQpO- zdH8+?t_n!U$S4vF($yL)+8l-Yc2?F8I?<3lG`t?uNoK4S!W@cFS5cG|0S7v%emj@u zkqrwZRUSFEaqoFFx5W)A4zGFzPLI*8E_S^ zs!i?6&G-_`KJ38$lMkS8=NhXlHM<~pU}&g}ysOVX#^+nXd&f*CSdE~~QZXA&9{x43 zHZ^+r0Y)AP`j}2oBz)m^0luKvxvb2O0{*=?;Lq;VWHOed?$1Uz;F4PxgQ{iMg{?X_ z!_>m*y`5ncfiG_)9o;hraitu#60+Ov8GLOsQB0P$)vnjS#!VQ(bd|2dG-@#_Rc2Fc zUI`=!Baiv9kq)l*96@-sn{6!!WD1RoN*sE-(D=!Sd6K9Vt7!Jp4`zE)?K6b;PL3h{ z2X7S8Sd;N(%}BgKx9a+O4o4dGKtCjnZ7#&_QwAL7~Q{|J4;Xm#WfMq%cb>g-MhT|lIRC-1GB5n@56^sho zN1eLI&Qhk}f_l9;GC!|+`;t0WeH~CxmC#CW*Q#u%aeT&PuHTbB|3v4ek`}~4y`JGkrW&wuDMMPu1Q>Ysp>vqiCxseNr9r^v7FtSdING~}R z1*w7BE^oCcj5{;oKTJ`NOK`^@w#>||mY^GG?D9XG(5RML2`*Mba?H+HUN;l0_ef0f z{a-i+b8SHYu3YZcR*0mwiFH*`OE`Xk$w#~ow|Im)>M)FJJw&@XT7&>oiR9XJVHsyj zOUtrmyK2{iMQ%Vav|H}gc9l89X4O8ov^R?KB!@WpoN2kKK^i+uLh zB{`2uYB3v60YDD6nYinvSn|F_h5`xLRJSU&)d4|5DgyQP9vJO|!Dj)af$)cOvAUIu z9DC(0waA_ytQy;MLgjd+s-n3?)aYF|U8g1(Vgpm4Y`+cKhv)_ql?DIyqB`FhSe%A8Hq@7{T|!wYMvVfxRHc{6E%Rh} zM{JeF{1HI7nkt}At|fJ6$+jefT9-9;)quG(uYg7ZMO+w*77YC>RT)jn-|35GGfXk0 z1o=t3m)VBH_J^gmu?>i(v55JLLbCx{=i~HX zCspxtL7?jt`60pv)nuQ>p=dm+gNMU|7FW~C4J#a*QC?nNSUTvCJ)fL$jR+N9M^CTG z9gkSaMqR`Rv^6WjlJFH&rP07vL2d+fq@nqUuTO9&Sv%vS8}YMg$xTE@>?LDI=eLYZO-241G92SL$?-)N zSy4sB&zCsfo+A8=kZBSN>YD1CUep+_;DUOdg9qU^VBBIfTWUCe(kmhsgfG=XlVnST zzU(r`Puuk2VdpC=!UV*`qsOaEGX)>x++^X7y*mHi`4W)N*7v#sY*RbB<97%o@3-dc z>m;P$&zgDTTSvZD*1Hy+siHdKrRv_K=uh0dAcMlHU&37(y}H8}oB1-eGhd5pD>H^6 zv}L-HFe^Y6CsR4@k7B>AI*J{}GjRR7fj(eFSR(QdlnpO*RB)Y98SQBzS1~n(l+!;> zyyUg*L?g?&Zm9<16FA4_x82jW%@tJvbN+16BQ&%+Q)t1Fkq;&;eW;+IG6izv65W|yJ*c~{{hqoT;?xMvng~*E*oRSQ@ z^w}+Sw_YM{pbX|=a~5{n`*)e^IcXh+U|~L9tH!8HQo2{0Znc&>GI_uHJlV^>t1K*4 z)Hh0*D`tg~Q=InYJWd>h5DspUYl+hJNocsEVenHssQ-#cr6xN!cYxx;+|kjIW=R<_ zO2ZW&{rrm=GCOa$ODAvZ9nAhvN9#Bd&f6npm6T49e#} zfX6V@Wnp}2(@L53Myc&7C4wb8mVx?s)V3t7)C7*U#TlkU;Ae-OrvvCZk_fpV+V9>I zBsDi{e$;dz)-}`>uUwI6w7vT2J+!$vl3AZ_8Ddm>LchzEP2MnU_Z_Q3*(ptZwb%e% zYa5&TMU@Rs~?&S$X%K}M_jSbl@GMy+wjC06>O99NwG~b5+!Bx7);UJfua^uuknXTp@39OB^6lZ@5uw3yQUV8E7EGK1q+ z5fvsC2*?Zj9v{6SFXQzXCZ@PO;v~kan;6(jOp7TM;Y(+pKhF)G^~~E{u0T*blQoH3 zp6X?A02T?d&H+Pg?slQkZGf(%&*{^PZCe`9EE$>jYr~?LXDC?w2vO0JOz%V*YoIl<4TXx<(_{*Vmr9 z%nF^|2k^H`FO2S248tg0JpaJ zjK8{NeD}^~?ae`9yi((V8ccZDh!*hZBfEJHjr`Xa3o_ zBi*8T+mZhZu5V_}|6k6xONjA5%N_`S;IhZB#qVX;28xtYmR=alvTf+w&p|ccz?jOt zzVKfvU=yrLxx}-@0}J}_^wqThfrV_2xTD-JX>*b|4<|!?UEoa58PO!hI4O9dsfMUs zvjdT}!wnkr0JEM@#;DEG;zqZ(P#U=x5+XK7O)(8*x`L1Ibo6x4Ai_@p)VfBDstK%=Y`nNh;>^SmhlPO5{OeSzi8=o%#Dqv=cowso1b-+ry%UpLlOB z{!`T2**&F$$)dHjRSFH`!KZNR=q+?TCgvK>ntd)-r*2%TrI*_9YtvK?m;^voGn4pe^4!2LWo6k-F_miOdpEf4GzVKoG!NbE5rtCmK z`|bl*ZMFl_0#5|r_81m$EeHo2Kltyu0wELWK3Hh*w+;&SF1Eny@e%Wk-MX@X!4C0M zBZDA3{O=6+7y}^!-#*;aU%YJZ4U4S{(PyuF$9cwuh=k24^IAFZFc!K8y3ayMoAkW{ znG#EB(lQy_jn`wbmqmU^#D7yMlgr&HuCS9tpO&2yE?;K{n7#qGU)cKFvK;d8XL}s@AL`~ppi%w18$q8(mQ9MFG$id`RSJgxfG{ACJneF$HTuns zzWzndkuHgV3&2u$=d`_1vKAiz)t8}(za#rMFRW7ig~<^+t({^sOEf#Zry-heZjGkuh7C^v9v4m9joKEc5Ht@u4EnmLzg|Xk-nO zFX=an3i#fRMHKgX`q_dWQxl9TmWX8+hOCpW2+~Z4$@cchIEJDEBk2NnVx#J$Vx?ph zNq3G0??18|2=xxP_6tk#`ByBRKyOoVD1Q|Zy!8cklCe?i4L2y+NGvaGM@J*lc&C?o z=z7}92ccuCSl)c1p~_tt!ll(|Q4N|KTwNuC9`k_V4L8*9%_B$L)?$F%1ib(9{`A4# z=&(s?#l)_5a0~b1U=Y6e;|&x9&q|HG_mDh3A=yWz3Ip79;HqWSaIz*Ey5u zD{)DNg&b~cXiiD3HmIHS1EqvL-00QG_V+Uj*ws8u`On9jZ1OjoU*PF`-hYmg`JBQt z&;m}SaolC*mpWd?8>V_y?EfK29&qbs-l3BR4$3;2ar`wmbtP+$YxUls)<>r>Xl%z1>ICHEpGtpT$}f}OUQHbq zN)#LhzVFz6;iPsXAoTsx^t+cDmdxidB`V1BuS&1)la&LBF*2ppVa{yOTTJIg=MCX} zLQ=@(Lxb+7X+gQbu8L+2#kY+vUwmd*i#BkM!6kN&tJ?T;&m( zyf!+g_$vbI^|pg|ueBv7=dX%A`>f9W%gY4NjPgvrU>NVG7Dj~x6#SW8CFg%wYc<7^ z4|^5R&JFMNC5k-g_==f{k6)|@t*_PTS}!4b1Gx1iiCkC>AmI7_YJ79@W3!VX;sp?l z09Y59%JS&AClI7yFgHLr#44!0i*>=?tzYKzDsjXv%4o(7q5#3xIbVnvba)_1m{dHr zF~kKL;q)ReZeJ>AQhyTZ=FwDqeIBnL z#{hX-q_Z~&FZ_(gB~3(7v}i8nQkpNyrN+`c9k zy&k*TrB}|cNFU0~I_T8PvK}YsCyfuawRPHJTAG}k*9v~&T;!_TMI)SIXLBIrR#8&Y zoVm%#&mUUbxaWKK?Of=en20^2FPR&nvt+nKr>-53&c@t#2IjBsHRC#{iat)c7jkB0 zu`SiP8gzWmjs~N)g^#ug3NtZD$~(0OJ5O*~5Wm84XwV-*8NowQ6Ao5_3{2~0;4?%0 z6#=H9ngbx1n_lHa3c}6=$!vooN<11QY!_BnebPz&=EE@P8PHM{sdiX7{~2)%EBUCQn+? zl_?(1a1|sT%1WM5U&Si$%$l~culQ`KUtRvi5qiy0H!=(Xedls}5WbJ&$R~7K7%3g= z5RxiArThR+h;o+DmlKi^IzV;!)C9ee=>7I|SYKBMjU??NlNgHTO=NyyMVvk57LDQ3*(}xGSmaq;p*>L0?0v^oB-#Q^T}%=1lXq=&H(-X4k{41EeD`! zHr+KA6)Jw+C01&hk&{G8<8H%0-M z{~DKNH2YrwHV(=0$jB#cWJhcd)9Kl6xAEL_&tcD=JrF`*b#=8emuPjxw$;?@b?;4h z9mC2_Q_K$lxM!2s`mh9$?PA@hVXf-_0N{H7eDx;pBO&mr0G5epK!&EJl!pOiQcB?y z6@(*8JeABfX4SG9E?hjnEoa7_K-|Y#TXwP}yI5+S*RnJ>B%Xy7e_3nPJ9(aK0N=UM zIsyDCfZqi0*PDIEi4!MYde=MO{l@_AVn&o_;3Fh=@uavkO?|v+8@zu4>b z{>>9lKJo7Wly|@L9fw3#|FDqqO9+rcig%L*@Cm#760DSj%e^=v!AN;=lhd=yb0#FAq4&dExFP32y^50==PXPeX zn*IdBe4CQ$9$za*bdZ;+Q0I1zwq<_ z>RlwAXwazt54iQGCR8mfWZ91<*VvawefSU(k01|(Fk(a)oRG|0%;l!v4t59uVvXuidlnI zoT*J-?_x;Hv5Bm?KhKZ)i%&m&L}QcK_QZ)3e+J+zEdIKgEV%E!p<;CB#k4l|2_ifI zfw#n+pxjeVAm22`FcFt96OnjQNRo~|Fs)XrVgJ4ZXfzs*UZ-JKB7Ii1e9oxKK191IXJ~xr4pZ-EIJ~94L0sMj#@^W19(Pdzi^SDKbP*jLo zVxYCgcJKo0TF8sR6 zr#|_~LJ9F-i0J7UN#M#0AJ@mq<7sfNI>f|}R;z_O?zjVY-0`NN2KDaSyAONz>_L`g z7AuWL)$sA$qsUHj<=eTt8f@0O6XkIL@7m&ZjgdNDu2BeGA;ePx;%)$~n9RW$GPB&7 zUu%r<2ZAy8wC<)6r%8%-XAR5CD;Nyy;N6(Uc3}Sj?Ax~wjYc!{NktfNrS)P+*(r)C z0K6Z-mu~T%0bT=lc$Kmpwt4_I%f7nt$Ri3R)Rt2Im6GyJfbfJER+@Msu>ITqJWI2n zz|Q?9NrJJlG1TjIOpZ^YG#dF}VEd*(P*P%QYT9F#TxVyu?T`B=8YwK;35uD)!XqER z=8AU`7V5dSk-axgzHFP<4+8i`*lW1q^2qT=`}aR^*WZ{jJ1ix>MF=5ct|<^5oe~{^ z!jtXnC{U`@x0576v(bPdLY@zhq?tv4D4gEGR6w9Qb&h8xjbbr(LX63=<j+o ztDrkgrm^+f0c$Ns!C$Xgjy(8CvDhvCUt`Rt_+W(fCv#|{eIgY1baCTh+^=pkcgs`F zvYH!J7{&p`)A0cKST)PC$_VUXWhW@+B5XzH9b3HTD*)_=t^VvZc{l9(wv*Q!QF!ii z$F%@`k5cNBX_l>ePNtA{VjIH9MecPnj<6EPke)oPOOJhWKRN$AFLFOO)BaxI8Zfwj zE5b$pBP{T}nHX5BGi54s`0Qh-W+S^W(KN;dZ zuL;1usjOyajZS`72=UWW$N`z^>`MmN{cr@|4}>sjL)pG`O9TmhQc_4iMu(a6Oi+#$ zKjys-BRfGc?}T-STgfkD`#A1qiGeLAZY4F?IP<2+V=sNS$P28LW%*G8{SI5fcv5l9 zm0VB%V^^Oz7QPU0N8SiOo8O11Es>a>x2?F zNK5!$d!_6#IXr-kvCm=UW?Rf@Y|coJCHuqD--E%b@cesXQlS^Fs| z#E%JxV~F~Gc%TJ~uMElRkTF7-+eAb@vzKm$sP8Bx?#>LuyoQyXpqO8Q?YYgbRU_Qh z$acfS0BccqOx5biXP;e@3H^T{{D=TP!K10uB(>vm+&oV117hZphlE7cEmua)fGSOA zcA{KpcpFx3wqm{v%QxK4&0U{i>^DY+fq@#>V5-Q?l%q!;UOIB@p<`)1`A#L19~VL_ z`qp08bjRb$OI=n5C1hD<@yT@=Ipd)wB8-82VE38&kaDvXvxV&` zV+CyTuocdEGi8`CBf)D_C%+m|ik>aY^0&06ABDhY0I{a6*dBY8*nzbU8j2yHxCNS( z(NKV)gs^7@Nm)Hwdpo(=iYZ{R$*mrxNm%Oj)@QQZJlXz~Ez3wBZ7AkzD94UIJQy?w zpL^_um5)$KKV)Ej0z&*DZ2O6i9Z9&E>ke4AQ$^euZG<7V0>TrM0YFOSCUXqGrkf2H zwPBNoZ-E8cHkuX1b|P#*2*`N96Oh}4gmiN z+gEiCV|%Q2N6F()96$ZYqsRY1gMP#q^G}l`dBzVIGu26M3>o>?5fApYQ<{0O>#(vD z6!SR%KL~8vGg`u0)}1ORvAsKg%^2+0TaF()`a*%}pOq^4yGfG#-$KY|0J;PO&L+p9 zJaw6;nN)}yG+Hy-PEbt1vWET?_U6Trh=GmIb|QHLuxP=T!X9+6l}z9!SAMQV9y|V* z`oRZ3{WJvqn4$7}3H0ki$oVu){RtWV@B$%F7NsX6$3%`~gqff>JI0LVBy6kgK~w?v zovM_8Rkj-JyrivIM*FdGOY$ux4?XnIGJxef?|e^PsiaLL-($$U!5Ez?mAu>4)ODJs z%0orQvX$cbNW;iZQp~T0Z9#~wxP&eF?G($tUe*B2z_Qb~l6h=T^tfdtO_N8v{k6vu zF)?Qd?<9~k#{6RdUq(bvk)cBba}bbI!Vx`hMG^#JiAbI^hVCR1(4-Fn_!fOwH!DPVP$=<=khrDTMJxxg zu^Vq<=eFzuw!`xbfQ=5`S_W_wz>i=!2GZ+Nj8U&Dl`JS%EgDvKiei2M8?U8~ofB?s zBsnb9wI0V@gB>0Cy|6PaUzcut7E6_;M$cA9%drMwKZ6OLyCqtB{+mm5U>Q*x9hlXFEfDO=Rmja&Ou(Lmwo#Js46N1M$>m63b7p!6z*oMO3wb@s%~s4q z0KN|!p9uEe*LW>gBQ@A^<3^2Ub=bsc$MlomN^-Lma|)YxNq+fjxQ?rp0W2$OW|P+n z?A*5F9W6IoF>k}>Sl`fxmEL68%(Bk{_*!gn{^PD}E;my#4+HoqY_6EM3L9rDIP1$` z54+lx5#?qo=3Ur){NQEW%z2Wd$#%)vc1OhQ$_8>X74u86`At2CTgL@{YMa*|cr6yO zD_1W9RSMf}u&uir)yRJXn;+e`6NS4wH~RCzo42f6S6&N?nIg;{dJ}9bYYIyhJG9B~ z?8VL=J-A-}VvE;q70bV)1R302zThr{GZ18Om&^Zf-|p?T z`gFhasPu^1Fe<>aWPu_%!++UkSyHMFir z>#8*Zp`TY!x8Xjy^n%XeoVL#AE2dYw?V--W{`d~&*m)~Mw7d;5O8@WIeCCB!(NHB6 zGpuYlzrI~P(Ja*d^8SKAMVMt6cvCtTf1elhP-|HK%qe?G)%-K;HkbxtA2t`<3rJsH z$UT+G8|)wWY*;Ydi-IYeYGDS~=8!-Pu#Y%|DKsxM363cwIHM3hhX@KFQI@8H*# zAP#F7MX-MV4dI^m_oo()Tudd{A0clD1$%n`lWT1Fc_WrNZ7Y#L=gWWaO#m``JU#7c zCI_O8P-X>xcn2$EW$e>zgpibwV%e{es>0M^&oZ-`>I1Q z*7}m*$YEM2qP#hM&>rl!*+T0nISdgW;xxpDm+@rErO(@+&&Z~kmKJ+YyIuV?8C9JWw;*@4LF#>%&Z7!C$%vALlabuU;xbw_tvW*ZC6r5O7o@Ka5mE3R{;w zEYQ90jqZJ*-CeR((Or;txcmKd`@lDiXHj=X{7UIGkO1|?Ijl>NYrNT1fc2kydtb-(Kg^8sw|ii_di3>Ad_c*-C4$q4tYo zUvzT(6r2g-VTcMNot~Ouj8R3A1HN!Hib65-ss8UkyzW3+`=CZ}0iSZO0R}DbGQ7@EtpNi>m zDs6$U{?N9)#Obrm&ifRt=p1R${d-9ML~6t>Z*nfZTS1Z(`{=*E0RX{D5#)h2y_gtEJ&_an-fA1?e~Iv;6BQuVzeF$B_JH$uf<0+*raT1r)%>=>6K#Uka4H}?)8VO+YK<>_Zv9%JO&5v zPO2Dp{OP)YCE_`0%l>hc_8dBIG^+KJW6M3imkquUF^D|IehL8`LNNcy?Uz_Qfl>b| zzG*;60()C^wab)Qyd0U*x5*0iR1guMvO0Eci63f{0lW_jnqYc&+BO({qetbwFd9<| zKEg?CBD(JLrcjvms|?wKd*ivlvJN5)WHUE4z=VaMxO_SBZ)}RRxuG)3OF^CbG_WiX zeNUE9&Mv*bdvyPtJ)oK$R?O_Ow3EMnwc$Sfx*+du$yd^Thiw*O_%I*oO_4r%F#7mx zLP32_?sCYG!!R_nHEI(Ug1sY6J<{>%3+f$ZjAW?AFT6IKHvB47lTajNV~NyQJ!&VR z_=}RX9cL4`9ysAX0+XSJjfQ(sUxBU{G^|ck1o)Re4Lq8WY@6TGT3YoUv_7E(0%at2-lGZ40^EM#KJ$lh=m*0^F@w|g+_c4 zh`lhrv=$X!lC()9Gk4L6*mDx!J+8pmBPIk8=BvvK=f=dqdUP7$;p11??I4_VSh=~S z0u5T!Gim(qPWuH$nSQ9`h-ZI#!*k3-tE!cskVLb{I2Ve zG#44N4&FouTnZgR0}xM6R)5K$oFB=Nd6PJZj~x^SW8pdg@B!^$({U(+up_v_mW7N8Y)AwrD&&R$-GJK5I$Hcg8Nt;Ku}_na~V z4iiYqiq_4R2W;K)^_*cx@;MJ59Uzjg++Wm?vTau+{|7zPN@AnrnT=l2E!y||X&s1v zv83aBp4JEbR#qZCG^nQx`1a~xY7uUrZ#=M;TV35Sg@Cm}OQy^adH+kfBAl1fWCCX( zM$nhX2DsYcNnD^Dos&cOuiD(#HwS3YY6dK8xizfVeB|MC5i@3J?bHMwtUGt^i9$}( zq*t$|+HK2xit0`m$xQsFdkYF!$zT41oOcrH_0*ZOG`*qhZifN#ZOf3ayKjHVikZ|oClT(8hMZ+0);x!U4MeAd#; zvk&HEt@_T{mdzpross7&<4#95iE5Dmbze1X@E&*hJJ&3BknXg*k%%9Kb;pm>C4}-( zxI$ulK(BqHDSqek`J-@C4JR)8_WwGH%HuiyoBB^Z(^54C1HjU}B)7ES)Y`Dr=(x_C z9(Hhm>t)hxAY8np=@}`3N<(YR{53?ohDPS+f{SYcBz`=`lUD>`KtLCwt8d8c*A31% z3CKs*YY7V8IANzWj%HrOZwdl5OQW2%Vn{saCr-=s>teYB;?qIR686$Hi{@TlnO-%2 zP1(Qaea~3{F_#(dwshb{Dpt%FZ8|l%kFqW(UxrNyIk0T}@)TFA_0TWh^T(GKSHnR; zfKQ(zD66bNhHwM56@)2v3Dr!S^G|+n?adTr9oN+YAE7-q_jN{{tQ|`y#Uhp)Cs~N+ z+xR^XW5=;M;OO+>#AsX#!gsx>@x^N*fIoj3P8xQahoEEn5&_G2I0MR>tpkhPki2(f zb#dA|#yrKPp;UTc=0-SX^YA`$V6XY@!CZ(8_a zQx@HLc#uJJnMrtP1!;TOjXPFU1ebu`W`1uux9XpN<=ga`CnxoJ=v!8KOD)C(Jhx*D zLolgBSEfH(IIu_cgVr4<8cUhw1+feE#j888!e>)s7=cG#owXi17gOkjl19tT29ApB zA?nGN4O7F}io$CjW^B;nfEjMzn#OI%PB3%s!S8XDOs`w3Kqp zodx*sJsYmsF((4~Xu#T4t+grdp3VUcwCgvkR(LJs+jW4HUTnRuVA8+(UMa(#Zm-lj{A_Yip@ znfvN04zLK1TZB`=&ay2_tEf52Jvb;En)ii9FZ64qrG1$BZ^gkT>H352W+K6pk3DX8 zRnW)ohq@KFFWMDp&WmyI@r`D(7%;>}dH($6VrG_7RyNF2NcBsnR72nL>xsjYp$zdv z@h2PGGHYZ&Pp3_5(9TF+U7_gI!6Tm3Tr;4cS77^HTCkthC*IOUTJN{o`13wl{T5W? zGdfNJgI~gNmFVmx}-CR=<2oK;+Rzc)P zhc*8rkz}>;Purhg)B#^o1OgokdW|kVGU?r`y%g|gAU7xtMig>51fZv-)mKzes>u7- z1y9^1Z5rvGq^`r0SZ+)V;J5KJ2ZAI=YaJ6Vl@N38$qsNQCnswwFt$L~lvd@|l|ZEi zD((!lM@t`WJE(gK$c<-$$<9C{vur5(Ta2uc`L`g&Se);~n*;{zpMX62wpP|w46&4# zUYH-=y=W?({xYz(X*DZSvs$B43Z90;mVT2|(8G{tepEmOlgbIuM2waK{U_7>jQPVJPe{EGzzxT&#mV0U*n z*_$aY>}=hex*mUTi2nO`hVkEnkp8r4`pZ{906m%Wros&~XT1+LUEkP{^TZmGG4%~s zDP@o>!9+3A6&0>iwerA(rW#U|d9z#^w~_8ry3TlZwRlGASKmYfZ1}?wNVm1GZ%jC% z3CS*eO~>KNz^rD~7!!q?veOX(N7YyY3(=7&yKYlHW7$fJXP)1n*0O^W;u9l5jSu;o zq!Ewj-+b0&{(4!@*+ym!ZEHus?-c#<1l%DFfnK}JKkjk>NPbCm%}oamDS^3ceveO4wXoq=*uVj}%R^u^BLLXDq8_r0Q$l8GQ6-}NZpR=`QHXCvR9 zMBhj3C>TWC)C-;=k8Sw3R?c6udHx%;QMB37$JuZT~zFxy#Kdr%U#{_>!J z^RME(?eT808#@o_!v>HVCO?o(Mn;B5`0(Tym*AQ5KamS?T>mFz%9QfC3(nH91ip2F z(cff0_l5nGsXuZ8G!ZfYFyH15Ja2S7XCSRt>p@c&7sUo4lSw=t5h{_2B(cUDZN%T% zNLVUG&oe9L>R(v!cp-7Vi0XaKJgFz!TQlY-crEt1lE4TG@~PmxMjJyW};4S=m&nLL{fZpvfuQcR(9&O`p@50+_cuY$VHdht)=~u9e1%+ zltqG2NQ@b*$sIOXBt@}ebmJ#@^l#UP-C+G2?vFj72ctg=b1klAIxus{Wr>C@PoY>i z!LOYjdF{-ry7mKdB80>KNFqJh?hm)$SDv4r|8II)!ROl|nqz$Xs-94+&2`wIE`s$* zZbw~e^aPEp^lt(zEzHb?v6SI88YD|BXAh|fyM+FTxm2`YTtr4{cvbb^dYrYi#-EYJ zyO!W_#ochigKa!q8>$fdaA;YekM7UmqN9nVmaeWV*%|5%TP-4lfi(`p%SOdYmp$Ga zo{&pgZlga0ad_ijS7&Ti9#WM#mGaC(b0~GoOYyg^nGir(i}QVCrk1%PB5^A<||#wpg}) z`LeC3f9)uYVti0g!7R3!+N*QZ6TsZ{!&=Xi)jtW6c>bo^tPLj_*cEeyIQ5n+<+doz_FytY@eW1REdBaZ4xAaP4rNTG(KrL+bKO5BeQbm zMW|_S=?K*RiubhJ@t>ip zIcrzq#2swCJ>>J#XdEFGB5eft#>!wcjhL}2q0_(?O!*OGBb#*rMiX!Jfjq{K-wt9d z>aGGHk}-cDHPH-o#2qXi%;TAO1eKlXxQ`4I-Loj*?RfjM^%%K-(W>F=S6J;<*I~V4 zqSEmG-A6V6lr9Mppj1|ir+x+A+1Sb@ZW?r`-HjA#3LrHYbj};QPg$-OFFKWIYM@U& zTLGM9evt}6A|#tLl{+Q9Nnh9V>f5!2OFezEd@VA{zh`8)Z+TuDdH+rFFPPSeH(qPx zjn_d{>{NGHZH)A)DcCKNN~1{sP>zy1dpU%Gk#F)f-1=Mk3b^q!snxC>R=74v58%h6 z*F_>wC57=ZD_~iUsJNpH6PY_bzEUICg@V$DzIo{*2RgcqLUr=9%N>syx42@H(E3@%jq!o$E$mo1E>=Ly~Bp^+3h{oliOG_OKG8ynIU}zaa z=<{N(XYYHsT3_EzcIIVY*(%u_X4*BrXL#1#o4rC*V>nCHvE?Zaitpkwyk()n7V=&mzzC!LCGSN`j>Be8g%1SaV5g1*L zus=e!HL71zaGkca%GYS?vPX@I3?(*i!p6ZR%axPU->D^@cqn$IK^}-WWk=~6&-%{h z3?DI)@m*)=vAgP!5S2xE)g}!bJpC)KeScS>tm!|!d{4=JcJ8i1b<^~eS?uGuod|-v zeyZY`NM$TKF_E-Ih2hGl*SBOH_$xL86Z==l8cszA)3$GDL*_#BX=IdDS(%gWqL#YX zkwirV1@y<*Gg-R2&!UIlK`uX(G?OA3Wn!C~k9vlQV=!UWB>-3hzlqsm5oh$!FwEii z-w}@*a=wW*<@Zt}0`;_^HfA!N$T>q2AuFH~R6`4w-UgSY9waIYoIX^Zt0#~9&wm`MsZAvAm*h#XaK3i3y*OMG+Rs3Pvn^zHn{W{^AZ9CjkwjTsIO3P!*t_5 z=OV)-1WoD3NyoDdyB6W|#3Go#^3>a*xO?RcG2)!h3n=K$RGmDbL0{Pte4VEh;vHSu zD`Jy=Kng;gJTN;vGJb07@4>xs+ z;1RpCtNVUbW>{IduV9@kf$SYlkY@_c9XygHszP=cSI`UjnmWGdmmiHKG|&()lNYca@)L;nd>hD z8VA4nsXjj#_fCFbooUhM(-{&B8%C5R{a=CS0>bP99K$a!0a$2KREh6?&?aD7RMSE_ z2|djr-Y+Uf+{>8uT`Ee^%(NAD;bN`aGA$(HTpym)rJcCeFm)AH7NuI!N#9Vje1a*4 z^iZ?oR&TO6rE6YuRIJ>1&ZLH}>zgMLnH;DNxFT=lIN-o0n{*s{GI<~;VwLOWjd9JZb+f$V`nt6S+h<7JDg^gJP zg*Zzche3@QO(&eV!{oe9?C1n;U<_gTJlWN?9}?BI?IM>~%)lpVfthjlzm=JJq+Z zs_9749>$XfNaa_7PSXkQVrTSAgsXN0uLNZBsPp6-YG!S-q$6WrNi@LEagh4FPOpWN zz#emwU2nLu55OdWvT|KU%>vM)YTjVZK=H7&wA{?>^pKEFkvUXRRAlGi=nsWQoZCVS zhuu6!7KGkR{{)u{({Mp{+y3NN#E~Iw-7K}N0soLx{Qa&?Sp9=;kd@*&UhOa)$(2Vq z5$;7tT*T@>(-N-&QEPS?70K5wZ{^{&;@GPq_BLAH*#(d$NwEV1Ehfb;$N^RK@%{5? zVBzEAW09JnySuxgzvCW3W@eUv*QxGG8_>2VhFNTgMl;Hw)xa#hCJteH$eAy{DXr_<|fw=Bzeccw`42F{X`OGv?X zLaKShhxy7=V22oFue7;Pd{*t-(-R{SErm2I6s7zw>$4}jm|967hYE(J-2UWv!}=LN z!P|aHCB7l=x1SoZ(SaS906WDd)(XF$fa$=H1Vx8=NwRkfGEP^x|347H#`aMP)78^6 zvz1$eE2U8#Gs|(vIZHTrQH4q{FA&cU>5mWyo+Ubv>`Kq$(I_@B<4?1HQIeEXjE;es zeb@~lk>+|4M3ySixesYN*E`whc5Zu{_!@LGcm%la_D4P`s&0(nsUw&F|owO*9jEpSmnTZ5^{UFe1jy+P9w0}d zh}oSE&5v8tD}IY`C0%5+`YAir-e$8gh!Z;?a9KA|W0jVAs8ChwdFKp%xIs=z^c$X5 zi9g*zBjLYjZaUu@W%U~y;eUu)p0Lli)T0GOUUOFdss6F<_fZwN82HL|@p3)g)W$EI z_SZL$^S?^>xJ9&#Gj=N1Y*NZH4KC$7cxvaIYnw}vt86y1A5(*6x~%mlBW;=N??d$N zwl&OK{iBT?>z`vU4+r($zd$zNF%0e`icL>EE&*P6&SA+wCF0E?*Ab5R@U!(6g=q;x zFqhVkbfvOw^2_g{s9m-_7_MY4tBmuU#EZQRnYqr~r}-s~T8yq4(m7Eo5Mz-<2VCRn zIr1A5pT~=xvb?%p*L8;A2X_*{@eawGOVNTP_?cL^SrJ3+&>>jg&fJugKD_exN{ge= z?~f0P_RfC#V}L zkpO*$S53_=nUO8uywZ&sk3|TnQDjO?s)mLJ&cTC{;+a=ooYxuJy1wAt^G= zoK2Gl1bxN-)6k!daR0DpQe|ajEn2tD*E|<}g)9jc#`5LIA*^8={RtXrUlsUZo;6@Z zkz1VC`}g-PmK=;wKHvJzkP8R|>~bD?gN)R8NP_nNVG{1n zTMQ+b>&n`c+>&jJ>={C@F#$;@Pp8(R8iZwUCHHTaV^{Do$4NXxh9jh-CS`v`Yc1{U zVwvjN!kFrO0@sQjrB*=h`0K6C6^nK;_hY+d`DaN8q~4QNjw0#wN8fjO5%`4x%5OBJ zUn90bK|bN_Z8wLhr3<46d36oN$xjZl4tEqv@%YRmu{&78O!8HuIRCUw87r{NNqMTn z=F59Rbr||eMx%|y^!+v4U zad0I}>lG{vaXcoN>7|fYseYR&-X2cP99vr)uMEtz*)K4A^q2TgpR^Cur@cKRXLNrJ zLucvIbD^MrqCx~TLH{STw|5Cw4{qjbYyvj&NM*}-j(>2qAI0$Y905CP!kg!GOD2z2 z`$I@8_25s>72S13c!w94w8VH#$KC$|FwFGtCU(k6fH)n@X+*2h@>1&MD@5E3n6cf! zY8zoAH5^GA5qp+yW40-vKi$P^-+TXOqRE1`DG#^}-+Pv_dIPai&=YA{y1r4LGEFV} zBye?#6JuEKFBglqe6wx1cww=_m-(H*i8s|!T@E67Evfz zcn7~Oreypx5rT*sXyIzDG?dkyX#N0A@kR!$-+US(vNnIDY9NBU)vjStVlneg)U&)H z`X2k)0Jt7Cj@6#hK-qr@<)sJFaOS03GL4z3X@g++7 ziSnL*7O<$jFWPR(sjNI9qFQ&y6IrCy5^+7RM?uaxwNg*C)yp19V4it=Si)RfOqlyC zD!@BWc3#RiH3E0mzOLOv4Ed!%qx}xTsO&r1`FwvSvT(8}7N*{-oj$B)b9gwCs(qu_ z2;ZzS?5W8mHl)9rR8*H6sQHzv3rL;3X^|$_aFwbb0m>AoA>*?uo1sScr9w&0T&Ipi zcUN(fhT3^L3ma3$c{U~ZE`Uit%0mui32h_~6fT!l#_#T^bXjF}BN8XR%d9~rdDZn9 zZ=Mjt^(QOaSTH5R;yBD+s?6YA9HM*nz-Q18-jxw+e>(vo?j-7I6siNvQPzE7qZ<#k zH&RQfM^lI6hb-PfYVWzAqZ5I2)Ms`;#EwjUP;c*f+foQ|$XBO`W!u&H>zxWQ6I8~; zMbB5)q<6kq`vXbKD+ak)h0?noT}8H7_E)Tbj7YSR?T%j6q0J6-d$EB?dMLPg<?-KEWqmU=;iy3Qle;XX0A zmcm4Tm%8oJriDFHr~&jb^SJE%ip{r7R2Ro;VsTCnEAhD=mBUyq-L}cZy5!#y zz=(@fgw@{`>-*0y*AoaRNz3ZVxxY(32@@ICVIjAHLdGwi?U5_2kuJXcEuipg)*m2hD03h?9?3|zdlS00T)(!SG6TMl2AH(L#3a8>c6 z@G*~C^6@SXW%e&TU?p2;H$Zq<_iPC~W!Nid^Hwx1= zWvI)aiPT;(ls_NM@JGgl_=nVlknT7WWh09v!3CoQ!21Zfa9vpU(f#Q1w*FMHz76v* zkk#AeGg{F4N|yMF9JILC%QMkLg_v1R{JE5{r^mK0hJcqKrxYj41~;8V&?Qik>S6qF z6qwpR8bM7IXh=KRm?K4oDhlqBv2xNz`!Q8z{7=xBv&g>{DW`nEO6x;qZzB#r`v0VDlKX{-es%<;6juA6^O z>L@>O#U&iR?Onh812F$PUd=`;f#dm-yixQJaTP?INu+c@DJhyZr@URaV%1%# zT>*#W@eNp2C8&7xUk1%FCB3xaKLCF4O>Vmz{}v~y>e(qMP@ADifdm z6i?RSEyTBB86ybh1fr$>zhC0qLIy|&-DYt7WR|oN`h{u)u z$!C7=7qaLHNw}4h^9#NNdYB^u_Mzlwk?$9#Q@*h-WREBrHUa8dW14-*{+iG(e?{BZ zSM<~M=Q2;xC)RE6)d%0+#Jze`g}zo;bf*h}+Wshus*>%LALIdeK6gv&(1&8TAQLs5 zEo)#mo@{L52C;34h7}QyjS_85OsCS`mw$%Q+Jjpa*+@gA7H%1_f1hy%vX_rmDL3c- zVzpsq+=-2taEkFHSiJ*Gh~H?tI{oIdpv zqjS9Nr%chCOy18A`3U1R)K&IMCnZy>TX&wXJ3q*ucR%XD`7+I}I+Xcq>mkl!{WL@{ zy{KI}kPs8t%+U2v>21~s&hbm7?d6ay*hI0@1MWQ@GZ#$nP0!^3qvb4y zvL3|x;9~m!ydvd0KOaWk%N9sYXT6c7lcpRJ5Q!=^*~-Q*UuB93%h8fsYRAf?V4<=* zcIL2DfS+Z@1LpPa-*q>fg`dU-OOzGtzQMkBhMedb00J?5*e-4_o;yPekeu(g;B~C0 zU$HJkw>i|$|0DV6B4z4g_3Qq;eIH^X9q&8nx|F$a>#`MiPx?6#>@okB6c9@Tz5P4Y zxh!C<0Ei_H-&tv7R;rfg7sKftX6BnnijqqARE@AuD87IDhLdDtX&iku34T5Uftd8G znEIIMrK{3&RpqrBOitgq#a`sgXB`w(07mcYZ2S7aun8L=D28W zzc_S!JFn<#L+It2!2Nt5arb?aFNE!`P2@L33#kQ5sTj0io}r2hs*grGs7&~3?AAN? zCW0>7CU#4(@wk+CSl!YwellPKK*pKohphM269T}Wsbi_@`K8$OwOaOo#7Ch-y_3Y} zU&SaiN9rl$Mns2*ak)Y280PmXAyj=T@LQNKA+U~Qb?1CB53ktt^r_IbQ7f3yCRWv+NY zxs5|V-?~>>?t&C}FPRCN(RP;D(W+7612O(L<4Y#*&_L zkNGcnX`k)$P&bR8sF>Vw{o+|2EGO{O)skSUo-h`NT)l@d_(a#B_r|N)DgkS1R6I*u z<_;G`2|FX9?uW#{Ows(@DP zzYP!Ie05#WK4p__@{x=}{tY@W_T1##Y$%lgKhn9GRp6<37kb|fPTILw41n6I_oWg8|{(x zIzOYgctGO#y%j9a=rS}4TYA93Ph#VbG48q1LS(Fg*BNP@72aJM_P1g<YQ7VDoV1LXvAo6aB!GkcUJh<)>L9oErw&$(oQO*3IV=MWAU6`_TW{@adMh`XN~2sEeWNAhhk@=?|5i z$#C%@>c8_wr0@`V61kzdfyG+}~)bU~Yl zh9Y#90z)JSiZBXzHY&gk*vJ6J8*~)Ni|B~Nll!bL(jA|DgwHqm7g08F6qj5uC}iUn z9_b9{j2q@zX)1)AWVy#RZPYP~fd$L%xr&IhM`*8jbwsFnCjv(bctJqz_DMJs90J;I z%LbZ8%x2M7buDT~dQJEQQoLj3_hH+LjphZw(F>#~#A;r{&2dPQFbV9? z{&42n)4d~9s_oErFw~^AS14mC8uWEONAMIlngSgGG{5&iZ(Ulv?Q=Bi-h2CylDSCgwh9W+26yL$0KD)z#7*0BDr*)<5@clES@^-VwrHI6W*1CE=G4H<6z{8Iv=3VW>d@Nb>__hGKaQ9J6k# zQ>-^N9xk+F*@@_Xhp@=k3n9b43pdA^$vaAccQjO}xkd~>n!SkjASWmdP6!12LcC+@ z;enk}Eu6OwU=@vDqy~;_J)H;!JqF6c3m(D~u3+zjjSiE$6(P`X$OKlVPE%W1f?Mne zLx5(H9HbXzm}^9M3&J_EtqI8->!UhMRMTibimMCf?nutC4G+KPJ&&>7Y1b}^=wZh* zuIWUK#8z@YBwWUEc^P&^qHpNuUTG?L2&xOhss5z4#Sn7pEo=(+WODILLG`@M@KLH* zr6+b_iQo*~a_dR0Aut!di-^6VF&mi=8~_^=Nh+h2=B}gW*|4Rf+!S+(*T!>PD!JqZu&p0?temW}WGJKtlu=q+YZUm44OdJa_v z+s=Z2?0!I#?%o{cm(AJbYi7@N<^bGM4VaS*IPC?U$_Op97g5_#+f!>l|3i@&FpTP; zQl^w?4LLIrjPE!g4=J*T%az!XB7=P}6!n`Fg%iPk!iIUqqc`Kt_s|7)N1~u&Iq!Ae ze;V--LSvPv*}{c67*jp(PV#R0avS=|F>Juo%R`QmwYV+-P@gP!9YX5Mzm5AcmA@IJ zrtmZVkdGpN+gd$L+hPj+(^wu>FJNfsN5QIrf9Dt>ep3GZ-1{u#gG8ZkOylLJz*o2@ z*B!~`Ix|Z*V2IHZH%yQBuGvTit#CSwV%=q&MbFt6P+Y@41nVqimhZUTfheVzV*n5V z!QvRjVB3?{+mi%4Yl0ev!Dm54pnwZsPv5Z4)1V`DHx=mS;SPG;U zo9j!DYj;)^>cQT}AW>8M;0Kh8-h1jobTl3`^bVwa37#mXpxlZVq@Fvw(zyqhVuC6D zDnhoBBnexx?&*3AQw&H>;q_mOhS~UsEliOYHb^nu^Nev;&{7-5uOkL zd&_$Xp9Y*@fiPeX+?{q+4Hq3QjRVcs;SW-=`4xYfa9d~J%S{ z*rP`$Vur)WOI{P7`NaBY3i$IDaM zhwxk}iIo*A!4DrBUU9Z}yPac)vuY$P-*53M-+N_R@cy!0V!aS5rAON%+B@)QH%m_& zxwzm^S66SK1*?ex$vW3$oa*^k(u+Qk>+D;4QW>7A4KVp*fAyv7Yo=Dba}au2Kk!cjZ}L}cJ5F+cX~NEv1-33)H_gewwsEG&r|OAN`85u&NPO`uEm{RKPc)K7K-u z2@@@<0C?YOh^@Ily3G`^{-})e=h5Ng@2=p+N~w69E7OS5C+w_c6=lLKF`TMA%-}Ms<&W%fftdOr2Dp0_!uAcu=(93kHn$l zfVe7?Ioa>7_Zi!-XJtDzP}dY=5gfzr{z>=yB5KFqzUbvTSGq|VPU0-BjN%i#@HkRh zoSuAY%vZ-9%(tmotraa(*qeF-^?{;&UPIx3YEH0mBC5?kI+jLD6r7s5w+d;yd)3+a z=NUnLd+I-L-+ZE{!|b3E)m^S4osv1+X_>m{UB?Un*}A5?o-7ss6}+d%7gwXbpP^F| zW@Etq1e);ltgMgYuHPv{m1>v%j3o5aC1KldHf77R`QgXP(7Y%xNC(VV`upb?*7BM; zfr1wCyo=}KO%#R-<3wEEdez>Oio@z8DiH;Z`gmx&#W+AiF7Xbjw0-}e;&K^YybYKi zbgxwE`g}gvD>@Z(@3610$MAEJd?nnuS`f6Ow2AseQMKvl3!kod#~U%5jrxR=Xxo)(f~p#Dxi`sX=rUSNw6B{p zn1bhi%As!@7e}PaBusEp&rCvX8B7H@EZ97Cy&Ewx6glH~HjLA<{btbaQD^QDEf;&? zOIWIvgk(;oX&W#ztQ)@A=B<9rxP_xN?1<)fVPp>2cp65ajB&>!7H)`G_GhC^~S zTB1YI;NXhHiC-}*D<5cSR|}Mx09QVKDXHcndbZNml~S8b`Uhrb($)=X_2UK12e*&x z3bz&A)0bH{QY0NJA3;o6zkv3C-2}XrQig9*c-QUuHZib@7=7`Uqb3|`7T$Xcs%a`w z>TiZQU&itVWO6)&cif&1&O0rRokjB4-jE{)!(R@6pM|zQxJgJ*fI*O)H@MT{aa<+6 zoHe)6z&a?1|xuN=h8O zyu;tg1g#puS3aFo=Eylf|Hedlii=JvudnVTU7pav;V{Og4F}GZ95ZhlH~WM8zgq|( zGtGYdk;IHfXte#v%mf<;vxZKnZB56`YHy;?Eer4Fg_i9`c(NMHml|%}lJJUQ13@;} zS-$oGW|-$T-|5@0pN;tU& z%}Vg1y#fzyOtp7m(Vq`x#r@FBXrsa|xpl!Q#UbTUWAyf;6aSc>gOQIuBa;eyC%r*u z$%Ee<&SUhOuG}UUQKLxtZ+{cXi z`q|8Cu1>`*wf&9PRW3wv$y>{F{E!Zo44N%$E}7ns&)CNAajf$Q`bn5T>^Bb%@S1GY zcCWYiW17xRF#}SDj};ncZ(EGhwY1*B{L=Fyx{V`MPhV)Nug^I!-%My6<8Ad@SXj_* z?d8o{4VZ>BrLc!Fk2^u<4Niuhn1BIiDj45kQcupAU+?%zWzj|M8R?SV?2bm zHSMzU_;I<8=IxVaVfD;~8#ePcjd*jK9TsJ*{ibxZv{qciKvNwsxM0B!6SFmh5l9f+ zE7te(RzacRK*3|%Ian2eK=TvHrI2)1%MyLMCK<{4mp`cqCi{)v+}c!8Ns~*4o|8M= z+6Jz+IqA8Jt53qkNj#b;7yulhZ=Ty*-%?R?>|N^nZ;l1E45|v~`Mj^JCVnKTVMM_r zW0RR#TQhjm+1mfEvaT*<2e5GiF;EaERIBwu9WBR~ha?yp*x$GcyW_hs;_LCw-L#`n zYoBwc-$abhKS-fEzz}pCJ?Z?h zN(^aR#a}CC7T#f!;aD|o#^nj`g7x{DdN_kE-@xH5nUs{4{&6+e4Qosp9F$%?=8;x) zx;rz8Dxe&%@Eu=Wro+@M;n{ZV3(sG%Q`36qyy{LL^{v;KvZ$d(&qh4Kg;h(qBjG3V z)`3NWNh%kbz5xcnHQ4ap%ZgP;Lf^>@j~`K!M3P)~Axmk|54rb0z~uHLgG zt;7c8zN9U5`^0YR#*7AV^)eZX*UgG$dRm&XgF{UUfIn^&Bk3y&oBy+Pj{k$Tg@xtM z;#jIi`Y0W-kZwg`Ew2-pc(yBSfIjxUQZ2K5{RG_gCI$crbZy05{8bYy@V-|^c91Vz zk0MtlWwuJf6QcVUW#25O=3xMt27T0*F;;F(iz+qaP@&Fm?K^i)zS^Qz?1R{9*i2Pp z$%@rn`oGVAemQHv59x8@=?lktZhxQ$%;mIcm$ z4TqneI!H?|3P6?lS6fm*l6BiZKStuG7@3(TWKBV?88{N|C56rGLsH5(V5#2652nja z?rSr3p|<#r2-k+#T$({@;X^8uC1ioCnUUu_nTo1@AJs3nNNp;l1jwfN!IST^mFS2G zaTch=4e)?ur%x(MUeqy|Cj)o5i!;MtxXvZ*3unxlr?4P=rWh4%KND~~T%3O~n~tYc z?~GD{bW=!0{e`fqLe79Mv^(b3syI2D0wg~5HHmx)Ub_1R6W4h)Rq{*>2q9ez=gZ~J zhy=k1`^*~TJ~Wz#Z_-L&bJwm5cQZt(`iX!-z)eLa)mKU|@eF4d>B-p_r-$^=bI#JZ;8n zcj$vzhJ|Trpal&HAa^^b+MuJF_N{hHi;@>7mwMMN&_h8(v6F#$}l#~^>mHf35b#IambW1x-#7^x09v!CMFIelHc@yTS1?tpvvmm1d<5yCYeZ+_q zr+2yzy`K8h5!X2k;}-kf((Bc*_%>cyCl_ZoG0+Q+@eLDc`#dT&sIpLIaf5kPeE&4^ zu5sB0p@b1L@zdE0ubv;yH(3WR;)aasGqu874bbedM`aG1otf*N^sX>{Z^FQbl)594G zNCK1Px)3Wi*1~jhz(-}0XMnMJdxk($L`TtN)YV4Jiw`xkzrH9>3@c8V+r_KkAH7S| zLfu$BL2da_>~8O4Xp*r)bQS`$3k`-Is0>9jmpx3Wk)2*zm4G1l8}pCv-?UI!wnD@d z7dp%9#LGTv76H|g%o$j?4BS!TA(}~v$zXx#VHI#8Q_iFro+08^rUzA6AB%fv#*J67 zojwzdAgm!W8fCZR$dx7P+uV15^w_%IPc07_l@@^D-kQ8imo5iAU0YQ!Hj5wXTe2^^ zE4!^Y_`5(kn}3ied0Cgn_jFiE5KO(N$xy{ocplcIW0hr_E!QW{Kg^7;T$vPBk%1Xf z%OjvQY4X9X|CH|7tS2|aS?bZ>GxX-`sv7~dR; z&^x=%2(os6UD#x0W0U>#FAq3yKs%aVp_Now9tmUL*|s5`q=j?|Xz=PO=1tLPYeiD& zm$d4F0*Yb-PzxnCLaKN2jekyIVJ;LgrWG)6b@1=jV#^R7Epj|y+5rT-&? z`qU;>ESW&4#QO&wwDFY~ygSX?#trgu>bDq5(x%0;=Fk9eiCIL!5*AomJt?0yc8l{F zDwYS7`%dG9#(bjc%~U>UQBrK}sVTgm&KQ9WTs-Tu~*ETrB-QRjYRQnAJTz?M`k&MzcEZw`A6F z6 z-fP%7ev+I^;JfBvZ{(oEBQA(g`*?bI67tJErwms*T&tdfbzPPUi=on+U9_r4Rm+)^}?Hvtao&=?x?yg^{%d#K8HIkCueK9uJ9TH zQEmtK!?KkZKQDtJiOeOVm%ehrL_W2npOw-KaQbVRHYu~wC{T`=rEAMRDG?5=F;%f> zAMD8VF2mq#kIk(X0F^v(tC)l-ih2s`H~ztOQqmk+ z;URnP&qD&UaUOJ3G7DTs88r&?QFI_yfvDT8B14Om*VxOcWZGla+Ww z4WN-JSRvfwTRxI026^j(OEzbym7a=zn+?R<2$d`R``DsK-`=z zsDH?f>5f_(=I$y?-!~z=s}%-f6!a~xfNL7mRR1MOl8_01RZRh!TXAzg`?FEy5A&~w z#ozy<;&9J&9m9@-uW@33tusHy_2nid?vQTb1KY-M@aSn+F6M%l9w3PKFlLY4RdJ|18BeK zqXnonP5n%IK4CNjMsNjxXRS)oSrL$D>(HuqW1c zW-i2B9Y?N8;00bGA9ctcnc6u8Htw!9ENWZXe}xvre)qAbvhK?CrWWRSfDWEn%QNMd z*;t19n?3PjPHIX}l&l2HqGG6g%_f;`sk@mKk`PNyQ7wUei+6<52+>i8hj1VW4tc%Oicv3X5i*z-Uyj zvYR;ss?PY&>pv7oUZ9UuN(xNbRZu)(@aH`oP-jJifoTzAamugo{cwSulrGwaU}LT< zb$YSBjJg@iSihAhLH#cpao^tXkNCMr`z5n;c%%(deiBo`mU#JH!BTaR?1DlAC`09q zv8z?ZTg}+hlFh*`SH`%^xD-VIVi@|`fcwX_7jdD(P~oZa+ozp$2+c4b{*v{VyQ{`M zB}@{ZvkYs?f+{oBH!(Q_hvbHkp{lWfd7}d1sPQuopBUu&boMZl`^BDvz_ehQJtSXf z+!PvOVzol?v!XS}yWwZ4sa4(w3O3&}Qn0mtd_ha2xr_?uvq=%#yzZ45<&X1c|J+_< zv0p1i8xF%~M1V9^iAbP5qe0f7lw&bi&tM>7X= zg8b5o#u8=_76l~P^m16|Br1<`J}jEGEA1`MnczkB3+QbIz&rbw=dk*bf#e$vQ$B%5 z1Ko1=&pmccv76!7-R5_HEm~}bstE?0L~4(hoqB(QQevc+eGF3S1Q*T%Gs?bszwKR7 zww6b3MWzyM)Lo4zpRzB>3*G*aOZ{Tn6n zZr^#qqSBOGv$O8zV*z{%Vb~b?VEDLGWCs8ekMYA#`2_3fXN}OU9-;~v6l(}FGT@

    nM(wPRa`W15dTH)Z%BMGnV@KCiPK%uJ40g_;j{Yv}z1a~nv6}@4yTI=e zsdY&0dxqmY+lB+iYC}1OXpLD${Waq<*$+F?@f!XMWUpbg>%m)Uwcq5{%t1@M%V%9! zb?}3E5#8uV)N0D}N7r5_t(HsNO>bsgj?W3i5VA|z>CZ+?ghSYCZOha!)i*czlTxq) z8>d){roH77+RqYTzT#Pv-2%4l!JX(ss5PAO2}mTv25e zI%6q4s^P2Q`0>^axc#>xo~T%Dbi*?~{1dq0vpYcueMGNn{Lz~h!^6j> zuIlWf^aV>>+sxhP3xq04lD7w86@3M+QD3m80=ul@_e?CxpybF3LN7_jmsO|@7jehk zHu~%`oIo}fk)an=wo>?;P(tqWug=}*cDrC*gU$g#E{9Hq&l)$WLb>BI&op(nB|Krc z>207nEu3(`*uep%xBBEhMfsaL*TO-BkD`gs&Co)v9ebCo3e6p|;Fr7$B`n5z?kQxe z!@eF}6=Fq$Bsk|r>z2Fm@r@RHAz1x5YvKICKzl8B^5X!+~v?wXcuv^UukAr~oHt@0{Ns^Ac)R_Kf}Isk&)rSaiq zljoGbKN#lT0&W*8p+eT#?f7@`se1A9yPx=b)!2q!B2Nf(sC6am>mL=RE zvkhuAVs1+oNFnY$H_*_XBJpOX76bYzeiCfE8p~rYJ%I3LMa&(0y!p1hVoh*DmlK>< zkIxHie7&GUI&L8_gr;QDw+ zl{zah+nB!a&KiZiH-4LSz2Y>(5@PQ4g;3{9N?#~XWR~7{c@0#=y6WG@9=d5p5w#`| zNV+VA9~TtsU_sl+AbGPow1D1u@lRuPQmoMAXLo!DNr$IH9}XScTtv|uCz?O%cSG0r z_Fk+Q&x)2mgvr}ds6)?)F0wVQ;ick!fWjnZas0_8Q)e*BBLum%$t?<8zI=u@OwRjskZwZhW3q2KdG$Mp)G`J%hRZSF~FPV ze*-?%h4OZL-@%gcs~3wFSC4E+87DQ1f?-q<_`%{@k-lEOa(DA2-bElIliiQJ7AG?|ofrDarLI%6R$PV6EA$samgDPMdwY9fyckLSdKr0p08^^1&VTin z{&@tCq%UVOIgh@)e4XohFE*+vm(a)bD}=DEoi=Px5^gb7y%uByt;)$nU)rar`X^2W z)xoS*!8D~W1|kohlKYjN^;#u8C__=V{Y^m)tKo&y+uK`ib+ud%%z2MO)vaKShu`RE z&KyzY2{_dQXDaptspkF{?e-ecXwyvLrn(L}!woY}OQY%^#n`D0_h-eYLv1} z$aiBZKc^2Hl6n2UqM!~d|H7|g4)Zk(hebo)0C#LG)EhvhS@|wK-pQR7T4FVx!jfd( z%YUZuf|IejT#&C7d#`ERQYCBc1lAHS z8e7Zv0e^zNxkSHQ_mvtJJAB3NmXhQgc=X;xpPBTmuP!bw^lY(hJcpQndvF-C9fqp9 zjMU1)&;9R|Xlb^6dH67&SYUoltI<5%+=Oc&RefEF#VT#G5OjPq0dw7ghKl6Y6hCuv2D_^{5e$ks zYZGv* zWz6I2dUsa&X7qX%FUz^GgoUP6dh~>T)I0JfOd-Zf6+agxq zSVjIid6L+JI&%zdo}O?Xo8jvCppA{?6UfvGu*?fo@ToZI;8)t%(6 z{l6Pd)G6&?AJMafD`W{%tE|fbk~LaUY$K*{vx2$41^lDBjLIaMa`BLw;MxA>77dx% z&k}}^yNYFbZaDmreWi#i83}RsojXT17qLI$J7@k=t8WRH+I=5tGjD=&B=6C1DTlZ1* zWv5Op67hM-CrriuV=Mo#bzqH#UNE8Ub2l9A=3X${z?)hU*QOS+yJsygJ1to1wFErc(C)UnJw zc&0D&D+EZ9!(25^6DwLSCO|tnuZ_&(n{4C0Ca>x~N)>WCkxP}mjX^z^TotDzBP{$b z#vfK>kW}CbuRL4^mi?V#H~C@ENZ)PG3+BfoQ2D9T6!xv!2Xc!@Xf2MKrlkPZ*iK1~ z8@T*|#h!r?&(y4qi9hlxjLf9@3#GYa8pcH#4l5_kTKw1LDvY1Z(VDA`Vw9z|pU&*^ zWf?06{w2D+ED7TOpm==BVPobHdT<4K2@|h3!*3$}Lp*`=K-`4aM`G4A!uksz{#NiR z{2SBE=$SQH)l6>6V^UzcJgEQpAQHLSy}3mG7O+cs!14RrfC}Y1W!x0eV6QT_vv(0$ z+9)Pt403JQTXp57=!OjI@A!7S^Toc1;#7wciW>-fL#UoJQ8iZ+YTYDvS+uaKca3Dkqu6n zD)F2sp1sKv!O?IZLKL(q>I6%ECNl6kH*u8K(hxWY)j8p+cQJ<47^A2}b1Z?E z2+A4Lqg#rkc-8?U~jeN@6nnRY=L zN=e$}mqfxR1Fk*B9clM3eVL&%nLMyyHFNU_tgz%vA<$lbtM{qV+0?Tq`s;mH=dFm> z9@M6{^~T8&p$qxW5XQ1FJ+&7O!-Z+%Ncspp{RCo&ym5>GH4@<;7mkbk`o+80PpPxC zW1ideCa`58)p{}k1Ti}(a>lp#@K4Y3g^F3ugo5fJ%`&zul`7h0fd-#S(UO$fRyc|+ zvlR3^RfUY@Uu~yS;w%&|7dRi3wE0rsAaKWf=1_pN0~vq)=kdKrMf(3LD-ZYr12r<$w8hi<#h9j3~ zX)g`*S@eNj%x$YCn`7J9JDg8VmfY4Uuc=8sr67irU1$Y4;6(L@uOhzb?7fx6yWrXTrYVl=08UJ2hRWw-WxwR9J;bxy#Lew#dwV=EJ)S;as@rtrVr3}?uOU4F z&pdI)5C<~J-o3oL1NP;I9$m18M9ZJ^osFZ^df?n$9`2{YHB;sb48nQgpyrC|`2~D6 z)72~Ftk%el>IcO#y~opJP4@0lQ5bX#)_c7cV)T-)wc_dtg*?_J7~bmktZ=nZh-nb>Cl+p?KG_Z&`H{2p zlx2$r$@Pe{uKkD@ex%uc2Tz%Q|5jsgwIA4?uyk7*u}}H|(74m#X9#&nFLyLT{dke% zB+3*gK?o`@ZCo6Os#^`ZSs!!4)hK+N(eG}QN?6fdKQVcozH4b6ztiPU#X)-qXSuPT zbt_uYaL6=0xVSpkI=AN+@VbG$Ng*P)?$m#+cYdgx?YhKNJfr*k;Y+8H^*CrE9Wz>Z z5a0WBgT2Fl)aTW`_;-7jtFqVAwBS*eme4W@spxM9MSEX~2WFU^v*BilR|f5wGwika z#_C9%M&`i~wn=rrI%V;SI= zzWwUG(}fIZhI;Gu3mkEpKWBSx{<0x~VJ>Z6{eZnngU(9USWUGH8s-wm7;~n_@%HPP zbKRk$@78OQA)~<9#lx4m)agBg$!w#p$A&V2DT1k#@JEER+XM+%w+fT6Av)Hb*|j@0 zL65f5!@tEq_g#GOL2Zh3Yk!+fXfnIAF&|!Qjw}i7CR6QwuMXHn%V6TgjZyFI6FpZB>( zNwcT7-+5>=u?xJ|M)3a5Xd}(WS{JLz2<5^d2A}Udw|PBPDwE3AIqqI*dM}Bd`fY-J%7*iJ51kvgtsLrU^2;f-janb3 z*xcb&aocG7)BgQ*-5Z>L1x>RK0d9$xn@_uxZLS={MT*=23T=V+>2s^?HyiHLa&F_X zOY3~$mP})}^N`48MY%;+$Z4H9YEGZeYlzn2=E-Kj>4yZ2Y{jgjz2_rxd%c(7nkkQ6 z$P0AF3cFcuPDc2x2A=JCv}|}zi4F2cQFqmT%ToN1U>~o-x!>y%)G{sjT8Z@RXSscy zZ671Nj{36*U~u|x+S>GF&IDF$Gvl*QA=;aZo$r`}2~GtcnU`7W&wnOvD%6%bk+8T@ zJ^LwB$2mUq zJbSgxl4AL_Cu~XC+Y5J^JuWwvKVOx;I3-YWafK-Bw)^hlJUG{HtFBbZMsoJ(LoHF{ zJtUZFxLy+!tvj KsTv96Z~p@sQ9ZT* literal 0 HcmV?d00001 diff --git a/assets/ui/tool_ant_nest.png b/assets/ui/tool_ant_nest.png new file mode 100644 index 0000000000000000000000000000000000000000..c854138eb43db99b0b8755ea4953cc0322cc81fb GIT binary patch literal 1094 zcmV-M1iAZ(P)@hAzB`)%sqUc7trn0r4Og{ZZJx-USjz?ZZxgcX+s@DlozEtSDd0dhmXIzJH+ zkLfm7!)4sue&Zc#-wtuL*t1+A=Ja zK*UcGsuW-@{FKmxHQ{RnA6rv|loAAUWw0)R>YG7hroz8EKUo!is{5yBlkhEXdv0G? zAL%rk0klSaur&IuLZ7oVBdnPPg4(lzNde|YeGZS|2Nop|nJ$8M3DlPW?eLeh4Bztp zYb^yaa(wkO`N8nZxg0X%#n=a7}|fAuAx#^^s}+WWVt04=6|=q?53 zhl1f-w*|<3yVi=g?Mang0H*)8w3Y$aGr-ajG%ush`beN9*9Cw*_XY4i3-mntMLH-z zidH3PT|Nz66d+|3ogN=m3ncZvypMj7P6{BBzB4V0u;#XV2w$Y20P*|Lxo5{%(JVsE z*(FuHzjHqy(9H}Wk~gYCcxwa9{Xda@M!!gh*9f|~K6}i4f4#;i?kRi`g^z@_JR<1n z10ywq*P8xC43>bJ&jq}UwwB?SQu$D*hxY|qo*rJ4=I9qu{8X@q5{T3(LaUiaJA4tt zCxN@WhbAQ$hND@A*2|66((3-a08MKO(K_%U%ku)%PYtVmX3&<^I6X}LRlwB7c{@_* zU9EEiyE!}fP;BDt;31ZTbi2C;xqW{9-_I>CyW7eV?D}{QLbEVK$-?nB_fSd<&ar7tazC08{ z^IE~RziGwA_XY;xfoh#{u2~MP16dv}5IyAb6G6kBR8j^nM<2a~KIF0hL-Ee*;er&N z1CP0R4v@Rfc_>6rfybJ^3b4eth5-No000000000000000001`bFYsIK^=@sOGynhq M07*qoM6N<$g7k&#Hvj+t literal 0 HcmV?d00001 diff --git a/assets/ui/tool_ball.png b/assets/ui/tool_ball.png index 64e5c552437b66f59bf19ebbbdce3e0fae04b9f8..e58011f45557ad7e88b7768dbceceb7e1322490a 100644 GIT binary patch delta 1453 zcmaLXYdF&j00!{?h8{B6e&%6GzBHgosEk`_Cmtk`5t}$z?@! zjRkGTLRV%q1V=rryqd9@zeXaIFXH9xN9wxIeKN1j_V{xgi;K z`$>QA7U;HY4KAFm92Cemq@s(CJ!N3sc$9+D8p2xN@UeFC?Aau zJ4iv}b1m3ICj2a#qtb2}M7+reMvm)1^$?K)C%nV8$zjw&QP%3#WKi~Je5$z=cS;=D za@)Ebc0|Ab`W{wL-gKyGQ(b??THfAkZQ9igR0R`lchIr2RF>8PsNRdPAZcAx^4l3P$v5PSFO4n2(? zn=!JwrF6CI6%7#@^z-+x0B?T!7DQB(5$$-FvAjiIR2Y=j;av2NRzKCTPvYJ%L29br zDlS%G+dac0PP*Bp*2w}dv_gQSuf8$YhoOyy=u2wuiUqQRC?6=@!;r2C?}zfTD{({} ziXJ8g#@VZ`!oD^R`cG&Ky9+*6Pq3N_9Fr&XB$JXqm0FvWlHQ+6OZ7J4o6iG z19#!atu3z=hufZYN_L6ZBvlOqgt^F57;F^6`)%uMf2anAsO7YnPARo={aRtPJ`A3P zN5;6!iqM_`K)#A+Wu;@zp!YV7$dh>BUZohT?a=fS`6k* zLb1~X(I+}C>pMAdkng^o{c0z6rRY-GgYwPC4BBR}9qX~(l%k<+Qk0x7Di`Q9G-XXa zuJL_h+smv}TVJMVc^Ps(AZh~{^C*Hsez?~Nt-=-&o5vj-T`EF)g4U9v(7e4OlGb^^ ze{Dj^r=O4N#JE0MG;{K&sU^16oFZk3om~2>XwT!4pCcCqm!1k1 z+5SB#+sdx3p#+5hd3LsuP2=V|>18>(LMvDrlya71%Ng0sWf>*E^wYG27%gB9rq??m zFA{$Df>vQ7>TI3!M8dp*C8H3`(MkO-zY}}i>`}jQLQrrmszUGalOi{5cy(7vXQ;Zp zlQ1&oIDEW4)ijo4omM6)R!@?C4!-#9MlV@Y)A^QR*7`41)b+-9NN26?+};7lu*^=P zyZgf#k1&8)2+~gHv_bvI9y?M)AGXd3K2w6hxVby6^Bn`m!QRZPzcUf7Yw;=rxHKpG zRQ;k7+w@5tTsoI6-FVZ@IJIs9{+c)z4l~8~L0+wx(B=@W2Z>hHtA|T$d@kmhOHH-} z$eu{!-7}-gzp5QM&~|md0{*y5Iv0ok@g;FT7672fZ2^DS)o;LgEc5>sM|&4SqisOi EztFFr8vp(}@9Kh%SKhJ4rUjPqT>w7Ajo_vgK zdJ~vesD387jAZJvtawXzziD*40RiDgx{4*RG+~iDOTKRzlS+3aGE-ROhgOIJZ1+Xhx?3!cudW;^slL(^2s@{&M@Ry8k+PjE&jGdFvbX-n(gyG_wA3)U_Jn3p zPj9N@#L+hd+D~)!Q--4;9fT0^Uz8N5z?1V8(|?B6*h&cOk8Bl|tZ zJ}iGtxf4%Hm(N^v+#>M$6rgxZnW~MRY#7osNSpOqW7gf57MW8wz!{6RKh`<)x0tkl z8XeYjsajRV6O4r{K{!5Q2vssx-V{GKvbFHsNa77AKUXk0+{ZJIipm!^olHpHo)93l z|9gU^s!%T+(z2xVGuW50W9$iogI+6J&mnI43a*#roY2${pG_)5#!(`6NFmfMkav~x z7w+NZbq0-@G~J{H*>vsgaeD|~lnK;kUjH!aWqPLeM)ss4-8tkE!91of(#!K@q$kjY z8e3^TaknFXG5XZFV`_zBzt7T~Jw&musIFo%w85I^Nrn)il07l(XTFt(&`mu7+<FdU2+&5YHMKBw+Su8b@cD56}|}j~6`q5cJ}Z2P(xProqNmtrGQ) zM?Dt@duW{%?8AGb$N>VIPr&lXb$1HG}uY-QBWMj_(H+|c0{Lp`Lv(n8D(T^Rt)jQ8A z16R&MP^_F+lZ;|e5l@Y@iAXXXJyftoE)WP zl7ZJ;SjHbJL0V^z(vr2CM&}q0i+EYKAqFk8?_Tzc&NG@tJ=sNhKz*xUCf?MN$n_&_ zbipG$(kp%T@w%HuIXS_5Wy^hBNv5tHlE~`yi2Yt6ZSK{NtEg=2(B)NO9v2a1gBbXl z=40j>g?PM!;DPflkE1U}6Nt*YW7lB(1x$3Dts0D9!Q`bqSR3({76yMn40 diff --git a/assets/ui/tool_nest_box.png b/assets/ui/tool_nest_box.png index 44f5c927baf7af4722eb6c99481c1c1d7a4d200b..c681d1942b342453e8e288c5457a70e18014ef11 100644 GIT binary patch delta 1843 zcmZuydpOe#1O1UZFBefgN1B;Jqog&ty?V{v^#1m^j4-Rb*f6=YFTzZS zyhXFjQ@kyN*R5P~OEYuNZC~&6eSdbI^PE4Pi-c!`M)2=)m}g$x7r3-(dCCO&OTfq_X=_DZi_pqgg&e3Whx|;7CJp7H_wr8M z-ebe7naH2lxHK}&4j4GF@8}C$xi?0Pyk_U&bgzjo?tkk2lqqA71hJ9(g@C^@|MlGM zl3z;#EgNl_yNSB3i{LCSIbxx31=WTK_)V z<;|DYk~~yKX6>15eQYI6tVn<)U2r6gy%rNh;C8-msLV@v&uDbZHn(G}CB+s3eljUa z4ESp420QQ49wn7E7&*euqd8yv@5T^OuUrEn7j`=?c#1G znbGqk4LOTX!Ou(ThdN3^z_9SWBz^Kstd&ydRp70_2{1%SLc;ctQnUUSHFX5AcIo{v z6tUnVJ!)Px9k;~06$FVcC@k*)*ZU`4>5AzY7mMs zpg_XhJm!2DLpLsu=oTZhjOnQHGkKKuh4|{sIW6Zk1w=d;v0t~RK(AN0j})u3JxZt=R1IN4E$nV~rZ+Z(F3N1kgQ8R5Ra`_M6u0(f<(=&>GMn zt}#*M7m|0Xs-yGhKtXf)4a8^ghyPdQ2Jl6!O8-jC(zdAR_#Xy$brQzLzkulR30GuE zoKLA+@Yq}3rYaV)4wyzh_rNlcO))}Q*HbccL9wEh3hydgi2p%=>#!F|N3mZ$PwLK# zfG4Y^OZ;93zUQC6@7t*uzq;11A=EmL$gu3PnrpJCxNQDI$*kQV>rzkIsdCSJFotzH z?m)I7-MM6|^wX8RcYqImqDxzSChCKim(R^`qApIUhQ{TsS_=GgJ!&tDJMDunBj!ou zL8pm9yl3XKcu~9QKunzjVv_y*#=&f-(YG3bpYkH|u7k(XMQ9VI{(m^w=Iw7*;B9pA z=ghz-^xY&(+9Fn!2{m)fdUpq8^CWW|syMB;)R}KI6V29*Y!D6=pQpO0FVO4L3Sz{M zjXW|iXWEXv1b|0}`<6<{?=%7vJHwPs4^&_h31TUbwL9REi+7Zgnjv zm=mXdsQ4ZH_C-8qc@y5JdBN=*Ygf)-AY(h%QRB{hY5d}>+V{}|BT>0OYt!6F>eI$; z9XZPUi0vw?59l2NuVl`}u+l|Jhf;cV7`u|f(rI*E36izJJ@LQ_pG~>5fKWL>)0IM+ zFgNWV%}Q+-J3a9+NUu*3hS(ndhbWR^8cdym!A(B~KJF5}gu(DmcY0!2DfR07S{Rg| z;okEHlO5 zKSM*xUp1LBfi9JCW=f%r=cuMg&>1l+^vy0Etnb*36Q(?HBrQ>t4dp_=Opf-NQLy>F z6mwSa%$nt&9_g^`#rP%a^zx>stC`BCux0IY96aB(cCpCC@33o2zfm^I{e~&wm2a`z zZ_P^x(5P~V%Shj1*fi{~_M?mq)FxV)&T$zhwf}}E+vK!UJ(uDJ!ld5Sx{aavIZ%4U zzewUi$rm5AA1wxWG829J-EkKffLRyi+d)8{9&mW;E9Hb7ZhQO{6sbA!eY!^aLfZby zu$6|bh=c!5?IDTO#u{n;jBAx9I-VdkQtAOj3RkcVQ?ovC`{2O@c$WU~hzm;E*S_`l z@bGZ60H{27XljSB5Lp6E3q0#r_zcJ}@8HmKY^dgH5{>2hiROajz5jnB*e^awPE}sK YtL)N1Y7y2T5BLcudz2l^=4Qfw0k_$C9smFU literal 3135 zcmai1X*ARg7yplCFh-1hEX|m)rIE2zQr4NVM5IDO6j{ppAnS~2VvH>$MMykp6G=6Q zkX=KzvW+!8sO(F_4CeKGc)z~yIrrY*m-{>So_o(d_uizlwiY4~IS2p%B3738bNfjC zR|UcQw%O|q&tUe;gf$RS4Woh(FfM75AzvbGUBE#qfXTnorqhFFqiTgb$ z{{h*rk~lxp+=BCcZy=&)vTw{Oyx6%^ZMlPbv1KpAw)Od3zqQL$NjRW>;%is*Ga#{~7%fS6yF7xC+wO zZvIlt>+3r|kMLrlTP=a3$-Z&TAI7^yoHu@x6Y;QlT^;aZsIsv&W@2EaP^H@dYY<4B20G z>#AEbC3X$17$ZnaxmiaI4s^WO#pH1`GFu^#_&UADvwnNV1qT4;N6mr_4HRn z>QIYmSe-VE;qHoPV1oPwI8yTDld=_uuH-{(>^?Opc7w&+Ri`N2_Gj?yRa+6VL90o@ zQ;*48Gwz-5cei`mesDJAbmCXuQf0>EKQ%-o2~tgLye#8sCOjx{CFW@xvq8S>?&kL# zo+i?zp{xh=U5Q*(wS%*tu|8o^^?`xLp{sBE!yDM0#IkgE>5;!Mpcg+2qy7K+x$;4t zfI;EBS`&w%hsaXTXNevK`FZ!aj{bP?pTQp4R20rSQ`_23(WU#z^#TJE^}XKgT8%zN zju-VI<$<_)z0P_fwL=CJba|p$%X{LEGd*`)Qz>4F=Ej zncL&7(Kv?Psdv%3W6w2sx^8bp{mOZ4jbG_|tZ`-yHnn(IUZ5T05`tmA=@_O%RjY2- zN69|NnjPk?=5RB$^^&2Q>8Z}q-;1&@fpe%^L`b2}b6>#5Hm?9Yd`h2AXuN+zR5ldH zt9M{Lm|(j0iBuXcgI)eE`jNX+(1hg(yrf&S=UCmY_8^GMhARrC;d;|zeN zx>}vQzh}OVx^^8rkMl2ydnY(N^DgQja;=9KPu=eY1MPVq5f}WAd9{6kMH4$2lD_w@ zT6TWjvEr4I@53tc_8e%U=0lWkSDjRQrIb&h0PVMtXhmr_**VH9M(b@a!Nk40sjQCaJW)k8tK672^D_qqXfk!(N!=0$X|x9-O7-mjz+-RomkWTZ3UCrWybpzGtX|a z`i^iPXEm|Anb{3+a{uoe3^M|GzlIuTB0RWm5(#DNc~jw?? z64qezd#IY-M_=OyM`fI}1)3skIY+>jiMq>wf$tQ>2v2eu>uMn8&Z)0kz<_xr!lkpf z4S-K)W&Si+8)f+Phy?IVvakuJNYzI;EgAxS?4nNN#ZMo(QIT%mN^hQB`)ttFRhW2^ z7Z2;}(C0n1-TTY9IgKrct~j*5HD%={@k3-~FgtB|f28z}nv8t~&LoqS7qSW~$YYUV zX0BnCxIB-8tzQNlV*#-cUK~3KU5Sn#)PTr+1BtJ8%5c1V=)jM~(!9h+9fp!RlIxgQ z_i%F6>%fC+e(7G9l)Stjyu>Y{8q*0gbNtx7P9)A6ee&XuwXB+G0PAm$6*kXl!)X#~ zxMlm}m3!@mzd-UB{qF>nty;F=EaKNi0pL1R5>9w03BN?zu{fMZIGN*E;9+^*h9mS8 zH4U07Xb3ECDPJ23f7~%aO-_Sqj`(`qkK1cx83){aaoTM!c9Fg7IjiX%(%c*_uR#y= z$tVSqwRT!3DQr-(vzRd2`~GUejiL0g8q1O#;h}QGmHTh7uGJReOK(H@l^@!@I`DN# z1TQMu)_jk-ttk7_|=;JLek~`k51J2?K4&9jBDbYN^<^V+Y`# z_famG)YPJqcGA{IyNB+TJizkqBErJ08qtpNbeUyV7%vK;Rc+y(P(qs{#DXeDXxn$s z44K8^Rdd}t?6e*%NxW#6esCc(>`%`V^@KcjYtpaJf3)AGdV0HjVY1#7s26kYX_qlU z3n7-srknBSl19=mbn%F_dI?2D_^4F=rglWHc%9yWj3q92Qyn zoqVohIR9Yi+MOJ?@(4}RPcM7t)f)rvbS+!bEv%P<2ccbNNNJZ+F#wE$!YCEwG?+Ik zLRbi=tO}2w5JuD=IX2xjy+<-EJB#x#_ink{1x9J>UZu9=`pv`=F(bK?0fwVD1q8Zn z`2c?b4Yi8yT`^T{WelGxPYP0%az*@jdc~p((9(mOACU(KzqYb|B*L%YSf1rK-A`-m zY{~4fRYQW4wwt7wlFUz2y4xtxd*~8|ENfyJuL5U2a{W>TBWGmB^+I!!{WrWFs%m{?a&Wvm)^n1Yk-C+Y_tT5znAU5dB#MBL^l@k-MZK9>tIP=^c?*oEDE|Te C{obVj diff --git a/css/styles.css b/css/styles.css index 74c557e..2b87d0d 100644 --- a/css/styles.css +++ b/css/styles.css @@ -1416,3 +1416,32 @@ body::before { opacity: 0.72; flex: 0 0 auto; } +.tool[data-tool="ant_nest"] { --tool-icon: url("../assets/ui/tool_ant_nest.png"); } +.tool[data-tool="ant_nest"]::before { + content: ""; + background: var(--tool-icon) center / contain no-repeat; +} +.tool[data-tool="ant_nest"]::after { + content: ""; + background: var(--tool-icon) right -8px center / 54px 54px no-repeat; +} + +/* v15.7.2: object-faithful tool icons for ball and nest box. */ +.tool[data-tool="ball"] { --tool-icon: url("../assets/ui/tool_ball.png"); } +.tool[data-tool="ball"]::before, +.tool[data-tool="ball"]::after { + content: ""; + background: var(--tool-icon) center / contain no-repeat; + font-size: 0; +} +.tool[data-tool="ball"]::after { + background-position: right -8px center; + background-size: 54px 54px; + opacity: 0.10; +} +.tool[data-tool="nest_box"] { --tool-icon: url("../assets/ui/tool_nest_box.png"); } +.tool[data-tool="nest_box"]::after { + content: ""; + background: var(--tool-icon) right -8px center / 54px 54px no-repeat; + opacity: 0.10; +} diff --git a/index.html b/index.html index 1a7885d..9e55382 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ たりない観察 - +

    @@ -165,16 +167,17 @@
    - + - - - - + + + + + diff --git a/js/ants.js b/js/ants.js new file mode 100644 index 0000000..49a17b9 --- /dev/null +++ b/js/ants.js @@ -0,0 +1,403 @@ +"use strict"; + +const ANT_NEST_START_COUNT = 6; +const ANT_NEST_MAX_COUNT = 10; +const ANT_NEST_MAX_OUTSIDE = 3; +const ANT_WORKER_HP = 32; +const ANT_QUEEN_HP = 180; +const ANT_WORKER_RADIUS = 4.2; +const ANT_QUEEN_RADIUS = 9.5; +const ANT_WORKER_SEARCH_SPEED = 8.625; +const ANT_WORKER_RETURN_SPEED = 12.0; +const ANT_WORKER_RETURN_WEAK_SPEED = 6.0; +const ANT_WORKER_DRAG_SPEED = 4.125; +const ANT_QUEEN_SPEED = 9.0; + +function clampAntHp(v) { + return clamp(Number(v) || 0, 0, ANT_WORKER_HP); +} + +function buildAntWorkerPool(count = ANT_NEST_START_COUNT) { + const n = clamp(Math.round(Number(count) || 0), 0, ANT_NEST_MAX_COUNT); + return Array.from({ length: n }, () => ANT_WORKER_HP); +} + +function sanitizeAntWorkerPool(list, fallbackCount = 0) { + if (!Array.isArray(list)) return buildAntWorkerPool(fallbackCount); + const out = list.map(v => clampAntHp(v)).filter(v => v > 0.01); + return out.slice(0, ANT_NEST_MAX_COUNT); +} + +function ensureAntNestWorkerPool(nest) { + if (!nest || nest.type !== "ant_nest") return []; + if (!Array.isArray(nest.antWorkers)) { + nest.antWorkers = buildAntWorkerPool(nest.antCount ?? ANT_NEST_START_COUNT); + } else { + nest.antWorkers = sanitizeAntWorkerPool(nest.antWorkers, nest.antCount ?? nest.antWorkers.length); + } + return nest.antWorkers; +} + +function syncAntNestCount(worldRef, nest) { + if (!nest || nest.type !== "ant_nest") return 0; + ensureAntNestWorkerPool(nest); + const outside = (worldRef?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.homeId === nest.id).length; + nest.antCount = clamp((nest.antWorkers?.length || 0) + outside, 0, ANT_NEST_MAX_COUNT); + return nest.antCount; +} + +class AntActor { + constructor(worldRef, opts = {}) { + this.world = worldRef; + this.id = opts.id || (crypto.randomUUID ? crypto.randomUUID() : `ant-${Date.now()}-${Math.random()}`); + this.kind = opts.kind || "worker"; + this.homeId = opts.homeId || ""; + this.targetId = opts.targetId || ""; + this.x = Number.isFinite(opts.x) ? opts.x : 0; + this.y = Number.isFinite(opts.y) ? opts.y : 0; + this.vx = opts.vx || 0; + this.vy = opts.vy || 0; + this.r = opts.r || (this.kind === "queen" ? ANT_QUEEN_RADIUS : ANT_WORKER_RADIUS); + this.maxHp = Number.isFinite(opts.maxHp) ? opts.maxHp : (this.kind === "queen" ? ANT_QUEEN_HP : ANT_WORKER_HP); + this.hp = Number.isFinite(opts.hp) ? opts.hp : this.maxHp; + this.state = opts.state || (this.kind === "queen" ? "founding" : "search"); + this.age = opts.age || 0; + this.seed = opts.seed || Math.random() * 1000; + this.wanderAngle = opts.wanderAngle || rand(0, Math.PI * 2); + this.nextTurn = opts.nextTurn || rand(0.4, 1.6); + this.returnTimer = opts.returnTimer || 0; + this.foundingX = opts.foundingX; + this.foundingY = opts.foundingY; + this.foundingDelayUntil = Number.isFinite(opts.foundingDelayUntil) ? opts.foundingDelayUntil : -Infinity; + this.carryLogAt = opts.carryLogAt || -999; + this.foundingAttempts = opts.foundingAttempts || 0; + this.dead = Boolean(opts.dead); + } + + serialize() { + return { + id: this.id, kind: this.kind, homeId: this.homeId, targetId: this.targetId, + x: this.x, y: this.y, vx: this.vx, vy: this.vy, r: this.r, hp: this.hp, maxHp: this.maxHp, + state: this.state, age: this.age, seed: this.seed, wanderAngle: this.wanderAngle, + nextTurn: this.nextTurn, returnTimer: this.returnTimer, foundingX: this.foundingX, + foundingY: this.foundingY, foundingDelayUntil: this.foundingDelayUntil, carryLogAt: this.carryLogAt, foundingAttempts: this.foundingAttempts, dead: this.dead, + }; + } + + static from(worldRef, data) { + return new AntActor(worldRef, data || {}); + } + + homeNest() { + return (this.world?.items || []).find(it => it && !it.dead && it.id === this.homeId && it.type === "ant_nest") || null; + } + + targetTarinai() { + return (this.world?.tarinai || []).find(t => t && !t.dead && t.id === this.targetId) || null; + } + + activeHaulersForTarget() { + return (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId && a.targetId === this.targetId); + } + + isLeadHauler() { + const haulers = this.activeHaulersForTarget(); + if (!haulers.length) return true; + let lead = haulers[0]; + for (const a of haulers) if (String(a.id) < String(lead.id)) lead = a; + return lead === this; + } + + chooseTarget(maxDist = 56) { + let best = null; + let bestScore = Infinity; + for (const t of this.world?.tarinai || []) { + if (!t || t.dead || t.insideNestBoxId || t.isZunchiSlave) continue; + const d = distXY(this.x, this.y, t.x, t.y); + if (d > maxDist) continue; + if ((t.antDraggedTimer || 0) > 0 && (t.antDraggedBy || "") && t.antDraggedBy !== this.id) { + const haulers = (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId === t.id).length; + if (haulers >= ANT_NEST_MAX_OUTSIDE) continue; + } + const weak = clamp((100 - (t.energy || 0)) / 100, 0, 1); + const score = d - weak * 18 + stableUnit(`${this.id}:${t.id}`, "ant-prey") * 6; + if (score < bestScore) { + best = t; + bestScore = score; + } + } + return best; + } + + update(dt) { + if (this.dead) return; + this.age += dt; + if (this.kind === "queen") return this.updateQueen(dt); + return this.updateWorker(dt); + } + + updateWorker(dt) { + const home = this.homeNest(); + if (!home) { + this.dead = true; + return; + } + if (this.hp <= 0) { + this.dieAsCorpse(home); + return; + } + if (this.state === "drag") return this.updateDrag(dt, home); + if (this.state === "return") return this.updateReturn(dt, home); + this.updateSearch(dt, home); + } + + updateSearch(dt, home) { + const target = this.chooseTarget(52); + if (target) { + this.state = "drag"; + this.targetId = target.id; + this.carryLogAt = this.world?.time || 0; + target.antDraggedTimer = Math.max(target.antDraggedTimer || 0, 0.45); + target.antDraggedBy = this.id; + target.fearTimer = Math.max(target.fearTimer || 0, 0.55); + target.thought = "\u30a2\u30ea\u306b\u904b\u3070\u308c\u3066\u3044\u308b"; + this.world.drawListDirty = true; + return; + } + this.nextTurn -= dt; + if (this.nextTurn <= 0) { + const toHome = Math.atan2(home.y - this.y, home.x - this.x); + const far = distXY(this.x, this.y, home.x, home.y); + const bias = far > 220 ? 0.58 : 0.18; + this.wanderAngle = this.wanderAngle * (1 - bias) + toHome * bias + rand(-1.2, 1.2); + this.nextTurn = rand(0.7, 1.9); + } + const hpFactor = clamp(this.hp / ANT_WORKER_HP, 0.45, 1.0); + const speed = (ANT_WORKER_SEARCH_SPEED + Math.sin(this.age * 2.4 + this.seed) * 0.75) * hpFactor; + this.vx = Math.cos(this.wanderAngle) * speed; + this.vy = Math.sin(this.wanderAngle) * speed * 0.78; + this.x = clamp(this.x + this.vx * dt, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding); + this.y = clamp(this.y + this.vy * dt, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding); + if (distXY(this.x, this.y, home.x, home.y) > 220) this.state = "return"; + } + + returnToNest(home) { + if (!home || home.dead || home.type !== "ant_nest") { + this.dead = true; + return; + } + ensureAntNestWorkerPool(home).push(clampAntHp(this.hp)); + syncAntNestCount(this.world, home); + this.dead = true; + this.world.drawListDirty = true; + } + + updateReturn(dt, home) { + const d = distXY(this.x, this.y, home.x, home.y) || 1; + if (d < Math.max(16, home.r * 0.66)) { + this.returnToNest(home); + return; + } + const speed = this.hp <= 8 ? ANT_WORKER_RETURN_WEAK_SPEED : ANT_WORKER_RETURN_SPEED; + this.x += (home.x - this.x) / d * speed * dt; + this.y += (home.y - this.y) / d * speed * dt; + this.vx = (home.x - this.x) / d * speed; + this.vy = (home.y - this.y) / d * speed; + } + + updateDrag(dt, home) { + const target = this.targetTarinai(); + if (!target || target.dead || target.insideNestBoxId) { + this.targetId = ""; + this.state = "return"; + return; + } + const haulers = Math.max(1, this.activeHaulersForTarget().length); + const leadHauler = this.isLeadHauler(); + target.antDraggedTimer = Math.max(target.antDraggedTimer || 0, 0.35); + target.antDraggedBy = this.id; + target.state = "panic"; + target.sleeping = false; + target.target = null; + target.fearTimer = Math.max(target.fearTimer || 0, 0.36); + target.thought = "\u30a2\u30ea\u306b\u5de3\u3078\u904b\u3070\u308c\u3066\u3044\u308b"; + const dHome = distXY(target.x, target.y, home.x, home.y) || 1; + if (dHome < Math.max(18, home.r * 0.66)) { + this.world.completeAntHaul?.(home, target); + this.targetId = ""; + this.state = "return"; + return; + } + const hpFactor = clamp(this.hp / ANT_WORKER_HP, 0.45, 1.0); + const speed = ANT_WORKER_DRAG_SPEED * hpFactor; + const ux = (home.x - target.x) / dHome; + const uy = (home.y - target.y) / dHome; + if (leadHauler) { + target.x = clamp(target.x + ux * speed * dt, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding); + target.y = clamp(target.y + uy * speed * dt, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding); + target.energy = clamp((target.energy || 0) - dt * 0.028, 0, 100); + } + const offsetAngle = this.seed + this.age * 2.0 + (haulers > 1 ? this.activeHaulersForTarget().findIndex(a => a === this) * 1.7 : 0); + const ring = target.radius * (0.64 + 0.06 * Math.min(haulers, 3)); + this.x = target.x - ux * ring + Math.cos(offsetAngle) * target.radius * 0.24; + this.y = target.y - uy * ring * 0.72 + Math.sin(offsetAngle) * target.radius * 0.18; + this.vx = ux * speed; + this.vy = uy * speed; + + const aggression = Math.max(0, target.currentPersonality?.aggression || 0); + const aggressiveAttack = target.shouldApplyPersonalityBehavior?.("aggression", 1) || aggression >= 0.5 || target.state === "ant_attack"; + const struggle = aggressiveAttack + ? (1.25 + aggression * 1.6 + clamp((target.energy || 0) / 100, 0, 1) * 0.35) / Math.max(1, haulers * 0.9) + : (0.42 + clamp((target.energy || 0) / 100, 0, 1) * 0.18) / Math.max(1, haulers); + this.hp -= dt * struggle; + + if ((this.world.time || 0) - (this.carryLogAt || -999) > 8 && Math.random() < dt * 0.04) { + this.carryLogAt = this.world.time || 0; + this.world.log(`${target.name}\u304c\u30a2\u30ea\u306b\u5f15\u3063\u5f35\u3089\u308c\u3066\u3044\u308b\u3002`, "event"); + } + if (this.hp <= 0) this.dieAsCorpse(home); + } + + dieAsCorpse(home = null) { + if (this.dead) return; + this.dead = true; + const corpse = new Item("ant_corpse", this.x, this.y); + corpse.amount = 24; + corpse.workerSprite = this.workerSpriteId(); + this.world.items.push(corpse); + this.world.effects?.push(new Effect("zunchi_miasma", this.x, this.y - 4, { size: 10, life: 0.44, color: "rgba(82,61,42,0.28)" })); + if (home) syncAntNestCount(this.world, home); + this.world.updateItemCounts?.(); + this.world.drawListDirty = true; + } + + buildNestAtFoundingSpot(force = false) { + if (!this.world) return null; + const base = new Item("ant_nest", this.foundingX, this.foundingY); + let spot = null; + if (this.world.findPlacementSpot) { + spot = this.world.findPlacementSpot(base, { allowOriginal: true, maxRadius: force ? 520 : 220, attempts: force ? 160 : 72 }); + } + if (!spot && force) { + spot = this.world.placementClampPointFor ? this.world.placementClampPointFor(base, this.foundingX, this.foundingY) : { x: this.foundingX, y: this.foundingY }; + } + if (!spot) return null; + base.x = spot.x; + base.y = spot.y; + base.antCount = ANT_NEST_START_COUNT; + base.antWorkers = buildAntWorkerPool(ANT_NEST_START_COUNT); + if (!force && this.world.placementBlocked?.(base)) return null; + this.world.items.push(base); + this.world.itemCounts[base.type] = (this.world.itemCounts[base.type] || 0) + 1; + this.world.rebuildSpatial?.(); + this.world.drawListDirty = true; + this.world.log("\u5973\u738b\u30a2\u30ea\u304c\u65b0\u3057\u3044\u30a2\u30ea\u306e\u5de3\u3092\u4f5c\u3063\u305f\u3002", "event"); + return base; + } + + updateQueen(dt) { + if (!Number.isFinite(this.foundingX) || !Number.isFinite(this.foundingY)) { + const p = this.world?.findAntNestFoundingSpot?.(this) || { x: this.x + rand(-140, 140), y: this.y + rand(-100, 100) }; + this.foundingX = p.x; + this.foundingY = p.y; + } + let d = distXY(this.x, this.y, this.foundingX, this.foundingY) || 1; + if (d < 20) { + if ((this.world?.time || 0) < (this.foundingDelayUntil || -Infinity)) { + this.vx = 0; + this.vy = 0; + return; + } + this.foundingAttempts += 1; + const placed = this.buildNestAtFoundingSpot(this.foundingAttempts >= 8); + if (placed) { + this.dead = true; + return; + } + const retrySpot = this.world?.findAntNestFoundingSpot?.({ x: this.x, y: this.y }) || this.world?.findAntNestFoundingSpot?.(this.homeNest?.() || this); + if (retrySpot) { + this.foundingX = retrySpot.x; + this.foundingY = retrySpot.y; + } else { + this.wanderAngle += rand(-1.4, 1.4); + this.foundingX = clamp(this.x + Math.cos(this.wanderAngle) * 90, 56, this.world.w - 56); + this.foundingY = clamp(this.y + Math.sin(this.wanderAngle) * 70, 56, this.world.h - 56); + } + d = distXY(this.x, this.y, this.foundingX, this.foundingY) || 1; + } + const speed = ANT_QUEEN_SPEED; + this.x += (this.foundingX - this.x) / d * speed * dt; + this.y += (this.foundingY - this.y) / d * speed * dt; + this.vx = (this.foundingX - this.x) / d * speed; + this.vy = (this.foundingY - this.y) / d * speed; + } + + workerSpriteId() { + return "ant_worker"; + } + + spriteId() { + return this.kind === "queen" ? "ant_queen" : this.workerSpriteId(); + } + + draw(ctx, time = 0, lighting = null) { + if (this.dead) return; + const id = this.spriteId(); + const img = typeof getRenderableImage === "function" ? getRenderableImage(id, id) : images.get(id); + const lightState = lighting || getLightingState(this.world); + ctx.save(); + const shadow = projectedShadowParams(lightState, this.kind === "queen" ? 0.58 : 0.26); + drawProjectedShadow(ctx, this.x, this.y + this.r * 0.62, this.r * 1.5, this.r * 0.30, { ...shadow, alpha: shadow.alpha * 0.72 }); + ctx.translate(this.x, this.y); + const angle = this.kind === "queen" + ? Math.atan2((this.foundingY ?? this.y) - this.y, (this.foundingX ?? this.x) - this.x) + : Math.atan2(this.vy || 0, this.vx || 1); + ctx.rotate(angle); + if (img) { + const w = this.kind === "queen" ? this.r * 4.1 : this.r * 3.8; + const metrics = getImageMetrics(id); + const h = w * (metrics?.ratio || 0.52); + ctx.globalAlpha = 0.96; + ctx.drawImage(img, -w * 0.5, -h * 0.58, w, h); + } else { + ctx.fillStyle = "rgba(44,44,44,0.92)"; + ctx.beginPath(); + ctx.ellipse(0, 0, this.r * 1.3, this.r * 0.72, 0, 0, Math.PI * 2); + ctx.fill(); + ctx.beginPath(); + ctx.arc(this.r * 1.15, -this.r * 0.05, this.r * 0.46, 0, Math.PI * 2); + ctx.fill(); + } + ctx.restore(); + this.drawHealthBar(ctx); + } + + drawHealthBar(ctx) { + const maxHp = Math.max(1, this.maxHp || (this.kind === "queen" ? ANT_QUEEN_HP : ANT_WORKER_HP)); + const pct = clamp((this.hp || 0) / maxHp, 0, 1); + const bw = this.kind === "queen" ? 28 : 18; + const bh = this.kind === "queen" ? 4 : 3; + const y = this.y - this.r * (this.kind === "queen" ? 2.0 : 2.6); + ctx.save(); + ctx.fillStyle = "rgba(255,252,242,0.86)"; + roundedRect(ctx, this.x - bw / 2 - 1.5, y - 1.5, bw + 3, bh + 3, 4); + ctx.fill(); + ctx.fillStyle = "rgba(63,50,42,0.30)"; + roundedRect(ctx, this.x - bw / 2, y, bw, bh, 3); + ctx.fill(); + ctx.fillStyle = pct > 0.45 ? "rgba(118,190,80,0.88)" : (pct > 0.20 ? "rgba(232,172,68,0.90)" : "rgba(218,82,70,0.92)"); + roundedRect(ctx, this.x - bw / 2, y, bw * pct, bh, 3); + ctx.fill(); + ctx.restore(); + } +} + +window.AntActor = AntActor; +window.ANT_NEST_START_COUNT = ANT_NEST_START_COUNT; +window.ANT_NEST_MAX_COUNT = ANT_NEST_MAX_COUNT; +window.ANT_NEST_MAX_OUTSIDE = ANT_NEST_MAX_OUTSIDE; +window.ANT_WORKER_HP = ANT_WORKER_HP; +window.ANT_QUEEN_HP = ANT_QUEEN_HP; +window.buildAntWorkerPool = buildAntWorkerPool; +window.ensureAntNestWorkerPool = ensureAntNestWorkerPool; +window.syncAntNestCount = syncAntNestCount; diff --git a/js/data.js b/js/data.js index 6c4fe60..fe68986 100644 --- a/js/data.js +++ b/js/data.js @@ -32,6 +32,8 @@ const SPRITES = [ const DECOR_ASSETS = [ { id: "zunchi", path: "assets/objects/zunchi.png" }, { id: "zunchi_02", path: "assets/objects/zunchi_02.png" }, + { id: "ant_queen", path: "assets/objects/ant_queen.png" }, + { id: "ant_worker", path: "assets/objects/ant_worker.png" }, ]; const TOOL_DEFINITIONS = Object.freeze({ @@ -51,6 +53,7 @@ const TOOL_DEFINITIONS = Object.freeze({ stone: { id: "stone", itemType: "stone", label: "\u77f3", placeable: true, scalable: true, radius: 20, amount: 999, icon: "assets/ui/tool_stone.png", tooltip: "\u91cd\u3044\u77f3\u3002\u843d\u3068\u3059\u3068\u5371\u306a\u3044\u3002" }, bed: { id: "bed", itemType: "bed", label: "\u5e72\u8349\u5bdd\u5e8a", placeable: true, scalable: false, radius: 37, amount: 999, icon: "assets/ui/tool_bed.png", tooltip: "\u8fd1\u304f\u3067\u7720\u308b\u3002\u4f53\u529b\u304c\u56de\u5fa9\u3059\u308b\u3002" }, nest_box: { id: "nest_box", itemType: "nest_box", label: "\u5de3\u7bb1", placeable: true, scalable: false, radius: 42, amount: 999, icon: "assets/ui/tool_nest_box.png", collisionShape: "nest_box_3x3", tooltip: "\u3044\u308b\u3060\u3051\u3067\u30b9\u30c8\u30ec\u30b9\u4f4e\u6e1b\u3002\u7720\u308b\u3068\u7761\u7720\u306e\u8cea\u304c\u4e0a\u304c\u308b\u3002" }, + ant_nest: { id: "ant_nest", itemType: "ant_nest", label: "\u30a2\u30ea\u306e\u5de3", placeable: true, scalable: false, radius: 17, amount: 999, icon: "assets/ui/tool_ant_nest.png", collisionShape: "circle", tooltip: "\u50cd\u304d\u30a2\u30ea\u304c\u305f\u308a\u306a\u3044\u3092\u63a2\u3057\u3001\u5de3\u3078\u904b\u3076\u3002" }, ball: { id: "ball", itemType: "ball", label: "\u30dc\u30fc\u30eb", placeable: true, scalable: false, radius: 18, amount: 999, icon: "assets/ui/tool_ball.png", collisionShape: "circle", tooltip: "\u305f\u308a\u306a\u3044\u304c\u904a\u3076\u305f\u3081\u306e\u304a\u3082\u3061\u3083\u3002" }, firecracker: { id: "firecracker", itemType: "firecracker", label: "\u7206\u7af9", placeable: true, scalable: true, radius: 15, amount: 999, icon: "assets/ui/tool_firecracker.png", tooltip: "\u7206\u767a\u3092\u8d77\u3053\u3059\u3002" }, fence_v: { id: "fence_v", itemType: "fence_v", label: "\u7e26\u306e\u67f5", placeable: true, scalable: true, radius: 42, amount: 999, icon: "assets/ui/tool_fence_v.png", collisionShape: "rect", tooltip: "\u305f\u308a\u306a\u3044\u3092\u901a\u305b\u3093\u307c\u3059\u308b\u3002" }, @@ -59,6 +62,7 @@ const TOOL_DEFINITIONS = Object.freeze({ trace: { id: "trace", itemType: "trace", label: "\u8db3\u8de1", placeable: false, scalable: false, radius: 16, amount: 220, simulationOnly: true }, splat: { id: "splat", itemType: "splat", label: "\u3057\u3076\u304d", placeable: false, scalable: false, radius: 26, amount: 260, simulationOnly: true }, food: { id: "food", itemType: "food", label: "\u98df\u3079\u7269", placeable: false, scalable: false, radius: 14, amount: 85, simulationOnly: true }, + ant_corpse: { id: "ant_corpse", itemType: "ant_corpse", label: "\u30a2\u30ea\u306e\u6b7b\u9ab8", placeable: false, scalable: false, radius: 8, amount: 24, simulationOnly: true }, }); function toolDefinition(id = "") { @@ -125,6 +129,8 @@ const ALPHA_BOUNDS = { zunchi_slave: { x: 17, y: 22, w: 478, h: 431, imageW: 512, imageH: 468 }, zunchi: { x: 0, y: 0, w: 236, h: 178, imageW: 236, imageH: 178 }, zunchi_02: { x: 8, y: 63, w: 220, h: 105, imageW: 236, imageH: 178 }, + ant_queen: { x: 0, y: 0, w: 300, h: 155, imageW: 300, imageH: 155 }, + ant_worker: { x: 0, y: 0, w: 140, h: 72, imageW: 140, imageH: 72 }, }; const NEEDS = ["\u98df\u3079\u7269", "\u4ef2\u9593", "\u7720\u308a", "\u52c7\u6c17", "\u6c34", "\u9759\u3051\u3055", "\u3042\u305f\u305f\u304b\u3055", "\u610f\u5473", "\u7a7a\u9593", "\u81ea\u4fe1"]; diff --git a/js/health.js b/js/health.js index 1e3f7a9..33fc663 100644 --- a/js/health.js +++ b/js/health.js @@ -17,6 +17,7 @@ const HEALTH = (() => { explosionDisease: "\u7206\u767a\u75c5", fightDisease: "\u304d\u305a\u3064\u304d\u75c5", zunchiDisease: "\u305a\u3093\u3061\u75c5", + antEaten: "\u30a2\u30ea\u306b\u98df\u3079\u3089\u308c\u305f", }); const DISEASE_RE = /([^\u3001\u3002\s]+\u75c5)/; @@ -33,6 +34,7 @@ const HEALTH = (() => { if (/\u7206\u767a\u75c5|explosion.*disease/.test(text)) return CAUSES.explosionDisease; if (/\u3051\u3093\u304b\u75c5|\u304d\u305a\u3064\u304d\u75c5|fight.*disease/.test(text)) return CAUSES.fightDisease; if (/\u305a\u3093\u3061\u75c5|zunchi_sick|zunchi.*\u75c5/.test(text)) return CAUSES.zunchiDisease; + if (/\u30a2\u30ea\u306b\u98df\u3079\u3089\u308c\u305f|eaten.*ant|ant.*eaten/.test(text)) return CAUSES.antEaten; if (/\u75c5/.test(text)) { const disease = text.match(DISEASE_RE); return disease ? disease[1] : CAUSES.zunchiDisease; diff --git a/js/items.js b/js/items.js index 0e78cf4..6a666c5 100644 --- a/js/items.js +++ b/js/items.js @@ -58,6 +58,20 @@ class Item { this.freshness = 1; this.zunchiVariant = stableUnit(this.id, "zunchi-variant") < 0.5 ? "zunchi" : "zunchi_02"; } + if (type === "ant_nest") { + this.antCount = ANT_NEST_START_COUNT || 6; + this.antSpawnTimer = rand(0.6, 2.2); + this.antSpawnCooldown = rand(0.8, 2.4); + this.antWorkers = typeof buildAntWorkerPool === "function" + ? buildAntWorkerPool(this.antCount) + : Array.from({ length: this.antCount }, () => ANT_WORKER_HP || 32); + this.queenSpawnAt = -999; + } + if (type === "ant_corpse") { + this.amount = 24; + this.workerSprite = "ant_worker"; + this.decayTimer = 0; + } if (type === "firecracker") { this.fuseTimer = 5; this.fuseMax = 5; @@ -84,6 +98,7 @@ class Item { if (["sweet", "love_mochi", "fight_mochi", "sleep_drug"].includes(this.type) && !Number.isFinite(this.foodServingsRemaining)) this.amount -= dt * 0.12; if (this.type === "trace") this.amount -= dt * 1.35; if (this.type === "splat") this.amount -= dt * 1.05; + if (this.type === "ant_corpse") this.amount -= dt * 0.018; if (this.type === "firecracker") { this.fuseTimer = Math.max(0, (this.fuseTimer ?? 5) - dt); if (this.fuseTimer <= 0) { @@ -460,7 +475,8 @@ class Item { comfort: this.comfort, wear: this.wear, crawlOpen: this.crawlOpen, zunchiVariant: this.zunchiVariant, toolSize: this.toolSize, foodServingScale: this.foodServingScale, foodServingsMax: this.foodServingsMax, foodServingsRemaining: this.foodServingsRemaining, blastScale: this.blastScale, fuseTimer: this.fuseTimer, fuseMax: this.fuseMax, dropTimer: this.dropTimer, dropMax: this.dropMax, vx: this.vx, vy: this.vy, prevX: this.prevX, prevY: this.prevY, spin: this.spin, spinVelocity: this.spinVelocity, lastKickedAt: this.lastKickedAt, lastKickerId: this.lastKickerId, - lastPokedAt: this.lastPokedAt, pokeCombo: this.pokeCombo, lastPokeAngle: this.lastPokeAngle + lastPokedAt: this.lastPokedAt, pokeCombo: this.pokeCombo, lastPokeAngle: this.lastPokeAngle, + antCount: this.antCount, antSpawnTimer: this.antSpawnTimer, antSpawnCooldown: this.antSpawnCooldown, antWorkers: Array.isArray(this.antWorkers) ? this.antWorkers.slice() : undefined, queenSpawnAt: this.queenSpawnAt, workerSprite: this.workerSprite, decayTimer: this.decayTimer }; } static from(o) { @@ -511,6 +527,22 @@ class Item { it.freshness = 1; it.zunchiVariant = "zunchi"; } + if (type === "ant_nest") { + it.antCount = Number.isFinite(o.antCount) ? clamp(Math.round(o.antCount), 0, ANT_NEST_MAX_COUNT || 10) : (ANT_NEST_START_COUNT || 6); + it.antSpawnTimer = o.antSpawnTimer ?? rand(0.6, 2.2); + it.antSpawnCooldown = o.antSpawnCooldown ?? rand(0.8, 2.4); + const legacyPool = Array.isArray(o.antWorkers) ? o.antWorkers : (Array.isArray(o.workerHpPool) ? o.workerHpPool : null); + it.antWorkers = Array.isArray(legacyPool) + ? legacyPool.map(v => clamp(Number(v) || ANT_WORKER_HP || 32, 0.1, ANT_WORKER_HP || 32)).slice(0, ANT_NEST_MAX_COUNT || 10) + : (typeof buildAntWorkerPool === "function" + ? buildAntWorkerPool(it.antCount) + : Array.from({ length: it.antCount }, () => ANT_WORKER_HP || 32)); + it.queenSpawnAt = Number.isFinite(o.queenSpawnAt) ? o.queenSpawnAt : -999; + } + if (type === "ant_corpse") { + it.workerSprite = o.workerSprite || "ant_worker"; + it.decayTimer = o.decayTimer || 0; + } if (type === "firecracker") { it.fuseTimer = 5; it.fuseMax = 5; @@ -541,6 +573,22 @@ class Item { it.pokeCombo = o.pokeCombo ?? it.pokeCombo ?? 0; it.lastPokeAngle = o.lastPokeAngle ?? it.lastPokeAngle ?? rand(0, Math.PI * 2); it.zunchiVariant = o.zunchiVariant || it.zunchiVariant || "zunchi"; + it.antCount = Number.isFinite(o.antCount) ? clamp(Math.round(o.antCount), 0, ANT_NEST_MAX_COUNT || 10) : it.antCount; + it.antSpawnTimer = o.antSpawnTimer ?? it.antSpawnTimer; + it.antSpawnCooldown = o.antSpawnCooldown ?? it.antSpawnCooldown; + if (type === "ant_nest") { + const legacyPool = Array.isArray(o.antWorkers) ? o.antWorkers : (Array.isArray(o.workerHpPool) ? o.workerHpPool : null); + if (Array.isArray(legacyPool)) { + it.antWorkers = legacyPool.map(v => clamp(Number(v) || 0, 0, ANT_WORKER_HP || 32)).filter(v => v > 0).slice(0, ANT_NEST_MAX_COUNT || 10); + } else if (!Array.isArray(it.antWorkers)) { + it.antWorkers = typeof buildAntWorkerPool === "function" + ? buildAntWorkerPool(it.antCount || (ANT_NEST_START_COUNT || 6)) + : Array.from({ length: it.antCount || (ANT_NEST_START_COUNT || 6) }, () => ANT_WORKER_HP || 32); + } + it.queenSpawnAt = Number.isFinite(o.queenSpawnAt) ? o.queenSpawnAt : (it.queenSpawnAt ?? -999); + } + it.workerSprite = o.workerSprite || it.workerSprite; + it.decayTimer = o.decayTimer ?? it.decayTimer; it.toolSize = o.toolSize || it.toolSize || "medium"; it.foodServingScale = o.foodServingScale || it.foodServingScale || ({ small: 0.68, medium: 1.0, large: 1.48 }[it.toolSize] || 1); if (isServingFoodType(it.type)) { @@ -779,6 +827,49 @@ class Item { ctx.ellipse(randSeed(this.seed + i, -this.r * 0.84, this.r * 0.84), randSeed(this.seed + 20 + i, this.r * 0.32, this.r * 0.68), this.r * 0.26, this.r * 0.045, randSeed(this.seed + 40 + i, -0.7, 0.7), 0, Math.PI * 2); ctx.fill(); } + } else if (this.type === "ant_nest") { + const count = clamp(Math.round(this.antCount ?? ANT_NEST_START_COUNT ?? 6), 0, ANT_NEST_MAX_COUNT ?? 10); + ctx.fillStyle = styleNight ? "#5e4634" : (styleWarm ? "#956b42" : "#77583a"); + ctx.strokeStyle = styleNight ? "rgba(43,32,26,0.78)" : "rgba(72,48,31,0.72)"; + ctx.lineWidth = 2.2; + ctx.beginPath(); + ctx.ellipse(0, 8, this.r * 1.35, this.r * 0.78, 0.08, 0, Math.PI * 2); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = styleNight ? "#211a17" : "#30231d"; + ctx.beginPath(); + ctx.ellipse(0, 2, this.r * 0.58, this.r * 0.36, 0, 0, Math.PI * 2); + ctx.fill(); + ctx.fillStyle = "rgba(38,37,35,0.88)"; + for (let i = 0; i < Math.min(6, count); i++) { + const ax = randSeed(this.seed + i * 11, -this.r * 1.0, this.r * 1.0); + const ay = randSeed(this.seed + i * 17, -this.r * 0.45, this.r * 0.55); + ctx.beginPath(); + ctx.ellipse(ax, ay, 3.4, 2.1, randSeed(this.seed + i * 23, -0.8, 0.8), 0, Math.PI * 2); + ctx.fill(); + } + ctx.fillStyle = "rgba(255,248,220,0.82)"; + ctx.font = "bold 10px ui-rounded, sans-serif"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(`${count}`, 0, this.r * 1.25); + } else if (this.type === "ant_corpse") { + const img = typeof getRenderableImage === "function" ? getRenderableImage("ant_worker", "ant_worker") : images.get("ant_worker"); + ctx.save(); + ctx.rotate((stableUnit(this.id || this.seed, "ant-corpse-rot") - 0.5) * 0.26); + ctx.scale(1, -1); + ctx.globalAlpha *= clamp((this.amount || 0) / 24, 0.35, 1); + if (img) { + const w = this.r * 3.9; + const metrics = getImageMetrics("ant_worker"); + const h = w * (metrics?.ratio || 0.52); + ctx.drawImage(img, -w * 0.5, -h * 0.55, w, h); + } else { + ctx.fillStyle = "rgba(42,39,35,0.85)"; + ctx.beginPath(); + ctx.ellipse(0, 0, this.r * 1.35, this.r * 0.72, 0, 0, Math.PI * 2); + ctx.fill(); + } + ctx.restore(); } else if (this.type === "ball") { const speed = Math.hypot(this.vx || 0, this.vy || 0); const moving = clamp(speed / 260, 0, 1); diff --git a/js/tarinai.js b/js/tarinai.js index 3cfdd80..5cfaf88 100644 --- a/js/tarinai.js +++ b/js/tarinai.js @@ -952,7 +952,7 @@ class Tarinai { const low = this.lowHealthSprite(); if (low === "stretch") return low; if (this.defeatedTimer > 0.04) return this.variantSprite("flee"); - if (this.state === "intimidate" || this.intimidateTimer > 0.04) return this.variantSprite("intimidate"); + if (this.state === "intimidate" || this.state === "ant_intimidate" || this.intimidateTimer > 0.04) return this.variantSprite("intimidate"); if (this.state === "panic" || this.state === "cursor_enemy" || this.fearTimer > 0.08 || this.intimidatedTimer > 0.08) return this.variantSprite("fear"); if (this.state === "fight" || this.fightTimer > 0.04) return "angry"; if (this.stress > 62 || (this.stress > 50 && this.mood < 46)) return this.variantSprite("stress"); @@ -1377,6 +1377,40 @@ class Tarinai { return; } + const nearbyAnts = (this.world.ants || []).filter(a => a && !a.dead && distXY(this.x, this.y, a.x, a.y) <= (a.kind === "queen" ? 112 : 82)); + let nearestAnt = null; + let nearestAntDist = Infinity; + for (const ant of nearbyAnts) { + const ad = distXY(this.x, this.y, ant.x, ant.y); + if (ad < nearestAntDist) { + nearestAnt = ant; + nearestAntDist = ad; + } + } + if (nearestAnt) { + const aggressiveToAnts = this.shouldApplyPersonalityBehavior("aggression", 1); + if (aggressiveToAnts && this.energy > 12 && this.fightTimer <= 0.04 && this.defeatedTimer <= 0.04) { + if (nearestAntDist < Math.max(36, this.radius + (nearestAnt.r || 4) + 8) && Math.random() < dt * 0.28) { + // Intimidation has no effect on ants. This is only a visible reaction. + this.state = "ant_intimidate"; + this.target = nearestAnt; + this.bubble("!", 0.9, "rgba(145,68,52,0.78)"); + this.thought = "\u30a2\u30ea\u3092\u5a01\u5687\u3057\u3066\u3044\u308b"; + return; + } + this.state = "ant_attack"; + this.target = nearestAnt; + this.goodMode = "angry"; + this.thought = "\u30a2\u30ea\u3092\u653b\u6483\u3057\u3066\u3044\u308b"; + return; + } + this.state = "panic"; + this.target = this.panicDestination(nearestAnt); + this.fearTimer = Math.max(this.fearTimer, 0.34); + this.thought = "\u30a2\u30ea\u304b\u3089\u9003\u3052\u3066\u3044\u308b"; + return; + } + const dayP = this.world.dayProgress(); const personalSleep = this.sleepStart < this.sleepEnd ? dayP >= this.sleepStart && dayP < this.sleepEnd @@ -1581,7 +1615,7 @@ class Tarinai { } if (this.hunger > 62) { - const itemTypes = this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass"]; + const itemTypes = this.isZunchiSlave ? ["zunchi"] : ["sweet", "love_mochi", "fight_mochi", "sleep_drug", "grass", "ant_corpse"]; const item = this.world.nearest(this, itemTypes, 420); if (item) { this.state = "seek_food"; @@ -1744,6 +1778,29 @@ class Tarinai { break; } + if (canBite && it.type === "ant_corpse") { + const bite = Math.min(it.amount, rand(3.2, 5.4)); + if (bite > 0) { + this.state = "eat"; + this.target = it; + this.vx *= Math.pow(0.18, dt * 60); + this.vy *= Math.pow(0.18, dt * 60); + it.amount -= bite; + this.hunger -= bite * 0.62; + this.recoverHealth(bite * 0.12); + this.stress = clamp(this.stress + bite * 0.05 * this.personalityProfile().fear, 0, 130); + this.eatTimer = Math.max(this.eatTimer, 0.26); + this.eatCooldown = rand(0.75, 1.25); + this.bubble("\u3082\u3050", 2.2, "rgba(72,60,48,0.78)"); + const mouth = this.mouthPosition(it); + this.world.spawnEatEffect(mouth.x, mouth.y, "#4a3f36"); + this.lastMealColor = "#4a3f36"; + this.makePoop(bite * 0.08); + if (this.world.time > this.nextEatSound) { audio.eat(); this.nextEatSound = this.world.time + 0.62; } + break; + } + } + if (it.type === "zunchi") { const touch = clamp(1 - d / (this.radius + it.r + 12), 0, 1); if (!this.isZunchiSlave) { @@ -2019,7 +2076,7 @@ class Tarinai { return; } - if (this.intimidateTimer > 0.04 || this.state === "intimidate") { + if (this.intimidateTimer > 0.04 || this.state === "intimidate" || this.state === "ant_intimidate") { this.vx *= Math.pow(0.22, dt * 60); this.vy *= Math.pow(0.22, dt * 60); return; @@ -2083,6 +2140,19 @@ class Tarinai { strength = headbutt > -0.15 ? 2.65 : 0.65; sign = headbutt > -0.15 ? 1 : -1; } + } else if (this.state === "ant_attack") { + strength = d < this.radius + ((this.target && this.target.r) || 4) + 6 ? 0.18 : 1.32; + sign = 1; + if (d < this.radius + ((this.target && this.target.r) || 4) + 10) { + const aggression = Math.max(0, this.currentPersonality?.aggression || 0); + if ((this.world.time || 0) >= (this.nextAntAttackAt || 0)) { + this.nextAntAttackAt = (this.world.time || 0) + 0.34; + if (Number.isFinite(this.target.hp)) this.target.hp = Math.max(0, this.target.hp - (4.6 + aggression * 3.4)); + this.fearTimer = Math.max(this.fearTimer, 0.12); + this.thought = "\u30a2\u30ea\u3092\u653b\u6483\u3057\u3066\u3044\u308b"; + if (Math.random() < 0.55) this.bubble("!", 0.8, "rgba(145,68,52,0.76)"); + } + } } ax += (dx / d) * baseSpeed * sign * strength; ay += (dy / d) * baseSpeed * sign * strength; diff --git a/js/world.js b/js/world.js index c5dbe67..44c933a 100644 --- a/js/world.js +++ b/js/world.js @@ -15,6 +15,7 @@ class World { this.toolSizes = {}; this.tarinai = []; this.items = []; + this.ants = []; this.effects = []; this.logs = []; this.eventCounters = {}; @@ -319,6 +320,7 @@ class World { this.toolSizes = this.toolSizes || {}; this.tarinai = []; this.items = []; + this.ants = []; this.effects = []; this.logs = []; this.eventCounters = {}; @@ -956,6 +958,37 @@ class World { } } + damageAntsInRadius(x, y, radius, damageFn, reason = "", opts = {}) { + let hit = 0; + for (const ant of this.ants || []) { + if (!ant || ant.dead) continue; + const d = Math.max(1, distXY(ant.x, ant.y, x, y)); + if (d > radius + (ant.r || 4)) continue; + const p = clamp(1 - d / Math.max(1, radius), 0, 1); + if (p <= 0 && d > radius) continue; + const damage = typeof damageFn === "function" ? damageFn(p, ant, d) : Number(damageFn || 0); + if (damage > 0) ant.hp = Math.max(0, (ant.hp ?? ant.maxHp ?? ANT_WORKER_HP ?? 32) - damage); + if (opts.push) { + let nx = (ant.x - x) / d; + let ny = (ant.y - y) / d; + if (!Number.isFinite(nx) || !Number.isFinite(ny) || Math.abs(nx) + Math.abs(ny) < 0.001) { + const a = rand(0, Math.PI * 2); + nx = Math.cos(a); + ny = Math.sin(a); + } + const push = typeof opts.push === "function" ? opts.push(p, ant, d) : Number(opts.push || 0); + ant.vx = (ant.vx || 0) + nx * push; + ant.vy = (ant.vy || 0) + ny * push; + ant.x = clamp(ant.x + nx * Math.min(18, push * 0.018), CONFIG.worldPadding, this.w - CONFIG.worldPadding); + ant.y = clamp(ant.y + ny * Math.min(18, push * 0.018), CONFIG.worldPadding, this.h - CONFIG.worldPadding); + } + hit += 1; + if (ant.hp <= 0 && ant.dieAsCorpse) ant.dieAsCorpse(ant.homeNest?.()); + } + if (hit > 0) this.drawListDirty = true; + return hit; + } + explodeFirecracker(it) { if (!it || it.dead || it.type !== "firecracker") return; it.amount = 0; @@ -1026,6 +1059,9 @@ class World { if (!t.dead && p > 0.22 && Math.random() < 0.035 * p) t.infectExplosionDisease?.(it); if (!t.dead && Math.random() < 0.45) this.spawnBubble(t.x, t.y - t.radius * 1.35, "\u306f\u3041\u3041\u3041\uff01", "rgba(84,66,86,0.80)"); } + this.damageAntsInRadius(x, y, blastRadius, p => 5 + p * 18, "\u7206\u7af9", { + push: p => (260 + (p * p * 0.55 + p * 0.45) * 920) * 0.42 * (it.blastScale || 1), + }); let blastedBalls = 0; for (const ball of this.items) { if (!ball || ball.dead || ball.type !== "ball") continue; @@ -1375,9 +1411,12 @@ class World { t.fallDir = nx >= 0 ? 1 : -1; hit += 1; } + const antHit = this.damageAntsInRadius(it.x, it.y, radius + 48, p => damage * (0.35 + p * 0.65), isStone ? "\u77f3\u304c\u843d\u3061\u305f" : "\u843d\u3061\u3066\u304d\u305f\u9053\u5177\u306b\u5f53\u305f\u3063\u305f", { + push: p => push * (0.35 + p), + }); this.effects.push(new Effect("ring", it.x, it.y, { size: isStone ? 32 : 18, life: 0.34, color: isStone ? "rgba(128,96,58,0.76)" : "rgba(174,128,70,0.52)" })); - if (hit > 0) this.spawnFallEffect(it.x, it.y + (it.r || 12) * 0.6, isStone ? 0.9 : 0.45); - if (isStone && hit > 0) audio.poke(); + if (hit > 0 || antHit > 0) this.spawnFallEffect(it.x, it.y + (it.r || 12) * 0.6, isStone ? 0.9 : 0.45); + if (isStone && (hit > 0 || antHit > 0)) audio.poke(); if (hit > 0) this.log(`${isStone ? "\u77f3" : "\u9053\u5177"}\u304c\u843d\u3061\u3001${hit}\u5339\u306e\u305f\u308a\u306a\u3044\u304c\u5dfb\u304d\u8fbc\u307e\u308c\u305f\u3002`, "accident"); } @@ -2055,10 +2094,13 @@ class World { sortedDrawList() { if (!this.drawList) this.drawList = []; - if (this.drawListDirty || this.drawList.length !== this.tarinai.length) { + const antCount = (this.ants || []).filter(a => a && !a.dead).length; + const tarinaiCount = (this.tarinai || []).filter(t => t && !t.dead).length; + if (this.drawListDirty || this.drawList.length !== tarinaiCount + antCount) { this.drawList.length = 0; - for (const t of this.tarinai) if (!t.dead) this.drawList.push(t); - this.drawList.sort((a, b) => a.y - b.y); + for (const t of this.tarinai || []) if (t && !t.dead) this.drawList.push(t); + for (const a of this.ants || []) if (a && !a.dead) this.drawList.push(a); + this.drawList.sort((a, b) => (a.y || 0) - (b.y || 0)); this.drawListDirty = false; } return this.drawList; @@ -2166,6 +2208,114 @@ class World { this.tarinai.length = write; } + compactAnts() { + if (!this.ants) this.ants = []; + let write = 0; + for (let read = 0; read < this.ants.length; read++) { + const a = this.ants[read]; + if (a && !a.dead) this.ants[write++] = a; + } + if (this.ants.length !== write) this.drawListDirty = true; + this.ants.length = write; + } + + updateAnts(dt) { + if (!this.ants) this.ants = []; + const nests = (this.items || []).filter(it => it && !it.dead && it.type === "ant_nest"); + for (const nest of nests) { + if (typeof ensureAntNestWorkerPool === "function") ensureAntNestWorkerPool(nest); + if (!Number.isFinite(nest.antCount)) nest.antCount = ANT_NEST_START_COUNT || 6; + if (typeof syncAntNestCount === "function") syncAntNestCount(this, nest); + nest.antSpawnTimer = Math.max(0, (nest.antSpawnTimer || 0) - dt); + const outside = this.ants.filter(a => a && !a.dead && a.kind === "worker" && a.homeId === nest.id).length; + const available = Array.isArray(nest.antWorkers) ? nest.antWorkers.length : Math.max(0, (nest.antCount || 0) - outside); + const maxOutside = Math.min(ANT_NEST_MAX_OUTSIDE || 3, nest.antCount || 0); + if (available > 0 && outside < maxOutside && (nest.antSpawnTimer || 0) <= 0 && (this.tarinai || []).some(t => t && !t.dead && !t.insideNestBoxId)) { + const hp = Array.isArray(nest.antWorkers) && nest.antWorkers.length ? clamp(nest.antWorkers.pop(), 0, ANT_WORKER_HP || 32) : (ANT_WORKER_HP || 32); + const a = new AntActor(this, { + kind: "worker", + homeId: nest.id, + x: nest.x + rand(-nest.r * 0.18, nest.r * 0.18), + y: nest.y - nest.r * 1.00 + rand(-3, 3), + hp, + maxHp: ANT_WORKER_HP || 32, + }); + this.ants.push(a); + if (typeof syncAntNestCount === "function") syncAntNestCount(this, nest); + nest.antSpawnTimer = rand(1.6, 3.8) + outside * 0.45; + this.drawListDirty = true; + } + } + for (const a of this.ants) a.update(dt); + } + + completeAntHaul(home, target) { + if (!home || home.dead || home.type !== "ant_nest" || !target || target.dead) return; + if (typeof ensureAntNestWorkerPool === "function") ensureAntNestWorkerPool(home); + const before = typeof syncAntNestCount === "function" + ? syncAntNestCount(this, home) + : clamp(Math.round(home.antCount ?? ANT_NEST_START_COUNT ?? 6), 0, ANT_NEST_MAX_COUNT ?? 10); + if (before >= (ANT_NEST_MAX_COUNT || 10)) { + this.spawnQueenAnt(home); + } else { + if (Array.isArray(home.antWorkers)) home.antWorkers.push(ANT_WORKER_HP || 32); + home.antCount = clamp(before + 1, 0, ANT_NEST_MAX_COUNT || 10); + if (typeof syncAntNestCount === "function") syncAntNestCount(this, home); + } + target.x = home.x; + target.y = home.y; + target.die("\u30a2\u30ea\u306b\u98df\u3079\u3089\u308c\u305f"); + this.drawListDirty = true; + } + + spawnQueenAnt(home) { + if (!home || home.dead || home.type !== "ant_nest") return null; + if ((home.queenSpawnAt || -999) + (CONFIG.dayLength || 120) > (this.time || 0)) return null; + if ((this.ants || []).some(a => a && !a.dead && a.kind === "queen" && a.homeId === home.id)) return null; + const spot = this.findAntNestFoundingSpot(home) || { + x: clamp((home.x || this.w * 0.5) + rand(-220, 220), 56, this.w - 56), + y: clamp((home.y || this.h * 0.5) + rand(-160, 160), 56, this.h - 56), + }; + home.queenSpawnAt = this.time || 0; + const queen = new AntActor(this, { + kind: "queen", + homeId: home.id, + x: home.x, + y: home.y - (home.r || 34) * 0.9, + foundingX: spot.x, + foundingY: spot.y, + foundingDelayUntil: (this.time || 0) + 0.35, + }); + this.ants.push(queen); + this.log("\u5973\u738b\u30a2\u30ea\u304c\u65b0\u3057\u3044\u5de3\u5834\u6240\u3092\u63a2\u3057\u59cb\u3081\u305f\u3002", "event"); + this.drawListDirty = true; + return queen; + } + + findAntNestFoundingSpot(source) { + const baseX = Number.isFinite(source?.x) ? source.x : this.w * 0.5; + const baseY = Number.isFinite(source?.y) ? source.y : this.h * 0.5; + let best = null; + let bestD = -Infinity; + for (let i = 0; i < 70; i++) { + const a = rand(0, Math.PI * 2); + const r = rand(150, Math.min(430, Math.max(this.w, this.h) * 0.52)); + const x = clamp(baseX + Math.cos(a) * r, 56, this.w - 56); + const y = clamp(baseY + Math.sin(a) * r * 0.74, 56, this.h - 56); + const nest = new Item("ant_nest", x, y); + const spot = this.findPlacementSpot ? this.findPlacementSpot(nest, { allowOriginal: true, maxRadius: 80, attempts: 10 }) : { x, y }; + if (!spot) continue; + let nearest = Infinity; + for (const it of this.items || []) { + if (!it || it.dead || it.type !== "ant_nest") continue; + nearest = Math.min(nearest, distXY(spot.x, spot.y, it.x, it.y)); + } + if (nearest > bestD) { best = spot; bestD = nearest; } + if (nearest > 280) break; + } + return best; + } + environmentScores() { const alive = this.tarinai || []; @@ -2184,8 +2334,9 @@ class World { const zunchi = this.itemCounts?.zunchi || 0; const splat = this.itemCounts?.splat || 0; const trace = this.itemCounts?.trace || 0; + const antCorpse = this.itemCounts?.ant_corpse || 0; const security = clamp(100 - fightPressure - blood * 1.6, 0, 100); - const hygiene = clamp(100 - zunchi * 2.0 - splat * 1.2 - trace * 0.30 - blood * 1.8 - diseaseCount * 8.0, 0, 100); + const hygiene = clamp(100 - zunchi * 2.0 - splat * 1.2 - trace * 0.30 - antCorpse * 0.65 - blood * 1.8 - diseaseCount * 8.0, 0, 100); const happiness = clamp(100 - Math.max(0, 100 - security) * 0.32 - Math.max(0, 100 - hygiene) * 0.24 - avgStress * 0.42, 0, 100); return { security, hygiene, happiness }; } @@ -2282,6 +2433,7 @@ class World { this.resolveBallBallCollisions(dt); this.rebuildSpatial(); } + this.updateAnts?.(dt); for (const ef of this.effects) ef.update(dt); @@ -2299,6 +2451,7 @@ class World { itemsCompacted = this.compactItems(); this.compactEffects(); this.compactTarinai(); + this.compactAnts?.(); this.compactTimer = 0; } @@ -2722,6 +2875,7 @@ class World { maxGeneration: this.maxGeneration, lastBirthAt: this.lastBirthAt || -999, tarinai: this.tarinai.map(t => t.serialize()), items: this.items.map(i => i.serialize()), + ants: (this.ants || []).map(a => a.serialize ? a.serialize() : a), logs: this.logs.slice(0, 30), family: this.family || {}, weather: this.weather || "sunny", @@ -2751,6 +2905,7 @@ class World { this.cameraY = Number(data.cameraY) || 0; this.tarinai = (data.tarinai || []).map(o => Tarinai.from(this, o)); this.items = (data.items || []).filter(o => o?.type !== "mirror" && o?.type !== "food" && o?.type !== "cardboard").map(o => Item.from(o)); + this.ants = (data.ants || []).map(o => AntActor.from(this, o)); this.effects = []; this.compactItems(); this.compactEffects(); From c6ba3e38a2f24fd7f09436f9c910dc6fb24c1132 Mon Sep 17 00:00:00 2001 From: 33333-33333 Date: Sat, 20 Jun 2026 23:27:39 +0900 Subject: [PATCH 5/5] hmm --- .htaccess | 12 +- PATCH_NOTES.md | 15 + README.md | 6 +- assets/objects/genkotsu.png | Bin 0 -> 42110 bytes assets/ui/tool_genkotsu.png | Bin 0 -> 42110 bytes assets/ui/tool_nest_box.png | Bin 1857 -> 1697 bytes css/styles.css | 388 +++++--------- docs/AI_CONTEXT.md | 4 +- docs/code_map.md | 2 +- docs/prompt.txt | 991 +++++++++++++++++++++++++++++------- index.html | 53 +- js/ants.js | 43 +- js/assets.js | 20 +- js/data.js | 6 +- js/items.js | 234 +++------ js/main.js | 30 +- js/sim_core.js | 8 +- js/tarinai.js | 116 ++--- js/ui.js | 101 +++- js/ui_family.js | 48 +- js/world.js | 388 +++++++++----- 21 files changed, 1566 insertions(+), 899 deletions(-) create mode 100644 assets/objects/genkotsu.png create mode 100644 assets/ui/tool_genkotsu.png diff --git a/.htaccess b/.htaccess index d579227..36b3f0a 100644 --- a/.htaccess +++ b/.htaccess @@ -1,21 +1,21 @@ ExpiresActive On ExpiresByType text/html "access plus 0 seconds" - ExpiresByType text/css "access plus 0 seconds" - ExpiresByType application/javascript "access plus 0 seconds" - ExpiresByType application/json "access plus 0 seconds" + ExpiresByType text/css "access plus 30 days" + ExpiresByType application/javascript "access plus 30 days" + ExpiresByType application/json "access plus 30 days" ExpiresByType image/png "access plus 30 days" ExpiresByType image/webp "access plus 30 days" ExpiresByType audio/mpeg "access plus 30 days" ExpiresByType audio/wav "access plus 30 days" - - Header set Cache-Control "no-cache, no-store, must-revalidate" + + Header set Cache-Control "no-cache, must-revalidate" Header set Pragma "no-cache" Header set Expires "0" - + Header set Cache-Control "public, max-age=2592000" diff --git a/PATCH_NOTES.md b/PATCH_NOTES.md index 8c5ba5c..938feeb 100644 --- a/PATCH_NOTES.md +++ b/PATCH_NOTES.md @@ -1,3 +1,18 @@ +## 15.9.2 修正 +- 巣箱アイコンとゲーム内描画から、枠内の明色・透過っぽく見える装飾を除去。 +- アリのHPバーを、たりないと同様にダメージ直後だけ表示する方式へ変更。 +- 道具UIに「げんこつ」を追加。添付画像から正義げんこつ部分を切り抜き、上から落下してたりない・アリにダメージと吹っ飛びを与える効果を追加。 +- 初期ロード画面と読み込み進捗バーを追加。JS/CSSをdefer化し、CSS/JSのサーバーキャッシュを有効化して再訪問時の通信量を削減。 + + +## 15.9.1 修正 +- 草を地面レイヤーとして扱い、既存の草の上にもオブジェクトを配置できるようにしました。草同士・草と障害物の植え付け制限は維持しています。 +- けんか餅のゲーム内描画から星印を削除し、×印のみ表示するようにしました。 +- ダメージ後に出る「こわい…」吹き出しを削除しました。 +- 家系図に「更新」トグルを追加しました。デフォルトはOFFで、ONの間だけ家系図を描画・更新します。 +- 死亡した個体のライブIDを再利用しないようにし、友達・敵対関係が別個体へ引き継がれて見える問題を防止しました。死亡時の一時ターゲット参照も掃除します。 +- たりないデータUIをカテゴリ別の折り畳み表示に変更しました。 + # Patch Notes ## Encoding cleanup diff --git a/README.md b/README.md index a55624e..69725d1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Read only these first: `README.md`, `docs/AI_CONTEXT.md`, `docs/code_map.md`. Th ## Core simulation - Entities: `Tarinai` agents with hunger, sleep/energy, loneliness, stress, health, age, personality, family links, relationships, diseases, favorite flag, target/need AI, transient animation timers. -- World: bounded field with weather, time, lighting, temperature, spatial-grid queries, items, effects, logs, archive/family data, persistence, placement and collision rules. +- World: bounded field with weather, time, lighting, temperature, spatial-grid queries, items, effects, logs, archive/family data, placement and collision rules. - Observation loop: agents autonomously seek food/water/sleep/social targets, react to zunchi, tools, rain, cold, crowding, relationships, disease, damage, conflict, reproduction, and player input. - Records: observation log and family tree store births, deaths, parentage, cause-of-death labels, favorite state, and key state changes. @@ -50,7 +50,7 @@ js/sim_core.js Names, personalities, relationships, effects, spatial grid. js/health.js Damage memory, death-cause normalization, damage application. js/items.js Item state, lifecycle, drawing, grass/zunchi/ball/firecracker logic. js/tarinai.js Agent state, AI, disease state, eating, conflict, reproduction, draw. -js/world.js World update, placement, weather, logs, save/load, global interactions. +js/world.js World update, placement, weather, logs, global interactions. js/ui.js Input, tool selection, dialogs, observation panel. js/ui_charts.js Population/statistics charts. js/ui_family.js Family/archive UI and cause-of-death display. @@ -69,7 +69,7 @@ docs/code_map.md Symbol-to-file lookup table. ## v15 notes - Colony chart tab `events` was removed. `environment` now reports security, hygiene, and happiness. -- Selected Tarinai UI includes per-individual records derived from matching observation log entries. +- Selected Tarinai UI includes per-individual records attached by structured observation events. - Observation highlights selected relatives and major social relations: parent, child, friend, enemy. - Explosions impart velocity to nearby zunchi items; cursor contact reduces stress and emits dense heart effects. diff --git a/assets/objects/genkotsu.png b/assets/objects/genkotsu.png new file mode 100644 index 0000000000000000000000000000000000000000..81603688134ad47b03c5d46b4245d18dca25ce78 GIT binary patch literal 42110 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%0D&2@EuibYnMfHTvlkg5R zZLgSiHN-lbW=dc&L@pX-3x_L%M9##KJ+yaZiZYOrl$1dsyc}B6-u@;bA;Frd$>z>< zflqbWW5b0^0LbvCt$!~ob?uwNMQ5EQyb18-vA%#RozSyRd@Y1vaOi8!F7QMK$Izdj zB3EN;;&E>Z-lKvlopNFxfAF22*)O5>wg7dq?hgz7FMUt97#pfFMS4xGgXAw@FSgPg zWUWgM-VY3a4}%nB?XZwfsioP(<-qZ|Lm>gSGMbd5W1TNWskO|Y54p6W z69AYWC;z?MaMzC2@(pw^&4mz7WL8~} zCXH|zs(j>ZZEYncCDlTOsa!d($%B!ZhYkLtO+EvhqS)Pf+SBg}iEpc1@##&GsUDi{ zvz!ZG$IRT0ria!$+;)5@h&T-gz05hk65zZXwy%8i!twwLqy`wJ;!zuR&_?@Msow}!U~9{dfKMDD5s$18$%_VZa{ei_8aBBH#wxRP(M zsAQJ=_^|kz%<+_VkfUjh^Y?lVmwNz4v-#6h?=HQvhDknf<=&=pWq_4FJw0{4+(sZ1 z_a}Hgot+f<=$rm38x|u=gFV2PqCz*G;|v1Fslp#>TtQN;Z-3&;;s|Zs1(+;1w>hc@ zNPTiaaQAT?drc=&9BIzv)dpTmHQ($Ue8m~y5F4#$=PZ+F_)%ZXBio%uqj zf0k!@0%O{4KmQvGcPj#Qu~r0x@=7>7(wsOHHYlyFO`AG~3;@N;^!oLX#>V*Sw9-&j zHZ-Zf{^pXCPEs`6{?+r25TxIK{_Mp4dsMfvw~w&S9w#XWp2cqH>*uDQrBx09u?##H zX%7z%(!D&wD>`C{d%9mlL(=OxH=b!~NYBci4!$R(9C zIW)0K4`B?Gx$iRf6462&l*WcY1ANJf@}d=+sl2hIf)Qi0 zPvC8QP@jrdU63~Y$EC7x|E)G=n7~s0IUr-^XrjBmtBt331z@6wv6B)KRMBwvv?&e& zZBf-d&h)#MrnATI@WOGT@{yFDWq#EVIzDa-ZdH6_|7Z#O@0iF^UqVL|1S6}1teqq+ zf*(jJytb3)LX(ooM*5cYKZKI-!b&YfZGfDRb6)N2e7T-6UM`2uhXF<7uA=*Y<3Z1HynKsuyKUU5jRrCd3~O!PgPf&`xilvA`?D`I}mgS^v#39MnMn~8u- zYq@98Xt8QYC}lckUOFY{lW=e`gcxa_a~Pg2QlJ&}KW)yda5?BNI2AY}tzKXzJ2|a3)-k^>s;R1qX;6#Y z(?j^hjK~GZGjDURv0sBStbamr)O6l6<`A{DwW$e|CO|_E(uVkx4<`Dw=lnHWpjg96X z^kHIv0$)Uw92#dwLlph9vd6_vE6v1Fill49IHct%u{5Ca1^f*Ic+J7c$jD@{Bv{BVU6rv9YB)ul>v@##rS{j6e5a_!>aX3J zfJ&OB(SdyU#S=i(rZXN{*J?0rhoDkOi{fgN3c=6PZ7(&5c!(og_&fWF6}$}kh+QLS zu*t=ZJHGTMQizeJFr$w%`3`=WL*_Cs8LJ|4X8<_3_)xl%T69e=-ytHnt&~-2$OED9*u&6q1)X`9%+xgy=ba%sDUF4F?tgMhV&64u$C(hMX z1Wuj4{uJ;V7h$6gx6P5aX4Dq`>@KEK@R3ktPGv#X(UJX`Dmu9d-JoLIvc&F;(fH?{ zu?nmx1YMt$-(=+b)XZMqtJf@V^vimI0?HDt$e58`c;8%1g%%h%LhdC9Kzljp2JyVL zowZpIiFKjhFCnYu)p30H{*aM~bo?uCk}!+Wc&|4KV$LmMJ<6My&Yr|EBBWP) zJ1y3MCfC`S*w@D18pz13skDEIMD@qSXSI(&h)gU|Br7y{7f!jEpnFspmqjikN~EBm zAi|f>dxx~|YPh(xRI0;LY`|tQ9Dg!;bi+gx7d^5U``g5`jiA}3Y$55C} z+v@7?JZKuB;lIw)>2db#b8|T5ZlXU|aTzrcZBxnvVAz#5G5UOt&c{D?Q!Zr2u2&KF z51fJJM6bP7F^2XiNqVT`8WWK+ z@X8XmBt_gBIh2&wX6amkS9%2YQ6H48+E{%7(ts7p9!sjW6_+mRdrD&U<^Q+AdZ?R+~TV*(__u z$0wQ%T^|5lM0x@3<78fl_j!8C=T5lgz`|SeH6lg{f@x;-)skf`SZ}egA5#x5p&beu zUW}ms)<_)ZPY{*TKAOW?B;0Bf2^+P1;%8dUA@#PNK=3D6MNHdAg(QZw$dCwq#1c*)zH5 z#Y&hRP#aYQ6Hek0*4uGh8DVl^zK(wdfrK}LB0n?z zERdz4rio`^gpja z2Ag3#3^u&wwPNmVh4$6+LXIaz6_NngY!6D=OKODcB# zdqG{oOV2%qxm;fvHNCYao(0crV|h8Mv9VFfNBZc-NA&V+Ya74)8JrNwAkv1_&uvXqn-fvjNo1dU{2lxfd}80%6j~gw76qvNSWM zP3N%ylD}g?2zdo`gxq+v8jZ%a>XPDgz%?U2=>Ar2xaj#Jfwa3U(exTe?Du6^SCB#yg|4-{JEh(S zWdN~BE1uW77;N2n-9*JQ@u@+}a=0UH7hvg)%xXk{0b*lg;DfN2u72PIH6Vfm3B_SZI>4})5= zYQM52lbfR0=X6?%P^EH5$=Frrr-?wZRSsJZqot&F0BLDyY1;LRVMckf+8jy|+ZI!~ z(C`W&puo0HV?@!1v!y>p%(0U%dl0tWZ})`(1%H0SdFFuOZBsj8v$yk_nUoVxp zmJTOr#KNFG5D8F+ul#ap8oe=rA$m9k8;rQYRdkjL6^-Wd30L|1{LP9Kv;573MEmP4 zFG8jF1Xu@81tm&YOY82pUOWefqT2pa-926e?Ch#(zg_@=6R7%7a>?su9_#OXQ}cXv z_CJ5L;#)9YL6bcEw{Qp=vkVMlSsF4S^!y*P{N;59Qy=-mHNtZQsCgw&_kpR@ssF|p z6C2CY+4=Ymwr*mw5gM=+VM{7KGpwn@-Q=dsyfv(uQzwn4jA1wiufISQ#rhP??2E2h zm#-lvDeOQ+m5iLY2k3*9zTa;Uy$g~iI80-%uGY)G`X%m}{W)J==TTvNYxaLw^8p>vjq91T@I;eK2$tQPw#$x0ppSQNn|zc6Lju@^S?X_LbF; z(uyPErq!#hY&;SA3e39wCkp?hW>3Myfd$jyMN;w$x&=k|WdcOVrfb!j44TyTQwaxF zL?Z}hz)lw;Wa;`FAIje?EV9;U@xU{gFY<8Mu*>xEz>3w3ov8Ra7Qh)Z?*gR~0 z@ntWO5=Ckoa-4bI8^PivtXF5m&-^w1_O^92J}E3NS>d;%%`q3uR<>awZ}Pn>CjxSZ ze~1i@sQ^88!%OzhlvZJEId?g+@d*r6Fg7GY8)B8JW1Q(xac(p*7Z1bLXxPi+TE|Kc zVo;i(E)ncW5+)lN2z|J5*-LPeVk63RzjJbS25U|`px^4`yNMr?xRXT{@M8mtL*O4C zK)5>&Z4e!@TAVt%NpoccL~@IXwhf4eA?%xRfErRbp0GZ=nMU@s8~o|}?Ak({gTTM0 zdP-!3=YGwU7ds2jy4UH>W6_d2Eu{zV8BY1jpiwYf8w-vJrm%~f_+W+i9nECBT_mNK zqDsP&>1D7B)KROZ|G2Q7&a=(%A3w%Az)prlIk~w@@J7+R{buHdUpX*a@>6MbkEkV& zZ~H!*iYxbMlq}hv4y#SC0s_*K#+(i(v+oxfCF1>yslakMHXISZOSRn6y*>`4N_tN7 zW=~!awEV&&>u+j?pLOQ6La0BjGG}N~$Le61$C{JY65Js3%ApZ14N46l;1?WOTG53y zHey~skhykvQ{&OnqOCXspj3yX59zE$zFCA0)gEtT1sTzJj%a5J% zy9*>UAX5p^2Y_RL;!yI`VdLL&c2KY_FHzCirFqxie5avSr%t?q0b1{?^8C>^af%FS zUw-|FYj9Y#s5NfHTY!0}*v+xQ!3J!!y2-CWxP5K%%N`@YI*tmqYn=g~PGd4Rk?cDq zl?9!DnI)ZRE@CxjHt#%tZpLLfvZNeV_BLH8GnuaJ$4r-q&4f7`etBY)7$}iD+D=vG z;PCtVr%ew;R!mp^uB;i-g4es4710=6(K#7qOWXw`ns&%B#_=4wrZ;Hu<}UF2{1&EO zn8*tMLIxNq^C1Y~+u0R`^11+D*YiubY=K#~8xsq=xT*tPdkiQn?k1etHECRvihICs z7Wk2G{y;_8EFEw_%HowgTerO=s&`?rdYTZ`~T>Wcc8=e)15q?NhMrJU^ru6&gF_kpSk}X}R*o)He+v zg!?QkeR;rgeR>s~lSA6l-fn4QQ(1e$Fk(T2h@mn21FH8z>Tw>$p(u;OB8|$KiOAG__e0(C(F>MVqbw zO3E%^p^}FlN~5Ak^CiIF0+9cU_mmvxYtbwbFYL|R>6+v*tMIU>6|+b%>*Q9PoN#Ul zE!*kG4n42m$C~Gx-`)_u*0vCz_{b7HDhDD_;Zs#cXfRnW{}eHhn2^8@gJPpd6$xk? zFYDsUbAVI?0;wR(fzNw>$un<|r8>*COt4Wgsa(2t#96efnm!-TVv)zlk^x9sHt1h3 z`USVRcw*t-^UvG@*K(c~y*K`iuVk0Z!TGK7Z*cadq@?EN=i?8znz@47vSGH>i3upl z$8-a2j#Evw-ObXJdd38You5lDo-jb*pKPa{iQb~(C%?_3q7*dPGGvX0XlM!9`x}v4 zf6~y?pyRTfK|@do+8ix69xECF7=WKe%Uu5DQS}{K9@pRrB^8~XjFkk@xFLPC%tyXw zc{iKARQfp90+zReks-1)2+JNzZp?3saRYZ5K@NFbQIl1HVgBM5C!L?=I3tZg$(p?` zdHPl#vTQOS^jGJ@M@46{LY3}3zht#a%b#W6VIp-q3l~J5IEztQT4v+JrA$o7_42!)QU zq|phz4Y{^n^8TdGJIvD!uwc3iok8gfB-S_qX;sJL`tKjsO^7p=+d)~VEU$3^U zRLCTYWfpuEf7&=HFz|l3(lM{AtFy7OVM0N}Uq|5$7 z22mCeXBHF{78b4=1*m!jC#N1QiA;|qm8XfNN4f>`$`F~V`iyxJ%h3ZjM*pBqq0db3 z>F$tl;H(C8#EXBDtR8T1^<{-T!5YMoF)uF&c|kALu@&;Q0E(19z7lC9GyF)79@;Bn zPxhZ-jf_Y2h6$AZIQ|Rf?|t(iYP_7U6P-1o`(EO?P@|QJGS*})n%yG&6i@lb8|mPe5Ckip?AT0st=*82 zkfu=bO9efe||FFT3fIK;6QMi#;`e3m{T;u-Q*3x$!77} ze=qA??Y`Kn|93i}SgvKQ%4qV2#uS9e{bT1uLbF-RWZ8^3Ba|%%7SgD4D0qmnConHA-=286k5yXPctv<)ccOEhonPJ^6f?pg;=qp^8M^2 zstS^bHu3*HxKf{VA}k;q&!CD@MuOWiRIA1O{_FxKd`X@ZNe13TfN2x`JxhChcBUXo zq>qX?f{H}SjZBZJeal_MEbW4xm7Ha{Ca}{gsubcc39^W@L}~ps)W1U=G2+h{&X7 ztu85=xsd}S7qlm917bU$+f%AVhAh7i!mbAB+^?3ZE>O8Jr>mYf@49hNamXVb--p_W z#LN17@vUd<@H2(T6H8{f>ZvZ^CIMc1>$gDh2Pp49zc!KpKl;w)4(&5TjE)e7AM}DT zgf#Uk)CuK;rX-E$ciNt?_w&_=%f(C(2Wfz%LBLB#);lkbf*+TB*ByxP?n4YVg9Z>P zHd*fgj>Pbr1(JcwQ6`xBnWQ9A7A#_V+7pEQnux8p){r-O;!smJeYnf#2ArghJz7fF zkOb!(uT>Y2Cm%s~?Jz#6by;y2-q2=A_jNaMN_|6J-8D@-u)R$+JTk&KsWgSmc+pru z;jsRN1lTbcJU%9de|dIw_o9@ML~{3Z-&WLrgDIo$Q4Mnwr<3LzDn-65cj>3|4wa(K zp|MTVY^Z2|Bk{bGq{))*?KR(qe5-QL+w^{t_~LmyCxaVZMi#jaU*L;(g)pd`6maq& znq3;>z=|ygB0n_-{#{U{`*OdO?-fWHxINIuPKU4LT~O-j?dRv0ZuXmZ#z9*2^InPq zg@Pm!@F&1qf_CfC%EgXPPEKynZBF-C z%Hy=N8`PWF+;7gWx&YV?(etU-MN@Fwi;K=9fl; z-kG2ms_GhTCW6?}!?-M7dm~xq#EWv2K#=Mu$iK)&P+%|N0$~zfImR&4*#~&j=V~NL zVNs_^gf4=maj^D!jA5CKF~@5QLn41_X@+Lf2_9OJukzWOtd^L7Fv()!cEw&=i;Mpg z#xo4~10~U<7e}-u9g?-6J)@zS_!5-BG-;dXp+0 zJonba2HPAF#_><$2g;Rzq5N~4wV|o#%kN#0ypU6{m#1e*Tic)bB+ow=62a;Lhck_q zPipa)IKUh(wah=b$E~AZfeToM-@gw#ghld*n=b5|1w}Ivzj}9Uq&O%)_;Jd`1Fy13 zIh`u5vRAi-nx?+k-Fq`6F@sb^qyIRTlO#p074o-Na?oDE!@8ee5#63HRvqG*S6b$K zEduPNthE7X1&Bs@Kpb++c8;YNz0ZwGQ5_6ynEw`*Wm2zU zD))N_pqG={W4x`vr=KQL;Aer@=Jblz=VrjbwX?Is8^|3>)$7&$Bo-eZU(yB#{0P!) zNegH*IJ!MJ?Jm(@c6LGrhe}k4Bhgh~r)V^3mZevfpKz&)xX#-{9=Qp+FqpN4n!_oi zB;+#pJcg!c>#pjt-7qou!KIbTAYry9H zg+9!CAYI7pBxgcGg=Jxqe8ezn?_yEI=B(I>A7WmdhLzOyow+Rjs{j!Hh=44Qfs zJsvau`@Lsb(9K#DBY~z=qk*hIt{fW?u&5I~WMO?N+emqal*P3dx1gnQ-)%~W`$lVH z;y8jeecIt@{Vrf}c{y%DFA8>66!?%D8jcFlZRZ+_(&EW`Rr1Z_u+$6Yg&zX+H^WbmJa6jWMT&4 zUW$&OF>%r|9Y zrMnujCy0;2>t{s6W_l?wp;dD{MIWB$BF;GCa=Gp{1B8|3v)f~cw^eCjHWOLBJL2>j zE5SB0fyQa&co6M>8$)Q7;cRx+c;uMo(DcO7d{g{m<`O$A^w@3J)b7s2$j@jmmPYcn zg=)yY-~E+H^{A;eDdieE9`j_dUvZofi*jet z&6po+(b*hiiVK3i$gwPpMeqB-eVM)toScRveV(sGQKO>$EEJKbGEv^3tAi-3ok;c* z9Cuu0i>s5Z|NW;feq{>3Dts#bBZunnY-MpDw0;c80}9vq_JHC%}p2QG=Z z*e`8v#s?H>;wbBQYNEI*wT|_I-6?6A3?g9Fj8k;YZpCqqe1J;~AQo@{?+ReG_~c%u z&6eI^F$5uqqv!XH7O&OhuwHFV(CM|KWpE$`z96URnlQH(L@D7i87*@rpfEPEu3}d6 zbSwIEQ`uHZ6m>a4!C9q_-s!alMg&V*J#|O6U-S7kb$IVA zrbcX&PhD-_UZbEz<9+y#QJQcjnl>Bl3&B6&d@bQ8U@qgHAq5!5{ry+mnBviy)8m9c z<{6W13P0CCDjpJb4!Lc|QFq?A$WD6tNzu)Jp&APmN!b#}?ua`Y6 z3y!`;XbB(H+6s5T{mS9rdt0J6<0w+(MVsGJw>iExX4dTL7u`5WmWb3iXIV6{?sB0e zoAx00a8)pTMCj#ug*X=FjEyL>d{3IU{XW#Wv=;}&J)+aZ01=afILtON!Cvd3cNd^(<2ZF{pV&T4Uxi3Hv;B42Z1Dj znWy}F(XLJfDMZUqq??_e4>jhfcx2LS6u5fQjc>FDdFEerKI!!I0lu0?sR6FdKH`N^ zHcXyxcwItS5<%idMn=;P(7NjWnO}cjS+ueDq81Ah#84%am?3*uc1YIv7NJX*w>LrM z9qx`hhfVR3*DDN>$I3!9t4THS6ehK;k*GJA$2)U)$UnNCVgEocOw-c)zL=`YL63kp z_ba_At$16HNds#ZO;84Y?*f)*NtdR<{ZIMh`1+g1|5)Z?WJ%vNBE|;TL<6kx0PmuW z&9ZQhRvi49SbiXf-~Lz7pVdz@OpgPCSZ}O!7Fx)HJNJ~}CAa6Y24+rncKz`r3$q?& zuK^Fq?jd@ez7c#H%dkSe#r@tPLpE6gVP7eLg@x?5b%LZdk>8GvzYj?WHZrOB1qxrZdV>t|bBWG1qA#PUyR-KbtA2XmuL zG|@7DQE@8O)US-N7e>^47e#C(Cha<{z}E?*1}AV#yPa1ha#9B$d6z(oxiGQ1)upP! zWNAXK98f}L%B3D%piEFvB;{-V{xJq9e=gpV&*Lwj% ze@FS>En(OFt|v0If7YY#ak~RF*j^n!XS!z2P(WI=n zX<*_+Nu}@0s4V`N?iBk(Eb~X%tvhb<0wgqW+$tBAw#h{5o|&^VvSXcU3c*{da7t2O zTP#8v9RMd|vSblj=%myJ-R_OmLT6`Z8mb*SseE4`C4eWEH+->^Rv#^fyym9fy08dhwEdRR%*18`_c38v@aP^jN zHHTNYf*);SaW}+M+{y5VK2Byu<~qHAc`Qkwd3e~A!l7S-o_X1fzku2t_r7jDkcdAr zUJRe!%nTIEL|x`aQ4Gz_60=PVUS0y;Chh1Ehb&l#yYMRriLdXYhW2}`<=ch}GtR>) zJ2?{*EFj#t0v`E*S+I2Fx?h|vYa?+OhH~GHI>3k9%uaSj9<03^sv1TsL>w6@@wBLb zdyn9Gz8+!Bk#w5F5|5c=e*16)NL=*Z+aXcOQwPBD&GLWXd?&yk%oPf#=w=Vs*1%L~ zz(#G7K3tp4+ebWbd|YYN(aiR`!yo(B;}&4|P(f^_ZSGpJ0Bu1IY*!oC0=Vg|fP==A z=E;`~>pl;Yn7RUW=74{|=IpzAldpeTyddfm8s}++&-=auTpa0KVkc!yxj%mVh|P8C zCYhSTM}37a$D0nJ2W*{y>mPvmD5z0@_bd{~Cn$s-SXbIvO~?i2n1l|uLqLrrFj4r* zEyx%B_17bMY7E`ymjQ|1)1{-hh`-c;m+aL{&pqB}-#d}n)zuiS#%SrrU?5%HSt5RP z3Ihk*-5tmUX|%oh2&_5m?eg0vt5pE6C2>3bWzGLw1C7M zhouvKRs2Q+vN0=~`M*ofZSOfUWdKLna`zv8OdOmVEd`5sljQ`w?VmTI7dKnahwp;K z>B;|azU*>h+vEtacDB)-g#r5&H!~8H7eW7?7|GpsS+kFP0Lz;+8yyLNM-~Vsj_KfU3viIJ5WX~vjWoL(wJu*`WWp9;DD0`C~7s)0>X0pQf z@cI4z>+!h%xG&c@-^ckH&*S=66`za@ZI?6?wcSM2U4(C-*3`dmG=4u0r>4%ubm(#@RFkOn8eCH&G$lTj1@DmCmO}tZwgxQKsakpu^|#v1W>5aJ-F164 zu18K05WO=WO^4ZR6`IOlsS88HI!gaL?(*-~ zGAw_CWgX_9(lb>&+SZp$`xmeCz+yg5OY41QCFr$+-)3G}lRGO5wdC=NzBNO%9%PYaJ8* zKh=S!GWCA-MzyroFd>3I)pu~f_jiAZ_pEdq>x)iTtTlOJG$b_(7$ac(DtDK5w?pfdESSy@UO4-~RXVhw>o1wW9}NJSle< zWIwgz*YI)iZPx0j4p(Hag?_mZJ32j4GBUaolT6(Sbug=}dnoGsA|i2A?m?Uo(A0j} zA!VBVw|1DPd!;*OVqqZ>+R_IHwE-Nbtr7Hm$RB2e+!$b^PeP1XHF_|xzwD=Io zT=a)Tx>SlcTo&{voh%Pqo^$M7o>x_$z02g&Vw!AtqqHT{f%*JER<^6{3d3XS^U{ms z(f4ePs2y-O@Z9MbZC zN?|3irBW1XHV;2MuBiLj!n63NL{w|e#~;$$mRG+J2gjDzl)}?S^k@S=k8Vv}S6AG& zeWsMy!cV1i?M*j`+n4)&{`;Z__T8n^L(7{JqoAYLAz_L!_yy%P7Q1WF)LlWXI>uCr zkw}53zxyvvbXMHlTdnoWuyZQaBwc2>fLj3ej2cmcGTFnTvh>+MPK=Qs9yWVz45V|L z=Hyo6e+C;-1GoFEey1fm(p#C`3X=gIi;hp8+{$Mq>mwr@NATdlNEu1ubSBeY>q7G_ z&)+iFQtV$#u2L;G>49UoUA{qZ$zkbB0M7L_-8DsGqA>J#<0cdyOEMS>#bdg8Dunqa zyLYp^$%%pI&4VvS8B$+bT3Wuf6cicC%qcO8qyz3 zYEbr{AwI((t*=5tcXtZ=zd;mT^-_xH!w}iy%&{-QUE;S?2yTQg85#C}${0*IM+fp) z9*Y5+`S6<_TAbA{j|Ev?{!n3!TW0i9OvtjkRa_8o_TqhWQR~#%B^^OxTioGv!YDgK)lz8D|t}2iTpUe9( zvF-2WAN^jP5e3xRR?-%9XkbC>uzYoB4JAM`pFs6=iS{{rBW#1tbBY8HIw_uR*f9 z+eQQ1N`{ovi!%u@E4SC!Zax9ok}M|#i%L``k+bp(EH~9_AR_UhR)pFuPKbF)za;u){Wk5Mk~LZd)H%Xd#ZG;bw8N*IY57G_ZM63sbmCf zYurpfZp}3&!acYkIAyeVV2fmta!kjEI@ncCUvzkETJtGMTxUefEqeHB4p{ zJBTV(@D}vJxltGtZq{a}7M_Dk~5DFJ;-EW~;+--_&YsLDPge!4%GoRed5hRk|cS*Z?X z_}e}_2qTT{`L!&IMsNjzKIw5Ku1#hA8AqtPuSPdKER z8rLguxUuzaymprupJ{kCCT`~lvx8=#TPNf%j!F7|!;MIN&>kRK_Xmx*3$LpO+*QmqqA#=mS`*Le)G0DaUA+qqQHD(ja4V)h++&m zqTtYG*Rt&Qw8|>cfBz<^KcPlt?D#=bGk6PLKGiOm#!2hRV2Qmsr!aT#d@Zu zAJyuM9UllyCro}(iK;8WrGDj#QSpkQQ#%|8!UG)2agP`CNmUM~34nTb8OT1uXaWG+9G zm~+KH-W*X@4ZL(>yeF|B9ghYG7O>dCNFo`*<(?wFXMf|Am0s;;YFcB{`x6qxW+4~b zrB_qGs*g9vED7U#W#GDBSQIJ#JoQ$>IE9}Qan6~`)KBiF%YNA?H;VDJ#RMLc<7R`o zMjDEVGNuaGMBQIM2<5gB2k1I#M=G(YyjUG1rygu^EK%hJTATsqg#xS-dPF*FCz$Jc zWgYQ|pB#R=c)UC+T7*N7;I2dBSEH)|8T)ogXqqHU}G4MRu0Qmlb^1QO18)E?b$MZe1q+o6k4eF-zr8Pv(S1sXK%h; z5q>z5QmoRUEI}qtYL+-ovxj};+6W_M%B!N){c`8WJFgMy>~)aJ`cZ%!yH@4WO=Ev*IuX ze+7(7fe#Ps&>=70U&p zV=1GE{&DZ!wHltE*#r^J{^q6PS_=Z1L+21=+ zN?jFuU83eCgzK_3tMLdGznC(@HrAWiXh8CCKtAk5Vo;!5?I9zSM<(;sk-{qkAytOqFGFN=k}A zY1$R`U=O(-ni&yVCn^$Y4r$ECsw$oTV(h@!cpNWsyKhLm7^U@#70-K>_+Xze7F)#;ad+I(+|ZQlmb19_c`w%nf!D#jxuEZ-GZACqyJ@a6N?SKgj1XoNELB~J8@`%}HB zs+gQIzK@rg-Q(=u@hTtC-MJ^BWpG(d7n$ch@_@d`kMvI0FgZ#Z9 zzgZ!?AO36e9>;Xgky?XcSflMcIAH6m6Hkr%63v}Pebz=W=B>v@veJ@Nu@N5n>1YG@ zn=j27a%uPBmE5=PiI(IW^V{3@)(9QFK4IHqpZL}%P*WxOMoSbo){e+qy6Ck2a zq(m7_G^fw*twT*P=;eyL33CA}n44Y(@y^+U(5khtCd z;Ql+oQktn!zm7&Xps#S7TK2R_oBPiv8Z%^TqtMTWEE7VSKP&zLlb}cv_^?~iP!4#U z*HS{M7@;`Z2HK9kYH0nIP!sF?@kDn)Qv11()35_6fAmbv+NeB09C$Z#fU@fSdB`=YWwfyU8W z{=f1H0~=W-6h~V2Est+$gWd1My*&n5-q5G0X*N@Jes0|$3knJ{TlVKZ8Gl?S4%L)S zGRB9!Hdx(?OqeKikft0UJA$_sq$hYX!leK%Voj%Qm(}*e-YCB?qaIKCCYgmh%0z`? z;XPkgobmxuPv7h;8!1;tOv;2_Y8;EOYDsFry4b+xk%zRgRf>3UDVLj_L;I?adqP8f zJvaf-ZX@rt(UYb+dgKn`1D%djB%JLIAd_?AcE?7IV3As5tP@PY@LalEF$2%+XMvZX zXv%d^2_{Qlqg7Ps1JX!b9bZRFFp~=kgnbU8`Jdd8ptz%qm?(t4WLU`#fEVR`jqajf zV0a#k6ICu`X*0eZfjf&uf-^ZelRddxl193-i-gotjLO*(V&se@sAn)m%=bM?kB(mXDsv+r#l2u~e9gP=vEH*UYrS38dim3PlOUn>m+ue(`Px~9!K&@+9iKg;c z@I`2qCq_oq8)PT469O-wApv5Ee;DvVW<` zOoA?kDb=Z#&tBbBl=cFJjyX?$B`FzIb-;4iQy0^0lON~gv zGvtUh2|i!c^xmZ^U7uSJ&&&*ID1Q$z7PtUb+mkFN-V@3YjeOdRYPrVHZrzOz+7MBu zrpoU`xYt<9HVC^K7#L*lv@~zAGpxiSeKT5i5GRj#_Owc0aB5YI!H|t8A*d0DpsK*bmld(#L-4y2;qAtgWXpnSR z7JN_;S1R!MT0&8|F_@#^YxL-w4yBc2UTQas8wxWq|Fr9IFu^uS>7O5U4wgP0$qqRS z377jfcV$k>O+62@gjv5G+zssgN^*PRH@eL)xA551%-%o2v^X_-oFI&aG=%ZjBY3jI`71(CqC4NrZu|paq%_Lxn;`X|AFJ;hB(Qp9wS(>pCqa4A zey&2khX9-H3x{l{??%U+02UfU9?pZ3be{C>#DO?+y;_1-WG=D+Ew+kjjb3c`;x~HC~$3;5*Q_Un|+u)aiAUYo*%qKbtzPMqpH+p{j zn23$5zT?A7AcW7o&c*`#%DVH(&priwkD^n{R-SVibfnVfg)10g#CI^U9Ga#Is?RhX zd87$0ysT9r!@&)k{kcNpAu~zTj*qsN&o9 z9g0lqeyG3vubv~dH17v0gPe(a2fI??(X$=r+2JT` zwcfhT1)mVpm2X|PX}h?&_4blk2I-4MAvUU^N0S|G{f;TysPW8R`X2Hq=YtO!ugF@; z%ZX@yyRoIcQ)5Og3&m5HQzYmAZ z6&mUZ=I;cN?p!iFe&~ho&BcE=MlQy)Cd{j?3ecqxehQDc5fSui+K0Py14cbBC|n$Lf&`u}F5#0_p6 z0)bfMZNyp=97qa;XU;u$(F}E8Q=+&MwEgX4mcZ>A49X}eekT~KbigN#kE9^SIE-A2 zU!2OAhs;*U_g^(2;xO|$7B(=#(CKwuo~|58p%&Bnd8mWo1PKPWek4LTnW-RjXr&%* ztzGJr75(?`-`C;4+jwGpsaaJp%Vly3lu9gM{1{H>etY1HaSxE)Rvh9L2#Pz_coSrs{?H9j4KR!+JnD5^yeSDsF2)OcP8#h0mDU=_LMU(fqB02>PiR;;L{B`RmaQJhKj0dz=1#cPU-R{p<4`=CJF%{cBns zsS_dR3Kzpasqvd$DdsapUVD$&B$}=`Z^FR(A^_d+(4QK}UhLxJV@ZVo$#Lbavmsux zwlq)=8s`3#kx;XM^sSqz(6#=#+mk0MZf?I*+d5vY^!l1ZmBCH`lrikva1II5t;}Ro zgW2ynJ~b6VG37vSIZ)W%P5@K)w*%h%J+CZ4)NK8U2nC%HGodN$iN#S2YVwSEKFXiZbkXuVD1+TRMd#s zx_zXl`%<__;9^rkMQ0duiEG%fkXhV|UrR&0vT{d_+2*Y0W3D3nb?ID>LepnReSB$p z*LHIHjEpT3K%SNQdq#YF8U&i+R8&+{-*m`tWrZC-_^9OIfC1FRj&Wbt`9?e(GVY$* zjp1sy9T6_m7PQ+`=`V@f3blz;l9Ch@0mA$llV;K%Lk#!gq9yK4YYNes@Jy9p1pS$~ zt!w!^nxTi;QYm=d9jY=%L|mqgu9N1eL2aS8z(d;LUC*yM!o*j>R}iG@TMWjK!{if5 zSB99IgDMqu|9=yhS#Ps+xk%B1Z-qlek+-O}Bn=J12U3>BmHqLi8o1T=51~3vWF>2a z$tuGue0Ow~PbkXcRiwkaZgP%`qi-2Z1=Rg3W}TE_PUIfu1eKdzja+;xD=lqZWTxqf zAQ6+q^ZastZ)GYHMA_kO?r)LT7)||#F*^=qPHGl}GDl9wJMpQ2wRnDr)2+DQTpVWz zI%pTqNWT`|bpwpP48!`Hgqp|dA$kp$8 z`!u<~`2p#+k{oo-X&GbfsCI7+xG?GyiNh`j6vZV`8vUAw2)iNqs+f6MmJ>8Dt#ew%5+95@|&rjiH<%UaY@woCL@@ zr~ajU9`>SQd$;4If@4mwq0a2gS#i83_D^zPpBtG`SlGyax5oEuiS8ORI5_QNj^Lz^ zO#(Nn|HWPN2clXAHRr|p<@X0w_=LpRCWk#-yPPb#PFS%4O=Pcq~R1vWL zGQx?{`gN?=Zk62(LFZNN@%yy=B!ytciclhbDNZTAj1Dg1-h3{mmi<6`L*_`N$SC^f zbH6v+XHroG`#RWA|9IqE*jOmO)C{$$K{6Npmchoszl!niiZf$PkkHz_W&0kDoVSm% zrp)Y7Pugnx>j|EwIKS3$$}C`$&pmOR6OIqxqB zCjzNs1HZnZa5Z{8{Kurt*aX{gg)&b^zNg^Yt|3S!8S=IGI?^X3x7FUh2iTUrk#N#K z7Ywzp+@bY5Hldimv0E6w&wQt8+uXem67J!Z#5GQ~v3s9NmGV0>bdkpMoPO|2^MIMRDxMJO;3 zEDi=HPyuWlj)hbgPklCZl*7VryhsMlPbX{erb4;d1nd!Fxx7l03M~>=MFo<6 za?!e7Oy4Q+oq`K8+~*8YGb+kAIvJGf>{@wbKl$v@W2SP*J(i09)OP;JETH!;bXYGS zt9>?P+!kJ%^9;Mhi7`dZ3U1m=dezinI zRJ0H>T>26p>>oC572q6<`C5kN??3~ZRpiO{@Q?Er9sM$Y`yJg~dcoc@1x^DMH+SN| z#?jUe71)oQ6W$-ll$b!d41cmEHaQ(tQ6a=N)pIaV78hqN$foO5@AGf1iseS|&P3Mq z@;NdWXY|Sn5url0-Jk-slt1~}nz&<&S?s6C2;Btx+SoZ#YJ{?gv0R`_T?IetqPhyu zEp+ygB)(_CMRFwoH)$=uDg;w_nth^b`6LL)w)J>uGEsDAHh&74QZ%g`Jd=;q#Qx)gMq2#+UANCq%+G_DKx-B>NJ(-OkdW*Ey8%*09v?0M4Hm{Dktfe+bI-qV z!xxL@_wNBafu{Y<_MYnq)#{*ag>N(8RspgmB6D5(X%*gsD9AbU9M(|TN5tV2VU$d{8H4hj0jqOH3; z&4fgSmvJo5Frf1ii}NUe_UqDwpcwSo!PkiGw}qQpMKm?la9&FVHhug2i}jxq`vNdL z_TKR^SCkSFc6c8V5zz!IcKC&aiZU(=Q&nLE2NqUujO;&aLnEVBe*AM46jrw47-22% z0y=8U!4~GCQO|dElh&uZa}i+OtwC|=Y%aK6iQYtXJ(l^yr9X$J^3~Yq&bDz!;crsL z;S55FlDbgaf)xM+tM9x?%VO?b2mb0B9o0=@`hHMe9zp-(Kl!&76eT-)3#X7mlUlj7! zahnt8jc5f2Er@zeyT0?EW7{%>r@IR=F?7$-=0ENCRGJ4iiJ8wslE-*91o%*_`_Nq&qequ6A=WMd8PWzfK8<$T~ zXD48m8oNN1+|dyeKvGwbXr-I^7BFI*ilkk!(Fi3APQVG(1m-v$J#^v+OAZ%OxykxNqoxGyv=FS zJwG4DuzEx)RMYcPopt$~R;XYtUv);F32kRaHVQ&E^8eQR{lG+*F5mZLOpyx?mIg1N zfc^cmy+Ryb;z?@=dTD!Y4W-JLXv6HJoLN%QTp6D&`P6zI+6WWlKU|Nz233{-Po$bjL}`NqyVg=9y~00EC?+%Kz-Z5z;@J zEm`9^^;qikAHLK{kI1{g#h`Vs|Couf*1g4N`KjV9kW&F3(C7vaNtqht5~s3~m`WG8 z(4bKx8>MN7>qn#6%r?8wJ@-K@G;P?@W&asd2nlJY)Kl?m+i-ku$YJg3x?7Kx*8ZLH z?^MoaN*PH^!S5oHTX*B<$XhS!o=J#A)%ebf1l_dXkoC7D=j(D=ZPfm!PA2?}Nn9i& zc1Lm8nNGY5t07iMyNEQPiDgH2lX`|vtS2Bx`)}vjn~*C%*SQN6N=j$zEeW1xABx*} zNeYrJu8zzJE)D-~n(k_gbszywr+I92_QD{a!E8dj7VEr^4Opgd z3k>Y*yC)si2`RjT9%7x;=|6f=Dhimu3a{~4>6+>?e+oW$O>*#VcIxC?yNLTDy6bY5 z5_^XB{&hkYWhv&=PLNEpV{^US@zdildBODx!S`t1 ztH2ZJL7hLfcvpc)L>qGYDI^iX+pVh(!AFC5XWOj=wj)vT)BhfntbAc|W6VrgTTz`U ztZbtNlPi$VyD#AlivblSWzPze>T&>&=2R?w-4B5m1Z|H89okhfq7O4Ut1|AmGQm$( zJ&!A{HywW`fL29SmDNIh_p@~oiR|j^exdh z|GRWSrTdo@=7^m_0-=rx`Bx$S6$#$(LBG~{(jj|w+b18Im z4F6VkiIF2|IV2R6C4%YYogJ5nr6rJVgGn{gc~pLT(mWp);LqW-Dd{j2BvlY#`6^(x zx`}qgJ>q-zTajQ*%e@6%OG^uaq|YHC3E9RczE(q+RA|VMr2)?xY3x`#{`t52k{>E} zj0O6BZAhuF#uhS;!nt3p?=>CX?H5oBXl+#&6T_taFK-e*c}^w4LAJ3 ztq##Jp&CPae5%A{4B0ax*Wn%qnd9wR#O~Hs$LA$aX`tn>H-_8M^bbiaM8-;6D)33Y z>Med_Ccut`n{><6fC$`eT*`h!vuWo;VS6qyA{#$OdfT5ixj%$x`s)iG8ObEnv9-%2 z1Nq`75Qc%%wF;()&uExA-T!SoDc=mN;PRj*h*BVew0>4yWLq0@LZUrz2mbq`Yy6fg zsG9|CX!t}rajV*v-^{=BylU{_hIDylr3&y`%@AwZ4mE%K3Y%&3%dp;BJmrec%HsI9 z`i8*f@^7|%l~We_FJ~7xVX>paoeKsHEk@JMC)@EU`M&0g;?zAJ%ej*UAvG+>Oc-nR zdfA|uSG$;$atq6Bb7l?N)o)2;0RGa5UYAt|HfyCWH)r$PN?czp-TY^4enQxG_|aVv zA(UX>*U6?h2wZ(}I6^ys*x@2c}UW253*xc{p)1!H_-o78ie%E(ug3xpv;QDhdBC)@EQaqoAAS#?VRU_9b3bRF>2d$TMDk+7`^qmt>ZvNXf7jpN z1`EO48MVkPfnp$RZTmd45!>CAIc<)H#H_mz&C3h^q&0d>6o{GYu;XQa|NiL9e(-+p zt<46>vjlqq7@O8IJ$-z9=wDOxCu9oV&V#d!iP@i@hJ{-7#%*K(cOA)NRD5%Je1!=V zJ$f5{({F*+l)o|B)T@NGx)ZkD{Lk`Lt1tc?TL@wtz%q#>A75~hL7x@MS0npqUySdj zrrf<0ayp92O5Nn^+t74T!Fjt41cF5;{%0$y2RF|>L?ymcLg5vpE)c*}`UIM`!i}2# z)oL8feEPv>pMwgKCC7aWB5j}4@Q+}ASe_xH2B(xeb{Nqt}*%WP(O<{w;#s6 z;SE?DlrTD~t;u5A@XL(Lyamm$UWp~z&;sWn3Lr*LBSStru85zFW5|Yv+$7&%GdVL) z9@VQGoP2Pi+>)7zxWd5CD=akMZoQ}|qz*qijzW<_81d;o6fD(e{~+Oax9zg^M%m3x zn7rwllYtUfk!HM|F~_lJ zklCK@nS*h~BO&>n-~Cz&Mq$nJi5#b_G7yXB&(njcwsCrG4(r8s?n}CIk!m3EX%xRw z5WF97-yE?bhJQ;M-*{(4t10mMARI~a2iug89!dOfFg~}oe|KL8U*4C1DL^-oKu$Dj^V!zUzN&_|v`|6XedUXSzv(!KK|+dm zM>I`MiQ7&-x_1j`nfXjafl93;k*5DOrTA4uR+h7w@AO@On~Do*btk$9;(%if!2rVw zUdb{8WH}}m!{!I9!}8)&kU@fU2W;so-8h$JkKs;J53Ae>m~W(Fq1Gt*5AKO@|ClIH zHYni4l*`V6xYrIs_J#kCzJmeGTdh9qTK+@xnL51%EoPX&iW_JYOSr@bINXS78}uB4;Gi;}Cl6VLlFLXPjr*Boh_ zawTl0LMBHiH~C9u7QvVJoSx`jtRl~T+x0|Z)Na^dVj`%Z(mmBc-8eqLL$e}u}dS3$n|-+ng^jHf5?ki5Rauzs;+Jx3ZHE#P5} zkxj#W(0kt{3*E=Fj%zr&h(D1dS0g4ZCfkR8uIV*i9-C2xn`s65hLTfQSKUP$oz1f- zZ*{I(>ZO6xpEnLDXmZ19BLTth-~S}DWnA5nFqj$c=&VCEQ5cr=BQ>8N{ z7$Sf5g50?x;52!^R6sL#CXRmDW>}wJTR&A@h%k5J2>&B>AYlRLq^J0!317t#L6&Ej z^y+cl$3em}D>N3|wLfSlUwGX)($zF&YC&;UnzCx9WOw<-2izg>Sl{Hk(64T;cRM{q zt9$&kOp!h_78UIv2zD=UTj9=DuTV%Ge^r4sMUc3LfshcK6cdk8lz$tWvN08Z*5_7J zY=*(0fz&`nYD!Ol*OW6{LvB;oM;pVI$AMsvwH|E-6w^T`{TUZ#cvM2o+2M}QD~@ho zb5MA79<2&HB}*NV%Uq0V0NzrE2Gd4x-u2=dq!C1zklz}F!d_Fj3QBpv`@CwDy zAZeiUpGp&Mhohb0;|lT8Z!0U>+wt`o3bp)0_*GK4%#MmFSh|CeW!;UopgDz^pZ(w~ za!d1~Pq)VzwZm4SSf7tVbLB!ajcw+c5SsQ($9n7556%{3h$<$Xbcb#&EBEKe?T1sj zi;~+p@vwRh&Q+b1{rfdXTeQ2ds}tzq7Klse*Tq*YSsRoaB6Xy0QzAkRb*$#!?kakX z%GP5DI`Aq;Wb4PWnBxxk$`^4P{3!eI`25;^V1!GM5Q#qgEBSfdtxpk>p=$!hKRl=5e*(F>)k|~ogHu?>I zU+gM3zA3Y&JY4`WR|SIjX_wZN(!zU_#~Ex7Ai3K3WiNmhmJY0m!R`*Y3PNOuoQ^JJ z`rQMNZ90LTVg_$~7L#kft`$-`O4*wa`$v%}H+SQE@3&v7VahXRuKPBVV#_<(@1AKA zJ=bWn>K<2YA?&0iy5pnDRAXGCS*ngrcsFfYK$1Qbzl8F{KZojtAzIF6fguNn+e3;M z=Zs;6&$WHaC>Uez*B`P>n%5YPrQX9gbQ|5#H~pA-*v%aKVU_4Vy+2Z)T)!|BN-|KY zsP;q8#=Qq(W~>XxAksv_0tkHifHC41Xqr=zYhn;cem*^aA4*gNGH3Ma#gq5b(yF## zgN;ih;T!&+!w35)G(q!@mmTOeY!iFAGvPvsTouH+NwS(z4u&oYVkz)w_Y=^x+AM6T#KDctfVdeSaaZ(g0 z!d46vA;4YfB9tFX>JfrbC%sMi6i!&#vrd9)r>T3zfBXg3qpHXwZg$76KcwqR7%0@+ zy)hABh3-1cQ!BTHiIQ-wTp5~VnIo5ft7Px+YQXpe5gM|Pd}jS&Kw(a!*3P3zX7FH- zW5GyLb7KCPQL2uv&Z3GLO*DZV-BRu)gROSg+kDV)Xw)4N4LcXmS5k0uyNezZ?YTbA z&uoANbM^NuXOj4UN(T*g>VAV3>8Khm*I^|_T2y;Yy)SAf$PX0-Rr2&W@Cg}prICfW z*K-v*mRn?i1>q={qS?#ueIcZ)0tY`1K%Nnzu<=tQ6sg2Izodi`AVYGHOn_y#GEQ}{ ztBTKIlp4ypiWRufj~*ghAA{K$GG%Qx0khy$hn&9&x#e~UWEv7jyxvA_E$F^zTPk<@ z4$C%SS649mG_$W1%S%DD= z(D2mMeH(Ag6JRPXY-qR(-BzSq8X>Asd9OgCJ@czrI*)1OFsydStic8TWCVcv6%oEdA|f5NT(|_u zd9aK@vj_oq5QAuWZ_tb#-Q91Iguv|^3RM&sBE^m}ewPmK)aoE>Ze)oQe5stPF6`!1 zEGMiZ=(j|*j{ocCBQ;PL&YT&c-8$>)0i#FXZ*_$Qayyj-CoJ}a7ypgtoGFVU4V|1vM(9WB-zn^UJHt)7gG3v2AS(9k4>?Ni>S{c12Lz;}aiTJ24Qrw8#M%EEYS z+YL;sfYz52d24iY?SJQ!D05dCSUwh z)B<&644Mx6KCK-3>MYOJSWJf&q^isRReP3Dy8)}|=#k9EI-~K%Qsx2%{OEf~k(Iui+JE@P%< z1^UuNq3YqV<@Ft4ra|?E&2$V$ymOXn$_G0<52qu(rP2~5&((mHV^+v$usg&Up*tl6 z6vEr~9DL=$Wtgq=qXVxKeZKZ^RYS7c>G%PZX5iupA}FkH?BI)4U>bbl5<7yolkYDT z{ibohC+_YrQcsQJVGtn3y4$2L4@EC+%x*)r#+gmu4s+x}uP_ ze^hRw*d#xg!i`G$-sD7l`|7(@Tafzr(g&9(d=L0Y0T|KmGRq_3-m%<|QNYq$}tGRF@`I=}g z*$^b;5poD_eonk0#*drl;d1YmzS#+c#q&1n^C_KyNSsosUie$MnhLIUfD0x|cf!K3 z%S#n)3-2(tWgjhId#Eh-1?CqBCmkMg!Qu98^0V9gFY%Xr%2-8CZY~jY}sHK;wv!_?#B~H?jFU1A! zrsM3sIuE*asHN1}jfr@UUwPU>6A*ri$zv48*kQgjKT>`WRwVQ814 zfjbjsoq^rlOO84rl!30tDs#gnU_`)pw&Kx8O)FHX9t-Y=%Tl^~1Q?#dhi^<#BZrF5R3llyl`ZUDyz%1}5Rm^%1 zNmIOVfB5P_%|&+jgrlYuF%hS_`Z9(j#rVY3es1ZH-j)~kPGD|3s&Z0}4lELP^zVN-(o`dBH6aJI88hkC^R%3Sn3r7Qu$cF}P zDtA`%RcV#I4O-=H{KI=?b(c@+t?W%jCMH7>V(4aX*r!F4XkStBG5lsL{(=m6DGzD> zbsS|b3n79x=1&Kygt9WC<9S;MWm_&;u{Sj^tujf^!k^_WN@8|xoDu#kQ=H0kGzgGT zjj9toYm2z`B$rY5L#hhOGC5$`J47KS)mbS=`y{p8_-7aR1phQ7C%*qEb0%rlW1@Sc#jn4GP0edyZt>;_;|CuX zIr`EOR{4V>LA^H9Ve+`jm`uTv728k$_#b5Z(T+akyYUT4hV{L!^M9!?E-}C^vUui% z0hD6H*8B3-vE3@z_lNuLjL~K|Dn#MXtt{udU^G`I>xBHeJtEu1uD_R;00jZIEoZoI?+mFJ)@yc2idh z(w?pl5K+%w-jVoTsh1Zd9vGifR%=S$swcpbZkys*D6iK-h-wvTZBijKN~Z2V7Py$` z*LF-(MHMp-eO}hwXV@@>lLIdXXeB*lmA*8CO7B8g(dC#@FgTRV&r|+nAedOuZ{l5Nrj%Ms4Z0VV%<7gzp{bieOYJ9bm;OCoqS~v@ zJ^$+Pc)R5q%N#*m+mtS<`(&T551Pc18`OV?IIB8JWsk*gA*cVZBEf5*zggt8vgcI3 z&ZeR;EI^d}_BKrs77;TYi;hX9e!J`W{dsYTXT>)NFu;tRU-4@?0v~$Xus4}l=H|@} zM%yNnV2-@GoA8|%%`k6p7@srK`uz@tZxL>ouvi zl7V0-kY*rgqHAuD*na-D9T39!T2m{Rn#I#AGYKWX79ZA?tbnDjByshNS<+tiw)TB1 z=E+Tk`bdBuV;6}qNqVxLPYml8M>+L08r?eiG*ej4h<*;x*Pe|+k)IH#0l1+W5A5p1 zZ*#q0;isVrTO?9-YhI59$>j3R8^+I+9R;el$Ch-<6H2MEU%dx?=`C+t&e%bmaV?xs zpPHKkfG|jg%%@O6qUAdZon9DdqTzX@`3!lftaysuEa*@fq5-r?J~W;2yls)N=H<3B zK4^yxiy+`ea)3(b-hTKI#O?sKdj@eL=tw!=tC68Xgiz1@``ffpcUaJ zGSPuDBZ&UaTN~rH5O%wfn_BuAE)3vmCHk>*_aJ-YxshhPJR)i)%R=7^D|J9=pKS}i z#QO3>FSg+S>N?A?D8H`@4<+ye2?Iw!8j-s6FeeqY zv|@d0pMhq*D=(h)?WNa}F2RenD4PMd$5%(2=;2UZNQ>`Nf~^EvjuUGB9ne9ZJ>9pS z+WBw{5#uCfFO}DMZqPJx&{Mw{Q#8)k`|oA`Li6_2J-%Fz&cjk9vSf%GLZ|<^LUtEt z(}jEAf|+sNc8hk-{J$o^(8pAo$H z5DT#lI3jP^075Q&{y4LD31(c)&R_nnyZgnA*FDsnb)&zIZv%ZJCeZj;d;H4^!ZZU5 zPSxLO1*(&{-eiA-#dBGA%q&r4-26`9wmsJ$P>XtP-j@BlYU`?ghhqUvlS_`emD{1J zAaBUSdvglqA)-krO@^enll4%AB~LAR);I)QTp%EGG`o9xb9ey2#d_ZiYN^D&K~@<^ zwJU$8$9ujs341aj*6W|O;^Jj-a29|yoAup@J)$g^iahL){F*=!GAA%B*1$0w#z@!G z_X>lB!i;-(K$gJ;hM{_ zq|y^hW)R8qNhpxPyMuB1kN114jfT5Dl-UftRtH zbhuW#j&x87#+wWV5?w3NwQJK)j7sg2rp2_BoSaI#C2%36!HZI;B%+RS-PwckI*=R9 z9;(P-)$SN0pk(g6QE(S&JG^A9^q9M=5b{H${BS~`R(}>!z53JUP>~4|YC?k9b&6a( zeq7|~bbwWW;X3j>qPA;!r(EEUSp|akm0&YJSEum(cKn#;6e^-cQo zc9*3pY2w?VkLkVl)45!?3&yN^eM&3rdhZN8g;@Jukgc@IowQ!5aOjcvF=|kH>B078 z3Xxr!ROAgC_d}YVcJB_*m>Yx8>$6RFj4v7M>hIsmV1k79au_oGfkZd0Z6CYW6uL7( zfBWjaZXn7>QWxnJ!)!z&H%(RTDg7UMZSjx8rImegROU~YmvIMYCp;PS*kl2xj}GjW zE%j8*?2JJ#5sN=%Zy(pmb(+nbtpDh-hnbyV;Gx`>_Ss*OhaDXi_6H9j-wBTOjM%m2 zQ0mijz_I4%=l7nRoQX>P1!<<$5TaRMwx5{2aj@8377X<1yow&j zQ@RTJ{eFpB3>s+8vGlx+I`m_z8okBPTkT@*d5Dr49gb#(2?#tRrBQ`s4KLLI%m29( zCQMDYFkW95#lJj(t`I$e)r1(IX>EmbjN3?xQHWk2gNJOm=Eq}h7x2;Hrn3Fd0a6<` zPrXSOy@xnY=uL}W)tO0D`ElgEE-Nb%bMSTLkM}{tj5KP<+QIG3#cNn)iN_B=l&|_c zm{0a7(cULDg7ZY1P)toXRpm*)5GBc5L=dM&s%G8mUB@y^H5G{3f;a2DmlC*0KE0!3 zowajpy|du8Sc!c6WpA-|cSz&G!S}!3-j6^_FUu5Y*c}4GjA**7&?aio5ljw_$q`Qv zSew{A#D;mjI$T-qGv!Hv;D8G6dBu}IvnQN(y&2NW8&4{Y+hE;)Zd3U#|9alT1)I0Nz}H8hK-Z)O4)<( znHeV8(>6OK{ar=4u(}BV#6Whs@kA~jxKNW}C3~RdfFBI5`F!XLbPF&lf|TXCymKD- zRv@ocvGTdOM0}+tmEnjXu0`&Y8H^Er#4y^`k676Cj-0M@x4-&9*+9_5&2zH)UptWf z3RhzC+Yqq-j{0QPr0dmR2of;Da$qelZQK{8s;@oytARdTezkCf4G00=eGtKc+!jkj zgbLV$0jBCuCiCPn@D!@Z$=5!*Fl1(4!+kFT6OHWQk8@>aHB9((M4=v}0=|1+9E@>- z2`mYiU*o0S?X@4h)p1=5QgE@PNF~{X zCNSIDR7%0aLduh^lrjk1oyB!Xf+Q2fqCHm6-GZluDE+phEoC_+cMUC2{X5RXVou9y zZnEj0TqdFW5)fYJzT(EA(|+%fF@CC?Bx4xk=^wv>y3N4H6rWd6K!VqH{6t-~~zLVBQNAgMe!}nF=q)l0E1dwZ8 zY-3#5!fOAvM#{U!WmWP~Gb7;QJU9xbv?+A3f!L>st6q@ib&Rx) zCqgc-&t}P3TVz%j zw1$;vtu6em4v!%bMHXz)DGg?o+^?trkMZl*FNiNVyLSXfW%i3~oTsM;jg~TrBVWsD zPg<&6=tx5E?s#&idhoa(Mj8Ir+-0sMZ1FY`Wa}Qu$I3WQ3fv=$Bncu7^zOtB9kuTK z4Zn~edLzBR=R8=_ASo*d&x%f_^lRslz$YN&53gO!bxO`o6RtiR&OY58BA>57xbDo( zcojdM81PsmUQ-K-$K#ovZ)|LE7c-buei#GaIeY=BdsF_Zm1=%_&)1`o@~=|XjC6?9 zYDNVbZ}oM8IWy)&p*qOI0JYHSpFi)XmZP+aKN@c|sUvd@p2WNzalEdn&iBVQ@Spw= z4RZu`u>+5Ck?^qc`t3S#Rt)*(agwJYS4{uv>`@tI$Y zmMKl1nS@(tS-{9y-I#_L?=b@@!NRt;$)cJ}`Q|aC2?^d)jr_8_8K5RM9htvI`AM;O zqGPt&g&`s`lGm%jCTT{Q6dA6lP%P!9K9)9@Ta9SqNl`cB%5NoXTIfLIVm4JLs^80B zs>ienQ9>8(^HvK*3axf~p|T9$o&^LB^U>*_FY0<^4-1~s#Zl`g|Bjhy2$=~`j%j?7 zNb@m3Ve6ZwUoIVgSp8?R#uhvJ9_7Z5*rWtVm%^Sp)f766^LiQlt&i)3Cqcy@n}sOT z3X44-Mn*)yo#=mm=a!-KU$g5;&A^B>OfAnMfrICCooP=RvU(@JuW5)axfh@Kj&_V+tlw)JB^U~&2{?gn1fal zqV6ZGTp8~!LkwYVV-hz-haC8vdwgs}N8kF=6TKdW;KWh%`AL#{C_qvsag<*v#Wo zx%GO&En9_Ns&as6;*{?242ZL_v89^*{a$_P>F%<&onvir{BOb@_VSBGq$y{Z%UUM&To<7(G!7cpm>qWfB7G6J{u>JNaI?^eVVS4aH~hZ zrO;cPS7+@yUZsn=3(Sr&?;rO{_T48`|1JFHZd7s%d;j;tnUyd8o6Dk!#59+`{|>G)e(<)O-%TL_ydT@NEI(|onenBlb|KZH zv9hp2qiHQHER4;~lW&!OB#YxK6Aa>_VzS0YRUoz+wA6699=F2lQ_FL638CS?`Slp{ zhU7AfymTx2O=2uIY(Yg)OF+iVE6jhc(kPut0`;X}f>(9vDI=-BzrO+@PgA`-)I)7; z#FVWson(ISs*f$d`)?AP1Wi|lJ=V7=F$x77mo6J>-n(}$?7YrCi%G$e^|077rHxyp zMW2ps!I+@++4fp1U#7j=1({FGgPf491>Rerq_w~zN?1&$Qw)>a^w2G2h|(6PA@_R8y?-UPH`i%Z{<+#)ZX@Ab0q zk`{Gt5|L&)94!C&Dx?B2V46u9Bh=FK-V1~6j<&C={koY~T1o*eNeVufpsJu1AMdk& z2f9G0MQ~EQE)E!9B&0K&W_#OnZ@kfGfpgSAnwk}fjACdsT+p-c|CYoBCI$vgQ_6~8 zX=!Ql+S>8vAzGEC^`9P)#WA1aeD(|2_z-?)->w+*2qJEAaOLS&r*-up@f?nsfMXXJ zh$WlrkdjqQV79R3jd68#(&<7^EozJzs99cl>0a%Ae`IfF_-6|o5h<>3fT@y1ui!pKJQ|2NL>`nHa z@ZHcX0Y$j$2@W0BY7OYT{e4e-S`4TJ1|RKKeK|`Pwcmoy3?8~$=+M3J+@`NRvhZq! zMev^yCrQS@-f9ZD?XK)-3U^^4Il;-4s7&hiPoxjqp-_AL_0SIf35<-i)Jj@bmWoVf zhg10%F!fkJ{9xidUO@oaJTSsxK>yntv%DXCB*LDc3Ysn3fB>d%5A}S_#jIzm_`ZMt zKGzgXRJ)vNW@SRxGG8I%aOU2MX2eel+g@CRR)1=e+=z9E2DuJF1r0q9-S&9ArIn>L zEGQr3aD_OQI)Za%Z28v6st5X7Ir<_&!V%CjzXHCTQWaB3vJ?>s!3#7N+M{7mG5F|G zMqzWc%TLdzK-k5r@Dj%m1h=n&LBJK-YOa0ONENljgbN8`ixW>RKvic5L>vWh5CHqr z|3%^%A4g_pW;<85Ux>G?z^jB|`?n;$OBX~t=A5o)1#Vc5CW|`1r~a*d`dcvELCD|^ zd)2NJ>bJZCL_|GTX2VCzf&&TOoRjcJKU22+L7{OXEC7)%ti*j;x1yEVboEHJV$XZj zVz4$a$pC-&6BFYJ0LcM-2vV1fQw=?pGt<+XZ*G1Lg-%>?jNw8;xM9N=#T;;y6WLON zMiq=DM8J9nvvY;d|M>M%m}s3FVa^g1TEngjZR8vm$N`0H@-8p++R)*U zVH^!(78$GQ{6c#6$wH}?F~S>nGmvK}oX6PuUt%cRc@2S=*m{t&!Vw8%v8~|oiHe9g z2euPcj=y#M<=A>ywv}^ql;oN$PA#g}2+pyg))O+QLrqFR7M3f#(}@9d zBW}~$*|%eDJLAC106wlJG$Ww+N#UqT3jh1)Nyc|H<7aSstZr-oNIsD+Hsb0#29D>d zj;W~~tBHvQrN3I{g+$UR0qhZh#WYYUl0g_!z8*KQipaOU&ATsX#lXv5;c}d)Db$XM z5thPG_g&eZ>W?dvwluDLG!@D0EC1b&SI6OUsDDS=@BJb)BTu^Y3N(vuLM@F?V*||< z;6F7wSV~g=H42G~hb!i=)N}-HHIs^X7G~Jb9?-r}Ucx317HaIJl#*WSRDcQ{p5MUe zsHe%a7b`JTP1m`&w&x?6@s$9Ks9}V0;1BhVNtzpsK5SR|GT)V#-$kL8OR@y_QaqnN zg&8umFw`S1diYlj<(6oSs$TyQOeRJd-1h<&Z=pyGxkHpa#|3U(LIZZqvsX(hPka3Z ztX8S0nEa~wYV{<-NP@VSPb1PkzNQtfjj>kSDdE>rW;^nMK0C(+1;D}q#?uqxx2-)r z>A=YLSKi6dQAk>vyj94x{jw1YWaE$p1Kjvxj4)7c05{l0;1*$>tl6o5W#2c8>r;g< z=W;!U13dBI1|-G5@UV<1=jnoz%0FlH$ALed;GGwLy9HJguy&9f{#<(|6~`V96BFo3 zX5RF&IXnFaA`;^i_uhvhQb0F{9wRJEzyy4Yg|tp?*6wZ{)u*xFs{SiL>5uI#I~=!r zYPq3D&b!Agc4g}$^KL6ujqe8Rx{vM69TAETQf3_$1yYb5Pi}P{1m1OyLjyohj&Zto z$U4zX(?~w~TOJX4xFVF#sHBt^?KVKTg~=j3agY@N=(^ga$B}MmfBoHk^^iIYui)^t zPJ$Kl`nmNAX>k)plfKkcI(*nBCA$;j}5%@5%Rf|l!%}$jgtLbRr}^NtJh8#jxqX0_pBWq{{zZThw>~{D<8NKNstc`${2d^FU-Z<}1amo8k_4$`jlQ zR=$B(Ehbs4y;sA)-ZuI}2XDL!#`HTu`5FDr)U1l$Z=CQ~nR z9BfQSgV@!|*Vi;|fTOv*q=ayV5oDtf_Aa8U`0aH{h&o-=k$5p8Jd1=}&_ri;8GtRq$`O zaVqCG&EwSPZyawZ^iQoo&c&msg6%GSja!8Wa=4)9Lg!i82|I{AzDQ}mFt-smQO-eR zvbMk5ow|ST*3ug#NlMr3yt$(-DIJ%~u3KDW6F#jVLBndMl{*-H=#HKhg3-PRN( z>^G~bUZPKGH?-Ast62>)GJV7*Xreb_!E>GOF9In$*1livf8OY0wT+E4V`ykm4pv4n z=jCTtqbp`fDn_sO)!yCs@J;%z7=6mNxxlNW(R9AumKMct$)O9V0AT_ZbnT+lP}R_; zE`P#0O2;!bnVefePb44b=;)|pV)6pSAl+NJptn&{QiA&`Ej^vP^0!BP+1>n2kAcmgIIXbX)Od17=xiX`qWfPxXW8d-M>92T=B!ceAulTK zdAVymTu_uB^B|iivf`xAEPF14jN=nU;IiWDk9?;-Ka<3KcDsojP7Uu%%HK-4?k7Lj zczi4@;zl*Bug`f9zRTno9A0l`5G!qXM=4eNX{g~9v)K3%;>pCG_trhBya|2zFS9a9 z?%xm?d0O<4i8EieKWST<)3fV6r-t@SwBsG42#$O|gR#cd;MFb}diq=n+~9Dd@t6pb nMLq~YKuAnR^Z$G@DtUV4Lk=NbjCaB)0zTC4+*8IVT7~={Brnwp literal 0 HcmV?d00001 diff --git a/assets/ui/tool_genkotsu.png b/assets/ui/tool_genkotsu.png new file mode 100644 index 0000000000000000000000000000000000000000..81603688134ad47b03c5d46b4245d18dca25ce78 GIT binary patch literal 42110 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%0D&2@EuibYnMfHTvlkg5R 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 literal 0 HcmV?d00001 diff --git a/assets/ui/tool_nest_box.png b/assets/ui/tool_nest_box.png index c681d1942b342453e8e288c5457a70e18014ef11..4f6015624ddabb82dd927a2f2f8d89446a744771 100644 GIT binary patch delta 1682 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 math -> assets -> audio -> render -> sim_core -> items -> health -> tarinai -> world -> text_catalog -> ui -> ui_charts -> ui_family -> main`. Primary objects: -- `World` (`js/world.js`): owns field size, time/weather, tarinai array, items, effects, logs, archive, save/load, placement, collision, interaction dispatch. +- `World` (`js/world.js`): owns field size, time/weather, tarinai array, items, effects, logs, archive, placement, collision, interaction dispatch. - `Tarinai` (`js/tarinai.js`): agent state and AI. Use helper files for shared rules; avoid making this file larger. -- `Item` (`js/items.js`): item state, draw, lifecycle, serialization. +- `Item` (`js/items.js`): item state, draw, lifecycle. - `HEALTH` (`js/health.js`): damage memory, major-damage window, death-cause classification, damage application. - `TEXT_CATALOG` (`js/text_catalog.js`): Japanese tooltips and ecology cards. Keep Japanese escaped. diff --git a/docs/code_map.md b/docs/code_map.md index 6a4bd87..5ae1a80 100644 --- a/docs/code_map.md +++ b/docs/code_map.md @@ -15,7 +15,7 @@ Use this as the first lookup table before opening large files. | Item creation/lifecycle/draw | `js/items.js` / `class Item` | | Cleaning, rain, placement | `js/world.js` / placement/update interaction helpers | | Fence collision | `js/world.js` / `resolveFenceCollision` | -| Logs/archive/save | `js/world.js` | +| Logs/archive | `js/world.js` | | Main renderer | `js/render.js` / `render` helpers | | Agent drawing | `js/tarinai.js` / `draw` | | Input/tools/dialogs | `js/ui.js` | diff --git a/docs/prompt.txt b/docs/prompt.txt index dc90944..c54aa78 100644 --- a/docs/prompt.txt +++ b/docs/prompt.txt @@ -1,265 +1,910 @@ -You are modifying an existing JavaScript browser game project. +You are working on the latest Tarinai observation game build. -Implement a personality system for the \u201ctarinai\u201d creatures. Keep the implementation conservative and debuggable. Do not add extra systems beyond the specification below. +Base input: -## Goal +* Start from `tarinai_colony_game_ant_nest_v5_fixed(1).zip`. +* The extracted project folder may be named `tarinai_colony_game_personality_fixed`. +* Modify the project files directly. +* Return a new zip named something like `tarinai_colony_game_ant_nest_v6_fixed.zip`. +* Preserve the current Japanese UI tone and naming style. +* After changes, run syntax checks on all JavaScript files and verify zip integrity. +* Bump all cache-busting versions in `index.html` consistently so browsers do not keep loading old JS/CSS. -Add four continuous personality parameters to each tarinai: +Important context: + +* This latest build already includes the four-axis personality system. +* This latest build already includes the ant nest feature. +* Do not revert either of those systems. +* Do not reintroduce the old legacy named personality system. +* Do not preserve old save compatibility. +* Old local save data is irrelevant. + +Important intentional behaviors to preserve: + +* The family tree reset feature is intentional. It exists so the player can delete an extremely large/heavy family tree. Do not remove it. +* The family tree reset may clear family tree data/cache and related heavy relationship graph data according to the current intended behavior. Do not “fix” it as a bug. +* Item placement drop-impact damage is intentional. Do not remove it. +* Keep item placement drop damage behavior as-is unless it directly causes a runtime error. +* Grass planting checks may remain mostly as-is. +* Tool-size inheritance may remain as-is. +* Screen resizing may reset the field. Do not add complicated resize preservation logic. + +--- + +# 1. Completely remove save/load functionality + +Remove the save/load feature entirely. + +Requirements: + +* Remove manual save buttons, load buttons, autosave controls, import/export controls, or any equivalent UI if present. +* Remove localStorage save/load usage. +* Remove autosave timers. +* Remove save key constants such as `tarinai-colony-save-*`. +* Remove save migration logic. +* Remove backward compatibility code for old saves. +* Remove serialization/deserialization code that exists only for save/load. +* Remove comments and fallback code related to old save formats. +* Do not preserve compatibility with previous versions. +* Do not add new save/load functionality. +* Do not remove normal image/audio asset loading functions. Only remove game-state save/load. + +Current-code hints: + +* `CONFIG.saveKey` still exists and should be removed. +* `serialize()` / `load(data)` style world-state code still exists and should be removed if it is only used for save/load. +* CSS classes for old save text dialogs should be removed if unused. +* Legacy personality stubs that exist only for old-save compatibility should be removed if they are not used by the current four-axis personality system. + +Expected result: + +* The game starts fresh. +* No save/load UI is visible. +* No old localStorage data is read. +* No migration or compatibility logic remains. + +--- + +# 2. Living Tarinai internal IDs + +Introduce or refactor to a living-only internal ID system for Tarinai. + +Important: + +* The existing code uses `id` widely for Tarinai identity, family tree, ants, relationships, and logs. +* Do not blindly make historical family-tree identity reusable if that would corrupt the family tree. +* The requested reusable ID is the active living individual ID. +* If persistent historical/family-tree identity is still needed, introduce a separate internal snapshot/archive key such as `familyKey` or `archiveKey`. +* Do not display either ID in the UI. + +Requirements: + +* Every living Tarinai must have an internal living ID. +* The living ID must not be displayed. +* Use the living ID internally for: + + * observation event ownership + * relationship highlights + * fight participants + * damage attribution where needed + * current ant targeting/dragging + * current selection state + * avoiding name-based ambiguity +* Do not use display name text as an internal identifier. +* Death must completely remove/release the living ID from the active living registry. +* Released living IDs may be reused by later Tarinai. +* Reusing a living ID must not attach new Tarinai events to an old dead Tarinai’s logs, observation history, family tree entry, or ant target. +* Any historical display that survives death must store a display snapshot separately: + + * name snapshot + * sprite/type snapshot + * death cause + * family links if needed + * any required personality display snapshot +* Ants that target or drag a Tarinai must not accidentally switch to a new Tarinai after a released living ID is reused. Use direct object references, validation tokens, or live ID plus generation token if necessary. + +Expected result: + +* Living Tarinai are internally identifiable without relying on names. +* Dead Tarinai living IDs are released and reusable. +* Historical displays remain stable. +* ID reuse does not corrupt logs, family tree, relationships, selection, or ant behavior. + +--- + +# 3. Four-axis personality compatibility + +The latest build uses four continuous personality axes: * aggression * openness * sociability * neuroticism -Each parameter ranges from `-1.0` to `+1.0`. +Do not reintroduce legacy named personality as a main data model. -Personality should affect behavior only when the value crosses clear thresholds. Small changes should be recorded internally, but observation logs should only be written when a threshold is crossed. +Coward/timid behavior: -## Personality axes +* Do not set a legacy `currentPersonality = "臆病"` style value. +* Do not add a separate cowardice parameter. +* `臆病` should remain a derived tag/state based on the four-axis personality model. +* The existing intended derivation is high neuroticism plus low aggression. +* When a Tarinai takes damage and its total fight losses are greater than its total fight wins: -### aggression + * with 5% chance, shift its current personality slightly toward cowardly behavior, + * for example increase neuroticism and decrease aggression, + * use only total fight wins/losses, + * do not include per-relationship win/loss counts, + * do not double count. +* If this behavior is already implemented correctly, keep it and only clean up naming/comments so it does not imply a legacy named-personality route. -Range: +Expected result: -* low side: calm -* high side: irritable +* The four-axis personality system remains intact. +* `臆病` remains a derived display/behavior tag, not a separate old personality. +* The damage/loss condition uses only aggregate lifetime fight result counters. -Behavior: +--- -* High aggression makes the tarinai more likely to threaten others, start fights, or retaliate. -* Low aggression makes the tarinai less likely to start fights. +# 4. Observation logs, event ownership, filtering, and statistics -Changes: +Current issues: -* Winning fights should slightly increase aggression. -* Losing fights should slightly decrease aggression. +* Observation logs may still be assigned by checking whether event text includes a Tarinai’s name. +* Hidden observation events may still count in event statistics. +* `つつく` / poke may still be classified as fight by text inference. -### openness +Implement: -Range: +* Observation events must store structured participant references. +* Use living Tarinai IDs while participants are alive. +* Also store display-name snapshots so old logs remain correct after death or ID reuse. +* Do not assign observation events by `text.includes(name)` or similar name substring matching. +* Event objects should have structured fields such as: -* low side: conservative -* high side: playful + * `type` + * `actorLiveId` + * `targetLiveId` + * `participantLiveIds` + * `participantSnapshots` + * `hiddenFromObservation` + * `countInStats` +* Exact field names are flexible, but the data must be structured. +* Hidden observation events must not be counted in statistics. +* Do not merely hide them from the UI while still incrementing counters. +* Events hidden from observation UI should either not be logged as visible observation events or should be marked with `countInStats: false`. -Behavior: +Remove from the observation UI and statistics: -* High openness makes the tarinai more likely to wander farther, investigate new objects, and play with toys such as balls. -* Low openness makes the tarinai prefer familiar or nearby areas. +* events about poking a ball +* events of the form “X avoided Y” / `○○が××を避けた` +* events that merely indicate selecting a Tarinai for observation, such as `○○を選択した。` -Changes: +Important classification rule: -* Being petted by the cursor should slightly increase openness. +* `つつく` / poke is not a fight. +* Do not classify poke events as `fight`. +* If there is an `inferLogKind()` or equivalent text-based classifier, fix or replace it so poke does not become fight. +* Prefer structured event types over Japanese text matching. -### sociability +Log display formatting: -Range: +* Remove name-substring based log decoration where practical. +* Render participant names from structured event snapshots. +* If a participant has died and its living ID was released, use the display-name snapshot stored in the event. +* Do not allow reused living IDs to rewrite old log display names. -* low side: loner -* high side: social +Expected result: -Behavior: +* Observation logs attach to the correct individuals. +* Hidden events are not shown and not counted. +* Poke is not treated as fight. +* Similar Tarinai names no longer corrupt logs. -* High sociability makes the tarinai more likely to approach other tarinai, especially parents, children, friends, or the cursor. -* High sociability also makes the tarinai more likely to react when a parent, child, or friend is fighting nearby. -* Low sociability makes the tarinai prefer being alone. +--- -Changes: +# 5. Family tree update performance and scheduling -* Spending time near parents, children, or friends should slightly increase sociability. +The latest build already has some idle/chunked family tree rendering. Preserve it and finish the scheduling/consistency work. -### neuroticism +Requirements: -Range: +* Keep heavy preprocessing split into small chunks. +* Use `requestIdleCallback` when available, with a safe `setTimeout` fallback. +* Avoid doing large graph construction, signature generation, relationship counting, or DOM creation in one blocking pass. +* The game loop must remain responsive while family tree data is prepared. -* low side: insensitive / unfazed -* high side: delicate / sensitive +Update timing rules: -Behavior: +* When the family tree panel is hidden or offscreen: -* High neuroticism makes the tarinai gain more stress from unpleasant stimuli such as corpses, poop, nearby fights, or overcrowding. -* Low neuroticism makes the tarinai less affected by such stimuli. + * Do not update every 5 seconds. + * Check/update at most once every 30 seconds. +* When the family tree panel is visible: -Changes: + * Do not update on a fixed 5-second timer. + * Update only when the family tree is dirty, meaning a relevant change occurred. +* Relevant dirty events include at least: -* Touching poop or corpses should still increase stress immediately. -* However, repeated exposure should slightly reduce neuroticism over time, representing habituation. -* This means tarinai can become less sensitive to unpleasant stimuli after repeated exposure. + * birth + * death + * parent/child relationship creation + * mate/partner relationship creation or change + * name/identity data change that affects the family tree display + * family tree reset +* Mark dirty from the source of the change, not by repeatedly recomputing expensive signatures. +* If a background update is already running, do not start another one. +* If a newer dirty event occurs while an update is running, schedule one additional update after the current update completes. +* If the family tree reset button is used, cancel stale pending render tokens/timers so old async work cannot reinsert deleted tree HTML afterward. -Important: +Important preservation rule: -* Do not treat \u201ccowardice\u201d as a direct low-aggression state. -* If a cowardly tag is needed, derive it as a compound state from high neuroticism and low aggression. -* Do not implement a separate cowardice parameter. +* Do not remove the family tree reset feature. +* It is intentional and may clear family tree data/cache and current heavy relationship graph data. +* Only fix reset-related runtime errors or stale async render problems. -## Birth personality and current personality +Expected result: -Each tarinai should have two personality objects: +* Opening or updating the family tree should not freeze the main simulation. +* Hidden family tree work should be rare. +* Visible family tree should refresh promptly after actual changes. +* Reset remains available and does not allow stale async renders to restore old content. -```js -birthPersonality -currentPersonality -``` +--- -Rules: +# 6. Disease fight initiation and targeting rules -* `birthPersonality` is created at birth and normally does not change. -* `currentPersonality` starts equal to `birthPersonality`. -* Experience modifies only `currentPersonality`. -* The tarinai data UI should show both birth personality and current personality. +Implement the following disease fight rules exactly. -## Inheritance +Fight initiation: -When a child is born: +* Tarinai with `爆発病` can initiate fights. +* Tarinai with `ずんち病` can initiate fights. +* Tarinai with any other disease must not initiate fights. +* Healthy Tarinai may initiate fights according to the existing rules. -```text -child birth personality = - average of the parents' current personality - + random variation between -0.2 and +0.2 for each parameter -``` +Being targeted / challenged: -Clamp each resulting value to `-1.0` through `+1.0`. +* Tarinai with `ねむり病` must not be targeted for fights. +* Tarinai with any other disease may still be targeted/challenged by another Tarinai. +* This means: -Then: + * `爆発病` and `ずんち病`: can initiate and can be targeted. + * `きずつき病` and other non-sleep diseases: cannot initiate, but can be targeted. + * `ねむり病`: cannot initiate and cannot be targeted. -```js -child.currentPersonality = child.birthPersonality -``` +Apply consistently to: -The child should pass its changed current personality to future descendants, not only its original birth personality. +* Normal fight selection. +* Forced fight logic. +* Intimidation logic if it can lead to fights. +* Fight-food effects such as `けんか餅`. +* Any helper such as `canStartFight`, `canBeFightTarget`, or equivalent. -## Thresholds and personality tags +Expected result: -Use two threshold levels: +* Disease rules are handled by clear helper functions. +* No scattered ad-hoc disease checks disagree. -```text --1.0 to -0.75: strong low-side trait --0.75 to -0.5: slight low-side trait --0.5 to +0.5: neutral, no visible personality tag -+0.5 to +0.75: slight high-side trait -+0.75 to +1.0: strong high-side trait -``` +--- -Display tags: +# 7. Collision and external-force unification -* Slight traits should be displayed as \u201cslightly X\u201d. -* Strong traits should be displayed as \u201cX\u201d. -* Neutral values should not create a visible tag. +The latest build already has `applyImpulse()` and some collision refactoring. Preserve and finish the design. -Example: +Requirements: -* aggression `+0.62` -> \u201cslightly irritable\u201d -* aggression `+0.83` -> \u201cirritable\u201d -* sociability `-0.58` -> \u201cslightly loner\u201d -* sociability `-0.82` -> \u201cloner\u201d -* openness `+0.20` -> no tag +* Normal self-propelled movement and external impulse/knockback must remain separate. +* External impulses must not be clamped by the normal Tarinai walking speed cap. +* If helper functions already exist, reuse and tighten them instead of adding duplicates. +* Useful helpers may include: -Behavior activation: + * `applyImpulse(entity, vx, vy, options)` + * `applyKnockback(entity, sourceX, sourceY, strength, options)` + * `applyImpactDamage(target, amount, cause)` + * `resolveCircleCircleCollision(...)` + * `resolveCircleRectCollision(...)` -* Slight traits affect relevant behavior with a 50% chance when choosing a behavior. -* Strong traits affect relevant behavior with a 100% chance when choosing a behavior. -* Do not check this every frame. Apply it only during behavior selection or when evaluating a relevant event. +Unlimited ball speed: -## Daily personality change limit +* Do not reintroduce a ball speed cap. +* Collision detection must handle high-speed balls using swept movement based on actual frame movement distance. +* Remove fixed low `Math.min(...)` collision-search caps that contradict unlimited ball speed. +* Ball vs wall, ball vs fence, ball vs nest box, ball vs ball, and ball vs Tarinai should remain reliable at high speed. -Add a daily change cap so personality values cannot change too quickly. +High-speed ball vs Tarinai: -Recommended limits: +* When a sufficiently fast ball hits a Tarinai: -```text -Per parameter: - maximum increase per day: +0.08 - maximum decrease per day: -0.08 + * Knock the Tarinai away using velocity equal to 1/5 of the ball velocity. + * This knockback must be an external impulse, not normal walking movement. + * Do not let normal “play with ball” behavior also run for that same dangerous impact if it would conflict. + * If the damage from this impact kills the Tarinai, death cause must be `衝突`. -Across all parameters: - maximum total absolute personality change per day: 0.20 -``` +High-speed Tarinai vs Tarinai: -If a change would exceed the daily limit, reduce or ignore the excess change. +* When a sufficiently fast Tarinai hits another Tarinai: -Reset these daily counters at the start of each new in-game day. + * The hit Tarinai should be knocked away. + * Use the attacker’s actual movement/impulse direction and speed. + * If collision damage kills a Tarinai, death cause must be `衝突`. -## Observation log rules +Explosion knockback: -Write personality change entries to the observation log only when a threshold is crossed. +* Keep explosion knockback strong. +* Use external impulse, not normal movement velocity. +* Knockback should be partly random. +* Tarinai closer to the blast center should be thrown faster and farther. +* Tarinai farther from the blast center should be thrown less strongly. +* Preserve or improve existing explosion damage behavior. +* If an explosion kills a Tarinai, keep the appropriate explosion-related death cause, not `衝突`. -Log when: +Ant interaction preservation: -* a value crosses `+0.5` -* a value crosses `+0.75` -* a value crosses `-0.5` -* a value crosses `-0.75` -* a value returns from a visible trait range back into neutral +* Preserve existing ant damage handling from firecracker explosions and dropped-object impacts. +* Do not break worker ants, queen ants, ant corpses, or ant nest reproduction behavior while refactoring forces. -Do not log every small personality change. +Expected result: -Example log messages: +* Normal walking speed remains bounded. +* Knockback from explosions and collisions can exceed walking speed. +* High-speed objects do not frequently tunnel through collisions. +* Collision behavior is handled by shared primitives rather than scattered custom math. -```text -\u201cMochi\u201d has become slightly irritable after winning fights. -\u201cMimi\u201d has become playful after spending time with toys. -\u201cNoko\u201d has become less sensitive after repeated contact with corpses. -\u201cTari\u201d no longer seems especially social. -``` +--- -Use the existing observation log system if one exists. +# 8. Ball-to-ball collision -## Tarinai data UI +Ensure balls collide with each other robustly. -Update the tarinai data UI to show personality information clearly. +Requirements: -It should include: +* Ball vs ball collision must use circle-circle collision. +* Resolve overlap. +* Exchange or reflect velocity in a physically plausible way. +* Work with high-speed balls, not only overlapping balls. +* Avoid infinite acceleration or NaN velocity. +* Do not apply arbitrary maximum speed caps. -1. Birth personality -2. Current personality -3. Visible personality tags derived from current personality +If this is already implemented, verify it and remove any remaining contradictory caps or stale-grid issues. -Example structure: +--- -```text -Personality Tags: -slightly irritable / social +# 9. Item falling speed -Birth Personality: -Aggression: -0.12 -Openness: +0.31 -Sociability: +0.48 -Neuroticism: +0.66 +Current issue: +Item falling motion can look like it changes speed unnaturally. -Current Personality: -Aggression: +0.57 -Openness: +0.34 -Sociability: +0.76 -Neuroticism: +0.22 -``` +Implement: -Keep the UI compact. Do not create a large new panel unless necessary. +* Make the visible item falling motion constant speed. +* Replace nonlinear visual curves such as `Math.pow(dropT, ...)` with linear progress unless a specific item intentionally has a special animation. +* The item should fall at a stable fixed speed from its start height to the ground. +* Keep the existing item placement drop-impact damage behavior. +* Do not remove drop-impact damage. +* Do not make harmless-looking items non-damaging merely because they look harmless. Current placement drop-impact behavior is intentional. -## Implementation constraints +Expected result: -* Keep the code simple and localized. -* Reuse existing behavior, logging, and UI systems where possible. -* Avoid adding unrelated features. -* Avoid adding complex new simulation systems. -* Preserve existing save data as much as possible. -* If old save data lacks personality fields, initialize them safely. -* Clamp all personality values to `-1.0` through `+1.0`. -* Add helper functions where useful, such as: +* Falling items move at a visually consistent constant speed. +* Existing drop impact behavior remains. - * `ensurePersonality(tarinai)` - * `adjustPersonality(tarinai, key, delta, reason)` - * `getPersonalityTraitTags(tarinai)` - * `getTraitStrength(value)` - * `shouldApplyPersonalityBehavior(tarinai, key, direction)` +--- -## Validation +# 10. Solid obstacle and placement logic unification -After implementation: +Current issues: +Fence, nest box, water dish, grass, and placement preview logic are partly fragmented. -* Run syntax checks for all JavaScript files. -* Verify that old tarinai without personality data do not crash the game. -* Verify that personality values are clamped. -* Verify that daily limits work. -* Verify that threshold crossing creates observation logs. -* Verify that minor personality changes do not spam logs. -* Verify that tarinai data UI shows birth personality, current personality, and visible tags. -* Verify that children inherit from parents' current personality with \u00b10.2 random variation. +Implement: + +* Unify placement validation for the object types where overlap matters. +* Overlap is important for: + + * grass + * fence + * nest box + * water dish +* For other items, overlap does not need to be strict unless an existing rule already requires it. +* Do not over-engineer overlap rules for stones, balls, food items, firecrackers, poop, ant nests, ant corpses, or similar objects. + +Solid obstacles: + +* Unify all solid rectangular obstacle collision logic. +* Fence and nest box should use the same obstacle system where possible. +* Rename misleading helpers if needed: + + * For example, functions named only for “fence” but now handling nest boxes too should be renamed or wrapped with neutral names such as `solidObstacle`. +* Ball movement, Tarinai movement, path blocking, and placement checks should reference the same obstacle data. + +Fence collision: + +* Fence collision bounds must match the visible fence appearance. +* If the visual fence is not the same size as the previous hitbox, update the hitbox to match the visual footprint. +* Avoid separate visual size and collision size unless explicitly documented in one definition table. + +Nest box collision: + +* Preserve the existing 3×3 nest box hitbox rule: + + * If the nest box is divided into a 3×3 grid, the collidable cells are: + + * top-left + * top-center + * top-right + * middle-left + * middle-right + * The middle-center, bottom-left, bottom-center, and bottom-right cells are passable/enterable according to the current nest behavior. +* Ball must bounce off these nest box solid cells. +* Tarinai must not path through these solid cells. + +Placement preview: + +* The preview highlight must use the exact same placement validation as actual placement. +* If the preview is red, clicking must not place the object. +* If the preview is green, clicking should place the object at the previewed position. +* Do not silently clamp or auto-correct an out-of-bounds placement to an in-bounds location. +* If the planned placement would extend outside the field, the highlight must turn red. +* Fix any case where a fence preview extending outside the field does not turn red. +* The highlighted preview position should show the true placement footprint, not a different corrected footprint. + +Grass placement: + +* Keep the existing grass planting spot search/check behavior unless it directly conflicts with the unified placement preview/actual placement contract. +* Do not spend time expanding grass checks to every object type. + +Screen resize: + +* Do not implement special preservation behavior for screen resizing. +* Screen size change is allowed to reset the field. +* Do not add complicated coordinate scaling or migration logic for resize. + +Expected result: + +* Placement UI, actual placement, and collision behavior agree. +* No “red but placeable” or “green but placed elsewhere” behavior. +* Grass, fence, nest box, and water dish avoid important overlap. +* Other item overlap can remain permissive. + +--- + +# 11. Spatial query scratch arrays + +Current issue: +`nearbyItems()` and `nearbyTarinai()` may share the same mutable scratch array. Nested spatial queries can overwrite an outer loop’s result. + +Implement: + +* `nearbyItems()` and `nearbyTarinai()` must not share the same mutable scratch array. +* Nested spatial queries must not overwrite an outer loop’s result. +* Use separate scratch arrays, return fresh arrays, or explicitly copy results where nested queries are possible. +* Verify: + + * item interaction loops + * bed/nest occupancy checks + * best bed search + * ball interactions + * Tarinai interaction loops + * ant prey search if it uses nearby queries + +Expected result: + +* Spatial queries are safe even when nested. +* Loops over nearby entities do not mutate unexpectedly. + +--- + +# 12. Spatial rebuild/update phase + +Current issue: +The spatial grid may be rebuilt before entities move, so later collision and interaction passes can use stale positions. + +Implement: + +* Ensure spatial grid data is not stale during collision and interaction passes. +* Prefer phase separation: + + * update items + * update ants if their movement affects targeting/collision + * update Tarinai movement + * rebuild spatial grid + * resolve cross-entity interactions/collisions +* If full phase separation is too invasive, at minimum rebuild the spatial grid after Tarinai movement and before any interaction/collision logic that relies on it. +* Avoid relying on grid data from before entities moved. + +Expected result: + +* Nearby queries use current positions. +* Collision and interaction behavior is more stable. + +--- + +# 13. Duplicate weather log + +Current issue: +Weather changes may create duplicate identical log entries in some builds. + +Implement: + +* Verify `updateWeather()`. +* A weather change must create only one weather log entry. +* Do not log the same weather text twice. +* Preserve the actual weather behavior. + +Expected result: + +* One weather change produces one visible log entry. + +--- + +# 14. Tool/item definition and CSS icon cleanup + +The latest build already has a `TOOL_DEFINITIONS`-style structure. Finish consolidating and remove conflicts. + +Requirements: + +* Use a single current source of truth for tool/item definitions where practical. +* It should include at least: + + * internal id + * Japanese label + * tooltip text + * UI icon or icon renderer + * game appearance reference where applicable + * placement size / footprint + * whether it is placeable + * whether it is scalable + * collision shape if applicable + * simulation-only status if applicable +* Use this definition in the tool UI, placement preview, placement logic, and logs where appropriate. +* Do not leave conflicting duplicate label/icon/size definitions in separate files unless unavoidable. + +Specific icon requirements: + +* `つつく` must use `👈`. +* `つまむ` must use `🤏`. +* `洗浄` must use the shower emoji `🚿`. +* Remove or stop referencing old PNG icons for `つつく` and `つまむ`. +* If `洗浄` has both an emoji and a PNG icon, ensure the displayed tool UI follows the current requested shower emoji specification. +* Fix the nest box tool UI icon so it matches the actual in-game nest box appearance. +* Preserve the ant nest tool icon and ensure it remains visible. +* Ensure every tool that appears in the tool UI has an icon. +* Avoid mojibake/garbled icon rendering. +* CSS icon definitions must be unified to the current specification. +* Remove old CSS generations and conflicting icon overrides. +* Do not rely on CSS order to accidentally choose the correct icon. + +Water tool: + +* `水` must remain removed from the tool UI. +* If water still exists as a simulation object produced by rain or other systems, keep that object behavior. +* `水の皿` remains a valid tool/item. +* Keep `water` as simulation-only if needed. +* Remove leftover UI-only water tool entries, labels, tooltips, and placement handlers unless required by non-UI simulation. + +Static tool buttons: + +* If `index.html` still hardcodes tool buttons, ensure it does not conflict with `TOOL_DEFINITIONS`. +* Prefer generating or validating tool metadata from the definition table if practical. +* At minimum, make sure static buttons and definition data agree. + +Expected result: + +* Tool UI no longer has missing icons, old icons, or mismatched nest box visuals. +* Current icon definitions are clean and non-duplicated. +* Ant nest remains integrated. + +--- + +# 15. Death cause normalization + +Ensure these death causes are applied consistently: + +* Death by old age / lifespan: + + * `天寿を全うした` +* Tarinai deleted because it went too far outside the field: + + * `仕様により画面外で削除` +* Death caused by ball collision or Tarinai collision damage: + + * `衝突` +* Explosion death: + + * Keep explosion-related cause. +* Existing disease-related deaths: + + * Preserve current intended disease death causes unless they conflict with the above. + +Implementation: + +* Centralize death cause normalization if possible. +* Avoid scattered caller-side strings that can drift. +* Ensure observation UI, family tree, memorial/death display, and any other death display show the normalized cause. +* Since save/load is removed, do not implement migration for old death-cause strings. + +Expected result: + +* Death cause strings are consistent. +* Collision deaths do not appear as generic accidents. +* Lifespan deaths show `天寿を全うした`. + +--- + +# 16. Out-of-bounds object policy + +Implement or verify a unified out-of-bounds policy: + +* For objects or entities slightly outside the field: + + * Return them to the nearest valid in-field position. +* For objects or entities far outside the field, or with invalid coordinates such as NaN/Infinity: + + * Delete them. +* For Tarinai deleted by this system: + + * Death cause must be `仕様により画面外で削除`. + * Release its living ID so it may be reused. +* For non-living objects: + + * Delete without a death cause. +* Keep wall bounce behavior for balls at normal field boundaries, but still sanitize balls that somehow get far outside or invalid coordinates. +* Ant workers/queens should not remain permanently invisible offscreen. If they go far out or become invalid, delete or safely return them according to the least disruptive current ant behavior. +* Do not add resize-specific preservation logic; field reset on screen size change is acceptable. + +Expected result: + +* No permanent invisible offscreen objects or actors. +* No NaN entities poison the simulation. +* Far-outside Tarinai deletion has the correct death cause. + +--- + +# 17. Observation relationship highlight + +Current issue: +Relationship highlight during observation can be affected by sprite rotation in some builds. + +Implement or verify: + +* Relationship highlights must be drawn in world/screen space independent of Tarinai sprite rotation. +* Do not draw the highlight inside a rotated sprite transform. +* Ensure highlight position follows the Tarinai but does not rotate with the Tarinai body. +* Use living IDs or stable current object references for relationship lookup where appropriate, not name matching. +* Include the latest intended relationship types: + + * parents + * children + * enemies + * friends, using the current friendship threshold + +Expected result: + +* Highlight remains visually stable regardless of sprite rotation. +* Highlight targets the correct individuals. + +--- + +# 18. Nest box behavior preservation + +Preserve and verify previous nest box fixes: + +* Tarinai inside the nest box should be fully transparent in the main field. +* Nest box can contain up to 5 Tarinai. +* Nest box occupant popup should show each individual on a separate line. +* The nest box solid hitbox must follow the 3×3 rule described above. +* Ball should bounce off nest box solid hitbox cells. +* Living Tarinai IDs must not break nest box occupancy. +* Since save/load is removed, do not add save compatibility for nest box IDs. + +Expected result: + +* Nest box behavior remains stable after obstacle and ID refactoring. + +--- + +# 19. Ant nest behavior preservation + +Preserve the current ant nest feature. + +Do not regress: + +* `ant_nest` remains placeable. +* Each ant nest starts with the intended worker count. +* Worker ants spawn from their home nest. +* Worker ants search for Tarinai and drag them back to the nest. +* Multiple workers dragging the same Tarinai increase carrying speed. +* Dragged Tarinai can struggle and kill workers. +* Dead workers become edible `ant_corpse` items. +* Damaged workers keep their HP when returning to and leaving the nest. +* A full nest can spawn a queen. +* A queen can create a new ant nest in an open spot. +* Queen spawning remains limited according to the current intended daily rule. +* Ant health does not recover. +* Ant sprites and Irasutoya credit remain. + +ID-related requirements: + +* Ants must not use display names to target Tarinai. +* Ant target references must not break after living ID reuse. +* If a target Tarinai dies, is deleted, or its living ID is released, worker ants should safely abandon or retarget according to current behavior. +* Removing save/load must not remove active runtime ant behavior. + +Expected result: + +* Ant nest behavior remains intact after ID, save/load, and spatial refactoring. + +--- + +# 20. Encyclopedia / ecology page + +Preserve and verify the `たりないの生態` addition: + +* It must include an explanation of health. +* It must include an explanation of stress. +* It must use a Tarinai sprite/image with both the health bar and stress bar visible. +* Keep the latest shortened ecology cards and HP/stress meter placement note if present. +* Do not break existing encyclopedia entries. +* Preserve the Irasutoya credit entry added for ant assets. + +--- + +# 21. Naming and Japanese text preservation + +Preserve previous Japanese terminology changes: + +* `喧嘩傷病` must remain renamed to `きずつき病`. +* Lifespan death text must display as `天寿を全うした`. +* Friend relation label should remain `友達` if that is the current intended label. +* Use the existing tone/style for Japanese labels and descriptions. +* Do not reintroduce removed or old names. + +--- + +# 22. Remove obsolete or dead code where safe + +Clean up old or dead specifications, but do not remove active gameplay. + +Remove or simplify where safe: + +* old save/load compatibility code +* old save migration code +* old CSS icon generations +* obsolete tool icon definitions +* UI-only `water` tool leftovers +* unused save-only item serialization fields +* comments describing removed old-save behavior +* old code paths for removed tools such as UI `水` +* old legacy named-personality compatibility stubs if they exist only for old saves +* old `food`, `mirror`, `cardboard`, or similar legacy remnants only if they are truly unreachable and not part of current gameplay + +Keep: + +* Current rain/simulation water behavior if it exists. +* Current grass planting behavior. +* Current tool-size inheritance behavior. +* Current field reset behavior on screen resize. +* Family tree reset feature. +* Item placement drop-impact damage. +* Four-axis personality system. +* Ant nest feature. + +--- + +# 23. Input cleanup + +If practical without destabilizing gameplay, clean up mouse/touch input handling. + +Requirements: + +* Consider converting canvas input to `PointerEvent` handling. +* Keep behavior equivalent on desktop. +* Ensure dragging, pinching, hosing, placing, panning, and clicking remain stable. +* Do not make this a large risky rewrite if the existing input system is stable. +* This is lower priority than save/load removal, IDs, logging, collision, family tree performance, spatial safety, and item falling speed. + +Expected result: + +* Input behavior remains stable. +* Touch and pointer handling do not regress. + +--- + +# 24. Code quality expectations + +Refactor carefully: + +* Prefer small, well-named helper functions. +* Avoid adding more scattered special cases. +* Avoid duplicating collision math. +* Avoid duplicating item/tool metadata. +* Avoid string-matching for gameplay logic where structured data is possible. +* Do not add save compatibility or migration code. +* Do not over-engineer screen-resize preservation. +* Keep intentional odd behaviors when explicitly listed above. + +Add comments only where they clarify non-obvious game rules, especially: + +* disease fight rules +* nest box 3×3 collision cells +* external impulse vs normal movement +* family tree dirty/update scheduling +* reusable living Tarinai IDs +* hidden observation events not counting in statistics +* four-axis personality compatibility +* constant item falling speed +* intentional family tree reset behavior +* intentional item placement drop-impact damage +* ant target safety with reusable living IDs + +--- + +# 25. Validation checklist + +Before returning the zip, verify at minimum: + +Static checks: + +* Run `node --check` on every JavaScript file. +* Ensure there are no `ReferenceError` risks from renamed helpers. +* Ensure all cache version references are updated consistently. +* Ensure save/load functions and UI are removed. +* Ensure no localStorage game-state save/load code remains. +* Ensure old save migration and old-save compatibility comments are removed. + +Manual or scripted behavior checks where practical: + +* The game starts fresh without reading old saves. +* No save/load UI is visible. +* Living Tarinai have internal living IDs. +* Living IDs are not displayed. +* Dead Tarinai living IDs are released and can be reused without corrupting active references. +* Historical family tree/log display snapshots remain stable after death and ID reuse. +* Ant targeting does not break when Tarinai die or living IDs are released. +* Observation events attach by structured IDs/snapshots, not by name substring. +* Hidden observation events do not appear and do not count in statistics. +* `つつく` is not classified as fight. +* Selecting a Tarinai for observation is not counted as a gameplay event/stat. +* Ball vs ball collision works. +* Fast ball hitting Tarinai knocks it by ball velocity / 5. +* Fast collision death cause is `衝突`. +* Explosion throws nearby Tarinai farther than distant Tarinai and is not clamped by walking speed. +* Falling items use visually constant falling speed. +* Existing item placement drop-impact damage still exists. +* Fence preview turns red when the footprint leaves the field. +* Red placement preview cannot place an object. +* Green placement preview places at the same footprint shown. +* Grass, fence, nest box, and water dish respect important overlap checks. +* Other item overlap remains permissive unless already constrained. +* Nest box collision uses the required 3×3 cells. +* Ball bounces off nest box solid cells. +* Spatial query results are safe from nested-query overwrites. +* Spatial grid is not stale during interaction/collision passes. +* A weather change creates only one log entry. +* Family tree hidden/offscreen update is no more frequent than every 30 seconds. +* Family tree visible update happens when dirty, not every 5 seconds. +* Family tree processing does not freeze the game. +* Family tree reset feature still exists and can clear heavy family tree data/cache. +* Family tree reset does not allow stale async renders to restore old tree content. +* Four-axis personality UI still works. +* Legacy named personality is not reintroduced. +* Damage plus total losses greater than total wins can shift personality toward derived `臆病` behavior without creating a legacy personality field. +* `爆発病` and `ずんち病` can initiate fights. +* Other diseases cannot initiate fights. +* `ねむり病` cannot initiate and cannot be targeted. +* Other non-sleep diseases can be targeted. +* Observation UI does not show ball-poke events or avoid events. +* Tool icons are correct: `👈`, `🤏`, `🚿`, nest box matching in-game appearance, and ant nest visible. +* CSS icon definitions are unified to current specs. +* `水` is absent from the tool UI. +* `水の皿` remains available. +* Simulation-only rain water still works if present. +* Lifespan death cause is `天寿を全うした`. +* Far-outside Tarinai deletion cause is `仕様により画面外で削除`. +* Ant nest behavior still works. +* Screen resize may reset the field; no special preservation behavior is required. + +Deliverable: + +* Return a zip named something like `tarinai_colony_game_ant_nest_v6_fixed.zip`. +* Include a concise summary of changed areas and validation results. diff --git a/index.html b/index.html index 9e55382..c95f7b3 100644 --- a/index.html +++ b/index.html @@ -3,13 +3,20 @@ - - - + + たりない観察 - + +
    +
    +
    たりない観察を読み込み中
    +
    通信量を抑えて初期化しています…
    + +
    0%
    +
    +
    @@ -74,6 +81,7 @@
    + @@ -109,7 +117,10 @@

    家系図

    - +
    + + +
    @@ -167,21 +178,21 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/js/ants.js b/js/ants.js index 49a17b9..afbc83f 100644 --- a/js/ants.js +++ b/js/ants.js @@ -53,6 +53,8 @@ class AntActor { this.kind = opts.kind || "worker"; this.homeId = opts.homeId || ""; this.targetId = opts.targetId || ""; + this.targetToken = opts.targetToken || 0; + this.targetRef = opts.targetRef || null; this.x = Number.isFinite(opts.x) ? opts.x : 0; this.y = Number.isFinite(opts.y) ? opts.y : 0; this.vx = opts.vx || 0; @@ -60,6 +62,7 @@ class AntActor { this.r = opts.r || (this.kind === "queen" ? ANT_QUEEN_RADIUS : ANT_WORKER_RADIUS); this.maxHp = Number.isFinite(opts.maxHp) ? opts.maxHp : (this.kind === "queen" ? ANT_QUEEN_HP : ANT_WORKER_HP); this.hp = Number.isFinite(opts.hp) ? opts.hp : this.maxHp; + this.hpBarTimer = Number.isFinite(opts.hpBarTimer) ? opts.hpBarTimer : 0; this.state = opts.state || (this.kind === "queen" ? "founding" : "search"); this.age = opts.age || 0; this.seed = opts.seed || Math.random() * 1000; @@ -74,30 +77,19 @@ class AntActor { this.dead = Boolean(opts.dead); } - serialize() { - return { - id: this.id, kind: this.kind, homeId: this.homeId, targetId: this.targetId, - x: this.x, y: this.y, vx: this.vx, vy: this.vy, r: this.r, hp: this.hp, maxHp: this.maxHp, - state: this.state, age: this.age, seed: this.seed, wanderAngle: this.wanderAngle, - nextTurn: this.nextTurn, returnTimer: this.returnTimer, foundingX: this.foundingX, - foundingY: this.foundingY, foundingDelayUntil: this.foundingDelayUntil, carryLogAt: this.carryLogAt, foundingAttempts: this.foundingAttempts, dead: this.dead, - }; - } - - static from(worldRef, data) { - return new AntActor(worldRef, data || {}); - } - homeNest() { return (this.world?.items || []).find(it => it && !it.dead && it.id === this.homeId && it.type === "ant_nest") || null; } targetTarinai() { - return (this.world?.tarinai || []).find(t => t && !t.dead && t.id === this.targetId) || null; + if (this.targetRef && !this.targetRef.dead && this.targetRef.id === this.targetId && this.targetRef.liveToken === this.targetToken) return this.targetRef; + const live = this.world?.liveTarinaiById?.(this.targetId, this.targetToken) || null; + this.targetRef = live; + return live; } activeHaulersForTarget() { - return (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId && a.targetId === this.targetId); + return (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId && a.targetId === this.targetId && a.targetToken === this.targetToken); } isLeadHauler() { @@ -116,7 +108,7 @@ class AntActor { const d = distXY(this.x, this.y, t.x, t.y); if (d > maxDist) continue; if ((t.antDraggedTimer || 0) > 0 && (t.antDraggedBy || "") && t.antDraggedBy !== this.id) { - const haulers = (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId === t.id).length; + const haulers = (this.world?.ants || []).filter(a => a && !a.dead && a.kind === "worker" && a.state === "drag" && a.targetId === t.id && a.targetToken === t.liveToken).length; if (haulers >= ANT_NEST_MAX_OUTSIDE) continue; } const weak = clamp((100 - (t.energy || 0)) / 100, 0, 1); @@ -131,9 +123,12 @@ class AntActor { update(dt) { if (this.dead) return; + const hpBefore = this.hp; this.age += dt; - if (this.kind === "queen") return this.updateQueen(dt); - return this.updateWorker(dt); + if (this.kind === "queen") this.updateQueen(dt); + else this.updateWorker(dt); + if (Number.isFinite(hpBefore) && this.hp < hpBefore - 0.01) this.hpBarTimer = Math.max(this.hpBarTimer || 0, 1.25); + this.hpBarTimer = Math.max(0, (this.hpBarTimer || 0) - dt); } updateWorker(dt) { @@ -156,6 +151,8 @@ class AntActor { if (target) { this.state = "drag"; this.targetId = target.id; + this.targetToken = target.liveToken || 0; + this.targetRef = target; this.carryLogAt = this.world?.time || 0; target.antDraggedTimer = Math.max(target.antDraggedTimer || 0, 0.45); target.antDraggedBy = this.id; @@ -209,6 +206,8 @@ class AntActor { const target = this.targetTarinai(); if (!target || target.dead || target.insideNestBoxId) { this.targetId = ""; + this.targetToken = 0; + this.targetRef = null; this.state = "return"; return; } @@ -225,6 +224,8 @@ class AntActor { if (dHome < Math.max(18, home.r * 0.66)) { this.world.completeAntHaul?.(home, target); this.targetId = ""; + this.targetToken = 0; + this.targetRef = null; this.state = "return"; return; } @@ -253,7 +254,7 @@ class AntActor { if ((this.world.time || 0) - (this.carryLogAt || -999) > 8 && Math.random() < dt * 0.04) { this.carryLogAt = this.world.time || 0; - this.world.log(`${target.name}\u304c\u30a2\u30ea\u306b\u5f15\u3063\u5f35\u3089\u308c\u3066\u3044\u308b\u3002`, "event"); + this.world.log(`${target.name}\u304c\u30a2\u30ea\u306b\u5f15\u3063\u5f35\u3089\u308c\u3066\u3044\u308b\u3002`, "event", { participants: [target] }); } if (this.hp <= 0) this.dieAsCorpse(home); } @@ -373,12 +374,14 @@ class AntActor { } drawHealthBar(ctx) { + if ((this.hpBarTimer || 0) <= 0) return; const maxHp = Math.max(1, this.maxHp || (this.kind === "queen" ? ANT_QUEEN_HP : ANT_WORKER_HP)); const pct = clamp((this.hp || 0) / maxHp, 0, 1); const bw = this.kind === "queen" ? 28 : 18; const bh = this.kind === "queen" ? 4 : 3; const y = this.y - this.r * (this.kind === "queen" ? 2.0 : 2.6); ctx.save(); + ctx.globalAlpha = clamp((this.hpBarTimer || 0) / 0.65, 0.35, 1); ctx.fillStyle = "rgba(255,252,242,0.86)"; roundedRect(ctx, this.x - bw / 2 - 1.5, y - 1.5, bw + 3, bh + 3, 4); ctx.fill(); diff --git a/js/assets.js b/js/assets.js index e5a8cb2..efd8b2b 100644 --- a/js/assets.js +++ b/js/assets.js @@ -8,8 +8,8 @@ const imageAssetIndex = new Map(); const scaledSpriteCache = new Map(); const stainOverlayCache = new Map(); -const INITIAL_IMAGE_IDS = new Set(["smile", "zunchi", "zunchi_02"]); -const EARLY_IMAGE_IDS = new Set(["smile", "angry", "teary", "jito", "drool", "cry", "sleep", "pokan", "normal_smirk", "normal_tongue", "normal_happy", "weak", "hurt", "hurt2", "zunchi", "zunchi_02"]); +const INITIAL_IMAGE_IDS = new Set(["smile", "zunchi", "zunchi_02", "genkotsu"]); +const EARLY_IMAGE_IDS = new Set(["smile", "angry", "teary", "jito", "drool", "cry", "sleep", "pokan", "normal_smirk", "normal_tongue", "normal_happy", "weak", "hurt", "hurt2", "zunchi", "zunchi_02", "genkotsu"]); function trimCanvasCache(cache, limit = 420) { while (cache.size > limit) { @@ -160,14 +160,18 @@ function getRenderableImage(id, fallbackId = "smile") { return null; } -function loadImages(ids = null) { +function loadImages(ids = null, onProgress = null) { setupAssetIndex(); const requested = ids ? new Set(ids) : INITIAL_IMAGE_IDS; - const tasks = []; - for (const id of requested) { - const asset = imageAssetIndex.get(id); - if (asset) tasks.push(loadImageAsset(asset, "high")); - } + const assets = [...requested].map(id => imageAssetIndex.get(id)).filter(Boolean); + const total = Math.max(assets.length, 1); + let done = 0; + if (typeof onProgress === "function") onProgress(done, total, null); + const tasks = assets.map(asset => loadImageAsset(asset, "high").then((img) => { + done += 1; + if (typeof onProgress === "function") onProgress(done, total, asset); + return img; + })); return Promise.all(tasks).then(() => undefined); } diff --git a/js/data.js b/js/data.js index fe68986..dea50df 100644 --- a/js/data.js +++ b/js/data.js @@ -34,6 +34,7 @@ const DECOR_ASSETS = [ { id: "zunchi_02", path: "assets/objects/zunchi_02.png" }, { id: "ant_queen", path: "assets/objects/ant_queen.png" }, { id: "ant_worker", path: "assets/objects/ant_worker.png" }, + { id: "genkotsu", path: "assets/objects/genkotsu.png" }, ]; const TOOL_DEFINITIONS = Object.freeze({ @@ -42,7 +43,7 @@ const TOOL_DEFINITIONS = Object.freeze({ poke: { id: "poke", label: "\u3064\u3064\u304f", placeable: false, scalable: false, iconText: "\u{1F448}", tooltip: "\u305f\u308a\u306a\u3044\u3092\u3064\u3064\u304f\u3002\u30dc\u30fc\u30eb\u3082\u3064\u3064\u3044\u3066\u8ee2\u304c\u305b\u308b\u3002" }, pinch: { id: "pinch", label: "\u3064\u307e\u3080", placeable: false, scalable: false, iconText: "\u{1F90F}", tooltip: "\u305f\u308a\u306a\u3044\u3084\u7269\u3092\u3064\u307e\u3093\u3067\u79fb\u52d5\u3055\u305b\u308b\u3002" }, new: { id: "new", label: "\u8ffd\u52a0", placeable: false, scalable: false, icon: "assets/ui/tool_new.png", tooltip: "\u753b\u9762\u5916\u304b\u3089\u65b0\u3057\u3044\u305f\u308a\u306a\u3044\u3092\u547c\u3076\u3002" }, - water_hose: { id: "water_hose", label: "\u6d17\u6d44", placeable: false, scalable: false, iconText: "\u{1F6BF}", icon: "assets/ui/tool_water_hose.png", tooltip: "\u30c9\u30e9\u30c3\u30b0\u3067\u6c5a\u308c\u3092\u304d\u308c\u3044\u306b\u3059\u308b\u3002" }, + water_hose: { id: "water_hose", label: "\u6d17\u6d44", placeable: false, scalable: false, iconText: "\u{1F6BF}", tooltip: "\u30c9\u30e9\u30c3\u30b0\u3067\u6c5a\u308c\u3092\u304d\u308c\u3044\u306b\u3059\u308b\u3002" }, zunchi: { id: "zunchi", itemType: "zunchi", label: "\u305a\u3093\u3061", placeable: true, scalable: true, radius: 14, amount: 240, icon: "assets/ui/tool_zunchi.png", tooltip: "\u305f\u308a\u306a\u3044\u306e\u305a\u3093\u3061\u3002\u75c5\u6c17\u3084\u8349\u306e\u80a5\u6599\u306b\u95a2\u308f\u308b\u3002" }, sweet: { id: "sweet", itemType: "sweet", label: "\u305a\u3093\u3060\u9905", placeable: true, scalable: true, radius: 13, amount: 62, icon: "assets/ui/tool_sweet.png", tooltip: "\u305f\u308a\u306a\u3044\u306e\u5927\u597d\u7269\u3002\u4e00\u90e8\u306e\u75c5\u6c17\u3092\u6cbb\u305b\u308b\u3002" }, love_mochi: { id: "love_mochi", itemType: "love_mochi", label: "\u3078\u3053\u9905", placeable: true, scalable: true, radius: 13, amount: 62, icon: "assets/ui/tool_love_mochi.png", tooltip: "\u98df\u5f8c\u3057\u3070\u3089\u304f\u7e41\u6b96\u884c\u52d5\u304c\u8d77\u304d\u3084\u3059\u304f\u306a\u308b\u3002" }, @@ -51,6 +52,7 @@ const TOOL_DEFINITIONS = Object.freeze({ sleep_drug: { id: "sleep_drug", itemType: "sleep_drug", label: "\u306d\u3080\u308a\u85ac", placeable: true, scalable: true, radius: 13, amount: 58, icon: "assets/ui/tool_sleep_drug.png", tooltip: "\u98df\u3079\u308b\u3068\u306d\u3080\u308a\u75c5\u306b\u306a\u308b\u3002\u30c0\u30e1\u30fc\u30b8\u3067\u5b8c\u6cbb\u3059\u308b\u3002" }, grass: { id: "grass", itemType: "grass", label: "\u8349", placeable: true, scalable: true, radius: 17, amount: 120, icon: "assets/ui/tool_grass.png", tooltip: "\u98df\u3079\u7269\u3002\u305f\u308a\u306a\u3044\u304c\u5b89\u5fc3\u3059\u308b\u3002" }, stone: { id: "stone", itemType: "stone", label: "\u77f3", placeable: true, scalable: true, radius: 20, amount: 999, icon: "assets/ui/tool_stone.png", tooltip: "\u91cd\u3044\u77f3\u3002\u843d\u3068\u3059\u3068\u5371\u306a\u3044\u3002" }, + genkotsu: { id: "genkotsu", itemType: "genkotsu", label: "\u3052\u3093\u3053\u3064", placeable: true, scalable: false, radius: 72, amount: 100, icon: "assets/ui/tool_genkotsu.png", tooltip: "\u4e0a\u304b\u3089\u6b63\u7fa9\u3052\u3093\u3053\u3064\u3092\u843d\u3068\u3057\u3001\u30a2\u30ea\u3068\u305f\u308a\u306a\u3044\u306b\u30c0\u30e1\u30fc\u30b8\u3068\u5439\u3063\u98db\u3073\u3092\u4e0e\u3048\u308b\u3002" }, bed: { id: "bed", itemType: "bed", label: "\u5e72\u8349\u5bdd\u5e8a", placeable: true, scalable: false, radius: 37, amount: 999, icon: "assets/ui/tool_bed.png", tooltip: "\u8fd1\u304f\u3067\u7720\u308b\u3002\u4f53\u529b\u304c\u56de\u5fa9\u3059\u308b\u3002" }, nest_box: { id: "nest_box", itemType: "nest_box", label: "\u5de3\u7bb1", placeable: true, scalable: false, radius: 42, amount: 999, icon: "assets/ui/tool_nest_box.png", collisionShape: "nest_box_3x3", tooltip: "\u3044\u308b\u3060\u3051\u3067\u30b9\u30c8\u30ec\u30b9\u4f4e\u6e1b\u3002\u7720\u308b\u3068\u7761\u7720\u306e\u8cea\u304c\u4e0a\u304c\u308b\u3002" }, ant_nest: { id: "ant_nest", itemType: "ant_nest", label: "\u30a2\u30ea\u306e\u5de3", placeable: true, scalable: false, radius: 17, amount: 999, icon: "assets/ui/tool_ant_nest.png", collisionShape: "circle", tooltip: "\u50cd\u304d\u30a2\u30ea\u304c\u305f\u308a\u306a\u3044\u3092\u63a2\u3057\u3001\u5de3\u3078\u904b\u3076\u3002" }, @@ -131,6 +133,7 @@ const ALPHA_BOUNDS = { zunchi_02: { x: 8, y: 63, w: 220, h: 105, imageW: 236, imageH: 178 }, ant_queen: { x: 0, y: 0, w: 300, h: 155, imageW: 300, imageH: 155 }, ant_worker: { x: 0, y: 0, w: 140, h: 72, imageW: 140, imageH: 72 }, + genkotsu: { x: 8, y: 8, w: 220, h: 283, imageW: 236, imageH: 299 }, }; const NEEDS = ["\u98df\u3079\u7269", "\u4ef2\u9593", "\u7720\u308a", "\u52c7\u6c17", "\u6c34", "\u9759\u3051\u3055", "\u3042\u305f\u305f\u304b\u3055", "\u610f\u5473", "\u7a7a\u9593", "\u81ea\u4fe1"]; @@ -145,7 +148,6 @@ const CONFIG = { traceLimit: 64, splatLimit: 48, effectLimit: 96, - saveKey: "tarinai-colony-save-v38", worldPadding: 30, hungerPerMinute: 11.2, lonelinessPerMinute: 7.6, diff --git a/js/items.js b/js/items.js index 6a666c5..30c8d86 100644 --- a/js/items.js +++ b/js/items.js @@ -76,6 +76,12 @@ class Item { this.fuseTimer = 5; this.fuseMax = 5; } + if (type === "genkotsu") { + this.amount = 100; + this.dropMax = 0; + this.dropImpactDone = false; + this.impactFlash = 0; + } if (isServingFoodType(type)) { this.toolSize = "medium"; this.foodServingScale = 1; @@ -106,6 +112,11 @@ class Item { else this.amount = 0; } } + if (this.type === "genkotsu") { + this.impactFlash = Math.max(0, (this.impactFlash || 0) - dt); + if (this.dropImpactDone) this.amount -= dt * 115; + else this.amount = Math.max(this.amount || 0, 100); + } if (this.type === "ball") this.updateBall(dt, worldRef); if (this.type === "zunchi") this.updateZunchiMotion(dt, worldRef); if (this.type === "grass") { @@ -176,8 +187,6 @@ class Item { const speed = Math.hypot(this.vx || 0, this.vy || 0); const searchRadius = Math.max(150, (this.r || 18) + speed * Math.max(dt || 0.016, 0.016) + 120); const items = worldRef.nearbyItems(this.x, this.y, searchRadius) || []; - let solidChecks = 0; - const maxSolidChecks = CONFIG.maxFenceCollisionChecks ?? 24; for (const it of items) { if (!it || it === this || it.dead) continue; if (it.type === "bed") { @@ -187,8 +196,6 @@ class Item { } const rects = worldRef.solidObstacleRects ? worldRef.solidObstacleRects(it) : []; if (!rects.length) continue; - if (solidChecks >= maxSolidChecks) continue; - solidChecks += 1; for (const rect of rects) this.resolveBallRectBounce(rect, worldRef, it); } } @@ -467,148 +474,6 @@ class Item { get dead() { return this.amount <= 0; } - serialize() { - return { - type: this.type, x: this.x, y: this.y, amount: this.amount, age: this.age, seed: this.seed, - stage: this.stage, stageTimer: this.stageTimer, fertility: this.fertility, freshness: this.freshness, - growth: this.growth, health: this.health, seedTimer: this.seedTimer, eatenAmount: this.eatenAmount, fertilityBoost: this.fertilityBoost, lifeSpan: this.lifeSpan, wither: this.wither, - comfort: this.comfort, wear: this.wear, crawlOpen: this.crawlOpen, zunchiVariant: this.zunchiVariant, toolSize: this.toolSize, foodServingScale: this.foodServingScale, foodServingsMax: this.foodServingsMax, foodServingsRemaining: this.foodServingsRemaining, blastScale: this.blastScale, fuseTimer: this.fuseTimer, fuseMax: this.fuseMax, dropTimer: this.dropTimer, dropMax: this.dropMax, - vx: this.vx, vy: this.vy, prevX: this.prevX, prevY: this.prevY, - spin: this.spin, spinVelocity: this.spinVelocity, lastKickedAt: this.lastKickedAt, lastKickerId: this.lastKickerId, - lastPokedAt: this.lastPokedAt, pokeCombo: this.pokeCombo, lastPokeAngle: this.lastPokeAngle, - antCount: this.antCount, antSpawnTimer: this.antSpawnTimer, antSpawnCooldown: this.antSpawnCooldown, antWorkers: Array.isArray(this.antWorkers) ? this.antWorkers.slice() : undefined, queenSpawnAt: this.queenSpawnAt, workerSprite: this.workerSprite, decayTimer: this.decayTimer - }; - } - static from(o) { - const type = o?.type || "grass"; - const it = Object.create(Item.prototype); - Item._loadId = (Item._loadId || 0) + 1; - it.id = o.id || `loaded-${Item._loadId}`; - it.type = type; - it.x = o.x; - it.y = o.y; - it.r = itemRadiusFor(type, 12); - it.amount = o.amount ?? itemAmountFor(type, 80); - it.age = o.age || 0; - it.seed = o.seed || Math.random() * 1000; - it.dropTimer = 0; - it.dropMax = 0; - it.dropImpactDone = false; - it.lifecycleTimer = o.lifecycleTimer ?? rand(0, type === "grass" ? 1.15 : 0.55); - it.lifecycleInterval = o.lifecycleInterval ?? (type === "grass" ? (1.75 + stableUnit(it.id, "grass-life") * 0.90) : (type === "zunchi" ? (0.95 + stableUnit(it.id, "zunchi-life") * 0.45) : 0)); - if (type === "grass") { - it.growth = 0.25; - it.health = 1; - it.seedTimer = rand(18, 38); - it.eatenAmount = 0; - it.fertilityBoost = 0; - } - if (type === "bed") { - it.comfort = 1; - it.wear = 0; - } - if (type === "ball") { - it.vx = o.vx || 0; - it.vy = o.vy || 0; - it.prevX = o.prevX ?? o.x; - it.prevY = o.prevY ?? o.y; - it.spin = o.spin || 0; - it.spinVelocity = o.spinVelocity || 0; - it.lastKickedAt = o.lastKickedAt ?? -999; - it.lastKickerId = o.lastKickerId || ""; - it.lastPokedAt = o.lastPokedAt ?? -999; - it.pokeCombo = o.pokeCombo || 0; - it.lastPokeAngle = o.lastPokeAngle || rand(0, Math.PI * 2); - } - if (type === "zunchi") { - it.stage = "fresh"; - it.stageTimer = 0; - it.fertility = 0; - it.freshness = 1; - it.zunchiVariant = "zunchi"; - } - if (type === "ant_nest") { - it.antCount = Number.isFinite(o.antCount) ? clamp(Math.round(o.antCount), 0, ANT_NEST_MAX_COUNT || 10) : (ANT_NEST_START_COUNT || 6); - it.antSpawnTimer = o.antSpawnTimer ?? rand(0.6, 2.2); - it.antSpawnCooldown = o.antSpawnCooldown ?? rand(0.8, 2.4); - const legacyPool = Array.isArray(o.antWorkers) ? o.antWorkers : (Array.isArray(o.workerHpPool) ? o.workerHpPool : null); - it.antWorkers = Array.isArray(legacyPool) - ? legacyPool.map(v => clamp(Number(v) || ANT_WORKER_HP || 32, 0.1, ANT_WORKER_HP || 32)).slice(0, ANT_NEST_MAX_COUNT || 10) - : (typeof buildAntWorkerPool === "function" - ? buildAntWorkerPool(it.antCount) - : Array.from({ length: it.antCount }, () => ANT_WORKER_HP || 32)); - it.queenSpawnAt = Number.isFinite(o.queenSpawnAt) ? o.queenSpawnAt : -999; - } - if (type === "ant_corpse") { - it.workerSprite = o.workerSprite || "ant_worker"; - it.decayTimer = o.decayTimer || 0; - } - if (type === "firecracker") { - it.fuseTimer = 5; - it.fuseMax = 5; - } - it.stage = o.stage || it.stage; - it.stageTimer = o.stageTimer || 0; - it.fertility = o.fertility || 0; - it.freshness = o.freshness ?? it.freshness; - it.growth = o.growth ?? it.growth; - it.health = o.health ?? it.health; - it.seedTimer = o.seedTimer ?? it.seedTimer; - it.eatenAmount = o.eatenAmount || 0; - it.fertilityBoost = o.fertilityBoost || 0; - it.lifeSpan = o.lifeSpan ?? it.lifeSpan; - it.wither = o.wither ?? it.wither ?? 0; - it.comfort = o.comfort ?? it.comfort; - it.wear = o.wear ?? it.wear; - it.crawlOpen = o.crawlOpen ?? it.crawlOpen; - it.vx = o.vx ?? it.vx ?? 0; - it.vy = o.vy ?? it.vy ?? 0; - it.prevX = o.prevX ?? it.prevX ?? it.x; - it.prevY = o.prevY ?? it.prevY ?? it.y; - it.spin = o.spin ?? it.spin ?? 0; - it.spinVelocity = o.spinVelocity ?? it.spinVelocity ?? 0; - it.lastKickedAt = o.lastKickedAt ?? it.lastKickedAt ?? -999; - it.lastKickerId = o.lastKickerId || it.lastKickerId || ""; - it.lastPokedAt = o.lastPokedAt ?? it.lastPokedAt ?? -999; - it.pokeCombo = o.pokeCombo ?? it.pokeCombo ?? 0; - it.lastPokeAngle = o.lastPokeAngle ?? it.lastPokeAngle ?? rand(0, Math.PI * 2); - it.zunchiVariant = o.zunchiVariant || it.zunchiVariant || "zunchi"; - it.antCount = Number.isFinite(o.antCount) ? clamp(Math.round(o.antCount), 0, ANT_NEST_MAX_COUNT || 10) : it.antCount; - it.antSpawnTimer = o.antSpawnTimer ?? it.antSpawnTimer; - it.antSpawnCooldown = o.antSpawnCooldown ?? it.antSpawnCooldown; - if (type === "ant_nest") { - const legacyPool = Array.isArray(o.antWorkers) ? o.antWorkers : (Array.isArray(o.workerHpPool) ? o.workerHpPool : null); - if (Array.isArray(legacyPool)) { - it.antWorkers = legacyPool.map(v => clamp(Number(v) || 0, 0, ANT_WORKER_HP || 32)).filter(v => v > 0).slice(0, ANT_NEST_MAX_COUNT || 10); - } else if (!Array.isArray(it.antWorkers)) { - it.antWorkers = typeof buildAntWorkerPool === "function" - ? buildAntWorkerPool(it.antCount || (ANT_NEST_START_COUNT || 6)) - : Array.from({ length: it.antCount || (ANT_NEST_START_COUNT || 6) }, () => ANT_WORKER_HP || 32); - } - it.queenSpawnAt = Number.isFinite(o.queenSpawnAt) ? o.queenSpawnAt : (it.queenSpawnAt ?? -999); - } - it.workerSprite = o.workerSprite || it.workerSprite; - it.decayTimer = o.decayTimer ?? it.decayTimer; - it.toolSize = o.toolSize || it.toolSize || "medium"; - it.foodServingScale = o.foodServingScale || it.foodServingScale || ({ small: 0.68, medium: 1.0, large: 1.48 }[it.toolSize] || 1); - if (isServingFoodType(it.type)) { - const servingMax = foodServingsForSize(it.toolSize); - it.foodServingsMax = Number.isFinite(o.foodServingsMax) ? o.foodServingsMax : servingMax; - if (Number.isFinite(o.foodServingsRemaining)) { - it.foodServingsRemaining = clamp(o.foodServingsRemaining, 0, it.foodServingsMax); - } else { - it.foodServingsRemaining = Math.max(1, Math.min(it.foodServingsMax, Math.ceil(it.foodServingsMax * clamp((o.amount ?? it.amount) / 70, 0.05, 1)))); - } - it.amount = it.foodServingsRemaining; - } - it.blastScale = o.blastScale || it.blastScale || 1; - it.fuseTimer = o.fuseTimer ?? it.fuseTimer; - it.fuseMax = o.fuseMax ?? it.fuseMax; - it.dropTimer = 0; - it.dropMax = 0; - it.dropImpactDone = true; - return it; - } draw(ctx, t, lighting = null) { const lightState = lighting || getLightingState(world); const night = clamp(lightState.nightStrength * 1.35, 0, 1); @@ -618,7 +483,8 @@ class Item { const servingRatio = isServingFoodType(this.type) ? ((this.foodServingsRemaining ?? this.amount) / Math.max(1, this.foodServingsMax || foodServingsForSize(this.toolSize || "medium"))) : null; const visibleAlpha = isServingFoodType(this.type) ? clamp(servingRatio ?? 1, 0.24, 1) : clamp(this.amount / 40, 0.24, 1); const dropT = this.dropMax > 0 ? clamp(this.dropTimer / this.dropMax, 0, 1) : 0; - const dropY = dropT > 0 ? -170 * Math.pow(dropT, 0.42) : 0; + const dropFallHeight = this.type === "genkotsu" ? Math.max(360, this.r * 5.8) : 170; + const dropY = dropT > 0 ? -dropFallHeight * dropT : 0; const shadow = projectedShadowParams(lightState, Math.max(0.4, this.r / 18)); if (this.type !== "trace" && this.type !== "splat") { const zunchiId = this.type === "zunchi" ? (this.zunchiVariant || "zunchi") : null; @@ -689,13 +555,8 @@ class Item { ctx.ellipse(-this.r * 0.28, -this.r * 0.18, this.r * 0.23, this.r * 0.10, -0.35, 0, Math.PI * 2); ctx.fill(); } else if (fightMochi) { - ctx.fillStyle = "#d55632"; - ctx.font = `${Math.round((this.r || 13) * 1.02)}px sans-serif`; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fillText("\u2726", 0, 1); - ctx.strokeStyle = "rgba(168,76,42,0.72)"; - ctx.lineWidth = 1.4; + ctx.strokeStyle = "rgba(168,76,42,0.82)"; + ctx.lineWidth = 1.8; ctx.beginPath(); ctx.moveTo(-this.r * 0.44, -this.r * 0.42); ctx.lineTo(this.r * 0.44, this.r * 0.42); @@ -725,6 +586,42 @@ class Item { ctx.textAlign = "center"; ctx.textBaseline = "middle"; ctx.fillText("Z", 0, this.r * 1.18); + } else if (this.type === "genkotsu") { + const img = typeof getRenderableImage === "function" ? getRenderableImage("genkotsu", "genkotsu") : images.get("genkotsu"); + const impact = clamp(this.impactFlash || 0, 0, 1); + ctx.save(); + ctx.shadowColor = "rgba(54,42,31,0.26)"; + ctx.shadowBlur = 5 + impact * 8; + ctx.shadowOffsetY = 4; + const squashY = 1 - impact * 0.08; + const stretchX = 1 + impact * 0.05; + ctx.scale(stretchX, squashY); + if (img) { + const metrics = typeof getImageMetrics === "function" ? getImageMetrics("genkotsu") : null; + const w = this.r * 2.55; + const h = w * (metrics?.ratio || 1.27); + ctx.drawImage(img, -w * 0.5, -h * 0.76, w, h); + } else { + ctx.fillStyle = "rgba(255,255,255,0.94)"; + ctx.strokeStyle = "rgba(64,64,64,0.78)"; + ctx.lineWidth = 5; + roundedRect(ctx, -this.r * 0.72, -this.r * 1.45, this.r * 1.44, this.r * 1.84, 18); + ctx.fill(); ctx.stroke(); + ctx.fillStyle = "rgba(42,46,52,0.92)"; + ctx.font = `bold ${Math.round(this.r * 0.45)}px sans-serif`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText("\u6b63", 0, -this.r * 0.74); + ctx.fillText("\u7fa9", 0, -this.r * 0.27); + } + if (impact > 0.01) { + ctx.globalAlpha = impact * 0.20; + ctx.fillStyle = "#ffffff"; + ctx.beginPath(); + ctx.ellipse(0, -this.r * 0.65, this.r * 0.92, this.r * 0.22, -0.10, 0, Math.PI * 2); + ctx.fill(); + } + ctx.restore(); } else if (this.type === "water_bowl") { ctx.fillStyle = "rgba(171, 120, 76, 0.72)"; ctx.strokeStyle = "rgba(94, 69, 48, 0.55)"; @@ -812,21 +709,26 @@ class Item { ctx.stroke(); } } else if (this.type === "nest_box") { - ctx.fillStyle = styleNight ? "#7d6040" : (styleWarm ? "#b98246" : "#9a6b3d"); - ctx.strokeStyle = styleNight ? "#4a3a2d" : "#5d4028"; - ctx.lineWidth = 2.4; + ctx.fillStyle = styleNight ? "#5f4933" : (styleWarm ? "#89613e" : "#775237"); + ctx.strokeStyle = styleNight ? "#31261f" : "#3f2e24"; + ctx.lineWidth = 2.6; roundedRect(ctx, -this.r * 1.28, -this.r * 0.80, this.r * 2.56, this.r * 1.52, 9); ctx.fill(); ctx.stroke(); - ctx.fillStyle = styleNight ? "#3b2f27" : "#65432a"; - ctx.beginPath(); - ctx.arc(0, -this.r * 0.02, this.r * 0.42, 0, Math.PI * 2); + ctx.fillStyle = styleNight ? "#6e5439" : "#8a5f3b"; + roundedRect(ctx, -this.r * 1.12, -this.r * 0.62, this.r * 2.24, this.r * 1.18, 6); + ctx.fill(); + ctx.strokeStyle = styleNight ? "rgba(42,32,25,0.76)" : "rgba(65,45,32,0.72)"; + ctx.lineWidth = 2.0; + ctx.beginPath(); + ctx.moveTo(-this.r * 0.95, -this.r * 0.50); + ctx.lineTo(this.r * 0.95, -this.r * 0.50); + ctx.moveTo(-this.r * 0.95, this.r * 0.48); + ctx.lineTo(this.r * 0.95, this.r * 0.48); + ctx.stroke(); + ctx.fillStyle = styleNight ? "#2b211c" : "#3c281f"; + ctx.beginPath(); + ctx.arc(0, -this.r * 0.08, this.r * 0.40, 0, Math.PI * 2); ctx.fill(); - ctx.fillStyle = "rgba(255,230,152,0.38)"; - for (let i = 0; i < 6; i++) { - ctx.beginPath(); - ctx.ellipse(randSeed(this.seed + i, -this.r * 0.84, this.r * 0.84), randSeed(this.seed + 20 + i, this.r * 0.32, this.r * 0.68), this.r * 0.26, this.r * 0.045, randSeed(this.seed + 40 + i, -0.7, 0.7), 0, Math.PI * 2); - ctx.fill(); - } } else if (this.type === "ant_nest") { const count = clamp(Math.round(this.antCount ?? ANT_NEST_START_COUNT ?? 6), 0, ANT_NEST_MAX_COUNT ?? 10); ctx.fillStyle = styleNight ? "#5e4634" : (styleWarm ? "#956b42" : "#77583a"); diff --git a/js/main.js b/js/main.js index d2e6542..3b9286f 100644 --- a/js/main.js +++ b/js/main.js @@ -6,6 +6,25 @@ let fpsFrames = 0; let perfResizeTimer = 0; let lastPerfLevel = 0; window.__tarinaiFps = 0; + +function setLoadingProgress(text = "", ratio = 0) { + const screen = document.getElementById("loadingScreen"); + if (!screen) return; + const pct = clamp(Number(ratio) || 0, 0, 1); + const label = document.getElementById("loadingText"); + const bar = document.getElementById("loadingBar"); + const percent = document.getElementById("loadingPercent"); + if (label && text) label.textContent = text; + if (bar) bar.style.width = `${Math.round(pct * 100)}%`; + if (percent) percent.textContent = `${Math.round(pct * 100)}%`; +} + +function hideLoadingScreen() { + setLoadingProgress("\u8d77\u52d5\u5b8c\u4e86", 1); + const screen = document.getElementById("loadingScreen"); + if (!screen) return; + window.setTimeout(() => screen.classList.add("hidden"), 120); +} function loop() { const t = nowSec(); const rawDt = t - last; @@ -38,16 +57,25 @@ function loop() { requestAnimationFrame(loop); } -loadImages().then(() => { +setLoadingProgress("\u521d\u671f\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u307f\u4e2d", 0.08); +loadImages(null, (done, total) => { + const p = total > 0 ? done / total : 1; + setLoadingProgress(`\u521d\u671f\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u307f\u4e2d ${done}/${total}`, 0.08 + p * 0.46); +}).then(() => { + setLoadingProgress("UI\u3092\u6e96\u5099\u4e2d", 0.62); bindUI(); + setLoadingProgress("\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u69cb\u7bc9\u4e2d", 0.72); applyFieldLayout("garden"); world.reset(null, "garden"); selectTool("observe"); + setLoadingProgress("\u8868\u793a\u3092\u521d\u671f\u5316\u4e2d", 0.84); renderLog(world.logs); renderArchive(); render(); renderStats(); syncTopButtons(); if (typeof startBackgroundImageLoading === "function") startBackgroundImageLoading(); + setLoadingProgress("\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u59cb\u4e2d", 0.94); loop(); + requestAnimationFrame(hideLoadingScreen); }); diff --git a/js/sim_core.js b/js/sim_core.js index 43fb3bb..a8330e9 100644 --- a/js/sim_core.js +++ b/js/sim_core.js @@ -64,8 +64,6 @@ function stableUnit(seed, salt = "") { return ((h >>> 0) % 100000) / 100000; } -// Legacy named personalities were removed. Keep these stubs only so old save data -// and old UI fallback references cannot revive the pre-four-axis personality model. const PERSONALITIES = Object.freeze({}); const PERSONALITY_IDS = []; @@ -255,12 +253,14 @@ function relationDefaults() { function isParentChild(a, b) { if (!a || !b) return false; - return Boolean(a.parents?.includes(b.id) || b.parents?.includes(a.id)); + const aKey = a.familyKey || a.id; + const bKey = b.familyKey || b.id; + return Boolean(a.parents?.includes(bKey) || b.parents?.includes(aKey)); } function relationDisplayName(worldRef, id) { if (!id) return "\u306a\u3057"; - const live = worldRef?.tarinai?.find(t => t.id === id); + const live = worldRef?.tarinai?.find(t => t.id === id || t.familyKey === id); if (live) return live.name; const fam = worldRef?.family?.[id]; return fam?.name || "\u4e0d\u660e"; diff --git a/js/tarinai.js b/js/tarinai.js index 5cfaf88..65532f1 100644 --- a/js/tarinai.js +++ b/js/tarinai.js @@ -17,7 +17,9 @@ function tarinaiRoundRectPath(ctx, x, y, w, h, r) { class Tarinai { constructor(world, opts = {}) { this.world = world; - this.id = opts.id || (crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}`); + this.familyKey = opts.familyKey || opts.archiveKey || opts.id || (crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}`); + this.id = opts.id || ""; + this.liveToken = opts.liveToken || 0; this.name = opts.name || makeName(world); // Legacy string personality is intentionally ignored. The game now uses only the four-axis personality model. this.personality = ""; @@ -25,7 +27,7 @@ class Tarinai { const typeMeta = SPRITES.find(s => s.id === this.type); if (typeMeta?.actionOnly || typeMeta?.displayOnly) this.type = baseSpriteId(); this.birthPersonality = normalizePersonality(opts.birthPersonality || opts.personalityBirth); - if (!opts.birthPersonality && !opts.personalityBirth) this.birthPersonality = randomBirthPersonality(this.id); + if (!opts.birthPersonality && !opts.personalityBirth) this.birthPersonality = randomBirthPersonality(this.familyKey); this.currentPersonality = normalizePersonality(opts.currentPersonality || opts.personalityCurrent || this.birthPersonality); this.personalityDaily = opts.personalityDaily && typeof opts.personalityDaily === "object" ? JSON.parse(JSON.stringify(opts.personalityDaily)) : null; ensurePersonality(this); @@ -76,8 +78,8 @@ class Tarinai { this.sleeping = false; this.blink = rand(0, 10); this.lastSocial = 0; - this.goodMode = opts.goodMode ?? stableChoice(this.id, "good-mode", displayNormalSprites()) ?? "smile"; - this.facing = opts.facing ?? (stableUnit(this.id, "facing") < 0.5 ? -1 : 1); + this.goodMode = opts.goodMode ?? stableChoice(this.familyKey, "good-mode", displayNormalSprites()) ?? "smile"; + this.facing = opts.facing ?? (stableUnit(this.familyKey, "facing") < 0.5 ? -1 : 1); this.visualFacing = opts.visualFacing ?? this.facing; this.facingLockUntil = opts.facingLockUntil ?? 0; this.eatTimer = opts.eatTimer ?? 0; @@ -95,7 +97,7 @@ class Tarinai { this.birthRitualLeader = !!opts.birthRitualLeader; this.pokeFlashTimer = opts.pokeFlashTimer ?? 0; this.zunchiStain = opts.zunchiStain ?? 0; - this.zunchiStainSeed = opts.zunchiStainSeed ?? stableUnit(this.id, "zunchi-stain"); + this.zunchiStainSeed = opts.zunchiStainSeed ?? stableUnit(this.familyKey, "zunchi-stain"); this.zunchiDisease = Boolean(opts.zunchiDisease); this.zunchiDiseaseSeverity = opts.zunchiDiseaseSeverity ?? (this.zunchiDisease ? 1 : 0); this.zunchiDiseaseCooldown = opts.zunchiDiseaseCooldown ?? 0; @@ -120,7 +122,7 @@ class Tarinai { this.focusPulseTimer = opts.focusPulseTimer ?? 0; if (this.isZunchiSlave) this.name = "\u305a\u3093\u3061\u3069\u308c\u3044"; this.tempComfort = opts.tempComfort ?? 0.62; - this.tempTimer = opts.tempTimer ?? stableUnit(this.id, "temp-start") * 0.55; + this.tempTimer = opts.tempTimer ?? stableUnit(this.familyKey, "temp-start") * 0.55; this.parents = opts.parents || []; this.parentNames = opts.parentNames || []; this.children = opts.children || []; @@ -143,60 +145,25 @@ class Tarinai { this.relationships = opts.relationships && typeof opts.relationships === "object" ? JSON.parse(JSON.stringify(opts.relationships)) : {}; this.fallTimer = opts.fallTimer ?? 0; this.fallMax = opts.fallMax ?? 1.15; - this.fallDir = opts.fallDir ?? (stableUnit(this.id, "fall-dir") < 0.5 ? -1 : 1); + this.fallDir = opts.fallDir ?? (stableUnit(this.familyKey, "fall-dir") < 0.5 ? -1 : 1); this.blastSpinTimer = opts.blastSpinTimer ?? 0; this.blastSpinMax = opts.blastSpinMax ?? 0; this.postBirthPeaceTimer = opts.postBirthPeaceTimer ?? 0; - this.sleepStart = 0.60 + stableUnit(this.id, "sleep-start") * 0.22; - this.sleepEnd = 0.15 + stableUnit(this.id, "sleep-end") * 0.14; - this.sleepFacing = stableUnit(this.id, "sleep-facing") < 0.5 ? -1 : 1; + this.sleepStart = 0.60 + stableUnit(this.familyKey, "sleep-start") * 0.22; + this.sleepEnd = 0.15 + stableUnit(this.familyKey, "sleep-end") * 0.14; + this.sleepFacing = stableUnit(this.familyKey, "sleep-facing") < 0.5 ? -1 : 1; this.nextBubbleAt = 0; this.nextSleepBubbleAt = 0; this.nextFearBubbleAt = 0; this.nextCursorHeartAt = opts.nextCursorHeartAt ?? 0; this.cursorPetting = opts.cursorPetting ?? 0; - this.aiTimer = opts.aiTimer ?? stableUnit(this.id, "ai-start") * 0.22; - this.envTimer = opts.envTimer ?? stableUnit(this.id, "env-start") * 0.55; + this.aiTimer = opts.aiTimer ?? stableUnit(this.familyKey, "ai-start") * 0.22; + this.envTimer = opts.envTimer ?? stableUnit(this.familyKey, "env-start") * 0.55; this.visibleSpriteId = opts.visibleSpriteId || null; this.spriteLockUntil = opts.spriteLockUntil ?? 0; this.entryTimer = opts.entryTimer ?? 0; } - serialize() { - return { - id: this.id, name: this.name, type: this.type, x: this.x, y: this.y, vx: this.vx, vy: this.vy, - scale: this.scale, age: this.age, lifeSpan: this.lifeSpan, generation: this.generation, hasPaired: this.hasPaired, - dead: this.dead, deathReason: this.deathReason, lastDamageCause: this.lastDamageCause, lastDamageAmount: this.lastDamageAmount, lastDamageAt: this.lastDamageAt, lastMajorDamageCause: this.lastMajorDamageCause, lastMajorDamageAmount: this.lastMajorDamageAmount, lastMajorDamageAt: this.lastMajorDamageAt, - hunger: this.hunger, loneliness: this.loneliness, energy: this.energy, stress: this.stress, hpBarTimer: this.hpBarTimer, stressBarTimer: this.stressBarTimer, - affection: this.affection, need: this.need, state: this.state, - goodMode: this.goodMode, facing: this.facing, visualFacing: this.visualFacing, facingLockUntil: this.facingLockUntil, eatTimer: this.eatTimer, - foodReactTimer: this.foodReactTimer, surpriseTimer: this.surpriseTimer, fearTimer: this.fearTimer, - intimidateTimer: this.intimidateTimer, intimidateTargetId: this.intimidateTargetId, intimidatedTimer: this.intimidatedTimer, - birthRitualTimer: this.birthRitualTimer, birthRitualMax: this.birthRitualMax, birthPartnerId: this.birthPartnerId, - birthRitualRole: this.birthRitualRole, birthRitualLeader: this.birthRitualLeader, - pokeFlashTimer: this.pokeFlashTimer, zunchiStain: this.zunchiStain, zunchiStainSeed: this.zunchiStainSeed, - totalFightLosses: this.totalFightLosses, totalFightWins: this.totalFightWins, isZunchiSlave: this.isZunchiSlave, formerName: this.formerName, loveMochiTimer: this.loveMochiTimer, fightMochiTimer: this.fightMochiTimer, - sleepDisease: this.sleepDisease, sleepDiseaseCooldown: this.sleepDiseaseCooldown, explosionDisease: this.explosionDisease, explosionDiseaseTimer: this.explosionDiseaseTimer, fightDisease: this.fightDisease, fightDiseaseCooldown: this.fightDiseaseCooldown, lastBleedAt: this.lastBleedAt, favorite: this.favorite, insideNestBoxId: this.insideNestBoxId || null, nestFade: this.nestFade || 0, nestBoxEnteredAt: this.nestBoxEnteredAt, nestBoxStayUntil: this.nestBoxStayUntil, focusPulseTimer: this.focusPulseTimer || 0, sleepDiseaseAnchorX: this.sleepDiseaseAnchorX, sleepDiseaseAnchorY: this.sleepDiseaseAnchorY, records: this.records ? this.records.slice(0, 42) : [], - zunchiDisease: this.zunchiDisease, zunchiDiseaseSeverity: this.zunchiDiseaseSeverity, zunchiDiseaseCooldown: this.zunchiDiseaseCooldown, - tempComfort: this.tempComfort, tempTimer: this.tempTimer, - parents: this.parents, parentNames: this.parentNames, children: this.children, birthTime: this.birthTime, - fightTimer: this.fightTimer, fightCooldown: this.fightCooldown, fightTargetId: this.fightTargetId, fightTargetIds: this.fightTargetIds, targetGiveupKey: this.targetGiveupKey, targetGiveupUntil: this.targetGiveupUntil, - panicTarget: this.panicTarget, panicTargetUntil: this.panicTargetUntil, panicStuckTimer: this.panicStuckTimer, - nextHeadbutt: this.nextHeadbutt, digest: this.digest, poopCount: this.poopCount, stretchTimer: this.stretchTimer, - grassEatTimer: this.grassEatTimer, hurtTimer: this.hurtTimer, - defeatedTimer: this.defeatedTimer, defeatedById: this.defeatedById, fightWinnerId: this.fightWinnerId, - relationships: this.relationships, fallTimer: this.fallTimer, fallMax: this.fallMax, fallDir: this.fallDir, - birthPersonality: normalizePersonality(this.birthPersonality), currentPersonality: normalizePersonality(this.currentPersonality), personalityDaily: this.personalityDaily || null, - blastSpinTimer: this.blastSpinTimer, blastSpinMax: this.blastSpinMax, postBirthPeaceTimer: this.postBirthPeaceTimer, - lastMealColor: this.lastMealColor, aiTimer: this.aiTimer, envTimer: this.envTimer, nextCursorHeartAt: this.nextCursorHeartAt, cursorPetting: this.cursorPetting, - entryTimer: this.entryTimer || 0, - }; - } - - static from(world, o) { - return new Tarinai(world, o); - } - get lack() { return clamp((this.hunger + this.loneliness + this.stress + (100 - this.energy)) / 4, 0, 100); } @@ -221,7 +188,7 @@ class Tarinai { if (!this.juvenile || !this.parents?.length) return null; let best = null, bestD = Infinity; for (const id of this.parents) { - const p = this.world.tarinai.find(t => t.id === id && !t.dead); + const p = this.world.tarinai.find(t => (t.familyKey || t.id) === id && !t.dead); if (!p) continue; const d = dist(this, p); if (d < bestD) { best = p; bestD = d; } @@ -292,7 +259,6 @@ class Tarinai { const changedB = this.adjustPersonality?.("aggression", -0.015, "after being hurt") || 0; this.fearTimer = Math.max(this.fearTimer || 0, 1.2); this.stress = clamp((this.stress || 0) + 5, 0, 130); - this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.35, "\u3053\u308f\u3044\u2026", "rgba(90,80,120,0.78)"); return Boolean(changedA || changedB); } @@ -313,10 +279,12 @@ class Tarinai { if (event) { rel.lastEvent = event; rel.lastTime = this.world.time; } } - strongestRelation(kind = "friend") { + strongestRelation(kind = "friend", liveOnly = true) { let bestId = null; let bestScore = kind === "fear" ? 5 : FRIEND_AFFINITY_THRESHOLD; + const liveIds = liveOnly ? new Set((this.world?.tarinai || []).filter(o => o && !o.dead && o !== this).map(o => o.id).filter(Boolean)) : null; for (const [id, rel] of Object.entries(this.relationships || {})) { + if (liveIds && !liveIds.has(id)) continue; const score = kind === "fear" ? (rel.fear || 0) : (rel.affinity || 0); if (score > bestScore) { bestId = id; bestScore = score; } } @@ -575,7 +543,7 @@ class Tarinai { normal: displayNormalSprites(), }; const options = (pools[category] || []).filter(id => SPRITES.some(s => s.id === id)); - return stableChoice(this.id, `variant-${category}`, options) || options[0] || this.goodMode || "smile"; + return stableChoice(this.familyKey || this.id, `variant-${category}`, options) || options[0] || this.goodMode || "smile"; } infectZunchiDisease(source = null, force = false) { @@ -625,7 +593,7 @@ class Tarinai { } if (!this.zunchiDisease && this.zunchiStain > 82 && Math.random() < dt * clamp((this.zunchiStain - 82) / 18, 0, 1) * 0.045) { this.infectZunchiDisease(null, true); - this.world?.log?.(`${this.name}\u306f\u305a\u3093\u3061\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306f\u305a\u3093\u3061\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "accident", { participants: [this] }); } if (this.zunchiDisease) { this.zunchiDiseaseSeverity = clamp((this.zunchiDiseaseSeverity || 0.7) + dt * 0.004, 0, 1.25); @@ -634,7 +602,7 @@ class Tarinai { if (this.energy > 82) this.zunchiDiseaseSeverity = Math.max(0, this.zunchiDiseaseSeverity - dt * (this.energy > 94 ? 0.020 : 0.010)); this.emitZunchiDiseaseEffect(dt); if (this.zunchiDiseaseSeverity <= 0.04) { - if (this.recoverZunchiDisease("\u4f53\u529b\u304c\u623b\u308a\u3001\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident"); + if (this.recoverZunchiDisease("\u4f53\u529b\u304c\u623b\u308a\u3001\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident", { participants: [this] }); } } } @@ -661,7 +629,7 @@ class Tarinai { this.fightTargetIds = []; this.thought = "\u306d\u3080\u308a\u75c5\u3067\u7720\u308a\u7d9a\u3051\u3066\u3044\u308b"; this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "Zzz...", "rgba(72,76,120,0.76)"); - this.world?.log?.(`${this.name}\u306f\u306d\u3080\u308a\u75c5\u306b\u304b\u304b\u3063\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306f\u306d\u3080\u308a\u75c5\u306b\u304b\u304b\u3063\u305f\u3002`, "accident", { participants: [this] }); return true; } @@ -676,7 +644,7 @@ class Tarinai { this.thought = reason || "\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f"; this.surpriseTimer = Math.max(this.surpriseTimer || 0, 0.65); this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "!", "rgba(72,76,120,0.76)"); - this.world?.log?.(`${this.name}\u306e\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306e\u306d\u3080\u308a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident", { participants: [this] }); return true; } @@ -687,7 +655,7 @@ class Tarinai { this.fearTimer = Math.max(this.fearTimer || 0, 0.55); this.thought = "\u7206\u767a\u75c5\u3067\u843d\u3061\u7740\u304b\u306a\u3044"; this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.2, "!", "rgba(178,78,42,0.82)"); - this.world?.log?.(`${this.name}\u306f\u7206\u767a\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306f\u7206\u767a\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "accident", { participants: [this] }); return true; } @@ -698,7 +666,7 @@ class Tarinai { this.thought = reason || "\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"; this.stress = clamp(this.stress - 10, 0, 130); this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "\u306f\u3046", "rgba(82,126,88,0.76)"); - this.world?.log?.(`${this.name}\u306e\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306e\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "accident", { participants: [this] }); return true; } @@ -713,7 +681,7 @@ class Tarinai { this.fearTimer = Math.max(this.fearTimer || 0, 0.35); this.thought = "\u304d\u305a\u3064\u304d\u75c5\u3067\u5f53\u3066\u3082\u306a\u304f\u5f77\u5fa8\u3063\u3066\u3044\u308b"; this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.20, "?", "rgba(150,78,44,0.80)"); - this.world?.log?.(`${this.name}\u306f\u304d\u305a\u3064\u304d\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "fight"); + this.world?.log?.(`${this.name}\u306f\u304d\u305a\u3064\u304d\u75c5\u3092\u767a\u75c7\u3057\u305f\u3002`, "fight", { participants: [this] }); return true; } @@ -724,7 +692,7 @@ class Tarinai { this.thought = reason || "\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f"; this.stress = clamp(this.stress - 12, 0, 130); this.world?.spawnBubble?.(this.x, this.y - this.radius * 1.18, "\u306f\u3046", "rgba(82,126,88,0.76)"); - this.world?.log?.(`${this.name}\u306e\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "fight"); + this.world?.log?.(`${this.name}\u306e\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f\u3002`, "fight", { participants: [this] }); return true; } @@ -866,7 +834,7 @@ class Tarinai { if (this.zunchiDisease) { this.zunchiDiseaseSeverity = Math.max(0, (this.zunchiDiseaseSeverity || 1) - power * (this.energy > 70 ? 0.050 : 0.028)); if (this.zunchiDiseaseSeverity <= 0.04 && this.recoverZunchiDisease("\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) { - this.world?.log?.(`${this.name}\u306f\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident"); + this.world?.log?.(`${this.name}\u306f\u6c34\u3067\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f\u3002`, "accident", { participants: [this] }); } } if (this.explosionDisease) this.recoverExplosionDisease("\u6c34\u3067\u7206\u767a\u75c5\u304c\u6cbb\u3063\u305f"); @@ -895,7 +863,7 @@ class Tarinai { if (Math.random() < dt * 0.000375) this.infectFightDisease(); } if (this.zunchiDisease && Math.random() < dt * 0.00055 * (this.energy > 66 ? 1.8 : 1.0)) { - if (this.recoverZunchiDisease("\u81ea\u7136\u306b\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u81ea\u7136\u306b\u6cbb\u3063\u305f\u3002`, "accident"); + if (this.recoverZunchiDisease("\u81ea\u7136\u306b\u305a\u3093\u3061\u75c5\u304c\u6cbb\u307e\u3063\u305f")) this.world?.log?.(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c\u81ea\u7136\u306b\u6cbb\u3063\u305f\u3002`, "accident", { participants: [this] }); } if (this.fightDisease && Math.random() < dt * 0.00070 * (this.energy > 58 ? 1.4 : 1.0)) { this.recoverFightDisease("\u81ea\u7136\u306b\u304d\u305a\u3064\u304d\u75c5\u304c\u6cbb\u3063\u305f"); @@ -1143,7 +1111,7 @@ class Tarinai { this.aiTimer += dt; const urgentAi = this.fightTimer > 0.04 || this.intimidateTimer > 0.04 || this.intimidatedTimer > 0.04 || this.birthRitualTimer > 0.04 || this.defeatedTimer > 0.04 || this.eatTimer > 0.02 || this.hurtTimer > 0.02; const popPerf = this.world.performanceLevel ? this.world.performanceLevel() : 0; - const aiInterval = urgentAi ? (popPerf >= 2 ? 0.105 : 0.075) : (0.18 + stableUnit(this.id, "ai-interval") * 0.09 + popPerf * 0.055); + const aiInterval = urgentAi ? (popPerf >= 2 ? 0.105 : 0.075) : (0.18 + stableUnit(this.familyKey || this.id, "ai-interval") * 0.09 + popPerf * 0.055); if (this.aiTimer >= aiInterval) { const aiDt = Math.min(this.aiTimer, 0.48); this.aiTimer = 0; @@ -1270,9 +1238,9 @@ class Tarinai { if (this.world?.nestBoxEntryPoint) return this.world.nestBoxEntryPoint(bed); return { x: clamp(bed.x, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding), y: clamp(bed.y + (bed.r || 42) * 0.24, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding) }; } - const angle = stableUnit(this.id, `bed-angle-${bed.id || bed.seed || "bed"}`) * Math.PI * 2; + const angle = stableUnit(this.familyKey || this.id, `bed-angle-${bed.id || bed.seed || "bed"}`) * Math.PI * 2; const baseRing = bed.r * 0.52; - const ring = baseRing + stableUnit(this.id, `bed-ring-${bed.id || bed.seed || "bed"}`) * bed.r * 0.95; + const ring = baseRing + stableUnit(this.familyKey || this.id, `bed-ring-${bed.id || bed.seed || "bed"}`) * bed.r * 0.95; return { x: clamp(bed.x + Math.cos(angle) * ring, CONFIG.worldPadding, this.world.w - CONFIG.worldPadding), y: clamp(bed.y + Math.sin(angle) * ring * 0.56 - this.radius * 0.10, CONFIG.worldPadding, this.world.h - CONFIG.worldPadding), @@ -1659,7 +1627,7 @@ class Tarinai { const backY = this.y + this.radius * rand(0.25, 0.48); this.world.spawnZunchi(backX, backY); this.bubble("\u3076\u308a\u3085\u3063", 3.2, "rgba(62,84,45,0.78)"); - if (Math.random() < 0.35) this.world.log(`${this.name}\u304c\u305a\u3093\u3061\u3092\u843d\u3068\u3057\u305f\u3002`); + if (Math.random() < 0.35) this.world.log(`${this.name}\u304c\u305a\u3093\u3061\u3092\u843d\u3068\u3057\u305f\u3002`, null, { participants: [this] }); } interactWithItems(dt) { @@ -1698,7 +1666,7 @@ class Tarinai { this.makePoop(eating * (it.type === "sweet" ? 0.18 : 0.22)); if (this.world.time > this.nextEatSound) { audio.eat(); this.nextEatSound = this.world.time + 0.42; } if (this.world.time - this.lastLog > 9 && Math.random() < 0.014) { - this.world.log(`${this.name}\u306f${it.type === "sweet" ? "\u305a\u3093\u3060\u9905" : "\u98df\u3079\u7269"}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`); + this.world.log(`${this.name}\u306f${it.type === "sweet" ? "\u305a\u3093\u3060\u9905" : "\u98df\u3079\u7269"}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`, null, { participants: [this] }); this.lastLog = this.world.time; } break; @@ -1745,7 +1713,7 @@ class Tarinai { this.makePoop(eating * 0.20); if (this.world.time > this.nextEatSound) { audio.eat(); this.nextEatSound = this.world.time + 0.42; } if (this.world.time - this.lastLog > 9 && Math.random() < 0.02) { - this.world.log(`${this.name}\u306f${it.type === "love_mochi" ? "\u3078\u3053\u9905" : (it.type === "fight_mochi" ? "\u3051\u3093\u304b\u9905" : "\u306d\u3080\u308a\u85ac")}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`, "food"); + this.world.log(`${this.name}\u306f${it.type === "love_mochi" ? "\u3078\u3053\u9905" : (it.type === "fight_mochi" ? "\u3051\u3093\u304b\u9905" : "\u306d\u3080\u308a\u85ac")}\u3092\u3057\u3070\u3089\u304f\u5473\u308f\u3063\u305f\u3002`, "food", { participants: [this] }); this.lastLog = this.world.time; } break; @@ -1906,10 +1874,10 @@ class Tarinai { } if (this.zunchiDisease && !o.zunchiDisease && (o.zunchiDiseaseCooldown || 0) <= 0 && d < 54 && Math.random() < dt * 0.065 * clamp(1 - d / 58, 0.12, 1)) { - if (o.infectZunchiDisease(this)) this.world.log(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c${o.name}\u306b\u3046\u3064\u3063\u305f\u3002`, "accident"); + if (o.infectZunchiDisease(this)) this.world.log(`${this.name}\u306e\u305a\u3093\u3061\u75c5\u304c${o.name}\u306b\u3046\u3064\u3063\u305f\u3002`, "accident", { participants: [o, this] }); } if (o.zunchiDisease && !this.zunchiDisease && (this.zunchiDiseaseCooldown || 0) <= 0 && d < 54 && Math.random() < dt * 0.065 * clamp(1 - d / 58, 0.12, 1)) { - if (this.infectZunchiDisease(o)) this.world.log(`${o.name}\u306e\u305a\u3093\u3061\u75c5\u304c${this.name}\u306b\u3046\u3064\u3063\u305f\u3002`, "accident"); + if (this.infectZunchiDisease(o)) this.world.log(`${o.name}\u306e\u305a\u3093\u3061\u75c5\u304c${this.name}\u306b\u3046\u3064\u3063\u305f\u3002`, "accident", { participants: [o, this] }); } const pairBond = this.world.areCoParents?.(this, o); @@ -1934,10 +1902,10 @@ class Tarinai { if ((rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD) { this.stress = clamp(this.stress - dt * 0.62 * this.trait.social, 0, 130); this.affection = clamp(this.affection + dt * 0.18, 0, 80); - if (this.world.relationNotice(this.id, o.id, "friend-calm", 55)) this.world.log(`${this.name}\u306f${o.name}\u3068\u3044\u308b\u3068\u5c11\u3057\u843d\u3061\u7740\u304f\u3002`, "relation"); + if (this.world.relationNotice(this.id, o.id, "friend-calm", 55)) this.world.log(`${this.name}\u306f${o.name}\u3068\u3044\u308b\u3068\u5c11\u3057\u843d\u3061\u7740\u304f\u3002`, "relation", { participants: [o, this] }); } if ((rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD && this.world.relationNotice(this.id, o.id, "friend", 32)) { - this.world.log(`${this.name}\u306f\u3088\u304f${o.name}\u306e\u8fd1\u304f\u306b\u3044\u308b\u3002`, "relation"); + this.world.log(`${this.name}\u306f\u3088\u304f${o.name}\u306e\u8fd1\u304f\u306b\u3044\u308b\u3002`, "relation", { participants: [o, this] }); } if (this.type === "angry") this.stress += dt * 0.08; if (this.type === "teary" && o.type === "teary") this.stress -= dt * 0.12; @@ -2011,7 +1979,7 @@ class Tarinai { } if (this.loneliness < 12 && Math.random() < dt * 0.002) { - this.world.log(`${this.name}\u306f\u8ab0\u304b\u306e\u8fd1\u304f\u3067\u3001\u305f\u308a\u306a\u3044\u3053\u3068\u3092\u5c11\u3057\u5fd8\u308c\u305f\u3002`); + this.world.log(`${this.name}\u306f\u8ab0\u304b\u306e\u8fd1\u304f\u3067\u3001\u305f\u308a\u306a\u3044\u3053\u3068\u3092\u5c11\u3057\u5fd8\u308c\u305f\u3002`, null, { participants: [this] }); } } @@ -2242,8 +2210,10 @@ class Tarinai { if (spot) this.world.items.push(new Item("grass", spot.x, spot.y)); } this.world.markDead(this, finalReason); + this.releasedLiveToken = this.liveToken || 0; + this.world.releaseTarinaiLiveId?.(this); audio.death(); - this.world.log(`${this.name}\u306f\u9759\u304b\u306a\u75d5\u8de1\u3092\u6b8b\u3057\u305f\u3002\u6b7b\u56e0: ${finalReason}`, "death"); + this.world.log(`${this.name}\u306f\u9759\u304b\u306a\u75d5\u8de1\u3092\u6b8b\u3057\u305f\u3002\u6b7b\u56e0: ${finalReason}`, "death", { participants: [this] }); if (this.world.selected === this) this.world.selected = null; } diff --git a/js/ui.js b/js/ui.js index c172696..993a464 100644 --- a/js/ui.js +++ b/js/ui.js @@ -24,6 +24,7 @@ const ui = { colonyChart: document.getElementById("colonyChart"), colonyChartLegend: document.getElementById("colonyChartLegend"), archiveContent: document.getElementById("archiveContent"), + archiveUpdateToggleBtn: document.getElementById("archiveUpdateToggleBtn"), archiveResetBtn: document.getElementById("archiveResetBtn"), archiveResetDialog: document.getElementById("archiveResetDialog"), archiveResetCancelBtn: document.getElementById("archiveResetCancelBtn"), @@ -39,6 +40,8 @@ const uiCache = { stats: {}, selectedSnapshot: "", selectedEmpty: false, + selectedCollapsedCategories: new Set(), + archiveUpdateEnabled: false, toolButtons: [], archiveVersion: "", archiveRows: [], @@ -124,7 +127,7 @@ function logKindLabel(kind) { } function tarinaiSpritePathForId(id) { - const live = world?.tarinai?.find(t => t.id === id && !t.dead); + const live = world?.tarinai?.find(t => (t.id === id || t.familyKey === id) && !t.dead); const sid = live?.spriteId ? live.spriteId() : live?.type; const fam = world?.family?.[id]; const fallback = fam?.type; @@ -163,7 +166,7 @@ function relationListHtml(t, kind = "friend") { } function focusTarinaiById(id) { - const t = world?.tarinai?.find(o => o && !o.dead && o.id === id); + const t = world?.tarinai?.find(o => o && !o.dead && (o.id === id || o.familyKey === id)); if (!t) { showToast("\u305d\u306e\u500b\u4f53\u306f\u3082\u3046\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002"); return false; } world.selected = t; t.focusPulseTimer = Math.max(t.focusPulseTimer || 0, 1.25); @@ -230,6 +233,15 @@ function personalityRowsHtml(personality = {}) { return PERSONALITY_KEYS.map(key => `${escapeHtml(PERSONALITY_LABELS[key]?.label || key)}: ${personalityValueText(p[key])}`).join(""); } +function selectedDataCategoryHtml(id, label, bodyHtml) { + if (!uiCache.selectedCollapsedCategories) uiCache.selectedCollapsedCategories = new Set(); + const collapsed = uiCache.selectedCollapsedCategories.has(id); + return `
    + +
    ${bodyHtml}
    +
    `; +} + function renderSelected() { const t = world.selected; if (!t || t.dead || !world.tarinai.includes(t)) { @@ -294,31 +306,45 @@ function renderSelected() { const recordText = quoteNameInRecordText(r.text || "", t.name); return `
  • ${escapeHtml(timeText)}${escapeHtml(recordText)}
  • `; }).join("") || `
  • -\u8a18\u9332\u306a\u3057
  • `; - ui.selectedInfo.innerHTML = ` -
    - -
    - ${effectBadges.length ? `
    ${effectBadges.join("")}
    ` : ""} + const basicHtml = `
    \u4e16\u4ee3${escapeHtml(generationDisplay || "\u4e0d\u660e")}
    \u72b6\u614b${escapeHtml(stateLabel(t.state))}
    \u7406\u7531${escapeHtml(reasonLabel(t))}
    - ${personalityHtml}
    \u5bfe\u8c61${escapeHtml(targetLabel(t.target))}
    \u5e74\u9f62${fmt(t.age)} / ${fmt(t.lifeSpan)}
    + `; + const healthHtml = `
    \u7a7a\u8179${fmt(t.hunger)}
    \u5bc2\u3057\u3055${fmt(t.loneliness)}
    \u4f53\u529b${fmt(t.energy)}
    \u30b9\u30c8\u30ec\u30b9${fmt(t.stress)}
    \u305a\u3093\u3061\u6c5a\u308c${fmt(t.zunchiStain || 0)}
    \u6c17\u5206${fmt(t.mood)}
    +
    \u305f\u308a\u306a\u3044${fmt(t.lack)}
    + `; + const relationHtml = `
    \u53cb\u9054${relationListHtml(t, "friend")}
    \u6575\u5bfe${relationListHtml(t, "enemy")}
    \u55a7\u5629\u8a18\u61b6${escapeHtml(fightRecord)}
    \u7d2f\u8a08\u6557\u5317${t.totalFightLosses || 0}
    + `; + const familyHtml = `
    \u89aa${escapeHtml(t.parentNames?.length ? t.parentNames.join(" + ") : "\u4e0d\u660e")}
    \u5b50${t.children?.length || 0}
    -
    \u305f\u308a\u306a\u3044${fmt(t.lack)}
    -

    \u500b\u4f53\u5225\u306e\u8a18\u9332

      ${recordHtml}
    + `; + ui.selectedInfo.innerHTML = ` +
    + +
    + ${effectBadges.length ? `
    ${effectBadges.join("")}
    ` : ""} +
    + ${selectedDataCategoryHtml("basic", "\u57fa\u672c", basicHtml)} + ${selectedDataCategoryHtml("health", "\u4f53\u8abf", healthHtml)} + ${selectedDataCategoryHtml("personality", "\u6027\u683c", personalityHtml)} + ${selectedDataCategoryHtml("relation", "\u95a2\u4fc2", relationHtml)} + ${selectedDataCategoryHtml("family", "\u5bb6\u65cf", familyHtml)} + ${selectedDataCategoryHtml("records", "\u8a18\u9332", `

    \u500b\u4f53\u5225\u306e\u8a18\u9332

      ${recordHtml}
    `)} +
    `; } @@ -371,7 +397,7 @@ function reasonLabel(t) { function targetLabel(target) { if (!target) return "\u306a\u3057"; if (target.name) return target.name; - if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", sleep_drug: "\u306d\u3080\u308a\u85ac", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", fight_sick: "\u304d\u305a\u3064\u304d\u75c5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; + if (target.type) return { sweet: "\u305a\u3093\u3060\u9905", love_mochi: "\u3078\u3053\u9905", fight_mochi: "\u3051\u3093\u304b\u9905", sleep_drug: "\u306d\u3080\u308a\u85ac", food: "\u98df\u4e8b", grass: "\u8349", water: "\u6c34", water_bowl: "\u6c34\u306e\u76bf", bed: "\u5e72\u8349\u5bdd\u5e8a", nest_box: "\u5de3\u7bb1", ball: "\u30dc\u30fc\u30eb", stone: "\u77f3", genkotsu: "\u3052\u3093\u3053\u3064", zunchi: "\u305a\u3093\u3061", system: "\u305a\u3093\u3061\u75c5", zunchi_sick: "\u305a\u3093\u3061\u75c5", fight_sick: "\u304d\u305a\u3064\u304d\u75c5", trace: "\u8db3\u8de1", splat: "\u3057\u3076\u304d" }[target.type] || target.type; if (Number.isFinite(target.x) && Number.isFinite(target.y)) return "\u30ab\u30fc\u30bd\u30eb"; return "\u4e0d\u660e"; } @@ -611,6 +637,36 @@ function syncTopButtons() { ui.pauseBtn.textContent = world.paused ? "\u518d\u958b" : "\u4e00\u6642\u505c\u6b62"; ui.speedBtn.textContent = `\u901f\u5ea6 x${world.speed}`; if (ui.soundBtn) ui.soundBtn.textContent = audio.enabled ? "\u97f3 ON" : "\u97f3 OFF"; + syncArchiveUpdateButton(); +} + +function archiveAutoUpdateEnabled() { + return Boolean(uiCache.archiveUpdateEnabled); +} + +function syncArchiveUpdateButton() { + const btn = ui.archiveUpdateToggleBtn; + if (!btn) return; + const on = archiveAutoUpdateEnabled(); + btn.textContent = on ? "\u66f4\u65b0 ON" : "\u66f4\u65b0 OFF"; + btn.classList.toggle("active", on); + btn.setAttribute("aria-pressed", on ? "true" : "false"); +} + +function setArchiveUpdateEnabled(on) { + uiCache.archiveUpdateEnabled = Boolean(on); + syncArchiveUpdateButton(); + if (uiCache.archiveUpdateEnabled) { + uiCache.archiveVersion = ""; + uiCache.archiveFamilyVersion = null; + world.familyTreeDirty = true; + scheduleArchiveWindowRender?.(); + showToast("\u5bb6\u7cfb\u56f3\u306e\u66f4\u65b0\u3092ON\u306b\u3057\u307e\u3057\u305f\u3002"); + } else { + if (uiCache.archiveRenderTimer) { clearTimeout(uiCache.archiveRenderTimer); uiCache.archiveRenderTimer = 0; } + uiCache.archiveScheduled = false; + showToast("\u5bb6\u7cfb\u56f3\u306e\u66f4\u65b0\u3092OFF\u306b\u3057\u307e\u3057\u305f\u3002"); + } } const SCALABLE_TOOLS = new Set(scalableToolIds()); @@ -692,7 +748,7 @@ function bindUI() { const node = e.target.closest("[data-family-tarinai-id]"); if (!node) return; const id = node.getAttribute("data-family-tarinai-id"); - const t = world.tarinai.find(x => x.id === id && !x.dead); + const t = world.tarinai.find(x => (x.id === id || x.familyKey === id) && !x.dead); if (!t) { showToast("\u305d\u306e\u500b\u4f53\u306f\u3082\u3046\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002"); return; } world.selected = t; t.focusPulseTimer = Math.max(t.focusPulseTimer || 0, 1.15); @@ -708,12 +764,25 @@ function bindUI() { if (!uiCache.archiveAutoRefreshTimer && typeof window !== "undefined") { uiCache.archiveAutoRefreshTimer = window.setInterval(() => { - if (!ui.archiveContent) return; + if (!ui.archiveContent || !archiveAutoUpdateEnabled()) return; scheduleArchiveWindowRender(); }, 5000); } ui.selectedInfo?.addEventListener("click", (e) => { + const categoryToggle = e.target.closest(".selected-category-toggle"); + if (categoryToggle) { + const category = categoryToggle.closest(".selected-category"); + const id = category?.dataset?.selectedCategory || ""; + if (!category || !id) return; + if (!uiCache.selectedCollapsedCategories) uiCache.selectedCollapsedCategories = new Set(); + category.classList.toggle("collapsed"); + const collapsed = category.classList.contains("collapsed"); + if (collapsed) uiCache.selectedCollapsedCategories.add(id); + else uiCache.selectedCollapsedCategories.delete(id); + categoryToggle.setAttribute("aria-expanded", collapsed ? "false" : "true"); + return; + } const focusBtn = e.target.closest("[data-focus-tarinai-id]"); if (focusBtn) { e.preventDefault(); @@ -750,7 +819,7 @@ function bindUI() { ui.pauseBtn?.addEventListener("click", () => { world.paused = !world.paused; const archiveStale = uiCache.archiveFamilyVersion !== (world.familyVersion || 0); - if (world.paused && (uiCache.archivePendingWhileRunning || archiveStale)) { + if (archiveAutoUpdateEnabled() && world.paused && (uiCache.archivePendingWhileRunning || archiveStale)) { uiCache.archivePendingWhileRunning = false; scheduleArchiveWindowRender(); } @@ -787,6 +856,8 @@ function bindUI() { ui.ecologyDialog?.addEventListener("click", (e) => { if (e.target === ui.ecologyDialog) closeEcologyDialog(); }); + ui.archiveUpdateToggleBtn?.addEventListener("click", () => setArchiveUpdateEnabled(!archiveAutoUpdateEnabled())); + syncArchiveUpdateButton(); ui.archiveResetBtn?.addEventListener("click", openArchiveResetDialog); ui.archiveResetCancelBtn?.addEventListener("click", closeArchiveResetDialog); ui.archiveResetDialog?.addEventListener("click", (e) => { @@ -794,7 +865,7 @@ function bindUI() { }); ui.archiveResetConfirmBtn?.addEventListener("click", () => { world.resetFamilyTree?.(); - uiCache.archiveVersion = ""; + window.resetArchiveRenderState?.(); closeArchiveResetDialog(); renderArchive(); renderSelected(); diff --git a/js/ui_family.js b/js/ui_family.js index a6bff5d..b4a6d6a 100644 --- a/js/ui_family.js +++ b/js/ui_family.js @@ -45,8 +45,8 @@ function lineageMutualParentIds(n, family = world.family || {}, idSet = null) { if (!n?.id) return parents; const relationIndex = lineageRelationIndex(family); const candidates = new Set((n.parents || []).filter(Boolean)); - // Older saves may contain only one side of the parent/child edge. For - // rendering, recover the missing side from a cached relation index. + // Runtime updates can briefly touch one side first; recover the reciprocal + // edge from the relation index so the archive does not flicker. for (const parentId of relationIndex.parentsByChild.get(n.id) || []) candidates.add(parentId); for (const id of candidates) { if (!id || id === n.id || seen.has(id)) continue; @@ -69,8 +69,7 @@ function lineageMutualChildIds(n, family = world.family || {}, idSet = null) { if (!n?.id) return children; const relationIndex = lineageRelationIndex(family); const candidates = new Set((n.children || []).filter(Boolean)); - // Same recovery as above, in the opposite direction: child.parents is enough - // to draw a real parent/child edge even if parent.children was not persisted. + // Same recovery as above, in the opposite direction. for (const childId of relationIndex.childrenByParent.get(n.id) || []) candidates.add(childId); for (const id of candidates) { if (!id || id === n.id || seen.has(id)) continue; @@ -348,7 +347,7 @@ function lineageNodeSort(a, b) { } function lineageTreeNodeHtml(n, x, y) { - const entity = n?.id ? world.tarinai.find(t => t.id === n.id) : null; + const entity = n?.id ? world.tarinai.find(t => (t.familyKey || t.id) === n.id) : null; const live = entity && !entity.dead ? entity : null; const img = n ? tarinaiSpritePathForId(n.id) : SPRITES[0].path; const name = escapeHtml(n?.name || "\u4e0d\u660e"); @@ -1121,7 +1120,7 @@ function lineageSetArchiveStaleStatus(show) { return; } if (existing) return; - ui.archiveContent.insertAdjacentHTML("afterbegin", `
    \u5bb6\u7cfb\u56f3\u306e\u66f4\u65b0\u306f\u4e00\u6642\u505c\u6b62\u4e2d\u3067\u3059\u3002\u4e00\u6642\u505c\u6b62\u3059\u308b\u3068\u53cd\u6620\u3055\u308c\u307e\u3059\u3002
    `); + ui.archiveContent.insertAdjacentHTML("afterbegin", `
    \u5bb6\u7cfb\u56f3\u306e\u66f4\u65b0\u306fOFF\u3067\u3059\u3002\u300c\u66f4\u65b0\u300d\u3092ON\u306b\u3059\u308b\u3068\u53cd\u6620\u3055\u308c\u307e\u3059\u3002
    `); } function lineageAssignPartnerAttachOffsets(linkGroups) { @@ -1418,6 +1417,15 @@ function lineageFamilyHtml(component, index, family, signature = "") { function renderArchive() { if (!ui.archiveContent) return; + if (typeof archiveAutoUpdateEnabled === "function" && !archiveAutoUpdateEnabled()) { + uiCache.archiveScheduled = false; + if (!uiCache.archiveVersion) { + ui.archiveContent.innerHTML = `
    \u5bb6\u7cfb\u56f3\u306e\u66f4\u65b0\u306fOFF\u3067\u3059\u3002\u300c\u66f4\u65b0\u300d\u3092ON\u306b\u3059\u308b\u3068\u63cf\u753b\u3057\u307e\u3059\u3002
    `; + } else if (world.familyTreeDirty) { + lineageSetArchiveStaleStatus(true); + } + return; + } if (uiCache.deferArchiveUntil && performance.now() < uiCache.deferArchiveUntil) return; uiCache.deferArchiveUntil = 0; uiCache.archiveScheduled = false; @@ -1553,6 +1561,27 @@ function renderArchive() { ); } +function resetArchiveRenderState() { + if (uiCache.archiveRenderTimer) { + clearTimeout(uiCache.archiveRenderTimer); + uiCache.archiveRenderTimer = 0; + } + uiCache.archiveRenderToken = ""; + uiCache.archiveRenderRunning = false; + uiCache.archiveScheduled = false; + uiCache.archivePendingOffscreen = false; + uiCache.archivePendingWhileRunning = false; + uiCache.archivePendingDirtyAfterRun = false; + uiCache.archiveLastHiddenCheckAt = -Infinity; + uiCache.archiveLastScheduleFamilyVersion = null; + uiCache.archiveVersion = ""; + uiCache.archiveFamilyVersion = null; + uiCache.archiveRelationSignature = ""; + uiCache.archiveRows = []; + uiCache.lastArchiveWindow = ""; + uiCache.archiveHtmlCache?.clear?.(); +} + function validateFamilyTree() { const issues = world.validateFamily ? [...world.validateFamily()] : []; const rendered = new Map(); @@ -1595,6 +1624,11 @@ function renderArchiveWindow() { } function scheduleArchiveWindowRender() { + if (typeof archiveAutoUpdateEnabled === "function" && !archiveAutoUpdateEnabled()) { + uiCache.archiveScheduled = false; + if (world.familyTreeDirty) lineageSetArchiveStaleStatus(true); + return; + } const familyDirty = Boolean(world.familyTreeDirty); if (uiCache.archiveVersion && uiCache.archiveFamilyVersion === (world.familyVersion || 0) && !familyDirty) return; if (uiCache.archiveRenderRunning) { @@ -1617,6 +1651,7 @@ function scheduleArchiveWindowRender() { } function schedulePendingArchiveRender() { + if (typeof archiveAutoUpdateEnabled === "function" && !archiveAutoUpdateEnabled()) return; if (!uiCache.archivePendingOffscreen) return; if (!lineageArchiveNearViewport()) return; uiCache.archivePendingOffscreen = false; @@ -1625,3 +1660,4 @@ function schedulePendingArchiveRender() { window.validateFamilyTree = validateFamilyTree; window.familyTreeDiagnostics = () => ({ ...(uiCache.archiveDiagnostics || {}) }); +window.resetArchiveRenderState = resetArchiveRenderState; diff --git a/js/world.js b/js/world.js index 44c933a..ec04b10 100644 --- a/js/world.js +++ b/js/world.js @@ -25,6 +25,10 @@ class World { this.drawListDirty = true; this.selected = null; this.deadCount = 0; + this.liveIdNext = 1; + this.liveIdFree = []; + this.liveIdSerial = 0; + this.liveTarinai = new Map(); this.lastBirthAt = -999; this.maxGeneration = 1; this.family = {}; @@ -42,7 +46,8 @@ class World { this.cameraY = 0; this.nextWeatherChange = rand(CONFIG.weatherChangeMin, CONFIG.weatherChangeMax); this.spatial = new SpatialGrid(96); - this.spatialScratch = []; + this.spatialItemScratch = []; + this.spatialTarinaiScratch = []; this.drawList = []; this.itemCounts = {}; this.effectCounts = {}; @@ -330,6 +335,10 @@ class World { this.drawListDirty = true; this.selected = null; this.deadCount = 0; + this.liveIdNext = 1; + this.liveIdFree = []; + this.liveIdSerial = 0; + this.liveTarinai = new Map(); this.lastBirthAt = -999; this.maxGeneration = 1; this.family = {}; @@ -367,9 +376,51 @@ class World { } + tarinaiFamilyKey(t) { + return t?.familyKey || t?.archiveKey || t?.id || ""; + } + + assignTarinaiLiveId(t) { + if (!t) return ""; + if (!this.liveTarinai) this.liveTarinai = new Map(); + // Live IDs are never recycled. Relationships and transient targets are keyed by + // live ID, so reuse can make dead friends/enemies leak onto new individuals. + this.liveIdFree = []; + if (!Number.isFinite(this.liveIdNext)) this.liveIdNext = 1; + if (!Number.isFinite(this.liveIdSerial)) this.liveIdSerial = 0; + const id = `t${this.liveIdNext++}`; + t.id = id; + t.liveToken = ++this.liveIdSerial; + this.liveTarinai.set(id, { token: t.liveToken, target: t }); + return id; + } + + releaseTarinaiLiveId(t) { + if (!t?.id || !this.liveTarinai) return false; + const current = this.liveTarinai.get(t.id); + if (!current || current.target !== t || current.token !== t.liveToken) return false; + const id = t.id; + this.liveTarinai.delete(id); + // Do not recycle live IDs. Relationships are keyed by live ID; recycling can + // make a dead friend's/enemy's relationship appear on a newly spawned individual. + t.releasedLiveId = id; + t.id = ""; + t.liveToken = 0; + return true; + } + + liveTarinaiById(id, token = null) { + if (!id || !this.liveTarinai) return null; + const entry = this.liveTarinai.get(id); + if (!entry || (token !== null && entry.token !== token)) return null; + const t = entry.target; + return t && !t.dead ? t : null; + } + recordFamily(t) { if (!this.family) this.family = {}; - if (!t?.id) return; + const familyKey = this.tarinaiFamilyKey(t); + if (!familyKey) return; const uniqueIds = (list) => Array.from(new Set((list || []).filter(Boolean))); const sameList = (a, b) => { const aa = uniqueIds(a); @@ -380,9 +431,9 @@ class World { const nextParents = uniqueIds(t.parents || []); const nextChildren = uniqueIds(t.children || []); const nextPersonalityTags = getPersonalityTraitTags(t); - if (!this.family[t.id]) { - this.family[t.id] = { - id: t.id, + if (!this.family[familyKey]) { + this.family[familyKey] = { + id: familyKey, name: t.name, type: t.type, personalityTags: nextPersonalityTags, @@ -397,7 +448,7 @@ class World { }; changed = true; } else { - const entry = this.family[t.id]; + const entry = this.family[familyKey]; const nextAlive = !t.dead; if (entry.name !== t.name) changed = true; if (entry.type !== t.type) changed = true; @@ -436,12 +487,13 @@ class World { if (!this.family) this.family = {}; if (this.familyCleanVersion === (this.familyVersion || 0)) return false; const family = this.family; - const liveById = new Map((this.tarinai || []).map(t => [t.id, t])); + const liveById = new Map((this.tarinai || []).map(t => [this.tarinaiFamilyKey(t), t]).filter(([id]) => id)); let changed = false; const uniqueIds = (list, allow) => Array.from(new Set((list || []).filter(id => id && (!allow || allow.has(id))))); const sameList = (a, b) => a.length === b.length && a.every((id, i) => id === b[i]); for (const t of this.tarinai || []) { - if (!this.family[t.id] && !(t.hasPaired || (t.parents || []).length || (t.children || []).length)) continue; + const familyKey = this.tarinaiFamilyKey(t); + if (!familyKey || (!this.family[familyKey] && !(t.hasPaired || (t.parents || []).length || (t.children || []).length))) continue; const before = this.familyVersion || 0; this.recordFamily(t); changed = changed || before !== (this.familyVersion || 0); @@ -571,14 +623,40 @@ class World { return issues; } + clearLiveReferencesTo(dead) { + const deadId = dead?.id || dead?.releasedLiveId || ""; + if (!deadId) return false; + let changed = false; + for (const other of this.tarinai || []) { + if (!other || other === dead || other.dead) continue; + if (other.target === dead || other.target?.id === deadId) { + other.target = null; + if (["seek_friend", "panic", "fight", "intimidate"].includes(other.state)) other.state = "idle"; + changed = true; + } + if (other.panicTarget === dead || other.panicTarget?.id === deadId) { other.panicTarget = null; changed = true; } + if (other.fightTargetId === deadId) { other.fightTargetId = null; changed = true; } + if (Array.isArray(other.fightTargetIds) && other.fightTargetIds.includes(deadId)) { + other.fightTargetIds = other.fightTargetIds.filter(id => id !== deadId); + changed = true; + } + for (const key of ["defeatedById", "fightWinnerId", "intimidateTargetId", "birthPartnerId"]) { + if (other[key] === deadId) { other[key] = null; changed = true; } + } + } + return changed; + } + markDead(t, reason) { + this.clearLiveReferencesTo(t); if (!this.family) this.family = {}; const finalReason = t?.normalizeDeathReason ? t.normalizeDeathReason(reason) : reason; - if (this.family[t.id]) { - if (this.family[t.id].alive !== false || this.family[t.id].deathReason !== finalReason) { - this.family[t.id].alive = false; - this.family[t.id].deathReason = finalReason; - delete this.family[t.id].personality; + const familyKey = this.tarinaiFamilyKey(t); + if (familyKey && this.family[familyKey]) { + if (this.family[familyKey].alive !== false || this.family[familyKey].deathReason !== finalReason) { + this.family[familyKey].alive = false; + this.family[familyKey].deathReason = finalReason; + delete this.family[familyKey].personality; this.familyVersion = (this.familyVersion || 0) + 1; this.markFamilyTreeDirty("death"); } @@ -632,6 +710,7 @@ class World { addTarinai(opts = {}) { const t = new Tarinai(this, opts); + this.assignTarinaiLiveId(t); this.tarinai.push(t); this.drawListDirty = true; if (t.hasPaired || (t.parents || []).length || (t.children || []).length) this.recordFamily(t); @@ -642,6 +721,7 @@ class World { startBirthRitual(a, b) { if (!a || !b || a.dead || b.dead) return false; if (a.isZunchiSlave || b.isZunchiSlave) return false; + if (this.areParentChild(a, b)) return false; if (a.sleepDisease || b.sleepDisease || a.fightDisease || b.fightDisease) return false; if (a.birthRitualTimer > 0.04 || b.birthRitualTimer > 0.04) return false; const aJoined = a.familyJoined ? a.familyJoined() : Boolean((a.parents || []).length || (a.children || []).length); @@ -696,25 +776,28 @@ class World { if (child) { child.postBirthPeaceTimer = 18; children.push(child); } } if (children.length > 0) this.lastBirthAt = this.time; - if (children.length > 1) this.log(`${a.name}\u3068${b.name}\u306e\u5b50\u304c${children.length}\u5339\u751f\u307e\u308c\u305f\u3002`, "birth"); + if (children.length > 1) this.log(`${a.name}\u3068${b.name}\u306e\u5b50\u304c${children.length}\u5339\u751f\u307e\u308c\u305f\u3002`, "birth", { participants: [a, b, ...children] }); return children[0] || null; } areParentChild(a, b) { if (!a || !b) return false; - const aId = a.id || a; - const bId = b.id || b; + const aId = this.tarinaiFamilyKey(a) || a; + const bId = this.tarinaiFamilyKey(b) || b; if (!aId || !bId) return false; return Boolean((a.parents || []).includes(bId) || (a.children || []).includes(bId) || (b.parents || []).includes(aId) || (b.children || []).includes(aId)); } areCoParents(a, b) { if (!a || !b) return false; - const aId = a.id || a; - const bId = b.id || b; + const aLiveId = a.id || a; + const bLiveId = b.id || b; + if (!aLiveId || !bLiveId || aLiveId === bLiveId) return false; + if (a.birthPartnerId && a.birthPartnerId === bLiveId) return true; + if (b.birthPartnerId && b.birthPartnerId === aLiveId) return true; + const aId = this.tarinaiFamilyKey(a) || aLiveId; + const bId = this.tarinaiFamilyKey(b) || bLiveId; if (!aId || !bId || aId === bId) return false; - if (a.birthPartnerId && a.birthPartnerId === bId) return true; - if (b.birthPartnerId && b.birthPartnerId === aId) return true; const aChildren = new Set((a.children || []).filter(Boolean)); if (!aChildren.size) return false; for (const id of (b.children || [])) { @@ -726,10 +809,12 @@ class World { canStartFight(t) { if (!t || t.dead) return false; if (t.sleepDisease) return false; - // Disease fight rule: explosion disease and zunchi disease can lash out; + // Disease fight rule: explosion, zunchi, and fight disease can lash out; // sleep disease cannot fight or be challenged, and other diseases cannot start fights. - if (t.explosionDisease || t.zunchiDisease) return true; - if (t.fightDisease) return false; + if (t.explosionDisease || t.zunchiDisease || t.fightDisease) return true; + const flag = (value) => typeof value === "function" ? Boolean(value.call(t)) : Boolean(value); + const hasOtherDisease = flag(t.disease) || flag(t.sick) || flag(t.infection) || flag(t.hasDisease); + if (hasOtherDisease) return false; return true; } @@ -761,7 +846,7 @@ class World { need: Math.random() < 0.6 ? pick([a.need, b.need]) : pick(NEEDS), generation: Math.max(a.generation, b.generation) + 1, lifeSpan: rand(1500, 2400), - parents: [a.id, b.id], + parents: [this.tarinaiFamilyKey(a), this.tarinaiFamilyKey(b)], parentNames: [a.name, b.name], birthTime: this.time, }); @@ -774,17 +859,20 @@ class World { b.adjustRelation?.(a, 0.65, -0.20, "co_parent"); a.postBirthPeaceTimer = Math.max(a.postBirthPeaceTimer || 0, 28); b.postBirthPeaceTimer = Math.max(b.postBirthPeaceTimer || 0, 28); - a.children.push(child.id); - b.children.push(child.id); + const childKey = this.tarinaiFamilyKey(child); + const aKey = this.tarinaiFamilyKey(a); + const bKey = this.tarinaiFamilyKey(b); + a.children.push(childKey); + b.children.push(childKey); this.recordFamily(a); this.recordFamily(b); this.recordFamily(child); - if (this.family[a.id] && !this.family[a.id].children.includes(child.id)) this.family[a.id].children.push(child.id); - if (this.family[b.id] && !this.family[b.id].children.includes(child.id)) this.family[b.id].children.push(child.id); + if (this.family[aKey] && !this.family[aKey].children.includes(childKey)) this.family[aKey].children.push(childKey); + if (this.family[bKey] && !this.family[bKey].children.includes(childKey)) this.family[bKey].children.push(childKey); this.familyCleanVersion = null; audio.birth(); this.lastBirthAt = this.time; - if (total <= 1) this.log(`${child.name}\u304c${a.name}\u3068${b.name}\u306e\u5b50\u3068\u3057\u3066\u751f\u307e\u308c\u305f\u3002`, "birth"); + if (total <= 1) this.log(`${child.name}\u304c${a.name}\u3068${b.name}\u306e\u5b50\u3068\u3057\u3066\u751f\u307e\u308c\u305f\u3002`, "birth", { participants: [child, a, b] }); return child; } @@ -901,7 +989,7 @@ class World { actor.adjustRelation(target, -0.08, 0.06, "intimidate"); target.adjustRelation(actor, -0.22, 0.85 * target.personalityProfile().fear, "intimidate"); if (this.time - Math.max(actor.lastLog, target.lastLog) > 5.5) { - this.log(`${actor.name}\u306f${target.name}\u3092\u5a01\u5687\u3057\u3066\u8ffd\u3044\u6255\u3063\u305f\u3002`, "fight"); + this.log(`${actor.name}\u306f${target.name}\u3092\u5a01\u5687\u3057\u3066\u8ffd\u3044\u6255\u3063\u305f\u3002`, "fight", { participants: [actor, target] }); actor.lastLog = target.lastLog = this.time; } return true; @@ -953,7 +1041,7 @@ class World { })); audio.fight(); if (this.time - Math.max(a.lastLog, b.lastLog) > 6) { - this.log(`${a.name}\u3068${b.name}\u304c\u5c0f\u3055\u306a\u55a7\u5629\u3092\u3057\u305f\u3002`, "fight"); + this.log(`${a.name}\u3068${b.name}\u304c\u5c0f\u3055\u306a\u55a7\u5629\u3092\u3057\u305f\u3002`, "fight", { participants: [a, b] }); a.lastLog = b.lastLog = this.time; } } @@ -967,7 +1055,10 @@ class World { const p = clamp(1 - d / Math.max(1, radius), 0, 1); if (p <= 0 && d > radius) continue; const damage = typeof damageFn === "function" ? damageFn(p, ant, d) : Number(damageFn || 0); - if (damage > 0) ant.hp = Math.max(0, (ant.hp ?? ant.maxHp ?? ANT_WORKER_HP ?? 32) - damage); + if (damage > 0) { + ant.hp = Math.max(0, (ant.hp ?? ant.maxHp ?? ANT_WORKER_HP ?? 32) - damage); + ant.hpBarTimer = Math.max(ant.hpBarTimer || 0, 1.25); + } if (opts.push) { let nx = (ant.x - x) / d; let ny = (ant.y - y) / d; @@ -1124,7 +1215,7 @@ class World { } t.die("\u7206\u767a\u75c5"); audio.explode(); - this.log(`${t.name}\u306f\u7206\u767a\u75c5\u3067\u7206\u767a\u3057\u305f\u3002`, "accident"); + this.log(`${t.name}\u306f\u7206\u767a\u75c5\u3067\u7206\u767a\u3057\u305f\u3002`, "accident", { participants: [t] }); } applyWaterHose(x, y, dx = 0, dy = 0, dt = 0.08) { @@ -1377,47 +1468,63 @@ class World { if ((loser.totalFightLosses || 0) >= 5 && loser.becomeZunchiSlave?.(winner)) { const oldName = loser.formerName || loser.name; this.spawnBubble(loser.x, loser.y - loser.radius * 1.20, "\u3076\u308a\u3085\u2026", "rgba(74,91,50,0.78)"); - this.log(`${oldName}\u306f5\u56de\u55a7\u5629\u306b\u8ca0\u3051\u3001\u305a\u3093\u3061\u3069\u308c\u3044\u306b\u306a\u3063\u305f\u3002`, "fight"); + this.log(`${oldName}\u306f5\u56de\u55a7\u5629\u306b\u8ca0\u3051\u3001\u305a\u3093\u3061\u3069\u308c\u3044\u306b\u306a\u3063\u305f\u3002`, "fight", { participants: [loser] }); } loser.fearTimer = Math.max(loser.fearTimer, 1.2 * loser.personalityProfile().fear); this.spawnBubble(loser.x, loser.y - loser.radius * 1.28, "\u306f\u3041\u3041\u3041\uff01", "rgba(84,66,86,0.80)"); winner.affection = clamp(winner.affection + 0.8, 0, 80); winner.stress = clamp(winner.stress - rand(9, 18), 0, 130); if (this.relationNotice(winner.id, loser.id, "fight-result", 8)) { - this.log(`${loser.name}\u306f${winner.name}\u306b\u8ca0\u3051\u3001\u305d\u306e\u3053\u3068\u3092\u899a\u3048\u305f\u3002`, "fight"); + this.log(`${loser.name}\u306f${winner.name}\u306b\u8ca0\u3051\u3001\u305d\u306e\u3053\u3068\u3092\u899a\u3048\u305f\u3002`, "fight", { participants: [loser, winner] }); } } itemDropImpact(it) { if (!it || it.dead || it.type === "water") return; const isStone = it.type === "stone"; - const radius = isStone ? 64 : Math.max(34, (it.r || 14) * 1.75); - const damage = isStone ? rand(20, 34) : rand(3, 7); - const push = isStone ? rand(145, 210) : rand(54, 92); + const isGenkotsu = it.type === "genkotsu"; + const radius = isGenkotsu ? Math.max(118, (it.r || 72) * 1.72) : (isStone ? 64 : Math.max(34, (it.r || 14) * 1.75)); + const damage = isGenkotsu ? rand(34, 54) : (isStone ? rand(20, 34) : rand(3, 7)); + const push = isGenkotsu ? rand(330, 470) : (isStone ? rand(145, 210) : rand(54, 92)); + const reason = isGenkotsu ? "\u3052\u3093\u3053\u3064\u304c\u843d\u3061\u305f" : (isStone ? "\u77f3\u304c\u843d\u3061\u305f" : "\u843d\u3061\u3066\u304d\u305f\u9053\u5177\u306b\u5f53\u305f\u3063\u305f"); + if (isGenkotsu) it.impactFlash = 1; let hit = 0; - for (const t of this.nearbyTarinai(it.x, it.y, radius + 48)) { + for (const t of this.nearbyTarinai(it.x, it.y, radius + 54)) { if (!t || t.dead || this.isTarinaiHiddenInNestBox(t)) continue; const d = Math.max(1, distXY(t.x, t.y, it.x, it.y)); const p = clamp(1 - d / (radius + t.radius), 0, 1); if (p <= 0) continue; - const nx = (t.x - it.x) / d; - const ny = (t.y - it.y) / d; + let nx = (t.x - it.x) / d; + let ny = (t.y - it.y) / d; + if (!Number.isFinite(nx) || !Number.isFinite(ny) || Math.abs(nx) + Math.abs(ny) < 0.001) { + const a = rand(0, Math.PI * 2); + nx = Math.cos(a); + ny = Math.sin(a); + } t.vx += nx * push * (0.35 + p); - t.vy += ny * push * (0.35 + p) - (isStone ? 42 : 18) * p; - t.damage(damage * (0.35 + p * 0.65), isStone ? "\u77f3\u304c\u843d\u3061\u305f" : "\u843d\u3061\u3066\u304d\u305f\u9053\u5177\u306b\u5f53\u305f\u3063\u305f"); - t.hurtTimer = Math.max(t.hurtTimer, isStone ? 2.7 : 1.25); - t.fallTimer = Math.max(t.fallTimer, isStone ? 0.62 : 0.26); + t.vy += ny * push * (0.35 + p) - (isGenkotsu ? 92 : (isStone ? 42 : 18)) * p; + t.damage(damage * (0.35 + p * 0.65), reason); + t.hurtTimer = Math.max(t.hurtTimer, isGenkotsu ? 3.4 : (isStone ? 2.7 : 1.25)); + t.fallTimer = Math.max(t.fallTimer, isGenkotsu ? 0.86 : (isStone ? 0.62 : 0.26)); t.fallMax = Math.max(t.fallMax || t.fallTimer, t.fallTimer); t.fallDir = nx >= 0 ? 1 : -1; hit += 1; } - const antHit = this.damageAntsInRadius(it.x, it.y, radius + 48, p => damage * (0.35 + p * 0.65), isStone ? "\u77f3\u304c\u843d\u3061\u305f" : "\u843d\u3061\u3066\u304d\u305f\u9053\u5177\u306b\u5f53\u305f\u3063\u305f", { + const antHit = this.damageAntsInRadius(it.x, it.y, radius + 54, p => damage * (0.35 + p * 0.65), reason, { push: p => push * (0.35 + p), }); - this.effects.push(new Effect("ring", it.x, it.y, { size: isStone ? 32 : 18, life: 0.34, color: isStone ? "rgba(128,96,58,0.76)" : "rgba(174,128,70,0.52)" })); - if (hit > 0 || antHit > 0) this.spawnFallEffect(it.x, it.y + (it.r || 12) * 0.6, isStone ? 0.9 : 0.45); - if (isStone && (hit > 0 || antHit > 0)) audio.poke(); - if (hit > 0) this.log(`${isStone ? "\u77f3" : "\u9053\u5177"}\u304c\u843d\u3061\u3001${hit}\u5339\u306e\u305f\u308a\u306a\u3044\u304c\u5dfb\u304d\u8fbc\u307e\u308c\u305f\u3002`, "accident"); + if (isGenkotsu) { + for (let r = 0; r < 4; r++) this.effects.push(new Effect("ring", it.x, it.y, { size: 32 + r * 34, life: 0.34 + r * 0.07, color: r % 2 ? "rgba(255,203,54,0.72)" : "rgba(74,57,42,0.42)" })); + for (let i = 0; i < 12; i++) this.effects.push(new Effect("fight", it.x + rand(-38, 38), it.y + rand(-22, 28), { size: rand(12, 22), life: rand(0.25, 0.48), color: "rgba(255,205,46,0.82)" })); + } else { + this.effects.push(new Effect("ring", it.x, it.y, { size: isStone ? 32 : 18, life: 0.34, color: isStone ? "rgba(128,96,58,0.76)" : "rgba(174,128,70,0.52)" })); + } + if (hit > 0 || antHit > 0) this.spawnFallEffect(it.x, it.y + (it.r || 12) * 0.6, isGenkotsu ? 1.22 : (isStone ? 0.9 : 0.45)); + if ((isStone || isGenkotsu) && (hit > 0 || antHit > 0)) audio.poke(); + if (hit > 0 || antHit > 0) { + const label = isGenkotsu ? "\u3052\u3093\u3053\u3064" : (isStone ? "\u77f3" : "\u9053\u5177"); + this.log(`${label}\u304c\u843d\u3061\u3001${hit}\u5339\u306e\u305f\u308a\u306a\u3044\u3068${antHit}\u5339\u306e\u30a2\u30ea\u304c\u5dfb\u304d\u8fbc\u307e\u308c\u305f\u3002`, "accident"); + } } countBallChasers(ball, except = null) { @@ -1640,7 +1747,7 @@ class World { t.blastSpinMax = Math.max(t.blastSpinMax || 0, t.blastSpinTimer); this.spawnFallEffect(t.x, t.y + t.radius * 0.55, clamp(damage / 18, 0.55, 1.8)); this.effects.push(new Effect("ring", hitX, hitY, { size: Math.max(20, ball.r * 1.25), life: 0.22, color: "rgba(210,75,65,0.50)" })); - if (this.relationNotice(t.id, ball.id || "ball", "fast-ball-hit", 2.8)) this.log(`${t.name}\u306f\u9ad8\u901f\u306e\u30dc\u30fc\u30eb\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident"); + if (this.relationNotice(t.id, ball.id || "ball", "fast-ball-hit", 2.8)) this.log(`${t.name}\u306f\u9ad8\u901f\u306e\u30dc\u30fc\u30eb\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident", { participants: [t] }); ball.vx = (ball.vx || 0) * 0.58 - nx * Math.min(110, ballSpeed * 0.10); ball.vy = (ball.vy || 0) * 0.58 - ny * Math.min(110, ballSpeed * 0.10); ball.spinVelocity = clamp((ball.spinVelocity || 0) + (nx >= 0 ? -1 : 1) * 8.5, -38, 38); @@ -1676,7 +1783,7 @@ class World { t.nextPlayBubbleAt = now + rand(2.0, 3.8); this.spawnBubble(t.x, t.y - t.radius * 1.15, pick(["!", "\u306f\u3046", "?" ]), "rgba(70,96,50,0.76)"); } - if (playful && this.relationNotice(t.id, ball.id || "ball", "ball-kick", 16)) this.log(`${t.name}\u306f\u30dc\u30fc\u30eb\u3092\u8ffd\u3044\u304b\u3051\u3066\u5f3e\u3044\u305f\u3002`, "observe"); + if (playful && this.relationNotice(t.id, ball.id || "ball", "ball-kick", 16)) this.log(`${t.name}\u306f\u30dc\u30fc\u30eb\u3092\u8ffd\u3044\u304b\u3051\u3066\u5f3e\u3044\u305f\u3002`, "observe", { participants: [t] }); this.effects.push(new Effect("ring", ball.x, ball.y, { size: Math.max(12, ball.r * 0.80), life: 0.20, color: "rgba(170,210,95,0.50)" })); } } @@ -1752,7 +1859,7 @@ class World { t.fearTimer = Math.max(t.fearTimer || 0, 0.55); } this.effects.push(new Effect("ring", (a.x + b.x) * 0.5, (a.y + b.y) * 0.5, { size: Math.max(16, hitDistance * 0.45), life: 0.20, color: "rgba(210,75,65,0.40)" })); - if (this.relationNotice(target.id, impactor.id, "tarinai-highspeed-collision", 2.6)) this.log(`${target.name}\u306f\u9ad8\u901f\u306e${impactor.name}\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident"); + if (this.relationNotice(target.id, impactor.id, "tarinai-highspeed-collision", 2.6)) this.log(`${target.name}\u306f\u9ad8\u901f\u306e${impactor.name}\u306b\u885d\u7a81\u3057\u3066\u5f3e\u304d\u98db\u3070\u3055\u308c\u305f\u3002`, "accident", { participants: [target, impactor] }); } } } @@ -2107,11 +2214,11 @@ class World { } nearbyItems(x, y, radius) { - return this.spatial.nearby(this.spatial.itemCells, x, y, radius, this.spatialScratch); + return this.spatial.nearby(this.spatial.itemCells, x, y, radius, this.spatialItemScratch); } nearbyTarinai(x, y, radius) { - return this.spatial.nearby(this.spatial.tarinaiCells, x, y, radius, this.spatialScratch); + return this.spatial.nearby(this.spatial.tarinaiCells, x, y, radius, this.spatialTarinaiScratch); } rebuildSpatial() { @@ -2344,8 +2451,9 @@ class World { observeHighlightKind(t) { const s = this.selected; if (!s || !t || t === s || t.dead || this.tool !== "observe") return ""; - if ((s.parents || []).includes(t.id)) return "parent"; - if ((s.children || []).includes(t.id)) return "child"; + const tFamilyKey = this.tarinaiFamilyKey(t); + if ((s.parents || []).includes(tFamilyKey)) return "parent"; + if ((s.children || []).includes(tFamilyKey)) return "child"; const rel = s.relationTo ? s.relationTo(t.id) : null; if (rel && (rel.affinity || 0) >= FRIEND_AFFINITY_THRESHOLD) return "friend"; if (rel && (rel.fear || 0) >= 8) return "enemy"; @@ -2440,6 +2548,7 @@ class World { for (const t of this.tarinai) { t.update(dt); } + this.rebuildSpatial(); this.limitBallChasers(); this.resolveBallInteractions(dt); this.resolveTarinaiHighSpeedCollisions(dt); @@ -2573,6 +2682,28 @@ class World { t.entryTimer = 0; } } + let changedAnts = false; + for (const ant of this.ants || []) { + if (!ant || ant.dead) continue; + const result = repairPoint(ant, ant.kind === "queen" ? 18 : 10); + if (result === "delete") { + ant.dead = true; + changedAnts = true; + continue; + } + if (result === "moved") { + ant.vx = 0; + ant.vy = 0; + if (ant.state === "drag") { + ant.state = "return"; + ant.targetId = ""; + ant.targetToken = 0; + ant.targetRef = null; + } + changedAnts = true; + } + } + if (changedAnts) this.compactAnts?.(); if (changedItems) { this.compactItems(); this.updateItemCounts(); @@ -2589,9 +2720,10 @@ class World { : current === "cloudy" ? ["sunny", "cloudy", "light_rain"] : ["sunny", "cloudy"]; - this.weather = pick(choices); + const next = pick(choices); + this.weather = next; this.nextWeatherChange = rand(CONFIG.weatherChangeMin, CONFIG.weatherChangeMax); - this.log(`\u5929\u6c17: ${weatherLabel(this.weather)}`); + if (next !== current) this.log(`\u5929\u6c17: ${weatherLabel(this.weather)}`); } fencePlacementBlocked(item) { @@ -2611,8 +2743,49 @@ class World { return false; } + importantPlacementOverlapBlocked(item) { + if (!item || item.dead) return true; + const important = new Set(["grass", "fence_v", "fence_h", "nest_box", "water_bowl"]); + if (!important.has(item.type)) return false; + const placingGrass = item.type === "grass"; + const itemRects = this.solidObstacleRects(item); + const radiusFor = typeof itemRadiusFor === "function" ? itemRadiusFor : ((type, fallback = 12) => fallback); + const itemRadius = Math.max(14, item.r || radiusFor(item.type, 12) || 12); + const rectCircleOverlap = (rect, cx, cy, radius, margin = 0) => { + if (!rect) return false; + const px = clamp(cx, rect.left - margin, rect.right + margin); + const py = clamp(cy, rect.top - margin, rect.bottom + margin); + return distXY(cx, cy, px, py) < radius + margin; + }; + const rectsOverlap = (a, b, margin = 0) => Boolean(a && b && !(a.right + margin < b.left || a.left - margin > b.right || a.bottom + margin < b.top || a.top - margin > b.bottom)); + for (const other of this.nearbyItems(item.x, item.y, Math.max(132, itemRadius * 4))) { + if (!other || other === item || other.dead || !important.has(other.type)) continue; + // Grass is a ground layer: objects may be placed on top of existing grass. + // Grass placement itself still avoids objects and other grass via grassSpotOpen(). + if (!placingGrass && other.type === "grass") continue; + const otherRects = this.solidObstacleRects(other); + const otherRadius = Math.max(14, other.r || radiusFor(other.type, 12) || 12); + const margin = Math.max(4, Math.min(itemRadius, otherRadius) * 0.18); + if (itemRects.length && otherRects.length) { + if (itemRects.some(a => otherRects.some(b => rectsOverlap(a, b, margin)))) return true; + continue; + } + if (itemRects.length) { + if (itemRects.some(r => rectCircleOverlap(r, other.x, other.y, otherRadius, margin))) return true; + continue; + } + if (otherRects.length) { + if (otherRects.some(r => rectCircleOverlap(r, item.x, item.y, itemRadius, margin))) return true; + continue; + } + if (distXY(item.x, item.y, other.x, other.y) < itemRadius + otherRadius + margin) return true; + } + return false; + } + placementBlocked(item) { if (!item || item.dead) return true; + if (item.type === "genkotsu") return false; const pad = CONFIG.worldPadding || 30; const rects = this.solidObstacleRects(item); if (rects.length) { @@ -2625,6 +2798,7 @@ class World { } if (item.type === "grass" && !this.grassSpotOpen(item.x, item.y, { avoidTarinai: true })) return true; if (this.isFenceType(item.type) && this.fencePlacementBlocked(item)) return true; + if (this.importantPlacementOverlapBlocked(item)) return true; if (item.type === "nest_box") { const margin = Math.max(8, (item.r || 42) * 0.18); for (const it of this.nearbyItems(item.x, item.y, Math.max(120, (item.r || 42) * 3))) { @@ -2745,7 +2919,7 @@ class World { return null; } if (dropped) { - item.dropMax = item.type === "stone" ? 0.72 : 0.58; + item.dropMax = item.type === "genkotsu" ? 0.78 : (item.type === "stone" ? 0.72 : 0.58); item.dropTimer = item.dropMax; item.dropImpactDone = false; } @@ -2763,7 +2937,6 @@ class World { if (!this.isTarinaiHiddenInNestBox(this.tarinai[i]) && this.tarinai[i].contains(x, y)) { found = this.tarinai[i]; break; } } this.selected = found; - if (found) this.log(`${found.name}\u3092\u9078\u629e\u3057\u305f\u3002`); return; } @@ -2782,9 +2955,9 @@ class World { const target = [...this.tarinai].reverse().find(t => t.contains(x, y)); if (target) { target.poke(); - if (!target.dead) this.log(`${target.name}\u306f\u3064\u3064\u304b\u308c\u3001\u305f\u308a\u306a\u3044\u3053\u3068\u3092\u899a\u3048\u305f\u3002`); + if (!target.dead) this.log(`${target.name}\u306f\u3064\u3064\u304b\u308c\u3001\u305f\u308a\u306a\u3044\u3053\u3068\u3092\u899a\u3048\u305f\u3002`, "observe", { participants: [target] }); } else { - this.log("\u7a7a\u6c17\u3092\u3064\u3064\u3044\u305f\u3002\u305d\u3053\u306b\u306f\u4f55\u3082\u305f\u308a\u306a\u304b\u3063\u305f\u3002"); + this.log("\u7a7a\u6c17\u3092\u3064\u3064\u3044\u305f\u3002\u305d\u3053\u306b\u306f\u4f55\u3082\u305f\u308a\u306a\u304b\u3063\u305f\u3002", "observe", { hiddenFromObservation: true, countInStats: false }); } return; } @@ -2826,14 +2999,14 @@ class World { const placed = this.placeItem(rawItem, true); if (!placed) return; const label = toolLabel(itemType); - this.log(`${label}\u3092\u914d\u7f6e\u3057\u305f\u3002`); + this.log(itemType === "genkotsu" ? `${label}\u3092\u843d\u3068\u3057\u305f\u3002` : `${label}\u3092\u914d\u7f6e\u3057\u305f\u3002`); } } inferLogKind(text) { const s = String(text || "").toLowerCase(); if (s.includes("firecracker") || s.includes("accident") || s.includes("drop") || s.includes("\u7206\u7af9") || s.includes("\u843d\u3061") || s.includes("\u4e8b\u6545") || s.includes("\u5439\u304d\u98db")) return "accident"; - if (s.includes("fight") || s.includes("lost to") || s.includes("poked") || s.includes("\u55a7\u5629") || s.includes("\u8ca0\u3051") || s.includes("\u3064\u3064\u304b")) return "fight"; + if (s.includes("fight") || s.includes("lost to") || s.includes("\u55a7\u5629") || s.includes("\u8ca0\u3051")) return "fight"; if (s.includes("appeared") || s.includes("wandered in") || s.includes("birth") || s.includes("\u73fe\u308c") || s.includes("\u8ff7\u3044\u8fbc")) return "birth"; if (s.includes("dead") || s.includes("trace") || s.includes("reason:") || s.includes("\u6b7b\u4ea1") || s.includes("\u75d5\u8de1") || s.includes("\u7406\u7531:") || s.includes("\u6b7b\u56e0:")) return "death"; if (s.includes("weather") || s.includes("day") || s.includes("night") || s.includes("morning") || s.includes("evening") || s.includes("\u5929\u6c17") || s.includes("\u65e5\u76ee") || s.includes("\u591c") || s.includes("\u671d") || s.includes("\u5915")) return "weather"; @@ -2856,12 +3029,32 @@ class World { kind: kind || this.inferLogKind(text), eventType: options.eventType || "", hiddenFromObservation: Boolean(options.hiddenFromObservation), + participants: (options.participants || []).filter(Boolean).map(t => ({ + id: t.id || t.releasedLiveId || "", + liveId: t.id || t.releasedLiveId || "", + liveToken: t.liveToken || t.releasedLiveToken || 0, + familyKey: this.tarinaiFamilyKey(t), + name: t.name || "", + type: t.type || "", + generation: t.generation || 1, + })), + participantLiveIds: (options.participants || []).filter(t => t?.id).map(t => t.id), + participantSnapshots: (options.participants || []).filter(Boolean).map(t => ({ + liveId: t.id || t.releasedLiveId || "", + liveToken: t.liveToken || t.releasedLiveToken || 0, + familyKey: this.tarinaiFamilyKey(t), + name: t.name || "", + type: t.type || "", + generation: t.generation || 1, + })), }; if (this.shouldHideFromObservationRecords(entry)) entry.hiddenFromObservation = true; + const countInStats = options.countInStats ?? !entry.hiddenFromObservation; + entry.countInStats = Boolean(countInStats); if (!this.eventCounters) this.eventCounters = {}; - this.eventCounters[entry.kind] = (this.eventCounters[entry.kind] || 0) + 1; - for (const t of this.tarinai || []) { - if (!t || !t.name || !text || !String(text).includes(t.name)) continue; + if (countInStats) this.eventCounters[entry.kind] = (this.eventCounters[entry.kind] || 0) + 1; + for (const t of options.participants || []) { + if (!t) continue; if (!entry.hiddenFromObservation && t.addRecord) t.addRecord(text, entry.kind); } this.logs.unshift(entry); @@ -2869,65 +3062,6 @@ class World { renderLog(this.logs); } - serialize() { - return { - w: this.w, h: this.h, time: this.time, day: this.day, deadCount: this.deadCount, - maxGeneration: this.maxGeneration, lastBirthAt: this.lastBirthAt || -999, - tarinai: this.tarinai.map(t => t.serialize()), - items: this.items.map(i => i.serialize()), - ants: (this.ants || []).map(a => a.serialize ? a.serialize() : a), - logs: this.logs.slice(0, 30), - family: this.family || {}, - weather: this.weather || "sunny", - fieldType: this.fieldType || "garden", - fieldZoom: this.fieldZoom || 1, - cameraX: this.cameraX || 0, - cameraY: this.cameraY || 0, - eventCounters: this.eventCounters || {}, - toolSize: this.toolSize || "medium", - toolSizes: this.toolSizes || {}, - nextWeatherChange: this.nextWeatherChange || CONFIG.weatherChangeMin, - }; - } - - load(data) { - this.time = data.time || 0; - this.day = data.day || 1; - this.deadCount = data.deadCount || 0; - this.eventCounters = data.eventCounters || {}; - this.toolSize = data.toolSize || this.toolSize || "medium"; - this.toolSizes = data.toolSizes || this.toolSizes || {}; - this.maxGeneration = data.maxGeneration || 1; - this.lastBirthAt = Number.isFinite(data.lastBirthAt) ? data.lastBirthAt : -999; - this.fieldType = FIELD_TYPES?.[data.fieldType]?.id || "garden"; - this.fieldZoom = Number(data.fieldZoom) || 1; - this.cameraX = Number(data.cameraX) || 0; - this.cameraY = Number(data.cameraY) || 0; - this.tarinai = (data.tarinai || []).map(o => Tarinai.from(this, o)); - this.items = (data.items || []).filter(o => o?.type !== "mirror" && o?.type !== "food" && o?.type !== "cardboard").map(o => Item.from(o)); - this.ants = (data.ants || []).map(o => AntActor.from(this, o)); - this.effects = []; - this.compactItems(); - this.compactEffects(); - this.logs = (data.logs || []).map(e => typeof e === "string" ? { time: this.time, text: e, kind: this.inferLogKind(e) } : { time: e.time || this.time, text: e.text || "", kind: e.kind || this.inferLogKind(e.text || "") }); - this.family = data.family || {}; - this.familyCleanVersion = null; - this.familyVersion = (this.familyVersion || 0) + 1; - this.markFamilyTreeDirty("load"); - this.weather = data.weather || "sunny"; - this.nextWeatherChange = data.nextWeatherChange || rand(CONFIG.weatherChangeMin, CONFIG.weatherChangeMax); - this.relationNotices = {}; - this.resolvedFightIds = {}; - for (const t of this.tarinai) this.recordFamily(t); - this.normalizeFamily(); - this.pruneExtinctFamilies({ normalize: false }); - this.lastPhase = this.phaseName(); - this.selected = null; - this.updateItemCounts(); - this.updateEffectCounts(); - this.rebuildSpatial(); - this.log("\u30bb\u30fc\u30d6\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3057\u305f\u3002"); - } } let world;