full microban poc

This commit is contained in:
mehbark 2025-05-02 00:29:45 -04:00
parent 425053b4b2
commit 3ed232370a
3 changed files with 1860 additions and 20 deletions

View file

@ -11,7 +11,7 @@ extends Node3D
# for zooming out to see the whole puzzle
func top_left_aabb() -> AABB:
return AABB(position, Vector3.ONE*0.1)
return AABB(position-Vector3(1,0,1), Vector3.ONE*0.1)
func bottom_right_aabb() -> AABB:
return AABB(position + Vector3(dims.x, 0, dims.y), Vector3.ONE*0.1)

56
main.gd
View file

@ -1,20 +1,12 @@
extends Node3D
var microban_1 := "
####
# .#
# ###
#*@ #
# $ #
# ###
####
"
@onready var camera: Camera3D = $Camera
var hist := UndoRedo.new()
@onready var board := Board.from_string(microban_1)
@onready var board := Board.from_string("")
var player: Piece
var level_num := -1
var levels_src: PackedStringArray
@onready var sound: AudioStreamPlayer = $Sound
@onready var sounds_hit := audio_stream_randomizer_from_dir("res://sfx/hit")
@ -22,18 +14,14 @@ var player: Piece
@onready var sounds_redo := audio_stream_randomizer_from_dir("res://sfx/redo")
func _ready() -> void:
add_child(board)
for piece in board.pieces():
if piece.type == Piece.Type.Player:
player = piece
$TopLeft.aabb = board.top_left_aabb()
$BottomRight.aabb = board.bottom_right_aabb()
camera.position = Vector3(player.position.x, camera.position.y, player.position.z)
var file := FileAccess.open("res://microban-1.txt", FileAccess.READ)
levels_src = file.get_as_text().split("\n\n")
advance_level()
func _process(delta: float) -> void:
if $TopLeft.is_on_screen() and $BottomRight.is_on_screen():
return
camera.position.y += delta
camera.position.y += 10*delta
func _input(event: InputEvent) -> void:
if event.is_action_pressed("u", true, true):
@ -77,6 +65,36 @@ func step(move: Vector2i):
else:
sound.stream = sounds_hit
sound.play()
if won() or Input.is_action_pressed("restart"):
advance_level()
func won() -> bool:
for piece in board.pieces():
if piece.type == Piece.Type.Goal:
var covered := board.any_at(piece.lpos, func(p): return p.type == Piece.Type.Box)
if !covered:
return false
return true
func advance_level():
level_num += 1
if level_num >= levels_src.size():
print("you win")
return
while "@" not in levels_src[level_num] and "+" not in levels_src[level_num]:
level_num += 1
board.queue_free()
board = Board.from_string(levels_src[level_num])
var wall_count := 0
for piece in board.pieces():
if piece.type == Piece.Type.Player:
player = piece
add_child(board)
$TopLeft.aabb = board.top_left_aabb()
$BottomRight.aabb = board.bottom_right_aabb()
var center := (board.top_left_aabb().position + board.bottom_right_aabb().position)/2
camera.position = Vector3(center.x, 2, center.z)
func audio_stream_randomizer_from_dir(dir: String) -> AudioStreamRandomizer:
var stream := AudioStreamRandomizer.new()

1822
microban-1.txt Normal file

File diff suppressed because it is too large Load diff