From 4e4743f14ffdadd97bf2f9911ef2952439cca488 Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Sat, 9 May 2026 01:01:50 +0200 Subject: [PATCH] refactor(items): use ItemType enum and offset constants in ChestItemData/RoomChestConfig Co-Authored-By: Claude Sonnet 4.6 --- scripts/objects/chest_item_data.gd | 6 +- scripts/objects/room_chest_config.gd | 83 +++++++++++++++------------- test/unit/test_room_chest.gd | 17 +++++- 3 files changed, 65 insertions(+), 41 deletions(-) diff --git a/scripts/objects/chest_item_data.gd b/scripts/objects/chest_item_data.gd index f704578..df66e32 100644 --- a/scripts/objects/chest_item_data.gd +++ b/scripts/objects/chest_item_data.gd @@ -1,7 +1,9 @@ ## ChestItemData — configuration for a single item slot inside a RoomChest. class_name ChestItemData extends Resource +enum ItemType { HOLDABLE, OUTFIT } + @export var item_id: String = "" -@export var item_type: String = "holdable" -@export var outfit_layer: int = 1 +@export var item_type: ItemType = ItemType.HOLDABLE +@export_range(1, 3) var outfit_layer: int = 1 @export var spawn_offset: Vector2 = Vector2.ZERO diff --git a/scripts/objects/room_chest_config.gd b/scripts/objects/room_chest_config.gd index 6965ef0..ee4cfae 100644 --- a/scripts/objects/room_chest_config.gd +++ b/scripts/objects/room_chest_config.gd @@ -2,88 +2,94 @@ ## Maps chest_id strings to ChestItemData arrays. No assets needed: item_id strings only. class_name RoomChestConfig +const _OFFSET_LEFT: Vector2 = Vector2(-70.0, -60.0) +const _OFFSET_CENTER: Vector2 = Vector2(0.0, -80.0) +const _OFFSET_RIGHT: Vector2 = Vector2(70.0, -60.0) +const _OFFSET_LEFT_2: Vector2 = Vector2(-50.0, -60.0) +const _OFFSET_RIGHT_2: Vector2 = Vector2(50.0, -60.0) + static func get_items(chest_id: String) -> Array[ChestItemData]: match chest_id: "reception_desk": return _make([ - ["clipboard", "holdable", 1, Vector2(-70.0, -60.0)], - ["pen", "holdable", 1, Vector2(0.0, -80.0)], - ["bandage", "holdable", 1, Vector2(70.0, -60.0)], + ["clipboard", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["pen", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["bandage", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "giftshop_shelf": return _make([ - ["gift_box", "holdable", 1, Vector2(-70.0, -60.0)], - ["ribbon", "holdable", 1, Vector2(0.0, -80.0)], - ["balloon", "holdable", 1, Vector2(70.0, -60.0)], + ["gift_box", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["ribbon", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["balloon", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "restaurant_counter": return _make([ - ["teacup", "holdable", 1, Vector2(-70.0, -60.0)], - ["plate", "holdable", 1, Vector2(0.0, -80.0)], - ["spoon", "holdable", 1, Vector2(70.0, -60.0)], + ["teacup", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["plate", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["spoon", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "emergency_cabinet": return _make([ - ["bandage_roll", "holdable", 1, Vector2(-70.0, -60.0)], - ["syringe", "holdable", 1, Vector2(0.0, -80.0)], - ["ice_pack", "holdable", 1, Vector2(70.0, -60.0)], + ["bandage_roll", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["syringe", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["ice_pack", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "xray_cabinet": return _make([ - ["xray_sheet", "holdable", 1, Vector2(-70.0, -60.0)], - ["lead_apron", "outfit", 1, Vector2(0.0, -80.0)], - ["marker", "holdable", 1, Vector2(70.0, -60.0)], + ["xray_sheet", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["lead_apron", ChestItemData.ItemType.OUTFIT, 1, _OFFSET_CENTER], + ["marker", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "pharmacy_medicine": return _make([ - ["pill_bottle", "holdable", 1, Vector2(-50.0, -60.0)], - ["syrup", "holdable", 1, Vector2(50.0, -60.0)], + ["pill_bottle", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT_2], + ["syrup", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT_2], ]) "pharmacy_tools": return _make([ - ["mortar", "holdable", 1, Vector2(-50.0, -60.0)], - ["spatula", "holdable", 1, Vector2(50.0, -60.0)], + ["mortar", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT_2], + ["spatula", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT_2], ]) "lab_bench": return _make([ - ["test_tube", "holdable", 1, Vector2(-70.0, -60.0)], - ["pipette", "holdable", 1, Vector2(0.0, -80.0)], - ["microscope_slide", "holdable", 1, Vector2(70.0, -60.0)], + ["test_tube", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["pipette", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["microscope_slide", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "patient_cabinet": return _make([ - ["thermometer", "holdable", 1, Vector2(-70.0, -60.0)], - ["stethoscope", "outfit", 2, Vector2(0.0, -80.0)], - ["pillow", "holdable", 1, Vector2(70.0, -60.0)], + ["thermometer", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["stethoscope", ChestItemData.ItemType.OUTFIT, 2, _OFFSET_CENTER], + ["pillow", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "ultrasound_cart": return _make([ - ["gel_tube", "holdable", 1, Vector2(-70.0, -60.0)], - ["probe", "holdable", 1, Vector2(0.0, -80.0)], - ["towel", "holdable", 1, Vector2(70.0, -60.0)], + ["gel_tube", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["probe", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["towel", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "delivery_cabinet": return _make([ - ["swaddle", "outfit", 1, Vector2(-70.0, -60.0)], - ["scissors", "holdable", 1, Vector2(0.0, -80.0)], - ["cord_clamp", "holdable", 1, Vector2(70.0, -60.0)], + ["swaddle", ChestItemData.ItemType.OUTFIT, 1, _OFFSET_LEFT], + ["scissors", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["cord_clamp", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT], ]) "nursery_shelf": return _make([ - ["bottle", "holdable", 1, Vector2(-70.0, -60.0)], - ["rattle", "holdable", 1, Vector2(0.0, -80.0)], - ["blanket", "outfit", 1, Vector2(70.0, -60.0)], + ["bottle", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT], + ["rattle", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_CENTER], + ["blanket", ChestItemData.ItemType.OUTFIT, 1, _OFFSET_RIGHT], ]) "garden_table": return _make([ - ["teapot", "holdable", 1, Vector2(-50.0, -60.0)], - ["cake", "holdable", 1, Vector2(50.0, -60.0)], + ["teapot", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT_2], + ["cake", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_RIGHT_2], ]) "garden_storage": return _make([ - ["confetti", "holdable", 1, Vector2(-50.0, -60.0)], - ["party_hat", "outfit", 1, Vector2(50.0, -60.0)], + ["confetti", ChestItemData.ItemType.HOLDABLE, 1, _OFFSET_LEFT_2], + ["party_hat", ChestItemData.ItemType.OUTFIT, 1, _OFFSET_RIGHT_2], ]) return [] @@ -91,6 +97,7 @@ static func get_items(chest_id: String) -> Array[ChestItemData]: static func _make(data: Array) -> Array[ChestItemData]: var result: Array[ChestItemData] = [] for entry: Array in data: + assert(entry.size() == 4, "ChestItemData entry must have 4 elements: " + str(entry)) var d: ChestItemData = ChestItemData.new() d.item_id = entry[0] d.item_type = entry[1] diff --git a/test/unit/test_room_chest.gd b/test/unit/test_room_chest.gd index dfa3c5a..3638df5 100644 --- a/test/unit/test_room_chest.gd +++ b/test/unit/test_room_chest.gd @@ -4,7 +4,7 @@ extends GutTest func test_chest_item_data_default_item_type_is_holdable() -> void: var d: ChestItemData = ChestItemData.new() - assert_eq(d.item_type, "holdable") + assert_eq(d.item_type, ChestItemData.ItemType.HOLDABLE) func test_chest_item_data_default_outfit_layer_is_one() -> void: @@ -20,3 +20,18 @@ func test_room_chest_config_reception_desk_has_three_items() -> void: func test_room_chest_config_unknown_id_returns_empty() -> void: var items: Array[ChestItemData] = RoomChestConfig.get_items("does_not_exist") assert_eq(items.size(), 0) + + +func test_room_chest_config_reception_desk_first_item_fields() -> void: + var items: Array[ChestItemData] = RoomChestConfig.get_items("reception_desk") + assert_eq(items[0].item_id, "clipboard") + assert_eq(items[0].item_type, ChestItemData.ItemType.HOLDABLE) + assert_eq(items[0].spawn_offset, Vector2(-70.0, -60.0)) + + +func test_room_chest_config_patient_cabinet_stethoscope_outfit_layer_two() -> void: + var items: Array[ChestItemData] = RoomChestConfig.get_items("patient_cabinet") + var stethoscope: ChestItemData = items[1] + assert_eq(stethoscope.item_id, "stethoscope") + assert_eq(stethoscope.item_type, ChestItemData.ItemType.OUTFIT) + assert_eq(stethoscope.outfit_layer, 2)