aboutsummaryrefslogtreecommitdiff
path: root/scripts/enemies.gd
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/enemies.gd')
-rw-r--r--scripts/enemies.gd117
1 files changed, 117 insertions, 0 deletions
diff --git a/scripts/enemies.gd b/scripts/enemies.gd
new file mode 100644
index 0000000..068814a
--- /dev/null
+++ b/scripts/enemies.gd
@@ -0,0 +1,117 @@
+extends Node
+
+var _path
+var _enemy_blue
+var _dissolve_mat
+
+var _fx_holder
+var _fx_enemy_damage
+
+var _shapes = {}
+
+var serial_enemy = 0
+var enemies = {}
+
+
+func _ready():
+ _fx_holder = get_tree().root.get_child(0).find_node("fx")
+ _path = get_tree().root.get_child(0).find_node("path")
+ _dissolve_mat = load("res://shaders/dissolve_mat.tres")
+ _enemy_blue = load("res://scenes/enemy.tscn")
+ _fx_enemy_damage = load("res://scenes/fx/enemy_damage.tscn")
+
+ load_shapes()
+
+func load_shapes():
+ _shapes = {}
+ var dir = Directory.new()
+ dir.open("res://models/shapes")
+ dir.list_dir_begin(true)
+ var shape = dir.get_next()
+ while shape != "":
+ if (shape.ends_with(".glb")):
+ var model = load("res://models/shapes/" + shape)
+ var sname = shape.substr(0, shape.length()-4)
+ _shapes[sname] = model
+ shape = dir.get_next()
+
+func spawn():
+ var instance = _enemy_blue.instance()
+ add_child(instance)
+ instance.transform.origin = _path.nodes[0].transform.origin;
+ instance.name = str(serial_enemy)
+ var instance_model = _shapes[_shapes.keys()[randi() % _shapes.size()]].instance()
+ instance.add_child(instance_model)
+ var axis : Vector3 = Quat(Vector3(0, randf()*TAU, 0)) * Vector3.RIGHT
+ enemies[serial_enemy] = {
+ "cur": 0, "hp": 10, "rel": 0, "ops": instance_model.name,
+ "axis": [axis.x, axis.y, axis.z] }
+ serial_enemy += 1
+
+func node_from_id (id):
+ return get_node(str(id))
+
+func _physics_process(delta):
+ var delist = []
+ for child in get_children():
+ var id = str(child.name).to_int()
+ var enemy = enemies[id]
+
+ if enemy.hp <= 0:
+ if enemy.ops == "T":
+ delist.append(id)
+ enemy.rel = 0
+ continue
+ else:
+ child.get_node(enemy.ops).queue_free()
+ enemy.ops = enemy.ops.substr(1, enemy.ops.length()-1)
+ enemy.hp = 10
+ var instance_model = _shapes[enemy.ops].instance()
+ child.add_child(instance_model)
+
+ var speed = 1
+ enemy.rel += speed * delta
+ while enemy.rel > 1:
+ enemy.rel -= 1
+ enemy.cur += 1
+
+ var destination = enemy.cur+1
+ if destination >= _path.nodes.size():
+ delist.append(id)
+ enemy.rel = 0
+ continue
+
+ var from = _path.nodes[enemy.cur].transform.origin
+ var to = _path.nodes[destination].transform.origin
+ child.transform.origin = lerp(from, to, enemy.rel)
+
+ var axis = Vector3(enemy.axis[0], enemy.axis[1], enemy.axis[2])
+ child.transform.basis = child.transform.basis.rotated(axis, delta)
+
+ for id in delist:
+ get_node(str(id)).queue_free()
+ enemies.erase(id)
+
+
+func damage(name):
+ var id = int(name)
+ var enemy = enemies[id]
+ enemies[id].hp -= 1
+
+ fx_damage(name)
+
+func fx_damage(name):
+ var id = int(name)
+ var enemy = enemies[id]
+
+ var instance = _fx_enemy_damage.instance()
+ _fx_holder.add_child(instance)
+
+ var node = node_from_id(id)
+ instance.transform = node.transform;
+ instance.refresh_basis()
+
+ var instance_model = _shapes[enemy["ops"]].instance()
+ instance.add_child(instance_model)
+
+ instance.refresh_shader(_dissolve_mat)