Commit c422a83f authored by Gerard Gascón's avatar Gerard Gascón
Browse files

feat: instantiate dragons with initial animation

parent 48b6cd42
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -8,11 +8,12 @@ size = Vector2(128, 128)

[node name="Dragon" type="Area2D" node_paths=PackedStringArray("dragon")]
script = ExtResource("1_jccds")
dragon = NodePath("Dragon")

[node name="Dragon" parent="." instance=ExtResource("2_l1h0r")]
position = Vector2(-64, -64)
dragon = NodePath("CollisionShape2D/Dragon")
animation_duration = 10.0

[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, 1)
shape = SubResource("RectangleShape2D_6eaxg")

[node name="Dragon" parent="CollisionShape2D" instance=ExtResource("2_l1h0r")]
position = Vector2(-64, -65)
+9 −1
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ class_name DragonEntity


@export var dragon: DragonSprite
@export_range(3, 20) var animation_duration: float

signal on_pick(dragon_id: int, position: Vector2, hat: Texture2D, shirt: Texture2D, shoes: Texture2D, dragon_name: String)

@@ -11,13 +12,20 @@ var id: int

func _ready() -> void:
	set_process_input(true)
	_play_initial_animation()


func _play_initial_animation() -> void:
	$CollisionShape2D.position = Vector2(get_window().size.x + 200, 0)
	var tween = get_tree().create_tween()
	tween.tween_property($CollisionShape2D, "position", Vector2(0, 0), animation_duration)


func _input_event(viewport, event, shape_idx) -> void:
	if event is InputEventMouseButton \
	and event.button_index == MOUSE_BUTTON_LEFT \
	and event.is_pressed():
		on_pick.emit(id, position, dragon.hat.texture, dragon.shirt.texture, dragon.shoes.texture, dragon.name_label.text)
		on_pick.emit(id, position + $CollisionShape2D.position, dragon.hat.texture, dragon.shirt.texture, dragon.shoes.texture, dragon.name_label.text)
		queue_free()


+37 −3
Original line number Diff line number Diff line
@@ -16,7 +16,12 @@ var _instantiator: DragonInstantiator
var _save_load: SaveLoad
var _library: DragonLibrary

var _dragon_entities: Dictionary = {}
var _dragon_entities: Dictionary[int, Dragon] = {}
var _instantiated_dragons: Dictionary[int, DragonEntity] = {}
var rng: RandomNumberGenerator = RandomNumberGenerator.new()

@export var min_dragon_instantiation_time: float
@export var max_dragon_instantiation_time: float


func _ready():
@@ -27,10 +32,36 @@ func _ready():
	await get_tree().process_frame
	move_window_to_bottom_right()
	_load_game()
	_queue_dragon_instantiation()


func _queue_dragon_instantiation():
	await get_tree().create_timer(rng.randf_range(min_dragon_instantiation_time, max_dragon_instantiation_time)).timeout
	_instantiate_random_dragon()


func _instantiate_random_dragon():
	pass
	for spot in dragon_spots:
		if not _filled_spots.has(spot):
			var dragon: DragonEntity = _pick_random_dragon(spot.position)
			if dragon != null:
				_filled_spots[spot] = dragon.id
				break
	_queue_dragon_instantiation()


func _pick_random_dragon(pos: Vector2) -> DragonEntity:
	for dragon in _library.dragons:
		var id: int = dragon['id']
		if _instantiated_dragons.has(id) or _dragon_entities.has(id):
			continue
		var dragon_name: String = dragon['name']
		var hat: Texture2D = hat_outfits.get_texture(dragon['hat'])
		var shirt: Texture2D = shirt_outfits.get_texture(dragon['shirt'])
		var shoes: Texture2D = shoes_outfits.get_texture(dragon['shoes'])
		return _instantiate_dragon_ingame(pos, hat, shirt, shoes, dragon_name, id)
		
	return null


func move_window_to_bottom_right():
@@ -69,7 +100,7 @@ func _load_game():
	print(_save_load.contents_to_save)


func _instantiate_dragon_ingame(position: Vector2, hat: Texture2D, shirt: Texture2D, shoes: Texture2D, dragon_name: String, id: int):
func _instantiate_dragon_ingame(position: Vector2, hat: Texture2D, shirt: Texture2D, shoes: Texture2D, dragon_name: String, id: int) -> DragonEntity:
	var dragon: DragonEntity = dragon_ingame.instantiate()
	dragon.dress(hat, shirt, shoes)
	dragon.set_dragon_name(dragon_name)
@@ -77,6 +108,8 @@ func _instantiate_dragon_ingame(position: Vector2, hat: Texture2D, shirt: Textur
	dragon.id = id
	dragon.position = position
	dragon.on_pick.connect(_pick_dragon)
	_instantiated_dragons[id] = dragon
	return dragon


func _pick_dragon(id: int, position: Vector2, hat: Texture2D, shirt: Texture2D, shoes: Texture2D, dragon_name: String, drag: bool = true):
@@ -85,6 +118,7 @@ func _pick_dragon(id: int, position: Vector2, hat: Texture2D, shirt: Texture2D,
	_dragon_entities[id] = dragon
	dragon.place_back.connect(_dragon_place_back)
	add_child(dragon)
	_instantiated_dragons.erase(id)
	
	for spot in _filled_spots:
		if _filled_spots[spot] == id:
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ dragon_spots = [NodePath("DragonSpot1"), NodePath("DragonSpot2"), NodePath("Drag
hat_outfits = ExtResource("4_85g3d")
shirt_outfits = ExtResource("5_choun")
shoes_outfits = ExtResource("6_ya4ey")
min_dragon_instantiation_time = 2.0
max_dragon_instantiation_time = 10.0

[node name="CanvasLayer" type="CanvasLayer" parent="."]

+8 −0
Original line number Diff line number Diff line
@@ -7,9 +7,13 @@ var dragging_start_position: Vector2i = Vector2i()

@onready var dragon: Dragon = $".."

var _initial_drag_requested: bool = false


func _ready() -> void:
	set_process_input(true)
	if _initial_drag_requested:
		initial_drag()


func initial_drag():
@@ -17,6 +21,10 @@ func initial_drag():
	dragging = true


func queue_initial_drag():
	_initial_drag_requested = true


func _input(event) -> void:
	if event is not InputEventMouseButton:
		return
Loading