Premier commit

This commit is contained in:
2026-09-01 22:41:37 +02:00
commit 7cff988739
133 changed files with 6412 additions and 0 deletions
@@ -0,0 +1,143 @@
extends Node
class_name AlienHordeManager
const CALCULATE_TARGET_FREQUENCY = 10
const CALCULATE_DIRECTION_FREQUENCY = 10
const CALCULATE_SCATTER_FREQUENCY = 5
const CALCULATE_STATE_FREQUENCY = 5
const ATTACK_DISTANCE = 10.
const MECHA_ATTACK_DISTANCE = 5.
const MAX_ALIEN_MECHA_AGGRO_DISTANCE = 100
const ALIEN_RANDOM_SCALE = 0.3
const MASTODONT_CHANCE = 0.01
const MASTODONT_SCALE_FACTOR = 4.
@export var hex_map : HexMap
@export var mecha : Mecha
@onready var multimeshes : Array[MultiMeshInstance3D] = [
%RunningAlienMultiMesh,
%AttackingAlienMultiMesh
]
@onready var targets : Array = hex_map.get_all_tiles_with_id("House")
var current_frame : int = 0
var alien_id_acc : int = 0
var aliens : Array[Alien] = []
func _physics_process(delta):
current_frame += 1
for t in targets:
if t is HouseHexTile:
if t.destroyed:
targets.erase(t)
# if current_frame % CALCULATE_CLUSTERS_FREQUENCY == 0:
# calculate_clusters()
calculate_target()
calculate_state()
update_horde(delta)
spawn_models(delta)
func spawn_alien(position : Vector3, rotation: float) -> Alien:
var alien : Alien = Alien.new()
alien.id = alien_id_acc
alien.position = position
alien.rotation.y = rotation
var is_mastodont = randf() < MASTODONT_CHANCE
alien.size = randf_range(1. - ALIEN_RANDOM_SCALE, 1. + ALIEN_RANDOM_SCALE) * (MASTODONT_SCALE_FACTOR if is_mastodont else 1.)
alien.scale = Vector3.ONE * alien.size
add_child(alien)
aliens.append(alien)
alien.died.connect(
func():
aliens.erase(alien)
)
alien_id_acc += 1
return alien
func calculate_target():
for alien in aliens:
if (current_frame + alien.id)%CALCULATE_TARGET_FREQUENCY and alien.state != Alien.State.DEAD :
if (
len(targets) == 0
or mecha.position.distance_to(alien.position) < alien.get_random().randf_range(0., MAX_ALIEN_MECHA_AGGRO_DISTANCE)
):
alien.target = mecha
else :
var old_target = alien.target
alien.target = targets[alien.get_random().randi() % len(targets)]
if old_target != alien.target:
alien.state = Alien.State.RUNNING
func calculate_state():
for alien in aliens:
if (current_frame + alien.id)%CALCULATE_STATE_FREQUENCY and alien.state != Alien.State.DEAD and alien.target:
var target_attack_distance = MECHA_ATTACK_DISTANCE if alien.target is Mecha else ATTACK_DISTANCE
alien.state = (
Alien.State.RUNNING if alien.target.position.distance_to(alien.position) > target_attack_distance
else Alien.State.ATTACKING
)
func update_horde(delta):
for alien in aliens:
match alien.state:
Alien.State.RUNNING:
alien.move(
delta,
(current_frame + alien.id)%CALCULATE_DIRECTION_FREQUENCY,
(current_frame + alien.id)%CALCULATE_SCATTER_FREQUENCY
)
Alien.State.ATTACKING:
alien.attack_target(delta)
func alien_to_multimesh_id(alien : Alien) -> int:
match alien.state:
Alien.State.RUNNING:
return 0
Alien.State.ATTACKING:
return 1
_: return -1
func spawn_models(delta):
for m_id in range(len(multimeshes)):
var multimesh = multimeshes[m_id].multimesh
multimesh.instance_count = len(aliens)
for i in range(len(aliens)):
var alien = aliens[i]
var is_current = m_id == alien_to_multimesh_id(alien)
multimesh.set_instance_transform(
i,
alien.transform.scaled(Vector3.ONE if is_current else Vector3.ZERO)
)
if alien.damage_effect_last > 0:
alien.damage_effect_last -= delta
multimesh.set_instance_custom_data(
i,
Color(
alien.id,
alien.damage_effect_last > 0,
alien.size,
0
))
multimesh.set_instance_color(i ,Color(alien.get_random().randi()%255,alien.get_random().randi()%255,alien.get_random().randi()%255))
func is_alien_alive(alien):
return alien and alien is Alien and alien.hp > 0
@@ -0,0 +1 @@
uid://bsiixctjr7ml4
@@ -0,0 +1,28 @@
[gd_scene format=3 uid="uid://brr2idsr7qmpf"]
[ext_resource type="ArrayMesh" uid="uid://cgv8clg8y80on" path="res://entities/alien/assets/vat/running_alien_vat/alien_mesh.tres" id="1_0bggl"]
[ext_resource type="Script" uid="uid://bsiixctjr7ml4" path="res://entities/alien/alien_horde_manager/alien_horde_manager.gd" id="1_hjbcl"]
[ext_resource type="ArrayMesh" uid="uid://chhggu10sxmuc" path="res://entities/alien/assets/vat/attacking_alien_vat/alien_mesh.tres" id="2_hjbcl"]
[sub_resource type="MultiMesh" id="MultiMesh_33mok"]
transform_format = 1
use_colors = true
use_custom_data = true
mesh = ExtResource("2_hjbcl")
[sub_resource type="MultiMesh" id="MultiMesh_tj3hn"]
transform_format = 1
use_colors = true
use_custom_data = true
mesh = ExtResource("1_0bggl")
[node name="AlienHordeManager" type="Node" unique_id=1604717993]
script = ExtResource("1_hjbcl")
[node name="AttackingAlienMultiMesh" type="MultiMeshInstance3D" parent="." unique_id=1055420147]
unique_name_in_owner = true
multimesh = SubResource("MultiMesh_33mok")
[node name="RunningAlienMultiMesh" type="MultiMeshInstance3D" parent="." unique_id=245629817]
unique_name_in_owner = true
multimesh = SubResource("MultiMesh_tj3hn")