a game about throwing hammers made for the github game off
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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()