Files
val-blog/ai-agent-living/godot/scripts/apartment_v2.gd
T

65 lines
2.0 KiB
GDScript

extends Node2D
const GRID_SIZE = 64
const ROOM_WIDTH = 10
const ROOM_HEIGHT = 8
const MAIN_CHANNEL_WIDTH = 2
var grid_cells: Array = []
var occupied_positions: Array = []
func _ready():
initialize_grid()
func initialize_grid():
grid_cells.resize(ROOM_WIDTH * ROOM_HEIGHT)
for y in range(ROOM_HEIGHT):
for x in range(ROOM_WIDTH):
var index = y * ROOM_WIDTH + x
grid_cells[index] = {
"position": Vector2(x * GRID_SIZE, y * GRID_SIZE),
"occupied": false,
"type": "empty"
}
# Reserve main channel (2 cells wide, can be horizontal or vertical, here we assume vertical left side)
if x == 0 and y < ROOM_HEIGHT - 2: # Keep 2 cells at bottom free
grid_cells[index]["occupied"] = true
grid_cells[index]["type"] = "channel"
func is_position_valid(pos: Vector2) -> bool:
var x = int(pos.x / GRID_SIZE)
var y = int(pos.y / GRID_SIZE)
if x < 0 or x >= ROOM_WIDTH or y < 0 or y >= ROOM_HEIGHT:
return false
var index = y * ROOM_WIDTH + x
return not grid_cells[index]["occupied"]
func get_random_valid_position() -> Vector2:
var attempts = 0
while attempts < 50:
var x = randi() % (ROOM_WIDTH - 1) # Avoid blocking channel
var y = randi() % ROOM_HEIGHT
var pos = Vector2(x * GRID_SIZE + GRID_SIZE / 2, y * GRID_SIZE + GRID_SIZE / 2)
if is_position_valid(pos):
return pos
attempts += 1
return Vector2.ZERO
func reserve_position(pos: Vector2, obj_type: String = "object"):
var x = int(pos.x / GRID_SIZE)
var y = int(pos.y / GRID_SIZE)
if x >= 0 and x < ROOM_WIDTH and y >= 0 and y < ROOM_HEIGHT:
var index = y * ROOM_WIDTH + x
if not grid_cells[index]["occupied"]:
grid_cells[index]["occupied"] = true
grid_cells[index]["type"] = obj_type
occupied_positions.append(pos)
func free_position(pos: Vector2):
var x = int(pos.x / GRID_SIZE)
var y = int(pos.y / GRID_SIZE)
if x >= 0 and x < ROOM_WIDTH and y >= 0 and y < ROOM_HEIGHT:
var index = y * ROOM_WIDTH + x
grid_cells[index]["occupied"] = false
grid_cells[index]["type"] = "empty"
occupied_positions.erase(pos)