This commit is contained in:
Aodhan Collins
2026-01-26 03:31:45 +00:00
parent b42521a008
commit c0e4aaeac5
5 changed files with 263 additions and 92 deletions

View File

@@ -23,7 +23,7 @@ func _ready():
audio_manager = load("res://scripts/AudioManager.gd").new()
add_child(audio_manager)
rooms = WorldData.generate_test_world()
rooms = WorldData.generate_procedural_world(20)
start_new_game()
func start_new_game():

View File

@@ -1,32 +1,49 @@
extends GridContainer
extends Control
var cells: Array[ColorRect] = []
var explored_rooms: Array = []
var current_room_id: String = ""
var cell_size: Vector2 = Vector2(20, 20)
var padding: float = 5.0
func _ready():
columns = 4
for i in range(16):
var cell = ColorRect.new()
cell.custom_minimum_size = Vector2(40, 40)
cell.color = Color.DARK_GRAY
add_child(cell)
cells.append(cell)
# Remove any children if they exist (cleanup from previous implementation)
for child in get_children():
child.queue_free()
func update_map(current_room_id: String, explored_rooms: Array):
# Parse "room_x_y"
var parts = current_room_id.split("_")
if parts.size() == 3:
var x = int(parts[1])
var y = int(parts[2])
var index = y * 4 + x
func update_map(new_room_id: String, explored: Array):
current_room_id = new_room_id
explored_rooms = explored
queue_redraw()
func _draw():
if current_room_id == "":
return
for i in range(cells.size()):
var cell_x = i % 4
var cell_y = i / 4
var cell_id = "room_%d_%d" % [cell_x, cell_y]
var center = size / 2
# Parse current room coordinates to center the map
var current_coords = _parse_coords(current_room_id)
for room_id in explored_rooms:
var coords = _parse_coords(room_id)
var rel_x = coords.x - current_coords.x
var rel_y = coords.y - current_coords.y
# Calculate position relative to center
# (rel_x, rel_y) * (cell_size + padding) gives the offset
var offset = Vector2(rel_x, rel_y) * (cell_size + Vector2(padding, padding))
var rect_pos = center + offset - cell_size / 2
var rect = Rect2(rect_pos, cell_size)
var color = Color.LIGHT_GRAY
if room_id == current_room_id:
color = Color.GREEN
if i == index:
cells[i].color = Color.GREEN # Player
elif cell_id in explored_rooms:
cells[i].color = Color.LIGHT_GRAY # Explored
else:
cells[i].color = Color.DARK_GRAY # Unexplored
draw_rect(rect, color, true)
draw_rect(rect, Color.BLACK, false, 1.0) # Border
func _parse_coords(id: String) -> Vector2:
var parts = id.split("_")
if parts.size() >= 3:
return Vector2(int(parts[1]), int(parts[2]))
return Vector2.ZERO

View File

@@ -1,5 +1,90 @@
class_name WorldData
static func generate_procedural_world(num_rooms: int = 15) -> Dictionary:
var rooms = {}
var occupied_coords = {} # Vector2 -> RoomData
# Start at 0,0
var current_pos = Vector2(0, 0)
var positions = [current_pos]
# Create first room
var start_room = _create_room(0, 0)
rooms[start_room.id] = start_room
occupied_coords[current_pos] = start_room
# Random Walk
while rooms.size() < num_rooms:
# Pick a random existing position to branch from
var base_pos = positions[randi() % positions.size()]
var directions = [Vector2.UP, Vector2.DOWN, Vector2.LEFT, Vector2.RIGHT]
var dir = directions[randi() % directions.size()]
var new_pos = base_pos + dir
if not occupied_coords.has(new_pos):
var new_room = _create_room(int(new_pos.x), int(new_pos.y))
rooms[new_room.id] = new_room
occupied_coords[new_pos] = new_room
positions.append(new_pos)
# Second pass: Link exits
for pos in occupied_coords:
var room = occupied_coords[pos]
var x = int(pos.x)
var y = int(pos.y)
if occupied_coords.has(Vector2(x, y - 1)): room.exits["north"] = "room_%d_%d" % [x, y - 1]
if occupied_coords.has(Vector2(x, y + 1)): room.exits["south"] = "room_%d_%d" % [x, y + 1]
if occupied_coords.has(Vector2(x + 1, y)): room.exits["east"] = "room_%d_%d" % [x + 1, y]
if occupied_coords.has(Vector2(x - 1, y)): room.exits["west"] = "room_%d_%d" % [x - 1, y]
# Populate items/enemies
_populate_world(rooms)
return rooms
static func _create_room(x: int, y: int) -> RoomData:
var room = RoomData.new()
room.id = "room_%d_%d" % [x, y]
room.room_name = "Room %d,%d" % [x, y]
room.description = "A dark, stone-walled room at coordinates %d, %d." % [x, y]
room.exits = {}
return room
static func _populate_world(rooms: Dictionary):
var room_ids = rooms.keys()
# Add a sword to a random room (excluding 0,0 if possible, but random is fine)
var sword_room_id = room_ids[randi() % room_ids.size()]
var sword_room = rooms[sword_room_id]
var sword = ItemData.new()
sword.id = "sword"
sword.name = "Rusty Sword"
sword.description = "A rusty old sword."
sword.effect_type = "DAMAGE"
sword.effect_value = 10
sword_room.items.append(sword)
# Add some enemies
var num_enemies = rooms.size() / 3
for i in range(num_enemies):
var enemy_room_id = room_ids[randi() % room_ids.size()]
# Avoid putting enemy in start room (0,0)
if enemy_room_id == "room_0_0":
continue
var enemy_room = rooms[enemy_room_id]
if enemy_room.enemies.size() == 0: # One enemy per room for now
var goblin = EnemyData.new()
goblin.id = "goblin"
goblin.name = "Goblin"
goblin.hp = 30
goblin.max_hp = 30
goblin.damage = 5
enemy_room.enemies.append(goblin)
static func generate_test_world() -> Dictionary:
var rooms = {}
for x in range(4):

View File

@@ -1,18 +1,18 @@
extends Node2D
@onready var game_manager = $GameManager
@onready var room_label = $UI/MainLayout/Sidebar/RoomLabel
@onready var log_label = $UI/MainLayout/GameView/Log
@onready var input_field = $UI/MainLayout/GameView/Input
@onready var minimap = $UI/MainLayout/Sidebar/Minimap
@onready var stats_label = $UI/MainLayout/Sidebar/StatsLabel
@onready var room_label = $UI/MainLayout/TopPanel/NarrativePanel/VBox/RoomLabel
@onready var log_label = $UI/MainLayout/TopPanel/NarrativePanel/VBox/Log
@onready var input_field = $UI/MainLayout/TopPanel/NarrativePanel/VBox/Input
@onready var minimap = $UI/MainLayout/ControlDeck/HBox/MinimapPanel/Minimap
@onready var stats_label = $UI/MainLayout/ControlDeck/HBox/StatsPanel/StatsLabel
@onready var btn_north = $UI/MainLayout/Sidebar/Controls/BtnNorth
@onready var btn_south = $UI/MainLayout/Sidebar/Controls/BtnSouth
@onready var btn_east = $UI/MainLayout/Sidebar/Controls/HBox/BtnEast
@onready var btn_west = $UI/MainLayout/Sidebar/Controls/HBox/BtnWest
@onready var btn_save = $UI/MainLayout/Sidebar/Controls/BtnSave
@onready var btn_load = $UI/MainLayout/Sidebar/Controls/BtnLoad
@onready var btn_north = $UI/MainLayout/ControlDeck/HBox/ActionsPanel/BtnNorth
@onready var btn_south = $UI/MainLayout/ControlDeck/HBox/ActionsPanel/BtnSouth
@onready var btn_east = $UI/MainLayout/ControlDeck/HBox/ActionsPanel/HBox/BtnEast
@onready var btn_west = $UI/MainLayout/ControlDeck/HBox/ActionsPanel/HBox/BtnWest
@onready var btn_save = $UI/MainLayout/ControlDeck/HBox/SystemPanel/BtnSave
@onready var btn_load = $UI/MainLayout/ControlDeck/HBox/SystemPanel/BtnLoad
@onready var combat_ui = $UI/CombatUI
@onready var main_layout = $UI/MainLayout