-
Notifications
You must be signed in to change notification settings - Fork 3
fix: align furniture construction rendering with BN data #138
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| /** | ||
| * @vitest-environment happy-dom | ||
| */ | ||
| import { render } from "@testing-library/svelte"; | ||
| import { describe, expect, it } from "vitest"; | ||
| import WithData from "../WithData.svelte"; | ||
| import { CBNData } from "../data"; | ||
| import Construction from "./Construction.svelte"; | ||
|
|
||
| describe("Construction", () => { | ||
| it("renders furniture prerequisites and null furniture results", () => { | ||
| const data = new CBNData([ | ||
| { | ||
| type: "construction_group", | ||
| id: "advanced_object_deconstruction", | ||
| name: "Advanced Object Deconstruction", | ||
| }, | ||
| { | ||
| type: "construction", | ||
| id: "constr_remove_object_fireplace", | ||
| group: "advanced_object_deconstruction", | ||
| category: "OTHER", | ||
| time: "90 m", | ||
| required_skills: [["fabrication", 2]], | ||
| pre_furniture: "f_fireplace", | ||
| post_furniture: "f_null", | ||
| }, | ||
| { | ||
| type: "furniture", | ||
| id: "f_fireplace", | ||
| name: "fireplace", | ||
| description: "A warm test fixture.", | ||
| move_cost_mod: 0, | ||
| required_str: 0, | ||
| }, | ||
| ]); | ||
|
|
||
| const { getByText } = render(WithData, { | ||
| Component: Construction, | ||
| data, | ||
| construction: data.byId("construction", "constr_remove_object_fireplace"), | ||
| }); | ||
|
|
||
| expect(getByText("Requires")).toBeTruthy(); | ||
| expect(getByText("fireplace")).toBeTruthy(); | ||
| expect(getByText("Creates")).toBeTruthy(); | ||
| expect(getByText("nothing")).toBeTruthy(); | ||
| }); | ||
|
|
||
| it("renders terrain prerequisites and furniture results without prefix inference", () => { | ||
| const data = new CBNData([ | ||
| { | ||
| type: "construction_group", | ||
| id: "build_beaded_door", | ||
| name: "Build Beaded Door", | ||
| }, | ||
| { | ||
| type: "construction", | ||
| id: "constr_beaded_door", | ||
| group: "build_beaded_door", | ||
| category: "OTHER", | ||
| time: "30 m", | ||
| required_skills: [["fabrication", 1]], | ||
| pre_terrain: "t_door_frame", | ||
| post_furniture: "f_beaded_door", | ||
| }, | ||
| { | ||
| type: "terrain", | ||
| id: "t_door_frame", | ||
| name: "door frame", | ||
| description: "A test door frame.", | ||
| }, | ||
| { | ||
| type: "furniture", | ||
| id: "f_beaded_door", | ||
| name: "beaded door", | ||
| description: "A test beaded door.", | ||
| move_cost_mod: 0, | ||
| required_str: 0, | ||
| }, | ||
| ]); | ||
|
|
||
| const { getByText } = render(WithData, { | ||
| Component: Construction, | ||
| data, | ||
| construction: data.byId("construction", "constr_beaded_door"), | ||
| }); | ||
|
|
||
| expect(getByText("door frame")).toBeTruthy(); | ||
| expect(getByText("beaded door")).toBeTruthy(); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| /** | ||
| * @vitest-environment happy-dom | ||
| */ | ||
| import { render } from "@testing-library/svelte"; | ||
| import { describe, expect, it } from "vitest"; | ||
| import WithData from "../WithData.svelte"; | ||
| import { CBNData } from "../data"; | ||
| import Furniture from "./Furniture.svelte"; | ||
|
|
||
| describe("Furniture", () => { | ||
| it("shows furniture constructions from post_furniture", () => { | ||
| const data = new CBNData([ | ||
| { | ||
| type: "construction_group", | ||
| id: "build_sign", | ||
| name: "Build Sign", | ||
| }, | ||
| { | ||
| type: "construction_group", | ||
| id: "dig_pit", | ||
| name: "Dig Pit", | ||
| }, | ||
| { | ||
| type: "construction", | ||
| id: "constr_sign", | ||
| group: "build_sign", | ||
| category: "OTHER", | ||
| time: "20 m", | ||
| required_skills: [["fabrication", 0]], | ||
| post_furniture: "f_sign", | ||
| }, | ||
| { | ||
| type: "construction", | ||
| id: "constr_pit", | ||
| group: "dig_pit", | ||
| category: "OTHER", | ||
| time: "30 m", | ||
| required_skills: [["fabrication", 0]], | ||
| post_terrain: "t_pit", | ||
| }, | ||
| { | ||
| type: "furniture", | ||
| id: "f_sign", | ||
| name: "sign", | ||
| description: "Read it. Warnings ahead.", | ||
| move_cost_mod: 0, | ||
| required_str: 0, | ||
| }, | ||
| { | ||
| type: "terrain", | ||
| id: "t_pit", | ||
| name: "pit", | ||
| description: "A test pit.", | ||
| }, | ||
| ]); | ||
|
|
||
| const { getByText, queryByText } = render(WithData, { | ||
| Component: Furniture, | ||
| data, | ||
| item: data.byId("furniture", "f_sign"), | ||
| }); | ||
|
|
||
| expect(getByText("Construction")).toBeTruthy(); | ||
| expect(getByText("Build Sign")).toBeTruthy(); | ||
| expect(queryByText("Dig Pit")).toBeNull(); | ||
| }); | ||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,8 +5,9 @@ import { getContext, untrack } from "svelte"; | |
| import { CBNData } from "../data"; | ||
| import LimitedList from "../LimitedList.svelte"; | ||
| import type { Construction, Item, ToolQuality, VehiclePart } from "../types"; | ||
| import { getConstructionPrerequisites } from "./construction"; | ||
| import ItemLink from "./ItemLink.svelte"; | ||
| import { byName, i18n, gameSingularName } from "../utils/i18n"; | ||
| import { byName, gameSingularName } from "../utils/i18n"; | ||
|
|
||
| interface Props { | ||
| item: ToolQuality; | ||
|
|
@@ -206,13 +207,13 @@ constructionsUsingQualityByLevelList.forEach(([, constructions]) => { | |
| id={f.group} | ||
| type="construction_group" | ||
| showIcon={false} /> | ||
| {#if f.pre_terrain} | ||
| on {#each [f.pre_terrain].flat() as preTerrain, i} | ||
| {@const itemType = preTerrain.startsWith("f_") | ||
| ? "furniture" | ||
| : "terrain"} | ||
| {#if i !== 0}{i18n.__(" OR ")}{/if} | ||
| <ItemLink type={itemType} id={preTerrain} /> | ||
| {@const prerequisites = getConstructionPrerequisites(f)} | ||
| {#if prerequisites.length} | ||
| {t("on")} | ||
| {#each prerequisites as prerequisite, i} | ||
| {#if i !== 0}, | ||
| {/if} | ||
| <ItemLink type={prerequisite.type} id={prerequisite.id} /> | ||
|
Comment on lines
+210
to
+216
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Localize the new prerequisite separator. The raw As per coding guidelines, "Use 🤖 Prompt for AI Agents |
||
| {/each} | ||
| {/if} | ||
| {/snippet} | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,53 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import type { Construction } from "../types"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export type ConstructionSurfaceTarget = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| type: "terrain" | "furniture"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Collect prerequisite terrain/furniture targets using explicit fields. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export function getConstructionPrerequisites( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| construction: Pick<Construction, "pre_terrain" | "pre_furniture">, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ): ConstructionSurfaceTarget[] { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const prerequisites: ConstructionSurfaceTarget[] = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (construction.pre_terrain) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| prerequisites.push({ id: construction.pre_terrain, type: "terrain" }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (construction.pre_furniture) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| prerequisites.push({ id: construction.pre_furniture, type: "furniture" }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return prerequisites; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Collect output terrain/furniture targets using explicit fields. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export function getConstructionResults( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| construction: Pick<Construction, "post_terrain" | "post_furniture">, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ): ConstructionSurfaceTarget[] { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const results: ConstructionSurfaceTarget[] = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (construction.post_terrain) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| results.push({ id: construction.post_terrain, type: "terrain" }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (construction.post_furniture) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| results.push({ id: construction.post_furniture, type: "furniture" }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return results; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export function isNullConstructionResult( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result: ConstructionSurfaceTarget, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ): boolean { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (result.type === "terrain" && result.id === "t_null") || | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (result.type === "furniture" && result.id === "f_null") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+11
to
+53
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Advisory: Consider JSDoc for public API surface. Per coding guidelines, public functions warrant JSDoc documentation. Current signatures are self-documenting, but brief descriptions would enhance IDE telemetry and onboarding velocity for downstream consumers. 📝 Optional: Add JSDoc headers+/**
+ * Extracts prerequisite surfaces (terrain/furniture) from a construction definition.
+ */
export function getConstructionPrerequisites(
construction: Pick<Construction, "pre_terrain" | "pre_furniture">,
): ConstructionSurfaceTarget[] {+/**
+ * Extracts result surfaces (terrain/furniture) from a construction definition.
+ */
export function getConstructionResults(
construction: Pick<Construction, "post_terrain" | "post_furniture">,
): ConstructionSurfaceTarget[] {+/**
+ * Returns true if the target represents a null/removal result (t_null or f_null).
+ */
export function isNullConstructionResult(
result: ConstructionSurfaceTarget,
): boolean {As per coding guidelines: "Use JSDoc comments for public functions and complex logic." 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
Test fixture incomplete but non-critical.
Terrain record at Lines 50-54 lacks required schema fields (
symbol,color,move_cost).CBNDataconstructor may tolerate partial records for test purposes. If strict validation is later enforced, this fixture will require augmentation.🔧 Optional: Complete terrain fixture
{ type: "terrain", id: "t_pit", name: "pit", description: "A test pit.", + symbol: "0", + color: "brown", + move_cost: 10, },📝 Committable suggestion
🤖 Prompt for AI Agents