How could i make this with less code or more optimized

Godot Version

4.2

Question

Im a new godot developer and i dont know much about optimization. Im making a wave system for my game and its really long.

func _on_timeout():
	wave += 1
	if wave == 1:
		enemies = [1,0,0,0]
	if wave == 2:
		enemies = [1,0,0,0]
	if wave == 3:
		enemies = [2,0,0,0]
	if wave == 4:
		enemies = [1,1,0,0]
	if wave == 5:
		enemies = [2,1,0,0]
	if wave == 6:
		enemies = [3,1,0,0]
	if wave == 7:
		enemies = [2,2,0,0]
	if wave == 8:
		enemies = [0,0,2,0]
	if wave == 9:
		enemies = [0,1,2,0]
	if wave == 10:
		enemies = [6,0,0,0]
	if wave == 11:
		enemies = [0,4,0,0]
	if wave == 12:
		enemies = [0,0,3,0]
	if wave == 13:
		enemies = [2,2,2,0]
	if wave >= 14:
		enemies = [3,3,3,0]
	enemy_spawn(enemies)

this is what i use for each level, for each level i rewrite it and put
If Global.level =2 then i rewrite all that but change the enemies around.
i want each wave to be unique and not randomly generated.
i try and keep everything in one script but im not sure if i should make a new script for each level.
this is what i use to decide the enemies on the level


func _ready():
	if Global.level == 1:
		enemy1 = preload("res://world/enemies/1cavemen/caveman.tscn")
		enemy2 = preload("res://world/enemies/1cavemen/caveman_sling.tscn")
		enemy3 = preload("res://world/enemies/1cavemen/caveman_brute.tscn")
		enemy4 = 0
	elif Global.level == 2:
		enemy1 = preload("res://world/enemies/2spartan_age_enemies/spear_helm.tscn")
		enemy2 = preload("res://world/enemies/2spartan_age_enemies/bow_robe.tscn")
		enemy3 = preload("res://world/enemies/2spartan_age_enemies/griffin.tscn")
		enemy4 = 0
	elif Global.level == 3:
		enemy1 = preload("res://world/enemies/3egyptians/bow_skin.tscn")
		enemy2 = preload("res://world/enemies/3egyptians/cat_sword.tscn")
		enemy3 = preload("res://world/enemies/3egyptians/mage_sheep.tscn")
		enemy4 = 0

it keeps going like this until level 8
Would it be more efficient to make a new script for each level or should i keep this?. how could i optimize the wave system and write it with less code.

the complete code is here:


extends Timer


extends Timer

var enemy1
var enemy2
var enemy3
var enemy4
var wave = 0 
var enemies = [0,0,0,0]
func _ready():
	if Global.level == 1:
		enemy1 = preload("res://world/enemies/1cavemen/caveman.tscn")
		enemy2 = preload("res://world/enemies/1cavemen/caveman_sling.tscn")
		enemy3 = preload("res://world/enemies/1cavemen/caveman_brute.tscn")
		enemy4 = 0
	elif Global.level == 2:
		enemy1 = preload("res://world/enemies/2spartan_age_enemies/spear_helm.tscn")
		enemy2 = preload("res://world/enemies/2spartan_age_enemies/bow_robe.tscn")
		enemy3 = preload("res://world/enemies/2spartan_age_enemies/griffin.tscn")
		enemy4 = 0
	elif Global.level == 3:
		enemy1 = preload("res://world/enemies/3egyptians/bow_skin.tscn")
		enemy2 = preload("res://world/enemies/3egyptians/cat_sword.tscn")
		enemy3 = preload("res://world/enemies/3egyptians/mage_sheep.tscn")
		enemy4 = 0
	elif Global.level == 4:
		enemy1 = preload("res://world/enemies/4medival/knight.tscn")
		enemy2 = preload("res://world/enemies/4medival/bow_chain.tscn")
		enemy3 = preload("res://world/enemies/4medival/paladin.tscn")
		enemy4 = 0
	elif Global.level == 5:
		enemy1 = preload("res://world/enemies/5renaissance/metalarmour_sword.tscn")
		enemy2 = preload("res://world/enemies/5renaissance/musket.tscn")
		enemy3 = preload("res://world/enemies/5renaissance/metalarmour_spear.tscn")
		enemy4 = 0
	elif Global.level == 6:
		enemy1 = preload("res://world/enemies/6modern/military_gun.tscn")
		enemy2 = preload("res://world/enemies/6modern/drone.tscn")
		enemy3 = preload("res://world/enemies/6modern/tank.tscn")
		enemy4 = 0
	elif Global.level == 7:
		enemy1 = preload("res://world/enemies/7furture/future_soldier.tscn")
		enemy2 = preload("res://world/enemies/7furture/mech_armour.tscn")
		enemy3 = preload("res://world/enemies/7furture/advanced_mech.tscn")
		enemy4 = 0
	elif Global.level == 8:
		enemy1 = preload("res://world/enemies/8alien/alien.tscn")
		enemy2 = preload("res://world/enemies/8alien/sphere_ship.tscn")
		enemy3 = preload("res://world/enemies/8alien/mothership.tscn")
		enemy4 = 0


		
func _process(delta):
	pass


func _on_timeout():
	wave += 1
	if Global.level == 1:
		if wave == 1:
			enemies = [1,0,0,0]
		if wave == 2:
			enemies = [1,0,0,0]
		if wave == 3:
			enemies = [2,0,0,0]
		if wave == 4:
			enemies = [1,1,0,0]
		if wave == 5:
			enemies = [2,1,0,0]
		if wave == 6:
			enemies = [3,1,0,0]
		if wave == 7:
			enemies = [2,2,0,0]
		if wave == 8:
			enemies = [0,0,2,0]
		if wave == 9:
			enemies = [0,1,2,0]
		if wave == 10:
			enemies = [6,0,0,0]
		if wave == 11:
			enemies = [0,4,0,0]
		if wave == 12:
			enemies = [0,0,3,0]
		if wave == 13:
			enemies = [2,2,2,0]
		if wave >= 14:
			enemies = [3,3,3,0]
	if Global.level == 2:
		if wave == 1:
			enemies = [1,0,0,0]
		if wave == 2:
			enemies = [1,0,0,0]
		if wave == 3:
			enemies = [2,0,0,0]
		if wave == 4:
			enemies = [1,1,0,0]
		if wave == 5:
			enemies = [2,1,0,0]
		if wave == 6:
			enemies = [3,1,0,0]
		if wave == 7:
			enemies = [2,2,0,0]
		if wave == 8:
			enemies = [0,0,2,0]
		if wave == 9:
			enemies = [0,1,2,0]
		if wave == 10:
			enemies = [6,0,0,0]
		if wave == 11:
			enemies = [0,4,0,0]
		if wave == 12:
			enemies = [0,0,3,0]
		if wave == 13:
			enemies = [2,2,2,0]
		if wave >= 14:
			enemies = [3,3,3,0]
	enemy_spawn(enemies)

func enemy_spawn(enemies):
	for i in enemies[0]:
		spawn(enemy1)
	for i in enemies[1]:
		spawn(enemy2)
	for i in enemies[2]:
		spawn(enemy3)
	for i in enemies[3]:
		spawn(enemy4)
		
func spawn(type):
	var enemy_type = type.instantiate()
	if type == enemy3 or enemy4:
		enemy_type.position = Vector2(randf_range(180,200), 4* int(2)+97)
	else:
		enemy_type.position = Vector2(randf_range(140,160),  round(randf_range(4,16))+97)
	add_child(enemy_type)

i havent made the waves unique for each level and wanted to ask for advice before i spent an hour writing the enemy number for each level.
i attach this script to each level and yeah idk if you have any questions i can asnwer them

1 Like

Make an array of arrays for the waves, then use the wave # as an index to pull the right wave data.

var enemy_wave_data = [[1,0,0,0], [1,0,0,0], [2,0,0,0]] and as many as needed.

I mainly use C# but I think the above would work, but not sure if doing that specifically is a no-no in gdscript. Maybe a dictionary would work too.

3 Likes

thanks alot, this made the code much simpler

2 Likes