a game about throwing hammers made for the github game off
Diffstat (limited to 'levels/Level.gd')
| -rw-r--r-- | levels/Level.gd | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/levels/Level.gd b/levels/Level.gd new file mode 100644 index 0000000..70afe3e --- /dev/null +++ b/levels/Level.gd @@ -0,0 +1,84 @@ +## A Level. +extends TileMap +class_name Level + +@icon("./level_icon.svg") + +const BlockDoor_scn := preload("res://world/door/block_door.tscn") +const Door_scn := preload("res://world/door/door.tscn") +const OneWayPlatform_scn := preload("res://world/one_way_platform.tscn") + +const ALL_DOORS := [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT] + +## The enabled walls. [url=https://kidscancode.org/blog/img/cells_4bit.png]4bit[/url] +@export_range(0, 15) var enabled_walls := 0 + +const rot_map := {Vector2i.LEFT: PI, Vector2i.RIGHT: 0, Vector2i.DOWN: PI / 2, Vector2i.UP: -PI / 2} # 180 # 90 # -90 + +@onready var enemys := $Enemys.get_children() +@onready var enemyqty := $Enemys.get_child_count() +@onready var has_enemys := enemyqty != 0 + +@onready var blockdoors: Node2D +@onready var doors: Node2D = create_node(&"doors") + +## Utility fuction to create a [Node2D] +func create_node(p_name: StringName) -> Node2D: + var n := Node2D.new() + n.position = Vector2.ZERO + n.name = p_name + add_child(n) + return n + + +func _ready(): + var wall_array := Maze.tile_4b_to_wall_array(enabled_walls) + + if len(wall_array) != 4: + var door_array := Util.sub(ALL_DOORS, wall_array) + if Vector2i.DOWN in door_array: + var p: OneWayPlatform = OneWayPlatform_scn.instantiate() + p.position = Vector2(128, 243) + call_deferred(&"add_child", p) + + if has_enemys: + blockdoors = create_node(&"block_doors") + + for door_p in door_array: + var door := add_door(door_p) + if has_enemys: + add_block_door(door) + + for enemy in enemys: + enemy.died.connect(_on_enemy_died) + + +## Add a [Door] for given direction. +func add_door(dir: Vector2i) -> Door: + var d := Door_scn.instantiate() + var v := Vector2i(128, 128) # center + d.rotation = rot_map[dir] + d.position = Vector2(v + (v * dir)).move_toward(v, 16) + d.dir = dir + doors.add_child(d) + return d + +## Add a [BlockDoor] on top of a [Door] +func add_block_door(door: Door) -> BlockDoor: + var d := BlockDoor_scn.instantiate() + d.rotation = door.rotation + d.position = door.position.move_toward(Vector2(128, 128), -8) + blockdoors.add_child(d) + return d + + +func _on_enemy_died() -> void: + enemyqty -= 1 + if enemyqty == 0: + open_doors() + +## Opens all doors +func open_doors() -> void: + var block_doors := blockdoors.get_children() + for bloc_door in block_doors: + bloc_door.open() |