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
85
86
87
88
89
90
91
92
93
94
## 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")

## The enabled walls. [url=https://kidscancode.org/blog/img/cells_4bit.png]4bit[/url]
@export_range(0, 15) var enabled_walls := 15

const rot_map := {Vector2i.LEFT: PI, Vector2i.RIGHT: 0, Vector2i.DOWN: PI / 2, Vector2i.UP: -PI / 2}  # 180  # 90  # -90

var completed := false:
	set(value):
		if not is_inside_tree() and value == true:
			completed = value
		else:
			push_error("no")

@onready var enemys := $Enemys.get_children() if not completed else []
@onready var enemyqty := enemys.size() if not completed else 0
@onready var has_enemys := enemyqty != 0

@onready var blockdoors: Node2D
@onready var doors: Node2D


## 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)
	move_child(n, 0)
	return n


func _ready():
	collision_visibility_mode = TileMap.VISIBILITY_MODE_FORCE_HIDE
	var door_array := Maze.tile_4b_to_path_array(enabled_walls)

	if completed:
		($Enemys as Node2D).queue_free()
	if !door_array.is_empty():
		if has_enemys:
			blockdoors = create_node(&"block_doors")
		doors = create_node(&"doors")

		for door_p in door_array:
			var door := add_door(door_p)
			if has_enemys:
				add_block_door(door)

		if Vector2i.DOWN in door_array:
			var n := create_node(&"one_way_platform")
			n.position = Vector2(128, 243)
			var p: OneWayPlatform = OneWayPlatform_scn.instantiate()
			n.call_deferred(&"add_child", p)

	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()