godot-shooter / files / items / LevelItemGenerator.gd
LevelItemGenerator.gd
| 1 | class_name LevelItemGenerator |
| 2 | |
| 3 | const Utils = preload("res://utils/Utils.gd") |
| 4 | var generated_count: int = 0 |
| 5 | var simultaneous_count: int = 1 |
| 6 | |
| 7 | var item_count: int |
| 8 | var creator_name: String |
| 9 | var instance_object: Object |
| 10 | var group_name: String |
| 11 | |
| 12 | func _init(count, creator, instance, group, sim_count = 1) -> void: |
| 13 | item_count = count |
| 14 | creator_name = creator |
| 15 | group_name = group |
| 16 | instance_object = instance |
| 17 | simultaneous_count = sim_count |
| 18 | |
| 19 | # runs the generator, returns is_done, a boolean |
| 20 | func run(node: Node) -> bool: |
| 21 | var items = node.get_tree().get_nodes_in_group(group_name) |
| 22 | var generated_enough = generated_count == item_count |
| 23 | var finished = generated_enough && items.size() == 0 |
| 24 | if finished: |
| 25 | return true |
| 26 | if generated_enough: |
| 27 | return true |
| 28 | var should_add = items.size() < simultaneous_count |
| 29 | if should_add: |
| 30 | var item: Node = funcref(instance_object, creator_name).call_func() |
| 31 | item.add_to_group(group_name) |
| 32 | node.add_child(item) |
| 33 | generated_count += 1 |
| 34 | var is_done = not should_add |
| 35 | return is_done |