@onready var earth_diamond = $EarthDiamond
@onready var music_player = $MusicPlayer
+@onready var sfx_player = $SFXPlayer
+var sfx_select
+var sfx_confirm
+var sfx_cancel
@onready var camera = $Camera2D
Dungeon_Entrance_Battle,
}
-enum BattleMenu {
+enum BattleState {
MainMenu,
+ SummonMenu,
+ SummonSword,
+ SummonHammer,
+ EnemyAttack,
}
static var state_dict = {}
viewport_size = get_viewport().size
state_dict["battle_refresh_gui"] = true
)
+ sfx_select = load("res://audio/LD55_sfx_select.mp3")
+ sfx_confirm = load("res://audio/LD55_sfx_confirm.mp3")
+ sfx_cancel = load("res://audio/LD55_sfx_cancel.mp3")
func update_text(text, next_state):
if state_dict["timer"] > text_speed:
tween_scene.tween_callback(func():
gander.auto_control_action = "facing_left"
state_dict["state"] = StateT.Dungeon_Entrance_Battle
- state_dict["battle_state"] = BattleMenu.MainMenu
+ state_dict["battle_state"] = BattleState.MainMenu
state_dict["battle_menu_setup"] = false
state_dict["battle_refresh_gui"] = false
state_dict["battle_item"] = null
+ var indicator_arrow = Sprite2D.new()
+ indicator_arrow.texture = load("res://gimp/arrow.png")
+ indicator_arrow.position.x = (indicator_arrow.get_rect().size.x - viewport_size.x) / 2.0
+ indicator_arrow.position.y = (viewport_size.y - indicator_arrow.get_rect().size.y) / 2.0
+ camera.add_child(indicator_arrow)
+ indicator_arrow.set_owner(camera)
+ tween_text = get_tree().create_tween()
+ tween_text.set_parallel()
+ tween_text.tween_property(indicator_arrow, "scale", Vector2(20.0, 20.0), 1.5)
+ tween_text.tween_property(indicator_arrow, "self_modulate", Color(1, 1, 1, 0), 1.5)
+ tween_text.set_parallel(false)
+ tween_text.tween_callback(func():
+ camera.remove_child(indicator_arrow)
+ )
)
StateT.Dungeon_Entrance_Battle:
camera_to_target(delta, level_cached_pos + Vector2(0.0, 500.0))
func setup_battle_menu():
match state_dict["battle_state"]:
- BattleMenu.MainMenu:
+ BattleState.MainMenu:
if not state_dict["battle_menu_setup"] or state_dict["battle_refresh_gui"]:
state_dict["battle_menu_setup"] = true
state_dict["battle_refresh_gui"] = false
battle_arrow.texture = load("res://gimp/arrow.png")
camera.add_child(battle_arrow, true)
battle_arrow.set_owner(camera)
+ battle_arrow.self_modulate = Color(1, 1, 1, 1)
var battle_menu_item_0 = camera.find_child("BattleMenuItem0")
if battle_menu_item_0 == null:
battle_menu_item_0 = Label.new()
battle_menu_item_1.position.y = battle_arrow.position.y + arrow_rect.size.y
state_dict["battle_selection"] = 0
state_dict["battle_options"] = ["attack", "summon"]
+ BattleState.SummonMenu:
+ if not state_dict["battle_menu_setup"] or state_dict["battle_refresh_gui"]:
+ state_dict["battle_menu_setup"] = true
+ state_dict["battle_refresh_gui"] = false
+ var battle_arrow = camera.find_child("BattleArrow")
+ var battle_menu_item_0 = camera.find_child("BattleMenuItem0")
+ var battle_menu_item_1 = camera.find_child("BattleMenuItem1")
+ battle_arrow.self_modulate = Color(1, 1, 1, 1)
+ battle_menu_item_0.text = "Summon Sword"
+ battle_menu_item_1.text = "Summon Hammer"
+ var arrow_rect = battle_arrow.get_rect()
+ battle_arrow.position.x = (arrow_rect.size.x - viewport_size.x) / 2.0
+ battle_arrow.position.y = (viewport_size.y - arrow_rect.size.y * 3.0) / 2.0
+ battle_menu_item_0.position.x = arrow_rect.size.x - viewport_size.x / 2.0
+ battle_menu_item_0.position.y = battle_arrow.position.y
+ battle_menu_item_1.position.x = arrow_rect.size.x - viewport_size.x / 2.0
+ battle_menu_item_1.position.y = battle_arrow.position.y + arrow_rect.size.y
+ state_dict["battle_selection"] = 0
+ state_dict["battle_options"] = ["summon_sword", "summon_hammer"]
+ BattleState.SummonSword:
+ var summon_node = find_child("SummonAttempt")
+ if summon_node.success_count >= summon_node.MAX_SUCCESS:
+ camera.remove_child(summon_node)
+ var summon_item = find_child("SummonItem")
+ if summon_item == null:
+ summon_item = Sprite2D.new()
+ summon_item.texture = load("res://gimp/sword.png")
+ summon_item.set_name(&"SummonItem")
+ gander.add_child(summon_item, true)
+ summon_item.set_owner(gander)
+ else:
+ summon_item.texture = load("res://gimp/sword.png")
+ gander.summon_item = summon_item
+ state_dict["battle_state"] = BattleState.EnemyAttack
+ elif summon_node.error_count >= summon_node.MAX_ERRORS:
+ tween_scene = get_tree().create_tween()
+ tween_scene.tween_method(func(c): for i in range(8): summon_node.summon_arrows_arr[i].self_modulate = c, Color(1.0, 0.0, 0.0), Color(1.0, 0.0, 0.0, 0.0), 1.0)
+ tween_scene.tween_callback(func(): camera.remove_child(summon_node))
+ state_dict["battle_state"] = BattleState.EnemyAttack
+ BattleState.SummonHammer:
+ var summon_node = find_child("SummonAttempt")
+ if summon_node.success_count >= summon_node.MAX_SUCCESS:
+ camera.remove_child(summon_node)
+ var summon_item = find_child("SummonItem")
+ if summon_item == null:
+ summon_item = Sprite2D.new()
+ summon_item.texture = load("res://gimp/hammer.png")
+ summon_item.set_name(&"SummonItem")
+ gander.add_child(summon_item, true)
+ summon_item.set_owner(gander)
+ else:
+ summon_item.texture = load("res://gimp/hammer.png")
+ gander.summon_item = summon_item
+ state_dict["battle_state"] = BattleState.EnemyAttack
+ elif summon_node.error_count >= summon_node.MAX_ERRORS:
+ tween_scene = get_tree().create_tween()
+ tween_scene.tween_method(func(c): for i in range(8): summon_node.summon_arrows_arr[i].self_modulate = c, Color(1.0, 0.0, 0.0), Color(1.0, 0.0, 0.0, 0.0), 1.0)
+ tween_scene.tween_callback(func(): camera.remove_child(summon_node))
+ state_dict["battle_state"] = BattleState.EnemyAttack
+ BattleState.EnemyAttack:
+ var battle_arrow = camera.find_child("BattleArrow")
+ var battle_menu_item_0 = camera.find_child("BattleMenuItem0")
+ var battle_menu_item_1 = camera.find_child("BattleMenuItem1")
+ battle_arrow.self_modulate = Color(1, 1, 1, 0)
+ battle_menu_item_0.text = ""
+ battle_menu_item_1.text = ""
func handle_battle_input(event: InputEvent):
+ if state_dict["battle_state"] == BattleState.SummonSword or state_dict["battle_state"] == BattleState.SummonHammer:
+ return
if event.is_pressed():
if event.is_action("Down"):
state_dict["battle_selection"] += 1
if state_dict["battle_selection"] < 0:
state_dict["battle_selection"] = state_dict["battle_options"].size() - 1
battle_arrow_positioning()
+ elif event.is_action("Confirm"):
+ handle_battle_action(state_dict["battle_options"][state_dict["battle_selection"]])
+ elif event.is_action("Cancel"):
+ handle_battle_action("cancel")
+
+func handle_battle_action(action):
+ match action:
+ "attack":
+ sfx_player.stream = sfx_confirm
+ sfx_player.play()
+ "summon":
+ state_dict["battle_state"] = BattleState.SummonMenu
+ state_dict["battle_menu_setup"] = false
+ sfx_player.stream = sfx_confirm
+ sfx_player.play()
+ "summon_sword":
+ #var summon_item = find_child("SummonItem")
+ #if summon_item == null:
+ #summon_item = Sprite2D.new()
+ #summon_item.texture = load("res://gimp/sword.png")
+ #summon_item.set_name(&"SummonItem")
+ #gander.add_child(summon_item, true)
+ #summon_item.set_owner(gander)
+ #else:
+ #summon_item.texture = load("res://gimp/sword.png")
+ #gander.summon_item = summon_item
+ #state_dict["battle_state"] = BattleState.EnemyAttack
+ #state_dict["battle_menu_setup"] = false
+ state_dict["battle_state"] = BattleState.SummonSword
+ state_dict["battle_menu_setup"] = false
+ var summon_scene = load("res://summoning.tscn")
+ var summon_node = summon_scene.instantiate()
+ summon_node.set_name(&"SummonAttempt")
+ camera.add_child(summon_node, true)
+ summon_node.set_owner(camera)
+ sfx_player.stream = sfx_confirm
+ sfx_player.play()
+ "summon_hammer":
+ #var summon_item = find_child("SummonItem")
+ #if summon_item == null:
+ #summon_item = Sprite2D.new()
+ #summon_item.texture = load("res://gimp/hammer.png")
+ #summon_item.set_name(&"SummonItem")
+ #gander.add_child(summon_item, true)
+ #summon_item.set_owner(gander)
+ #else:
+ #summon_item.texture = load("res://gimp/hammer.png")
+ #gander.summon_item = summon_item
+ #state_dict["battle_state"] = BattleState.EnemyAttack
+ #state_dict["battle_menu_setup"] = false
+ state_dict["battle_state"] = BattleState.SummonHammer
+ state_dict["battle_menu_setup"] = false
+ var summon_scene = load("res://summoning.tscn")
+ var summon_node = summon_scene.instantiate()
+ summon_node.set_name(&"SummonAttempt")
+ camera.add_child(summon_node, true)
+ summon_node.set_owner(camera)
+ sfx_player.stream = sfx_confirm
+ sfx_player.play()
+ "cancel":
+ state_dict["battle_state"] = BattleState.MainMenu
+ state_dict["battle_menu_setup"] = false
+ sfx_player.stream = sfx_cancel
+ sfx_player.play()
+ _:
+ pass
func battle_arrow_positioning():
var battle_arrow: Sprite2D = camera.find_child("BattleArrow")
if battle_arrow != null:
var arrow_rect = battle_arrow.get_rect()
battle_arrow.position.y = (viewport_size.y + arrow_rect.size.y) / 2.0 - (arrow_rect.size.y * (state_dict["battle_options"].size() - state_dict["battle_selection"]))
+ sfx_player.stream = sfx_select
+ sfx_player.play()
--- /dev/null
+extends Node2D
+
+enum Direction {
+ LEFT,
+ RIGHT,
+ UP,
+ DOWN,
+}
+
+@onready var ar_one = $SummonArrow
+@onready var ar_two = $SummonArrow2
+@onready var ar_three = $SummonArrow3
+@onready var ar_four = $SummonArrow4
+@onready var ar_five = $SummonArrow5
+@onready var ar_six = $SummonArrow6
+@onready var ar_seven = $SummonArrow7
+@onready var ar_eight = $SummonArrow8
+
+@onready var timer_box = $TimerBox
+const TIMER_BOX_WIDTH = 380.0
+
+var summon_arrows_arr = []
+
+var arrow_directions = []
+
+const MAX_ERRORS = 3
+const MAX_SUCCESS = 8
+var error_count = 0
+var success_count = 0
+
+const TIMER_AMOUNT = 5.0
+var timer = 0.0
+
+func int_to_dir(i):
+ match i:
+ 0:
+ return Direction.LEFT
+ 1:
+ return Direction.RIGHT
+ 2:
+ return Direction.UP
+ 3:
+ return Direction.DOWN
+ _:
+ return Direction.DOWN
+
+func dir_to_angle(d: Direction):
+ match d:
+ Direction.LEFT:
+ return 0.0
+ Direction.RIGHT:
+ return PI
+ Direction.UP:
+ return PI / 2.0
+ Direction.DOWN:
+ return PI * 3.0 / 2.0
+
+func _ready():
+ summon_arrows_arr.append(ar_one)
+ summon_arrows_arr.append(ar_two)
+ summon_arrows_arr.append(ar_three)
+ summon_arrows_arr.append(ar_four)
+ summon_arrows_arr.append(ar_five)
+ summon_arrows_arr.append(ar_six)
+ summon_arrows_arr.append(ar_seven)
+ summon_arrows_arr.append(ar_eight)
+ var rng = RandomNumberGenerator.new()
+ for i in range(8):
+ arrow_directions.append(int_to_dir(rng.randi_range(0, 3)))
+ summon_arrows_arr[i].rotation = dir_to_angle(arrow_directions[i])
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+ timer += delta
+ if timer >= TIMER_AMOUNT:
+ timer = 0.0
+ if success_count < MAX_SUCCESS and error_count < MAX_ERRORS:
+ on_summon_error()
+ if success_count < MAX_SUCCESS and error_count < MAX_ERRORS:
+ var interp_amount = (TIMER_AMOUNT - timer) / TIMER_AMOUNT
+ timer_box.scale.x = interp_amount * TIMER_BOX_WIDTH
+ timer_box.self_modulate = Color((1.0 - interp_amount), interp_amount, 0.0)
+
+func _unhandled_input(event):
+ if error_count >= MAX_ERRORS or success_count >= MAX_SUCCESS:
+ return
+ if event.is_pressed():
+ if event.is_action("Left"):
+ if arrow_directions[success_count] == Direction.LEFT:
+ on_summon_success(success_count)
+ else:
+ on_summon_error()
+ elif event.is_action("Right"):
+ if arrow_directions[success_count] == Direction.RIGHT:
+ on_summon_success(success_count)
+ else:
+ on_summon_error()
+ elif event.is_action("Up"):
+ if arrow_directions[success_count] == Direction.UP:
+ on_summon_success(success_count)
+ else:
+ on_summon_error()
+ elif event.is_action("Down"):
+ if arrow_directions[success_count] == Direction.DOWN:
+ on_summon_success(success_count)
+ else:
+ on_summon_error()
+
+func on_summon_success(idx):
+ summon_arrows_arr[idx].self_modulate = Color(0.0, 1.0, 0.0)
+ success_count += 1
+
+func on_summon_error():
+ timer = 0.0
+ success_count = 0
+ error_count += 1
+ if error_count >= MAX_ERRORS:
+ for i in range(8):
+ summon_arrows_arr[i].self_modulate = Color(1.0, 0.0, 0.0)
+ else:
+ for i in range(8):
+ summon_arrows_arr[i].self_modulate = Color(1.0, 1.0, 1.0)
--- /dev/null
+[gd_scene load_steps=4 format=3 uid="uid://b7tummdg08cfc"]
+
+[ext_resource type="Script" path="res://summoning.gd" id="1_qh1sn"]
+[ext_resource type="Texture2D" uid="uid://dvyxj067n812g" path="res://gimp/summon_arrow.png" id="2_io4qw"]
+
+[sub_resource type="CanvasTexture" id="CanvasTexture_oraey"]
+
+[node name="Node2D" type="Node2D"]
+script = ExtResource("1_qh1sn")
+
+[node name="SummonArrow" type="Sprite2D" parent="."]
+position = Vector2(-136, -56)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow2" type="Sprite2D" parent="."]
+position = Vector2(-46, -56)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow3" type="Sprite2D" parent="."]
+position = Vector2(47, -55)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow4" type="Sprite2D" parent="."]
+position = Vector2(143, -56)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow5" type="Sprite2D" parent="."]
+position = Vector2(-144, 57)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow6" type="Sprite2D" parent="."]
+position = Vector2(-49, 56)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow7" type="Sprite2D" parent="."]
+position = Vector2(47, 57)
+texture = ExtResource("2_io4qw")
+
+[node name="SummonArrow8" type="Sprite2D" parent="."]
+position = Vector2(136, 58)
+texture = ExtResource("2_io4qw")
+
+[node name="Label" type="Label" parent="."]
+offset_left = -187.0
+offset_top = -140.0
+offset_right = 188.0
+offset_bottom = -100.0
+theme_override_font_sizes/font_size = 24
+text = "Press the directions to summon!"
+
+[node name="TimerBox" type="Sprite2D" parent="."]
+position = Vector2(0, 135)
+scale = Vector2(380, 50)
+texture = SubResource("CanvasTexture_oraey")