]> git.seodisparate.com - LD55/commitdiff
Work
authorStephen Seo <seo.disparate@gmail.com>
Sun, 14 Apr 2024 06:31:39 +0000 (15:31 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Sun, 14 Apr 2024 06:31:39 +0000 (15:31 +0900)
Tweaks and improvements.

Added a few sprites for battle.

Some setup for battle.

12 files changed:
DungeonEntrance.tscn
MainLogic.gd
export_presets.cfg [new file with mode: 0644]
gander_schwartz.gd
gimp/arrow.png [new file with mode: 0644]
gimp/arrow.png.import [new file with mode: 0644]
gimp/hammer.png [new file with mode: 0644]
gimp/hammer.png.import [new file with mode: 0644]
gimp/sword.png [new file with mode: 0644]
gimp/sword.png.import [new file with mode: 0644]
main_scene.tscn
project.godot

index 9c3cf43a5b1967f43339f47e7d4d6633eba22550..10dc03dca8392b8cbfac9baa21c6b576cb4c2c76 100644 (file)
@@ -19,7 +19,7 @@ normal = Vector2(-1, 0)
 
 [node name="DungeonEntrance" type="Sprite2D" parent="."]
 texture_filter = 1
-position = Vector2(2, -784)
+position = Vector2(0, -784)
 scale = Vector2(1.995, 1.995)
 texture = ExtResource("1_vo6aq")
 
@@ -32,7 +32,7 @@ polygon = PackedVector2Array(-160, 127, -159, -129, 160, -126, 161, 127, 21, 127
 
 [node name="DungeonGuard" type="Sprite2D" parent="."]
 texture_filter = 1
-position = Vector2(2, -552)
+position = Vector2(0, -552)
 scale = Vector2(1.71, 1.71)
 texture = ExtResource("2_nujkm")
 
@@ -50,7 +50,7 @@ position = Vector2(-307, -1)
 shape = SubResource("WorldBoundaryShape2D_ocep5")
 
 [node name="CollisionShape2D2" type="CollisionShape2D" parent="StaticBody2D"]
-position = Vector2(0, 210)
+position = Vector2(0, 243)
 shape = SubResource("WorldBoundaryShape2D_gq7j0")
 
 [node name="CollisionShape2D3" type="CollisionShape2D" parent="StaticBody2D"]
@@ -59,8 +59,8 @@ shape = SubResource("WorldBoundaryShape2D_xvl4y")
 
 [node name="Label" type="Label" parent="."]
 z_index = 5
-offset_left = -111.0
-offset_top = 152.0
-offset_right = 111.0
-offset_bottom = 175.0
+offset_left = -110.0
+offset_top = 208.0
+offset_right = 112.0
+offset_bottom = 231.0
 text = "The Dungeon is to the north!"
index ebda33c80e250636539406c6e5f0b2211a76a26d..bd6155c79228db63af45db40a3d4d7fa9193deeb 100644 (file)
@@ -12,7 +12,7 @@ extends Node2D
 
 @onready var camera = $Camera2D
 
-const camera_move_speed = 80.0
+const camera_move_speed = 1.5
 
 const text_speed = 0.08
 
@@ -21,8 +21,8 @@ const start_text = "You seek the elementals?\nProve your worth!\nShow the elemen
 const intro_text_00 = "The name's Gander Schwartz.\nBut my friends call me the \"Wandering Gander\"."
 const intro_text_01 = "I'm what most would call a \"third-rate summoner\",\nbut there's a reason for that.\nI summon \"items\", not \"beasts\"."
 const intro_text_02 = "Most summoners summon beasts to fight for them.\nI summon items to fight with, or even tools to solve puzzles in dungeons."
-const intro_text_03 = "There is one dungeon I've been itching to conquer.\nThe elemental dungeon!"
-const intro_text_04 = "If I beat the elemental dungeon,\nI'll be able to enhance my summons with elemental properties!"
+const intro_text_03 = "There is one dungeon I've been itching to conquer.\nThe Elemental Dungeon!"
+const intro_text_04 = "If I beat the Elemental Dungeon,\nI'll be able to enhance my summons with elemental properties!"
 const intro_text_05 = "No longer would I need to light an oil lantern with flint and steel,\nor keep lugging around leather skins for water!"
 const intro_text_06 = "But the dungeon is a challenge.\nA challenge I hope to best with my wits and my item summoning!"
 
@@ -56,20 +56,27 @@ enum StateT {
        Dungeon_Entrance_Battle,
 }
 
+enum BattleMenu {
+       MainMenu,
+}
+
 static var state_dict = {}
 
 var tween_volume
 var tween_text
+var tween_scene
 
 var diamonds_gone = false
 
-var music_file
-
 var gander
 
 var level
 var level_guard = null
 
+var level_cached_pos = null
+
+var viewport_size
+
 # Called when the node enters the scene tree for the first time.
 func _ready():
        if not state_dict.has("state"):
@@ -81,6 +88,11 @@ func _ready():
                        "angle" : 0.0
                }
                music_player.play()
+               viewport_size = get_viewport().size
+               get_viewport().size_changed.connect(func():
+                       viewport_size = get_viewport().size
+                       state_dict["battle_refresh_gui"] = true
+               )
 
 func update_text(text, next_state):
        if state_dict["timer"] > text_speed:
@@ -113,9 +125,7 @@ func _process(delta):
                        main_label.text = ""
                        lower_label.text = ""
                        music_player.volume_db = 0.0
-                       music_player.stream = AudioStreamMP3.new()
-                       music_file = FileAccess.open("res://audio/LD55_1.mp3", FileAccess.READ)
-                       music_player.stream.data = music_file.get_buffer(music_file.get_length())
+                       music_player.stream = load("res://audio/LD55_1.mp3")
                        music_player.stream.loop = true
                        music_player.play()
                        var gander_scene = preload("res://gander_schwartz.tscn")
@@ -125,6 +135,8 @@ func _process(delta):
                        gander.position.y = 50
                        gander.velocity.x = -gander.SPEED
                        gander.auto_control_action = "walking_left"
+                       tween_scene = get_tree().create_tween()
+                       tween_scene.tween_method(func(c): RenderingServer.set_default_clear_color(c), Color(0.13, 0.13, 0.13, 1.0), Color(0.3, 0.4, 0.1, 1.0), 4)
                StateT.Introduction_00:
                        update_stop_diamonds(delta)
                        update_text(intro_text_00, StateT.Introduction_00_post)
@@ -174,11 +186,8 @@ func _process(delta):
                                lower_label.text = ""
                                lower_label.self_modulate = Color(1, 1, 1, 1)
                        )
-                       music_file.close()
                        music_player.volume_db = 0.0
-                       music_player.stream = AudioStreamMP3.new()
-                       music_file = FileAccess.open("res://audio/LD55_2.mp3", FileAccess.READ)
-                       music_player.stream.data = music_file.get_buffer(music_file.get_length())
+                       music_player.stream = load("res://audio/LD55_2.mp3")
                        music_player.stream.loop = true
                        music_player.play()
                StateT.Dungeon_Entrance:
@@ -188,6 +197,33 @@ func _process(delta):
                        if level_guard != null and gander.last_collided_id == level_guard.get_instance_id():
                                print("collided with guard.")
                                gander.last_collided_id = null
+                               music_player.stop()
+                               music_player.stream = preload("res://audio/LD55_3.mp3")
+                               music_player.stream.loop = true
+                               music_player.play()
+                               level.find_child("DungeonGuardCollider").set_deferred("disabled", true)
+                               gander.find_child("CollisionShape2D").set_deferred("disabled", true)
+                               gander.player_controlled = false
+                               gander.current_scene_type = gander.GanderSceneT.Battle
+                               tween_scene = get_tree().create_tween()
+                               level_cached_pos = level.find_child("DungeonEntrance").position
+                               var battle_pos = level_cached_pos + Vector2(0.0, 500.0)
+                               tween_scene.set_parallel()
+                               tween_scene.tween_property(level.find_child("DungeonGuard"), "position", battle_pos - Vector2(200.0, 30.0), 2.0)
+                               tween_scene.tween_property(gander, "position", battle_pos + Vector2(200.0, 0.0), 2.0)
+                               gander.auto_control_action = "walking_right"
+                               tween_scene.set_parallel(false)
+                               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_menu_setup"] = false
+                                       state_dict["battle_refresh_gui"] = false
+                                       state_dict["battle_item"] = null
+                               )
+               StateT.Dungeon_Entrance_Battle:
+                       camera_to_target(delta, level_cached_pos + Vector2(0.0, 500.0))
+                       setup_battle_menu()
                _:
                        pass
        if gander is MainCharacter and not gander.player_controlled and gander.current_scene_type == gander.GanderSceneT.Introduction:
@@ -198,7 +234,9 @@ func _process(delta):
                
 
 func _unhandled_input(event):
-       if event.is_pressed() and event.is_action("Confirm"):
+       if state_dict["state"] == StateT.Dungeon_Entrance_Battle:
+               handle_battle_input(event)
+       elif event.is_pressed() and event.is_action("Confirm"):
                match state_dict["state"]:
                        StateT.Start:
                                main_label.text = start_text
@@ -335,12 +373,75 @@ func update_stop_diamonds(delta):
        diamond_position_update()
 
 func camera_to_gander(delta):
-       var diff = gander.position - camera.position
-       if diff.length() > 0.04:
-               var move_vec = diff.normalized() * camera_move_speed * delta
-               if diff.length() < move_vec.length():
-                       camera.position = gander.position
-               else:
-                       camera.position += move_vec
-       else:
-               camera.position = gander.position
+       camera_to_target(delta, gander.position)
+
+func camera_to_target(delta, vec2):
+       var diff = vec2 - camera.position
+       camera.position += diff * delta * camera_move_speed
+
+func setup_battle_menu():
+       match state_dict["battle_state"]:
+               BattleMenu.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
+                               var battle_arrow = camera.find_child("BattleArrow")
+                               if battle_arrow == null:
+                                       battle_arrow = Sprite2D.new()
+                                       battle_arrow.set_name(&"BattleArrow")
+                                       battle_arrow.texture = load("res://gimp/arrow.png")
+                                       camera.add_child(battle_arrow, true)
+                                       battle_arrow.set_owner(camera)
+                               var battle_menu_item_0 = camera.find_child("BattleMenuItem0")
+                               if battle_menu_item_0 == null:
+                                       battle_menu_item_0 = Label.new()
+                                       battle_menu_item_0.set_name(&"BattleMenuItem0")
+                                       camera.add_child(battle_menu_item_0, true)
+                                       battle_menu_item_0.set_owner(camera)
+                               var battle_menu_item_1 = camera.find_child("BattleMenuItem1")
+                               if battle_menu_item_1 == null:
+                                       battle_menu_item_1 = Label.new()
+                                       battle_menu_item_1.set_name(&"BattleMenuItem1")
+                                       camera.add_child(battle_menu_item_1, true)
+                                       battle_menu_item_1.set_owner(camera)
+                               if state_dict["battle_item"] == null:
+                                       battle_menu_item_0.text = "Summon Item"
+                                       battle_menu_item_1.text = ""
+                                       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) / 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
+                                       state_dict["battle_selection"] = 0
+                                       state_dict["battle_options"] = ["summon"]
+                               else:
+                                       battle_menu_item_0.text = "Attack with Item"
+                                       battle_menu_item_1.text = "Summon new Item"
+                                       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"] = ["attack", "summon"]
+
+func handle_battle_input(event: InputEvent):
+       if event.is_pressed():
+               if event.is_action("Down"):
+                       state_dict["battle_selection"] += 1
+                       if state_dict["battle_selection"] >= state_dict["battle_options"].size():
+                               state_dict["battle_selection"] = 0
+                       battle_arrow_positioning()
+               elif event.is_action("Up"):
+                       state_dict["battle_selection"] -= 1
+                       if state_dict["battle_selection"] < 0:
+                               state_dict["battle_selection"] = state_dict["battle_options"].size() - 1
+                       battle_arrow_positioning()
+
+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"]))
diff --git a/export_presets.cfg b/export_presets.cfg
new file mode 100644 (file)
index 0000000..2883165
--- /dev/null
@@ -0,0 +1,39 @@
+[preset.0]
+
+name="Linux/X11"
+platform="Linux/X11"
+runnable=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+export_path="../../GodotExported/LD55/LD55.x86_64"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+binary_format/embed_pck=false
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
+binary_format/architecture="x86_64"
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="#!/usr/bin/env bash
+export DISPLAY=:0
+unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
+\"{temp_dir}/{exe_name}\" {cmd_args}"
+ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
+kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
+rm -rf \"{temp_dir}\""
index de4054145e15bbb078332c360e334f5cfe3fc691..9e557fdcb2da4c8e725fabed4f367da1b2df6eba 100644 (file)
@@ -6,6 +6,7 @@ var player_controlled = false
 enum GanderSceneT {
        Introduction,
        Gameplay,
+       Battle,
 }
 var current_scene_type = GanderSceneT.Introduction
 var auto_control_action = "facing_front"
@@ -13,7 +14,6 @@ var auto_control_action = "facing_front"
 var last_collided_id = null
 
 @onready var animated = $AnimatedSprite2D
-@onready var guard = $DungeonGuard
 
 const SPEED = 150.0
 const ANIM_DEADZONE = 0.3
@@ -60,9 +60,10 @@ func _physics_process(delta):
        elif animated.animation != auto_control_action:
                animated.play(auto_control_action)
 
-       move_and_slide()
-       var last_collision = get_last_slide_collision()
-       if last_collision != null:
-               last_collided_id = last_collision.get_collider_id()
-       else:
-               last_collided_id = null
+       if current_scene_type != GanderSceneT.Battle:
+               move_and_slide()
+               var last_collision = get_last_slide_collision()
+               if last_collision != null:
+                       last_collided_id = last_collision.get_collider_id()
+               else:
+                       last_collided_id = null
diff --git a/gimp/arrow.png b/gimp/arrow.png
new file mode 100644 (file)
index 0000000..87054ca
Binary files /dev/null and b/gimp/arrow.png differ
diff --git a/gimp/arrow.png.import b/gimp/arrow.png.import
new file mode 100644 (file)
index 0000000..c39fa10
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7ey8ay7etot7"
+path="res://.godot/imported/arrow.png-1ff2c1793b6898e6750b81c11b16be86.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://gimp/arrow.png"
+dest_files=["res://.godot/imported/arrow.png-1ff2c1793b6898e6750b81c11b16be86.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/gimp/hammer.png b/gimp/hammer.png
new file mode 100644 (file)
index 0000000..d3571f0
Binary files /dev/null and b/gimp/hammer.png differ
diff --git a/gimp/hammer.png.import b/gimp/hammer.png.import
new file mode 100644 (file)
index 0000000..00a9588
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6ci7lm15okhr"
+path="res://.godot/imported/hammer.png-430b8e98de82f10ad08a61167ab515de.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://gimp/hammer.png"
+dest_files=["res://.godot/imported/hammer.png-430b8e98de82f10ad08a61167ab515de.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/gimp/sword.png b/gimp/sword.png
new file mode 100644 (file)
index 0000000..defcc45
Binary files /dev/null and b/gimp/sword.png differ
diff --git a/gimp/sword.png.import b/gimp/sword.png.import
new file mode 100644 (file)
index 0000000..3fc8c65
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bemf77dxebgw1"
+path="res://.godot/imported/sword.png-10267e2e65de70563df10750bee7e827.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://gimp/sword.png"
+dest_files=["res://.godot/imported/sword.png-10267e2e65de70563df10750bee7e827.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
index 7b8fe7fd8d273c80dc590efad1058d113a13483a..5408bf4e5caa58c0c9993b03dfb79dcd0656d5bc 100644 (file)
@@ -1,4 +1,4 @@
-[gd_scene load_steps=7 format=3 uid="uid://ch52ervf073wd"]
+[gd_scene load_steps=8 format=3 uid="uid://ch52ervf073wd"]
 
 [ext_resource type="Script" path="res://MainLogic.gd" id="1_43no1"]
 [ext_resource type="Texture2D" uid="uid://varqu7luxowf" path="res://gimp/earth_diamond.png" id="2_hlcsm"]
@@ -6,6 +6,7 @@
 [ext_resource type="Texture2D" uid="uid://djwgnisoid4co" path="res://gimp/water_diamond.png" id="4_u6w6s"]
 [ext_resource type="Texture2D" uid="uid://d2mxjcl50laoa" path="res://gimp/wind_diamond.png" id="5_3irym"]
 [ext_resource type="AudioStream" uid="uid://2epey2fmmtb2" path="res://audio/LD55_0.mp3" id="6_3kpot"]
+[ext_resource type="Texture2D" uid="uid://bemf77dxebgw1" path="res://gimp/sword.png" id="7_v3xw4"]
 
 [node name="Node2D" type="Node2D"]
 script = ExtResource("1_43no1")
@@ -44,3 +45,7 @@ texture = ExtResource("5_3irym")
 
 [node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
 stream = ExtResource("6_3kpot")
+
+[node name="Sword" type="Sprite2D" parent="."]
+position = Vector2(-669, 382)
+texture = ExtResource("7_v3xw4")
index 4c3e65936f2077e66fb7b74672bd6bc8fee4f818..2dfaca14553bbd739cf0bc07a578335efed0a3c2 100644 (file)
@@ -13,7 +13,9 @@ config_version=5
 config/name="LD55"
 run/main_scene="res://main_scene.tscn"
 config/features=PackedStringArray("4.2", "GL Compatibility")
+boot_splash/bg_color=Color(0.141176, 0.141176, 0.141176, 1)
 config/icon="res://icon.svg"
+boot_splash/minimum_display_time=1000
 
 [input]