Plant spawn

This commit is contained in:
Rendo 2025-08-03 18:34:54 +05:00
commit 941912d7f1
25 changed files with 281 additions and 40 deletions

View file

@ -0,0 +1,6 @@
extends Marker2D
func _ready() -> void:
FieldParams.field_rect.position = global_position
queue_free()

View file

@ -0,0 +1 @@
uid://cj8mt02far5np

View file

@ -0,0 +1,37 @@
extends Node
class_name LayeredEntityContainer
var entities := {
"under" : [],
"base" : [],
"above" : []
}
func _ready() -> void:
LevelEventBus.layer_entity_created.connect(on_entity_spawned)
LevelEventBus.layer_entity_killed.connect(on_entity_killed)
for layer in entities.keys():
entities[layer].resize(FieldParams.COLUMNS * FieldParams.ROWS)
## Checks if tile is occupied. [br]
## If position or layer are invalid, returns true
func is_occupied(position : int, layer : StringName) -> bool:
if position >= FieldParams.COLUMNS * FieldParams.ROWS or entities.has(layer) == false: return true
return not entities[layer][position] == null
func on_entity_spawned(entity : Entity) -> void:
if entities.has(entity.layer) == false: return
var index = FieldParams.indexify(entity.get_parent().global_position)
if index >= FieldParams.COLUMNS * FieldParams.ROWS or is_occupied(index,entity.layer): return
entities[entity.layer][index] = entity
func on_entity_killed(context : Entity.KilledContext) -> void:
var entity = context.target
var index = FieldParams.indexify(entity.get_parent().global_position)
if is_occupied(index,entity.layer) == false: return
entities[entity.layer][index] = null

View file

@ -0,0 +1 @@
uid://cyttjwv888cb4

View file

@ -3,12 +3,35 @@ extends Node
class_name LevelData
static var state : LevelStates = LevelStates.NotInGame
static var sun_count : float
static var sun_count : float = 100
var hotbar_seedpackets : Array[SeedpacketResource]
func _ready() -> void:
LevelEventBus.packet_selected.connect(on_seedpacket_clicked)
set_state(LevelStates.PlantPick)
LevelEventBus.state_advance_requested.connect(advance_state)
LevelEventBus.packet_placed.connect(on_packet_placed)
func _exit_tree() -> void:
set_state(LevelStates.NotInGame)
func advance_state() -> void:
set_state(state + 1)
func set_state(to : LevelStates):
state = to
match state:
LevelStates.PlantPick:
LevelEventBus.packet_selected.connect(on_seedpacket_clicked)
LevelStates.Pregame:
LevelEventBus.packet_selected.disconnect(on_seedpacket_clicked)
LevelStates.Game:
pass
LevelStates.Postgame:
pass
LevelStates.NotInGame:
pass
LevelEventBus.state_changed.emit(state)
func on_seedpacket_clicked(seedpacket : SeedpacketResource):
if hotbar_seedpackets.has(seedpacket):
@ -17,6 +40,11 @@ func on_seedpacket_clicked(seedpacket : SeedpacketResource):
hotbar_seedpackets.append(seedpacket)
LevelEventBus.hotbar_packets_update.emit(hotbar_seedpackets)
func on_packet_placed(seedpacket : SeedpacketResource):
print(seedpacket)
sun_count -= seedpacket.cost
LevelEventBus.sun_count_updated.emit(sun_count)
## Possible states of level
enum LevelStates {
## The game is during plant pick stage
@ -27,6 +55,6 @@ enum LevelStates {
Game,
## Game ended
Postgame,
## Not in a level,
## Not in a level
NotInGame
}

View file

@ -0,0 +1,51 @@
extends CanvasGroup
@export var entity_container : LayeredEntityContainer
var can_plant : bool = false
var held_packet : SeedpacketResource = null
func _ready() -> void:
LevelEventBus.state_changed.connect(on_level_state_changed)
LevelEventBus.packet_deselected.connect(on_seedpacket_deselected)
func _process(_delta: float) -> void:
var mouse_pos = get_global_mouse_position()
var indexified_mouse = FieldParams.indexify(mouse_pos - FieldParams.field_rect.position)
if FieldParams.field_rect.has_point(mouse_pos) and entity_container.is_occupied(indexified_mouse,"base") == false:
global_position = FieldParams.deindexify(indexified_mouse) + FieldParams.TILE / 2.0 + FieldParams.field_rect.position
can_plant = true
else:
global_position = mouse_pos
can_plant = false
func _input(event: InputEvent) -> void:
if held_packet != null and event.is_action_pressed("cancel_action"):
stop_placement()
if held_packet != null and can_plant and event.is_action_pressed("primary_action"):
for child in get_children():
child.reparent(get_tree().current_scene.get_node("%Plants"))
LevelEventBus.packet_placed.emit(held_packet)
held_packet = null
visible = false
func on_seedpacket_selected(packet : SeedpacketResource) -> void:
add_child(packet.scene.instantiate())
held_packet = packet
visible = true
func on_seedpacket_deselected(packet : SeedpacketResource) -> void:
if packet == held_packet:
stop_placement()
func on_level_state_changed(state : LevelData.LevelStates) -> void:
if state == LevelData.LevelStates.Game:
LevelEventBus.state_changed.disconnect(on_level_state_changed)
LevelEventBus.packet_selected.connect(on_seedpacket_selected)
func stop_placement():
for child in get_children():
child.queue_free()
held_packet = null
visible = false

View file

@ -0,0 +1 @@
uid://sjnxv5q4yk2