diff --git a/app_manifest.json b/app_manifest.json index 3f31e31..b498e50 100644 --- a/app_manifest.json +++ b/app_manifest.json @@ -1,5 +1,5 @@ { - "version": "16.07.50", + "version": "38.00.00", "css": [ "css/base.css", "css/layout.css", @@ -19,6 +19,9 @@ "js/input_mode_manager.js", "js/math.js", "js/physics_helpers.js", + "js/collision_footprint_system.js", + "js/mechanical_system.js", + "js/constraint_system.js", "js/assets.js", "js/audio.js", "js/perf_profiler.js", @@ -29,7 +32,6 @@ "js/items.js", "js/item_type_initializers.js", "js/item_lifecycle_support.js", - "js/item_lifecycle_legacy_system.js", "js/item_lifecycle_runtime.js", "js/item_update_policy.js", "js/item_dynamic_tool_system.js", @@ -44,7 +46,6 @@ "js/item_lifecycle_step_decay.js", "js/item_lifecycle_step_dynamic.js", "js/item_lifecycle_step_growth.js", - "js/item_lifecycle_step_legacy.js", "js/item_lifecycle_pipeline.js", "js/item_runtime.js", "js/structure_lifecycle.js", @@ -77,14 +78,12 @@ "js/tarinai_sunbath_system.js", "js/tarinai_cursor_care_system.js", "js/tarinai_local_environment_system.js", - "js/tarinai_update_legacy_system.js", "js/tarinai_social_move_life.js", "js/tarinai_update_step_frame.js", "js/tarinai_update_step_ai.js", "js/tarinai_update_step_environment.js", "js/tarinai_update_step_movement.js", "js/tarinai_update_step_health.js", - "js/tarinai_update_step_legacy.js", "js/tarinai_update_pipeline.js", "js/tarinai_runtime.js", "js/tarinai_render.js", @@ -123,14 +122,11 @@ "js/save_schema.js", "js/snapshot_system.js", "js/restore_coordinator.js", + "js/history_system.js", "js/save_codec.js", "js/save_storage.js", "js/save_system.js", "js/patch_helpers.js", - "js/freeze_store.js", - "js/freeze_snapshot_adapter.js", - "js/freeze_panel.js", - "js/freeze_system.js", "js/ui_tooltips.js", "js/ui_layout_dialogs.js", "js/ui_ground.js", @@ -156,5 +152,5 @@ "assets/sounds/*.mp3", "assets/objects/*.png" ], - "notes": "Source of truth for static loading order; generated files are index.html script/link tags and service-worker.js cache list. Item definitions are centralized in js/item_registry.js. Save compatibility migration is intentionally not retained. Snapshot restore is data-only; save and freeze are split into coordinator/codec/storage/panel/adapter modules. EventBus owns phase audio and log UI/audio notification side effects. World.update is phase-driven through js/world_update_phases.js; UI field input is split into shared/touch/mouse modules. Item construction, lifecycle, rendering, Tarinai targeting, ActionSpec definitions, consumable behavior, social action ticks, and building behavior are split into dedicated modules. Lightweight cleanup: item type constructor initialization is isolated; action selection bonus logic is shared; diagnostics no longer use removed performance-quality fields. Ground definitions, structure lifecycle, delete-tool actions, shared tooltips, and ground UI helpers are split into dedicated modules. FPS work: profiler, static/dynamic spatial buckets, item update scheduler, visible-cell rendering, chunked terrain cache, adaptive DPR, and render quality LOD are included. Boundary cleanup v1: save schema constants are centralized in js/save_schema.js and World.update now routes through js/simulation.js before the phase runner. Boundary cleanup v2: basic UI tool and selection changes route through js/command_dispatcher.js. Boundary cleanup v3: UI pointer, focus, favorite, pause, speed, and tool-size changes route through command_dispatcher; simulation order is named in js/system_order.js. Boundary cleanup v4: concrete world update phase work is extracted into js/simulation_systems.js; world_update_phases.js is now a compatibility facade. Boundary cleanup v5: simulation_systems.js is reduced to a facade; runtime helpers, environment, item/ant, effects, creature, maintenance, and ambient spawn systems are split into dedicated files. Boundary cleanup v6: item and Tarinai update entrypoints now route through js/item_runtime.js and js/tarinai_runtime.js before the legacy lifecycle implementations. Boundary cleanup v7: item update cadence is centralized in js/item_update_policy.js; Tarinai update cadence is centralized in js/tarinai_update_policy.js; scheduler and simulation helpers now consume those policies. Boundary cleanup v8: Tarinai update now routes through js/tarinai_update_pipeline.js with frame, AI, environment, movement, health, and legacy fallback steps. Boundary cleanup v9: Item lifecycle now routes through js/item_lifecycle_pipeline.js with frame, decay, dynamic, growth, and legacy fallback steps. Boundary cleanup v10: dynamic item behavior dispatch is split into js/item_dynamic_system.js plus tool, ball, duplicator, pin, and zunchi submodules; item_lifecycle_step_dynamic.js now calls that boundary. Boundary cleanup v11: fan/magnet/rotator, ball physics, duplicator loading, pin attachment, and zunchi motion/lifecycle implementations now live in the dynamic subsystem files; Item.prototype keeps thin compatibility facades. Boundary cleanup v12: item lifecycle support helpers and legacy fallback moved out of item_lifecycle_runtime.js; decay and growth implementation moved into dedicated item_lifecycle_*_system modules while lifecycle steps remain thin pipeline adapters. Boundary cleanup v13: Tarinai item interaction is extracted into js/tarinai_item_interaction_system.js; AI update step now calls that system directly while Tarinai.prototype keeps a thin compatibility facade. Boundary cleanup v14: remaining Tarinai interaction/planning cleanup is consolidated; item interaction scan/context, food consumption, and contact effects are split into dedicated modules, and resolveNeeds now routes through explicit need/action/forced planner boundaries while keeping legacy behavior as a fallback system. Boundary cleanup v15: Tarinai item interaction orchestration preserves the legacy per-candidate order by trying food consumption and then contact effects for each candidate before advancing." + "notes": "Boundary cleanup v38: freezer removed, washing expanded and continuous, laboratory ground added, and save schema synchronized." } diff --git a/css/base.css b/css/base.css index c40b8bc..5a72a27 100644 --- a/css/base.css +++ b/css/base.css @@ -347,23 +347,23 @@ h1 { .tool-grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); - gap: 8px; + gap: 6px; } .tool { - --tool-main-icon-size: 38px; - --tool-icon-zoom: 1.12; + --tool-main-icon-size: 28px; + --tool-icon-zoom: 1.05; --tool-watermark-size: 0px; border-radius: 12px; display: grid; - grid-template-columns: 42px minmax(0,1fr); + grid-template-columns: 29px minmax(0,1fr); align-items: center; justify-items: stretch; - gap: 4px; - padding: 4px 7px 4px 3px; - min-height: 48px; - font-size: 12px; - line-height: 1.08; + gap: 3px; + padding: 4px 4px 4px 2px; + min-height: 47px; + font-size: 10.2px; + line-height: 1.06; letter-spacing: -0.015em; text-align: left; position: relative; @@ -375,7 +375,7 @@ h1 { .tool::before { content: ""; position: absolute; - left: 4px; + left: 3px; top: 50%; width: var(--tool-main-icon-size); height: var(--tool-main-icon-size); @@ -405,31 +405,34 @@ h1 { max-width: 100%; min-width: 0; overflow-wrap: anywhere; - font-size: 12px; - line-height: 1.12; + font-size: 10.2px; + line-height: 1.10; font-weight: 700; + max-width: 5.05em; + word-break: normal; + overflow-wrap: anywhere; text-shadow: 0 1px 0 rgba(255,255,255,0.62); } -.tool.tool-has-canvas-icon { --tool-icon: none; grid-template-columns: 42px minmax(0,1fr); min-height: 48px; padding-top: 4px; } +.tool.tool-has-canvas-icon { --tool-icon: none; grid-template-columns: 29px minmax(0,1fr); min-height: 47px; padding-top: 4px; } .tool.tool-has-canvas-icon::before, .tool.tool-has-canvas-icon::after { background: none !important; } .tool-sprite-preview { position: absolute; - left: 2px; + left: 1px; top: 50%; - width: 42px; - height: 42px; + width: 30px; + height: 30px; transform: translateY(-50%); pointer-events: none; z-index: 1; filter: drop-shadow(0 2px 3px rgba(52,40,26,0.12)); } .tool-sprite-watermark { display: none !important; } -.tool[data-tool="giant_drug"] .tool-sprite-preview { width: 56px; height: 56px; left: -5px; } +.tool[data-tool="giant_drug"] .tool-sprite-preview { width: 39px; height: 39px; left: -4px; } .tool[data-tool="dwarf_drug"] .tool-sprite-preview, -.tool[data-tool="oshibyo"] .tool-sprite-preview { width: 28px; height: 28px; left: 9px; } +.tool[data-tool="oshibyo"] .tool-sprite-preview { width: 22px; height: 22px; left: 5px; } .tool[data-tool="poke"], .tool[data-tool="water_hose"] { --tool-icon-zoom: 0.92; } .tool[data-tool="observe"] { --tool-icon: url("../assets/ui/tool_observe.webp"); } .tool[data-tool="zunchi"] { --tool-icon: url("../assets/ui/tool_zunchi.webp"); } diff --git a/css/components.css b/css/components.css index ed6227d..d5fdc33 100644 --- a/css/components.css +++ b/css/components.css @@ -736,3 +736,52 @@ border-radius: 999px; background: rgba(111, 153, 102, 0.13); } + + +/* v36: pin only the operation tool category under the quick-scroll tabs. */ +.tool-category[data-tool-category="operate"]:not(.collapsed) { + position: sticky; + top: 58px; + z-index: 11; + overflow: hidden; + background: linear-gradient(180deg, rgba(238, 247, 255, 0.98), rgba(221, 237, 255, 0.98)); + border-color: rgba(82,128,190,0.36); + box-shadow: 0 8px 18px rgba(58, 82, 112, 0.13), inset 0 1px 0 rgba(255,255,255,0.82); +} +.tool-category[data-tool-category="operate"] .tool-category-toggle { + background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(231, 243, 255, 0.98)); + border-bottom-color: rgba(82,128,190,0.30); +} +.tool-category[data-tool-category="operate"] .tool-category-body { + background: rgba(238, 247, 255, 0.98); +} +.tool-category[data-tool-category="operate"] .tool-category-body { + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 5px; +} +.tool-category[data-tool-category="operate"] .tool { + grid-template-columns: 1fr; + min-height: 38px; + padding: 4px; + justify-items: center; + align-items: center; + text-align: center; + background: rgba(255,255,255,0.96); + border-color: rgba(82,128,190,0.28); +} +.tool-category[data-tool-category="operate"] .tool-label { + display: none; +} +.tool-category[data-tool-category="operate"] .tool::before { + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(var(--tool-icon-zoom, 1)); +} +.tool-category[data-tool-category="operate"] .tool-sprite-preview { + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +} +@media (max-width: 980px) { + .tool-category[data-tool-category="operate"]:not(.collapsed) { top: 58px; } +} diff --git a/css/layout.css b/css/layout.css index 625d2de..c7b4fec 100644 --- a/css/layout.css +++ b/css/layout.css @@ -10,6 +10,13 @@ .tool[data-tool="poke"] { --tool-emoji: "\1F448"; } .tool[data-tool="pinch"] { --tool-emoji: "\1F90F"; } .tool[data-tool="water_hose"] { --tool-emoji: "\1F6BF"; } +.tool[data-tool="copy"] { --tool-emoji: "⧉"; } +.tool[data-tool="area_delete"] { --tool-emoji: "✕"; } +.tool[data-tool="rope"] { --tool-emoji: "╰"; } +.tool[data-tool="rod"] { --tool-emoji: "━"; } +.tool[data-tool="reciprocator"] { --tool-emoji: "⇄"; } +.tool[data-tool="undo"] { --tool-emoji: "↶"; } +.tool[data-tool="redo"] { --tool-emoji: "↷"; } .tool.tool-emoji-icon { --tool-icon: none; } .tool.tool-emoji-icon::before { content: var(--tool-emoji); @@ -25,8 +32,21 @@ .tool[data-tool="poke"].tool-emoji-icon::before, .tool[data-tool="water_hose"].tool-emoji-icon::before { font-size: 25px; } +.tool[data-tool="rope"].tool-emoji-icon::before, +.tool[data-tool="rod"].tool-emoji-icon::before, +.tool[data-tool="reciprocator"].tool-emoji-icon::before, +.tool[data-tool="undo"].tool-emoji-icon::before, +.tool[data-tool="redo"].tool-emoji-icon::before { font-size: 29px; font-family: var(--font, sans-serif); } .tool[data-tool="delete"], .tool[data-tool="area_delete"] { --tool-icon-zoom: 1.42; } +.tool[data-tool="pinch"].tool-emoji-icon::before { font-size: 22px; } +.tool[data-tool="area_delete"].tool-emoji-icon::before { + font-size: 30px; + color: #f3a7aa; + text-shadow: 0 1px 0 rgba(255,255,255,0.65), 0 2px 5px rgba(146,54,62,0.16); + filter: none; +} + .tool[data-tool="ball"] { --tool-icon-zoom: 1.36; } .tool[data-tool="observe"], .tool[data-tool="new"] { --tool-icon-zoom: 1.20; } @@ -328,6 +348,7 @@ meter { .tool-category[data-tool-category="food"] { --tool-cat-a: rgba(236,252,219,0.82); --tool-cat-b: rgba(214,244,194,0.74); --tool-cat-line: rgba(96,156,72,0.26); } .tool-category[data-tool-category="medicine"] { --tool-cat-a: rgba(243,231,255,0.84); --tool-cat-b: rgba(230,214,252,0.78); --tool-cat-line: rgba(136,94,184,0.28); } .tool-category[data-tool-category="habitat"] { --tool-cat-a: rgba(255,245,218,0.84); --tool-cat-b: rgba(250,229,186,0.76); --tool-cat-line: rgba(174,125,54,0.28); } +.tool-category[data-tool-category="physics"] { --tool-cat-a: rgba(226,247,246,0.84); --tool-cat-b: rgba(199,232,231,0.76); --tool-cat-line: rgba(70,145,148,0.28); } .tool-category[data-tool-category="hazard"] { --tool-cat-a: rgba(255,230,224,0.84); --tool-cat-b: rgba(250,207,197,0.78); --tool-cat-line: rgba(189,88,66,0.30); } .tool-category { border-color: var(--tool-cat-line, rgba(84,68,48,0.10)); background: linear-gradient(180deg, var(--tool-cat-a, rgba(255,255,255,0.36)), rgba(255,255,255,0.28)); } .tool-category-toggle { background: linear-gradient(180deg, var(--tool-cat-a, rgba(255,252,244,0.66)), var(--tool-cat-b, rgba(255,252,244,0.54))); border-bottom-color: var(--tool-cat-line, rgba(84,68,48,0.08)); } diff --git a/index.html b/index.html index 2d2469a..2fe75ae 100644 --- a/index.html +++ b/index.html @@ -7,11 +7,11 @@ - - - - - + + + + +