feat(val-blog): add 2026-04-30 dream journey post
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user