Fixes room spawning and adds physical doors and indicator lights

This commit is contained in:
2026-03-10 11:16:48 -04:00
parent 7559114623
commit b709b64a52
6 changed files with 172 additions and 5 deletions
+113
View File
@@ -0,0 +1,113 @@
extends Node2D
class_name RoomDoor
# ---------------------------------------------------------------------------
# Constants
# ---------------------------------------------------------------------------
const DOOR_THICKNESS := 12.0
const INDICATOR_SIZE := 10.0
const INDICATOR_OFFSET := 20.0 # distance above door
# Indicator light colors (brighter versions of room floor colors)
const INDICATOR_COLORS := {
RoomData.RoomType.START: Color(0.3, 0.3, 0.5), # blue-gray
RoomData.RoomType.COMBAT: Color(0.35, 0.35, 0.55), # blue-gray
RoomData.RoomType.ITEM: Color(0.2, 0.5, 0.2), # green
RoomData.RoomType.SHOP: Color(0.6, 0.45, 0.2), # gold/amber
RoomData.RoomType.BOSS: Color(0.7, 0.15, 0.15), # red
}
# ---------------------------------------------------------------------------
# State
# ---------------------------------------------------------------------------
var direction: String = "" # "up", "down", "left", "right"
var door_size: Vector2 = Vector2.ZERO
var adjacent_room_type: RoomData.RoomType = RoomData.RoomType.COMBAT
var _barrier: StaticBody2D = null
var _barrier_collision: CollisionShape2D = null
var _barrier_visual: Polygon2D = null
var _indicator: Polygon2D = null
var _is_locked: bool = false
# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
func setup(dir: String, size: Vector2, adj_type: RoomData.RoomType) -> void:
direction = dir
door_size = size
adjacent_room_type = adj_type
_build_barrier()
_build_indicator()
# Start unlocked (open)
unlock()
func _build_barrier() -> void:
_barrier = StaticBody2D.new()
_barrier.collision_layer = 1 # world layer - blocks player
_barrier.collision_mask = 0
_barrier_collision = CollisionShape2D.new()
var shape := RectangleShape2D.new()
shape.size = door_size
_barrier_collision.shape = shape
_barrier.add_child(_barrier_collision)
# Visual - solid rectangle
_barrier_visual = Polygon2D.new()
var hx := door_size.x / 2.0
var hy := door_size.y / 2.0
_barrier_visual.polygon = PackedVector2Array([
Vector2(-hx, -hy), Vector2(hx, -hy),
Vector2(hx, hy), Vector2(-hx, hy),
])
_barrier_visual.color = Color(0.4, 0.35, 0.3) # metallic brown
_barrier.add_child(_barrier_visual)
add_child(_barrier)
func _build_indicator() -> void:
_indicator = Polygon2D.new()
# Small diamond shape for indicator
var s := INDICATOR_SIZE
_indicator.polygon = PackedVector2Array([
Vector2(0, -s), Vector2(s, 0),
Vector2(0, s), Vector2(-s, 0),
])
# Position based on door direction
var offset := Vector2.ZERO
match direction:
"up": offset = Vector2(0, -door_size.y / 2.0 - INDICATOR_OFFSET)
"down": offset = Vector2(0, door_size.y / 2.0 + INDICATOR_OFFSET)
"left": offset = Vector2(-door_size.x / 2.0 - INDICATOR_OFFSET, 0)
"right": offset = Vector2(door_size.x / 2.0 + INDICATOR_OFFSET, 0)
_indicator.position = offset
_indicator.color = INDICATOR_COLORS.get(adjacent_room_type, INDICATOR_COLORS[RoomData.RoomType.COMBAT])
add_child(_indicator)
# ---------------------------------------------------------------------------
# Lock/Unlock
# ---------------------------------------------------------------------------
func lock() -> void:
_is_locked = true
_barrier_collision.disabled = false
_barrier_visual.visible = true
func unlock() -> void:
_is_locked = false
_barrier_collision.disabled = true
_barrier_visual.visible = false
func is_locked() -> bool:
return _is_locked