full microban poc
This commit is contained in:
parent
425053b4b2
commit
3ed232370a
3 changed files with 1860 additions and 20 deletions
2
board.gd
2
board.gd
|
@ -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
56
main.gd
|
@ -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
1822
microban-1.txt
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue