From b2862e34d9f9fb424b33b98c59105a8404efcd51 Mon Sep 17 00:00:00 2001 From: hypercross Date: Mon, 20 Apr 2026 19:22:55 +0800 Subject: [PATCH] fix: improve inventory item drag-and-drop behavior - Use `snapBack` instead of immediate coordinate reset when a drag fails - Adjust grid snapping calculation to use center-relative coordinates - Validate item placement by simulating removal from the grid first --- .../src/gameobjects/InventoryItemContainer.ts | 8 ++++---- packages/sts-like-viewer/src/state/inventory.ts | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/sts-like-viewer/src/gameobjects/InventoryItemContainer.ts b/packages/sts-like-viewer/src/gameobjects/InventoryItemContainer.ts index 2e0255e..687ea18 100644 --- a/packages/sts-like-viewer/src/gameobjects/InventoryItemContainer.ts +++ b/packages/sts-like-viewer/src/gameobjects/InventoryItemContainer.ts @@ -127,8 +127,8 @@ export class InventoryItemContainer extends Phaser.GameObjects.Container { } else if (event.type === DragDropEventType.UP) { this.setAlpha(1); if (!this.handleDragEnd()) { - this.x = startX; - this.y = startY; + const t = this.item.peek()?.transform; + t && this.snapBack(t); } startX = startY = 0; } @@ -146,8 +146,8 @@ export class InventoryItemContainer extends Phaser.GameObjects.Container { const x = this.x - this.gridOffsetX; const y = this.y - this.gridOffsetY; - const targetX = Math.round((x - cellSize / 2) / cellSize); - const targetY = Math.round((y - cellSize / 2) / cellSize); + const targetX = Math.round(x / cellSize); + const targetY = Math.round(y / cellSize); const clampedX = Math.max(0, Math.min(targetX, 10 - shapeWidth)); const clampedY = Math.max(0, Math.min(targetY, 10 - shapeHeight)); diff --git a/packages/sts-like-viewer/src/state/inventory.ts b/packages/sts-like-viewer/src/state/inventory.ts index 395b0b3..bcc56f3 100644 --- a/packages/sts-like-viewer/src/state/inventory.ts +++ b/packages/sts-like-viewer/src/state/inventory.ts @@ -1,3 +1,4 @@ +import { create } from "mutative"; import { mutableSignal } from "boardgame-core"; import { createGridInventory, @@ -47,7 +48,11 @@ export function moveItem( ...item.transform, offset: { x: newX, y: newY }, }; - const validation = validatePlacement(inventory, item.shape, newTransform); + + const removed = create(inventory, (inv) => { + removeItemFromGrid(inv, itemId); + }); + const validation = validatePlacement(removed, item.shape, newTransform); if (!validation.valid) return false; inventorySignal.produce((inv) => {