From 18c416d4d22058d57a8468b98a11db06f7915c63 Mon Sep 17 00:00:00 2001 From: Warren H Date: Mon, 13 Jul 2026 17:21:10 -0400 Subject: [PATCH] Release v0.1.8 2026-07-13 --- package.json | 2 +- .../build_replacement_creature_bosses.py | 352 ++++++++++++++++++ .../bogbell-myconid/bogbell-myconid.glb | Bin 0 -> 79408 bytes .../brassbeak-basilisk/brassbeak-basilisk.glb | Bin 0 -> 96180 bytes src/components/BottomScreen.tsx | 3 +- src/components/FrontEnd.tsx | 220 ++++++++--- src/components/GameScene.tsx | 143 +++++-- src/components/boss/bossDeathVisuals.test.ts | 10 + src/components/boss/bossDeathVisuals.ts | 7 + src/frontend/saveContinuation.test.ts | 34 ++ src/frontend/saveContinuation.ts | 22 ++ src/game/battleSimulation.test.ts | 5 +- src/game/bossCatalog.test.ts | 16 + src/game/bossCatalog.ts | 8 +- src/game/bossDeath.ts | 8 + src/game/bossMechanics.ts | 11 +- src/game/bossRooms.ts | 4 +- src/game/bossSelection.test.ts | 20 + src/game/bossSelection.ts | 24 ++ src/game/bossVisuals.ts | 13 +- src/game/bosses/mechanicPool.test.ts | 18 + src/game/bosses/mechanicPool.ts | 41 +- src/game/partyState.ts | 5 + src/game/roguelike.test.ts | 13 +- src/game/roguelike.ts | 19 +- src/game/store.test.ts | 117 +++++- src/game/store.ts | 35 +- src/game/types.ts | 3 + src/styles.css | 126 +++++-- 29 files changed, 1120 insertions(+), 159 deletions(-) create mode 100644 scripts/blender/build_replacement_creature_bosses.py create mode 100644 src/assets/game/models/original/bosses/bogbell-myconid/bogbell-myconid.glb create mode 100644 src/assets/game/models/original/bosses/brassbeak-basilisk/brassbeak-basilisk.glb create mode 100644 src/frontend/saveContinuation.test.ts create mode 100644 src/frontend/saveContinuation.ts create mode 100644 src/game/bossDeath.ts create mode 100644 src/game/bossSelection.test.ts create mode 100644 src/game/bossSelection.ts create mode 100644 src/game/partyState.ts diff --git a/package.json b/package.json index 02887d3..7a60a84 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "i-want-to-heal", "private": true, - "version": "0.1.7", + "version": "0.1.8", "type": "module", "scripts": { "dev": "vite --host 0.0.0.0", diff --git a/scripts/blender/build_replacement_creature_bosses.py b/scripts/blender/build_replacement_creature_bosses.py new file mode 100644 index 0000000..05c0a99 --- /dev/null +++ b/scripts/blender/build_replacement_creature_bosses.py @@ -0,0 +1,352 @@ +"""Build two original low-poly creature bosses as animated runtime GLBs. + +Replaces weak chicken and frog visuals while keeping stable boss IDs in game data. + +Run with: + /Applications/Blender.app/Contents/MacOS/Blender --background --factory-startup \ + --python scripts/blender/build_replacement_creature_bosses.py +""" + +from __future__ import annotations + +import json +import math +import sys +from pathlib import Path + +import bpy + + +sys.path.insert(0, str(Path(__file__).parent)) +from build_iwt2_boss_trio import ( # noqa: E402 + OUT_ROOT, + actions, + armature, + cone, + ellipsoid, + export_asset, + finish, + join_parts, + plate, + prepare_materials, + reset_scene, +) + + +def add_metadata(asset_id: str, concept: str) -> None: + metadata_path = OUT_ROOT / asset_id / f"{asset_id}.asset.json" + metadata = json.loads(metadata_path.read_text()) + metadata["sourceConcept"] = concept + metadata["license"] = "Original project-owned asset" + metadata["runtime"]["forward"] = "-Y" + metadata["runtime"]["unit"] = "meters" + metadata_path.write_text(json.dumps(metadata, indent=2) + "\n") + + +def build_brassbeak_basilisk() -> None: + """Six-legged forge basilisk replacing Cluckhorn's chicken-cow model.""" + asset_id = "brassbeak-basilisk" + reset_scene() + mats = prepare_materials({ + "Scale": {"color": (0.035, 0.105, 0.12, 1), "metallic": 0.14, "roughness": 0.62}, + "Underbelly": {"color": (0.12, 0.19, 0.18, 1), "metallic": 0.05, "roughness": 0.72}, + "Copper": {"color": (0.45, 0.16, 0.055, 1), "metallic": 0.48, "roughness": 0.33}, + "Brass": {"color": (0.78, 0.48, 0.09, 1), "metallic": 0.62, "roughness": 0.25}, + "Blade": {"color": (0.50, 0.58, 0.55, 1), "metallic": 0.72, "roughness": 0.2}, + "Furnace": {"color": (0.02, 0.82, 0.72, 1), "roughness": 0.18, "emission": (0.01, 0.72, 0.64, 1), "strength": 5.5}, + }) + specs = [ + ("Root", (0, 0, 0), (0, 0, 0.45), None), + ("Body", (0, 0.06, 1.18), (0, 0.05, 2.05), "Root"), + ("Head", (0, -1.0, 1.48), (0, -1.82, 1.38), "Body"), + ("Jaw", (0, -1.42, 1.28), (0, -2.05, 1.12), "Head"), + ("Wing.L", (-0.62, -0.08, 1.72), (-1.55, -0.28, 1.5), "Body"), + ("Wing.R", (0.62, -0.08, 1.72), (1.55, -0.28, 1.5), "Body"), + ("Leg.FL", (-0.62, -0.72, 1.12), (-0.88, -0.84, 0.24), "Body"), + ("Leg.FR", (0.62, -0.72, 1.12), (0.88, -0.84, 0.24), "Body"), + ("Leg.ML", (-0.78, 0.03, 1.06), (-1.0, 0.02, 0.22), "Body"), + ("Leg.MR", (0.78, 0.03, 1.06), (1.0, 0.02, 0.22), "Body"), + ("Leg.BL", (-0.66, 0.76, 1.12), (-0.9, 0.88, 0.24), "Body"), + ("Leg.BR", (0.66, 0.76, 1.12), (0.9, 0.88, 0.24), "Body"), + ("Tail.1", (0, 1.0, 1.3), (0, 1.85, 1.12), "Body"), + ("Tail.2", (0, 1.8, 1.12), (0, 2.7, 0.92), "Tail.1"), + ] + rig = armature("BrassbeakBasilisk", specs) + + # Broad armored silhouette with glowing furnace seams. + ellipsoid("BasiliskBody", (0, 0.08, 1.36), (1.08, 1.43, 0.72), mats["Scale"], "Body", 2) + ellipsoid("FurnaceBelly", (0, -0.15, 1.08), (0.78, 1.08, 0.46), mats["Underbelly"], "Body", 2) + for index, y in enumerate((-0.7, -0.22, 0.28, 0.76)): + width = 0.82 + (0.12 if index in (1, 2) else 0) + plate( + f"BackPlate{index}", (0, y, 1.92 + 0.08 * math.sin(index)), + (width, 0.55, 0.27), (math.radians(84), 0, 0), + mats["Copper"] if index % 2 == 0 else mats["Brass"], "Body", + ) + cone( + f"ChimneySpine{index}", (0, y, 2.02), (0, y + 0.03, 2.52 - index * 0.04), + 0.13, 0, mats["Blade"], "Body", 5, + ) + for side in (-1, 1): + cone( + f"FurnaceSeam{side:+d}", (side * 0.58, -0.76, 1.34), (side * 0.72, 0.72, 1.34), + 0.035, 0.022, mats["Furnace"], "Body", 5, + ) + + # Hammerhead, brass beak, split jaw, and crown blades. + ellipsoid("HammerHead", (0, -1.28, 1.5), (0.78, 0.74, 0.56), mats["Copper"], "Head", 2) + ellipsoid("FaceMask", (0, -1.72, 1.5), (0.58, 0.34, 0.42), mats["Brass"], "Head", 1) + cone("UpperBeak", (0, -1.68, 1.51), (0, -2.58, 1.34), 0.42, 0.035, mats["Brass"], "Head", 6) + cone("LowerBeak", (0, -1.64, 1.3), (0, -2.32, 1.18), 0.3, 0.025, mats["Blade"], "Jaw", 6) + for side, suffix in ((-1, "L"), (1, "R")): + ellipsoid(f"Eye{suffix}", (side * 0.43, -1.72, 1.66), (0.09, 0.055, 0.09), mats["Furnace"], "Head", 1) + cone( + f"BrowHorn{suffix}", (side * 0.42, -1.38, 1.78), (side * 0.88, -1.7, 2.03), + 0.13, 0, mats["Blade"], "Head", 5, + ) + for index, (x, z) in enumerate(((-0.34, 2.0), (0, 2.14), (0.34, 2.0))): + cone(f"CrownBlade{index}", (x, -1.2, 1.8), (x * 1.35, -1.15, z + 0.54), 0.12, 0, mats["Brass"], "Head", 5) + + # Blade-like vestigial wings make lateral cleaves readable from camera. + for side, suffix in ((-1, "L"), (1, "R")): + bone = f"Wing.{suffix}" + plate( + f"WingShield{suffix}", (side * 1.05, -0.08, 1.62), (0.7, 0.56, 0.13), + (math.radians(78), math.radians(side * 18), math.radians(side * 8)), mats["Copper"], bone, + ) + cone( + f"WingBlade{suffix}", (side * 0.72, -0.24, 1.7), (side * 1.95, -0.58, 1.42), + 0.19, 0.015, mats["Blade"], bone, 6, + ) + cone( + f"WingGlow{suffix}", (side * 0.88, -0.3, 1.69), (side * 1.7, -0.52, 1.5), + 0.05, 0.008, mats["Furnace"], bone, 5, + ) + + # Six short piston legs: stable, strange, easy to read while scuttling. + leg_rows = (("F", -0.72), ("M", 0.03), ("B", 0.76)) + for row_index, (row, y) in enumerate(leg_rows): + for side, suffix in ((-1, "L"), (1, "R")): + bone = f"Leg.{row}{suffix}" + hip_x = side * (0.64 if row != "M" else 0.78) + foot_x = side * (0.98 if row != "M" else 1.1) + ellipsoid(f"Hip{row}{suffix}", (hip_x, y, 1.05), (0.3, 0.34, 0.3), mats["Copper"], bone, 1) + cone(f"Shin{row}{suffix}", (hip_x, y, 1.0), (foot_x, y - 0.04, 0.28), 0.22, 0.14, mats["Scale"], bone, 6) + ellipsoid(f"Foot{row}{suffix}", (foot_x, y - 0.22, 0.2), (0.31, 0.48, 0.19), mats["Brass"], bone, 1) + for toe_index, toe_x in enumerate((-0.13, 0.13)): + cone( + f"Toe{row}{suffix}{toe_index}", (foot_x + toe_x, y - 0.42, 0.2), + (foot_x + toe_x * 1.4, y - 0.75, 0.1), 0.055, 0.004, mats["Blade"], bone, 5, + ) + + cone("TailCore1", (0, 0.95, 1.3), (0, 1.85, 1.1), 0.48, 0.3, mats["Scale"], "Tail.1", 7) + cone("TailCore2", (0, 1.78, 1.1), (0, 2.72, 0.88), 0.31, 0.07, mats["Copper"], "Tail.2", 7) + cone("TailBladeTop", (0, 2.45, 0.9), (0, 3.18, 1.45), 0.2, 0.015, mats["Blade"], "Tail.2", 5) + cone("TailBladeBottom", (0, 2.45, 0.9), (0, 3.15, 0.48), 0.18, 0.015, mats["Brass"], "Tail.2", 5) + ellipsoid("TailCoreGlow", (0, 2.54, 0.91), (0.14, 0.17, 0.14), mats["Furnace"], "Tail.2", 1) + + body = join_parts("BrassbeakBasilisk", rig) + clips = actions(rig, brassbeak_actions()) + export_asset( + asset_id, "Brassbeak Basilisk", rig, body, clips, + [ + ("Body", (0, 0, 1.25), (1.25, 1.55, 0.9)), + ("Head", (0, -1.65, 1.42), (0.95, 1.05, 0.75)), + ("Tail", (0, 2.08, 1.0), (0.55, 1.25, 0.78)), + ], + (0, 0, 1.25), 8.8, "FurnaceBurst", 20, + ) + add_metadata(asset_id, "Original six-legged forge basilisk designed for I Want to Heal") + + +def brassbeak_actions(): + return [ + ("Idle", 60, True, [ + {"frame": 1}, + {"frame": 15, "locations": {"Root": (0, 0, 0.04)}, "rotations": {"Head": (3, 0, -3), "Jaw": (7, 0, 0), "Tail.2": (0, 0, 7), "Wing.L": (0, 0, -4), "Wing.R": (0, 0, 4)}}, + {"frame": 30, "rotations": {"Head": (0, 0, 3), "Jaw": (0, 0, 0), "Tail.2": (0, 0, -7)}}, + {"frame": 45, "locations": {"Root": (0, 0, 0.04)}, "rotations": {"Head": (3, 0, -3), "Jaw": (7, 0, 0), "Tail.2": (0, 0, 7), "Wing.L": (0, 0, -4), "Wing.R": (0, 0, 4)}}, + {"frame": 60}, + ]), + ("Scuttle", 30, True, [ + {"frame": 1, "rotations": {"Leg.FL": (-18, 0, -5), "Leg.MR": (-18, 0, 4), "Leg.BL": (-18, 0, -4), "Leg.FR": (18, 0, 5), "Leg.ML": (18, 0, -4), "Leg.BR": (18, 0, 4), "Tail.2": (0, 0, -9)}}, + {"frame": 8, "locations": {"Root": (0, 0, 0.08)}, "rotations": {"Body": (-3, 0, 0)}}, + {"frame": 16, "rotations": {"Leg.FL": (18, 0, 5), "Leg.MR": (18, 0, -4), "Leg.BL": (18, 0, 4), "Leg.FR": (-18, 0, -5), "Leg.ML": (-18, 0, 4), "Leg.BR": (-18, 0, -4), "Tail.2": (0, 0, 9)}}, + {"frame": 23, "locations": {"Root": (0, 0, 0.08)}, "rotations": {"Body": (3, 0, 0)}}, + {"frame": 30, "rotations": {"Leg.FL": (-18, 0, -5), "Leg.MR": (-18, 0, 4), "Leg.BL": (-18, 0, -4), "Leg.FR": (18, 0, 5), "Leg.ML": (18, 0, -4), "Leg.BR": (18, 0, 4), "Tail.2": (0, 0, -9)}}, + ]), + ("BeakRend", 34, False, [ + {"frame": 1}, + {"frame": 9, "locations": {"Root": (0, 0.12, -0.05)}, "rotations": {"Body": (-9, 0, 0), "Head": (-24, 0, 0), "Jaw": (24, 0, 0), "Wing.L": (0, -16, -10), "Wing.R": (0, 16, 10)}}, + {"frame": 15, "locations": {"Root": (0, -0.2, 0.05)}, "rotations": {"Body": (15, 0, 0), "Head": (28, 0, 0), "Jaw": (-6, 0, 0)}}, + {"frame": 23, "rotations": {"Head": (-8, 0, 0), "Jaw": (12, 0, 0)}}, + {"frame": 34}, + ]), + ("FurnaceBurst", 46, False, [ + {"frame": 1}, + {"frame": 12, "locations": {"Root": (0, 0, 0.1)}, "scales": {"Body": (0.94, 0.94, 0.94)}, "rotations": {"Wing.L": (-18, 18, -22), "Wing.R": (-18, -18, 22), "Head": (-12, 0, 0), "Jaw": (18, 0, 0), "Tail.1": (-12, 0, 0)}}, + {"frame": 20, "locations": {"Root": (0, -0.08, 0.22)}, "scales": {"Body": (1.1, 1.1, 1.1)}, "rotations": {"Wing.L": (18, -62, -64), "Wing.R": (18, 62, 64), "Head": (20, 0, 0), "Jaw": (30, 0, 0), "Tail.1": (18, 0, 0), "Tail.2": (-22, 0, 0)}}, + {"frame": 30, "scales": {"Body": (0.97, 0.97, 0.97)}, "rotations": {"Wing.L": (4, -18, -20), "Wing.R": (4, 18, 20), "Jaw": (4, 0, 0), "Tail.2": (8, 0, 0)}}, + {"frame": 46}, + ]), + ("Stagger", 28, False, [ + {"frame": 1}, + {"frame": 6, "locations": {"Root": (0.12, 0.12, -0.09)}, "rotations": {"Body": (-14, 0, 13), "Head": (22, 0, -12), "Wing.L": (24, 0, -18), "Wing.R": (-8, 0, 12)}}, + {"frame": 15, "rotations": {"Body": (7, 0, -6), "Head": (-8, 0, 5)}}, + {"frame": 28}, + ]), + ("Death", 72, False, [ + {"frame": 1}, + {"frame": 20, "locations": {"Root": (0.15, 0.08, -0.25)}, "rotations": {"Root": (0, 25, 32), "Body": (18, 0, 12), "Head": (24, 0, -10), "Jaw": (20, 0, 0), "Wing.L": (32, 0, -26), "Wing.R": (16, 0, 20)}}, + {"frame": 46, "locations": {"Root": (0.28, 0.08, -0.78)}, "rotations": {"Root": (0, 52, 82), "Body": (30, 0, 20), "Head": (42, 0, -20), "Leg.FL": (30, 0, 0), "Leg.ML": (-24, 0, 0), "Leg.BL": (20, 0, 0), "Tail.1": (-32, 0, 0), "Tail.2": (-25, 0, 0)}}, + {"frame": 72, "locations": {"Root": (0.28, 0.08, -0.82)}, "rotations": {"Root": (0, 52, 82), "Body": (30, 0, 20), "Head": (44, 0, -20), "Leg.FL": (30, 0, 0), "Leg.ML": (-24, 0, 0), "Leg.BL": (20, 0, 0), "Tail.1": (-32, 0, 0), "Tail.2": (-25, 0, 0)}}, + ]), + ] + + +def build_bogbell_myconid() -> None: + """Bell-capped fungal brute replacing Mirelord's frog model.""" + asset_id = "bogbell-myconid" + reset_scene() + mats = prepare_materials({ + "Bark": {"color": (0.12, 0.18, 0.095, 1), "roughness": 0.88}, + "Root": {"color": (0.25, 0.31, 0.16, 1), "roughness": 0.8}, + "Cap": {"color": (0.29, 0.055, 0.31, 1), "roughness": 0.6}, + "CapEdge": {"color": (0.52, 0.15, 0.42, 1), "roughness": 0.52}, + "Gill": {"color": (0.62, 0.55, 0.31, 1), "roughness": 0.7}, + "Spore": {"color": (0.48, 1.0, 0.32, 1), "roughness": 0.16, "emission": (0.22, 0.92, 0.16, 1), "strength": 4.8}, + }) + specs = [ + ("Root", (0, 0, 0), (0, 0, 0.5), None), + ("Body", (0, 0, 1.15), (0, 0, 2.25), "Root"), + ("Cap", (0, -0.05, 2.18), (0, -0.05, 3.18), "Body"), + ("Arm.L", (-0.58, -0.15, 1.72), (-1.28, -0.62, 0.7), "Body"), + ("Arm.R", (0.58, -0.15, 1.72), (1.28, -0.62, 0.7), "Body"), + ("Leg.L", (-0.38, 0.08, 1.08), (-0.58, -0.1, 0.2), "Body"), + ("Leg.R", (0.38, 0.08, 1.08), (0.58, -0.1, 0.2), "Body"), + ("Tendril.L", (-0.42, 0.58, 1.45), (-1.05, 1.45, 0.82), "Body"), + ("Tendril.R", (0.42, 0.58, 1.45), (1.05, 1.45, 0.82), "Body"), + ] + rig = armature("BogbellMyconid", specs) + + # Gnarled trunk and hanging bell cap. + ellipsoid("Trunk", (0, 0.05, 1.48), (0.82, 0.68, 1.05), mats["Bark"], "Body", 2) + ellipsoid("ChestKnot", (0, -0.5, 1.62), (0.58, 0.28, 0.62), mats["Root"], "Body", 1) + cone("NeckStalk", (0, -0.02, 1.95), (0, -0.04, 2.65), 0.48, 0.36, mats["Gill"], "Cap", 8) + plate("BellCap", (0, -0.04, 2.78), (1.55, 1.38, 0.55), (0, 0, 0), mats["Cap"], "Cap", 9) + ellipsoid("CapCrown", (0, 0.02, 3.04), (1.25, 1.08, 0.42), mats["CapEdge"], "Cap", 2) + plate("GillBell", (0, -0.03, 2.58), (1.28, 1.12, 0.28), (0, 0, math.radians(180)), mats["Gill"], "Cap", 9) + for index, angle in enumerate(range(0, 360, 45)): + radians = math.radians(angle) + x, y = math.cos(radians) * 1.02, math.sin(radians) * 0.87 + cone( + f"CapHorn{index}", (x * 0.9, y * 0.9, 3.12), (x * 1.38, y * 1.35, 3.34 + 0.08 * (index % 2)), + 0.11, 0, mats["CapEdge"], "Cap", 5, + ) + for side, suffix in ((-1, "L"), (1, "R")): + ellipsoid(f"Eye{suffix}", (side * 0.29, -0.65, 2.18), (0.095, 0.055, 0.11), mats["Spore"], "Cap", 1) + cone( + f"FaceRoot{suffix}", (side * 0.25, -0.52, 2.03), (side * 0.42, -0.78, 1.72), + 0.07, 0.015, mats["Root"], "Cap", 5, + ) + ellipsoid("MouthHollow", (0, -0.68, 1.94), (0.22, 0.055, 0.13), mats["Cap"], "Cap", 1) + + # Root arms end in broad knuckles for readable pummel animation. + for side, suffix in ((-1, "L"), (1, "R")): + bone = f"Arm.{suffix}" + cone(f"UpperArm{suffix}", (side * 0.55, -0.12, 1.78), (side * 1.04, -0.45, 1.05), 0.3, 0.22, mats["Bark"], bone, 7) + cone(f"Forearm{suffix}", (side * 1.02, -0.44, 1.06), (side * 1.34, -0.84, 0.58), 0.24, 0.18, mats["Root"], bone, 7) + ellipsoid(f"Knuckle{suffix}", (side * 1.38, -0.91, 0.48), (0.43, 0.38, 0.32), mats["Bark"], bone, 1) + for finger in (-0.16, 0, 0.16): + cone( + f"Finger{suffix}{finger}", (side * 1.36 + finger, -1.02, 0.43), + (side * 1.46 + finger, -1.35, 0.22), 0.065, 0.012, mats["Root"], bone, 5, + ) + + for side, suffix in ((-1, "L"), (1, "R")): + bone = f"Leg.{suffix}" + ellipsoid(f"Hip{suffix}", (side * 0.4, 0.08, 1.0), (0.42, 0.46, 0.5), mats["Bark"], bone, 1) + cone(f"RootLeg{suffix}", (side * 0.4, 0.06, 0.95), (side * 0.62, -0.12, 0.25), 0.34, 0.22, mats["Root"], bone, 7) + for toe_index, toe_x in enumerate((-0.22, 0, 0.22)): + cone( + f"RootToe{suffix}{toe_index}", (side * 0.62 + toe_x, -0.2, 0.25), + (side * 0.72 + toe_x * 1.25, -0.78 - abs(toe_x), 0.08), 0.095, 0.015, mats["Bark"], bone, 6, + ) + + # Rear tendrils drag through mire. Spore sacs pulse during eruption. + for side, suffix in ((-1, "L"), (1, "R")): + bone = f"Tendril.{suffix}" + cone(f"TendrilBase{suffix}", (side * 0.4, 0.5, 1.38), (side * 0.78, 1.22, 0.82), 0.22, 0.12, mats["Root"], bone, 7) + cone(f"TendrilTip{suffix}", (side * 0.76, 1.18, 0.84), (side * 1.28, 1.85, 0.3), 0.13, 0.018, mats["Bark"], bone, 6) + ellipsoid(f"SporeSac{suffix}", (side * 0.82, 0.72, 1.25), (0.24, 0.31, 0.3), mats["Spore"], bone, 1) + for index, (x, y, z, size) in enumerate(((-0.5, 0.45, 1.88, 0.16), (0.48, 0.5, 1.72, 0.2), (-0.28, 0.62, 1.35, 0.13))): + ellipsoid(f"BodySpore{index}", (x, y, z), (size, size * 0.82, size * 1.1), mats["Spore"], "Body", 1) + + body = join_parts("BogbellMyconid", rig) + clips = actions(rig, bogbell_actions()) + export_asset( + asset_id, "Bogbell Myconid", rig, body, clips, + [ + ("Body", (0, 0, 1.45), (1.05, 0.95, 1.35)), + ("Cap", (0, 0, 2.82), (1.68, 1.48, 0.72)), + ("Roots", (0, 0.38, 0.62), (1.58, 1.75, 0.72)), + ], + (0, 0, 1.65), 8.5, "SporeEruption", 21, + ) + add_metadata(asset_id, "Original bell-capped fungal mire creature designed for I Want to Heal") + + +def bogbell_actions(): + return [ + ("Idle", 60, True, [ + {"frame": 1}, + {"frame": 15, "locations": {"Root": (0, 0, 0.04)}, "scales": {"Cap": (1.03, 1.03, 0.98)}, "rotations": {"Cap": (2, 0, -3), "Arm.L": (0, 0, -3), "Arm.R": (0, 0, 3), "Tendril.L": (0, 0, 7), "Tendril.R": (0, 0, -7)}}, + {"frame": 30, "scales": {"Cap": (0.98, 0.98, 1.03)}, "rotations": {"Cap": (-1, 0, 3), "Tendril.L": (0, 0, -7), "Tendril.R": (0, 0, 7)}}, + {"frame": 45, "locations": {"Root": (0, 0, 0.04)}, "scales": {"Cap": (1.03, 1.03, 0.98)}, "rotations": {"Cap": (2, 0, -3), "Arm.L": (0, 0, -3), "Arm.R": (0, 0, 3), "Tendril.L": (0, 0, 7), "Tendril.R": (0, 0, -7)}}, + {"frame": 60}, + ]), + ("BurrowRush", 32, True, [ + {"frame": 1, "locations": {"Root": (0, 0, -0.12)}, "rotations": {"Body": (10, 0, 0), "Arm.L": (26, 0, -12), "Arm.R": (26, 0, 12), "Leg.L": (-16, 0, 0), "Leg.R": (16, 0, 0), "Tendril.L": (-18, 0, -12), "Tendril.R": (-18, 0, 12)}}, + {"frame": 9, "locations": {"Root": (0, 0, -0.26)}, "rotations": {"Cap": (-9, 0, 0), "Leg.L": (16, 0, 0), "Leg.R": (-16, 0, 0), "Tendril.L": (14, 0, 10), "Tendril.R": (14, 0, -10)}}, + {"frame": 17, "locations": {"Root": (0, 0, -0.12)}, "rotations": {"Body": (10, 0, 0), "Arm.L": (26, 0, -12), "Arm.R": (26, 0, 12), "Leg.L": (-16, 0, 0), "Leg.R": (16, 0, 0), "Tendril.L": (-18, 0, -12), "Tendril.R": (-18, 0, 12)}}, + {"frame": 25, "locations": {"Root": (0, 0, -0.26)}, "rotations": {"Cap": (-9, 0, 0), "Leg.L": (16, 0, 0), "Leg.R": (-16, 0, 0), "Tendril.L": (14, 0, 10), "Tendril.R": (14, 0, -10)}}, + {"frame": 32, "locations": {"Root": (0, 0, -0.12)}, "rotations": {"Body": (10, 0, 0), "Arm.L": (26, 0, -12), "Arm.R": (26, 0, 12), "Leg.L": (-16, 0, 0), "Leg.R": (16, 0, 0), "Tendril.L": (-18, 0, -12), "Tendril.R": (-18, 0, 12)}}, + ]), + ("RootPummel", 36, False, [ + {"frame": 1}, + {"frame": 10, "locations": {"Root": (0, 0.1, 0.06)}, "rotations": {"Body": (-12, 0, 0), "Cap": (-8, 0, 0), "Arm.L": (-42, 0, -30), "Arm.R": (-42, 0, 30)}}, + {"frame": 17, "locations": {"Root": (0, -0.12, -0.14)}, "rotations": {"Body": (22, 0, 0), "Cap": (18, 0, 0), "Arm.L": (58, 0, 16), "Arm.R": (58, 0, -16)}}, + {"frame": 25, "rotations": {"Body": (-5, 0, 0), "Arm.L": (12, 0, -6), "Arm.R": (12, 0, 6)}}, + {"frame": 36}, + ]), + ("SporeEruption", 48, False, [ + {"frame": 1}, + {"frame": 13, "locations": {"Root": (0, 0, -0.12)}, "scales": {"Cap": (0.88, 0.88, 1.16)}, "rotations": {"Body": (-13, 0, 0), "Cap": (-15, 0, 0), "Arm.L": (-26, 0, -28), "Arm.R": (-26, 0, 28), "Tendril.L": (-28, 0, -24), "Tendril.R": (-28, 0, 24)}}, + {"frame": 21, "locations": {"Root": (0, -0.04, 0.24)}, "scales": {"Cap": (1.18, 1.18, 0.9), "Body": (1.08, 1.08, 1.08)}, "rotations": {"Body": (18, 0, 0), "Cap": (19, 0, 0), "Arm.L": (18, 0, 62), "Arm.R": (18, 0, -62), "Tendril.L": (32, 0, 48), "Tendril.R": (32, 0, -48)}}, + {"frame": 32, "scales": {"Cap": (0.97, 0.97, 1.04), "Body": (0.97, 0.97, 0.97)}, "rotations": {"Cap": (-5, 0, 0), "Arm.L": (4, 0, 12), "Arm.R": (4, 0, -12)}}, + {"frame": 48}, + ]), + ("Stagger", 28, False, [ + {"frame": 1}, + {"frame": 6, "locations": {"Root": (0.14, 0.1, -0.08)}, "rotations": {"Body": (-15, 0, 13), "Cap": (24, 0, -18), "Arm.L": (20, 0, -18), "Arm.R": (-8, 0, 12)}}, + {"frame": 15, "rotations": {"Body": (7, 0, -6), "Cap": (-8, 0, 7)}}, + {"frame": 28}, + ]), + ("Death", 74, False, [ + {"frame": 1}, + {"frame": 20, "locations": {"Root": (0.14, 0.1, -0.3)}, "rotations": {"Root": (0, 24, 30), "Body": (20, 0, 12), "Cap": (28, 0, -18), "Arm.L": (30, 0, -26), "Arm.R": (16, 0, 20), "Tendril.L": (-24, 0, -14), "Tendril.R": (-16, 0, 18)}}, + {"frame": 48, "locations": {"Root": (0.28, 0.1, -0.86)}, "rotations": {"Root": (0, 54, 84), "Body": (34, 0, 24), "Cap": (48, 0, -30), "Arm.L": (52, 0, -42), "Arm.R": (28, 0, 34), "Leg.L": (24, 0, 0), "Leg.R": (-18, 0, 0), "Tendril.L": (-40, 0, -24), "Tendril.R": (-34, 0, 26)}}, + {"frame": 74, "locations": {"Root": (0.28, 0.1, -0.9)}, "rotations": {"Root": (0, 54, 84), "Body": (34, 0, 24), "Cap": (50, 0, -30), "Arm.L": (52, 0, -42), "Arm.R": (28, 0, 34), "Leg.L": (24, 0, 0), "Leg.R": (-18, 0, 0), "Tendril.L": (-40, 0, -24), "Tendril.R": (-34, 0, 26)}}, + ]), + ] + + +def main() -> None: + bpy.context.preferences.filepaths.save_version = 0 + OUT_ROOT.mkdir(parents=True, exist_ok=True) + build_brassbeak_basilisk() + build_bogbell_myconid() + + +if __name__ == "__main__": + main() diff --git a/src/assets/game/models/original/bosses/bogbell-myconid/bogbell-myconid.glb b/src/assets/game/models/original/bosses/bogbell-myconid/bogbell-myconid.glb new file mode 100644 index 0000000000000000000000000000000000000000..15ce8fc698925fdd76374ced6a68aa0e26d9eef2 GIT binary patch literal 79408 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�~5Mv$; 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 state.globalCooldownUntil); const mana = useGameStore((state) => state.mana); const phase = useGameStore((state) => state.phase); + const healerAlive = useGameStore((state) => state.party.some((member) => member.id === "aelia" && member.hp > 0)); const selected = useGameStore((state) => state.party.find((member) => member.id === state.selectedMemberId)!); const activeCast = useGameStore((state) => state.activeCast); const castAbility = useGameStore((state) => state.castAbility); @@ -95,7 +96,7 @@ function AbilityButton({ abilityId }: { abilityId: (typeof ABILITY_ORDER)[number const globalRemaining = Math.max(0, globalCooldownUntil - time); const noDispel = abilityId === "purify" && selected.debuffs.length === 0; const invalidTarget = ability.targeting === "ally" && selected.hp <= 0; - const disabled = phase !== "combat" || activeCast !== null || remaining > 0 || globalRemaining > 0 || mana < manaCost || noDispel || invalidTarget; + const disabled = phase !== "combat" || !healerAlive || activeCast !== null || remaining > 0 || globalRemaining > 0 || mana < manaCost || noDispel || invalidTarget; const resourceCopy = `${manaCost ? `${manaCost} mana` : "free"}${castTime ? ` · ${castTime.toFixed(1)}s` : ""}`; return ( diff --git a/src/components/FrontEnd.tsx b/src/components/FrontEnd.tsx index bb0bd01..4f377a2 100644 --- a/src/components/FrontEnd.tsx +++ b/src/components/FrontEnd.tsx @@ -1,6 +1,7 @@ import { lazy, Suspense, useEffect, useMemo, useRef, useState } from "react"; import { buildCollections, MAX_HUNTER_NAME_LENGTH, MODE_COPY, normalizeHunterName } from "../frontend/data"; import { formatPlayTime, formatSaveTimestamp } from "../frontend/saveRepository"; +import { resolveSaveContinuation, saveVersionsMatch } from "../frontend/saveContinuation"; import { useActiveHunter, useFrontendStore } from "../frontend/store"; import type { GameModeId, SaveSlotId, SaveSlotState } from "../frontend/types"; import { useMenuController, type MenuAction } from "../input/useMenuController"; @@ -80,11 +81,46 @@ function ControllerLegend({ back = false }: { back?: boolean }) { return
{DEFAULT_CONTROLLER_GLYPHS.confirm} Select{back && {DEFAULT_CONTROLLER_GLYPHS.back} Back} Navigate
; } +function SaveLibraryContext({ slots, accountId }: { slots: readonly SaveSlotState[]; accountId: string | null }) { + return ( + +
Device saves{accountId ? "SERVER LINKED" : "OFFLINE READY"}
+
+ {slots.map((slot) => { + const save = slot.local ?? slot.online; + const healer = save ? HEALER_CLASSES[save.activeClassId] : null; + return ( +
+ {String(slot.id).padStart(2, "0")} + {save ? ( + <> +
{save.hunterName[0]}
+ + {slot.local ? "On this Thor" : "Online copy"} + {save.hunterName} + Level {save.healers[save.activeClassId].level} {healer?.name} · {save.location} + + + + ) : ( + Available slotNew hunterContinue offline to create + )} +
+ ); + })} +
+
Save details update from upper-screen selectionLOWER DISPLAY · INFORMATION ONLY
+
+ ); +} + function LoginScreen() { const restoreSession = useFrontendStore((state) => state.restoreSession); const signIn = useFrontendStore((state) => state.signIn); const createAccount = useFrontendStore((state) => state.createAccount); const continueOffline = useFrontendStore((state) => state.continueOffline); + const slots = useFrontendStore((state) => state.slots); + const accountId = useFrontendStore((state) => state.accountId); const notice = useFrontendStore((state) => state.notice); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); @@ -101,7 +137,7 @@ function LoginScreen() { { id: "password", run: () => passwordRef.current?.focus() }, { id: "sign-in", run: () => { void signIn(username, password); } }, { id: "create-account", run: () => { void createAccount(username, password); } }, - { id: "offline", run: continueOffline }, + { id: "continue", run: continueOffline }, ], [continueOffline, createAccount, password, signIn, username]); const controller = useMenuController(actions); @@ -116,7 +152,7 @@ function LoginScreen() {
Offline-first hunter records

Keep everyone standing.

-

Your save always lives on this device. Sign in only when you want a second copy for PC ↔ AYN Thor handoff.

+

Continue to your saved hunters. Sign in when you want online copies for PC ↔ AYN Thor handoff.

{ event.preventDefault(); submitSignIn(); }}> @@ -153,38 +189,27 @@ function LoginScreen() { { void createAccount(username, password); }}> Create accountRequired for first sync - - Continue with offline saveNo account required + + ContinueChoose saved hunter {notice &&
{notice}
} } - bottom={ - - -
- How saving works -
    -
  1. 01Play offlineEvery change writes to device storage first.
  2. -
  3. 02Create or sign inAccount is secured by the TrueNAS game server.
  4. -
  5. 03Move devicesUpload or download any of your three server save slots.
  6. -
-
-
PCONLINE COPYTHOR
-
- } + bottom={} /> ); } function SlotCard({ slot, selected, focused, onSelect, onFocus }: { slot: SaveSlotState; selected: boolean; focused: boolean; onSelect: () => void; onFocus: () => void }) { - const save = slot.local; + const continuation = resolveSaveContinuation(slot); + const save = slot.local ?? slot.online; const healer = save ? HEALER_CLASSES[save.activeClassId] : null; + const copyStatus = continuation === "choose" ? "Newer online" : continuation === "online" ? "Online only" : null; return (