feat: 实现避难所仓储系统与生存状态HUD改进

- 新增避难所仓储功能,支持物品在随身背包与仓储间转移
- 添加生存状态图标资源与状态阈值告警系统
- 重构HUD界面,优化状态显示与操作流程
- 扩展游戏核心系统,增加仓储相关动作和校验
- 更新文档说明仓储规则与实现细节
This commit is contained in:
2026-04-28 22:58:49 +08:00
parent e783e6e533
commit 6234a50bdb
27 changed files with 1455 additions and 1024 deletions
+45
View File
@@ -8,6 +8,7 @@ describe('TinyWaste gameplay loop', () => {
expect(state.player.placeId).toBe('home');
expect(state.player.inventory.some((entry) => entry.itemId === 'shiv')).toBe(true);
expect(state.player.storage.some((entry) => entry.itemId === 'leather_coat')).toBe(true);
expect(state.player.quests.q_tutorial_water.state).toBe('active');
});
@@ -42,4 +43,48 @@ describe('TinyWaste gameplay loop', () => {
expect(view.header.placeName).toBe('近郊土路');
expect(view.map.places.find((place) => place.current)?.id).toBe('roadside');
});
it('moves items between field bag and shelter storage while at home', () => {
const state = createNewGameState(gameContent, '测试幸存者');
const initialBagWater = state.player.inventory.find((entry) => entry.itemId === 'water_dirty')?.count ?? 0;
const initialStorageWater =
state.player.storage.find((entry) => entry.itemId === 'water_dirty')?.count ?? 0;
const stashed = applyGameAction(state, gameContent, {
type: 'stash-item',
itemId: 'water_dirty',
count: 1,
});
const stashView = buildGameView(stashed.state, gameContent);
expect(stashView.player.storageAccessible).toBe(true);
expect(
stashed.state.player.inventory.find((entry) => entry.itemId === 'water_dirty')?.count ?? 0,
).toBe(initialBagWater - 1);
expect(
stashed.state.player.storage.find((entry) => entry.itemId === 'water_dirty')?.count ?? 0,
).toBe(initialStorageWater + 1);
const retrieved = applyGameAction(stashed.state, gameContent, {
type: 'retrieve-item',
itemId: 'water_dirty',
count: 1,
});
expect(
retrieved.state.player.inventory.find((entry) => entry.itemId === 'water_dirty')?.count ?? 0,
).toBe(initialBagWater);
});
it('builds survival alerts from threshold-based status states', () => {
const state = createNewGameState(gameContent, '测试幸存者');
state.player.stats.thirst = 20;
state.player.stats.energy = 18;
const view = buildGameView(state, gameContent);
expect(view.survival.alerts.some((entry) => entry.stat === 'thirst')).toBe(true);
expect(view.survival.alerts.some((entry) => entry.stat === 'energy')).toBe(true);
expect(view.survival.headline).toContain('告警');
});
});
+1
View File
@@ -3,6 +3,7 @@ import type { GameContent } from '@tinywaste/game-core';
export const gameContent: GameContent = {
version: '0.1.0',
inventoryCapacity: 36,
storageCapacity: 84,
items: {
water_dirty: {
id: 'water_dirty',