From 2a236ea041def2f53997242682e7133289f11c2f Mon Sep 17 00:00:00 2001 From: Bo Thompson Date: Wed, 27 Aug 2025 08:02:11 -0400 Subject: [PATCH] Extensive work on the sideview and initial work on player profiles, inventory display, and renaming adventurerdata vs adventurer to adventurer vs adventurersprite --- .../Base_Default/default_layout_base.gd | 4 +- data/statblock.gd | 19 + data/statblock.gd.uid | 1 + dialogic/timelines/letter.dtl | 2 + dialogic/timelines/letter.dtl.uid | 1 + external/test-qsvchar.gif | Bin 0 -> 11595 bytes external/test-qsvchar.png | Bin 0 -> 8124 bytes graphics/questview/goo.png | Bin 0 -> 1041 bytes graphics/questview/goo.png.import | 40 + graphics/ui/time-frame.png | Bin 0 -> 333 bytes graphics/ui/time-frame.png.import | 40 + project.godot | 8 +- scenes/letter.tscn | 252 ++++++ scripts/adventurer.gd | 138 +-- scripts/adventurer.gd.uid | 2 +- scripts/adventurer_data.gd | 78 -- scripts/adventurer_data.gd.uid | 1 - scripts/adventurer_profile_window.gd | 40 + scripts/adventurer_profile_window.gd.uid | 1 + scripts/adventurer_sprite.gd | 74 ++ scripts/adventurer_sprite.gd.uid | 1 + scripts/enemy.gd | 7 + scripts/enemy.gd.uid | 1 + scripts/game_manager.gd | 33 +- scripts/guild.gd | 12 +- scripts/guild_employee.gd | 2 +- scripts/guild_queue.gd | 12 +- scripts/guildhall.gd | 2 +- scripts/item_slot.gd | 12 +- scripts/main_panel.gd | 18 + scripts/member_panel_entry.gd | 4 +- scripts/npc.gd | 2 +- scripts/npc_profile_window.gd | 50 +- scripts/player.gd | 4 +- scripts/profile_window.gd | 14 +- scripts/quest.gd | 157 +++- scripts/quest_progress_bar.gd | 25 +- scripts/quest_sprite.gd | 38 + scripts/quest_sprite.gd.uid | 1 + scripts/quest_view.gd | 33 + scripts/quest_view.gd.uid | 1 + scripts/questor_sprite.gd | 33 + scripts/questor_sprite.gd.uid | 1 + scripts/test_scene.gd | 7 +- scripts/top_menu.gd | 2 +- scripts/waypoint.gd | 5 + templates/enemies/goo.tscn | 21 + templates/guildhall.tscn | 2 - templates/main_panel.tscn | 32 +- templates/player_profile_window.tscn | 839 ++++++++++++++++++ templates/quest_view.tscn | 89 ++ templates/quest_view_window.tscn | 149 +--- templates/questor_sprite.tscn | 78 ++ templates/test_adventurer.tscn | 2 +- templates/test_adventurer_sprite.tscn | 2 +- 55 files changed, 1975 insertions(+), 417 deletions(-) create mode 100644 data/statblock.gd create mode 100644 data/statblock.gd.uid create mode 100644 dialogic/timelines/letter.dtl create mode 100644 dialogic/timelines/letter.dtl.uid create mode 100644 external/test-qsvchar.gif create mode 100644 external/test-qsvchar.png create mode 100644 graphics/questview/goo.png create mode 100644 graphics/questview/goo.png.import create mode 100644 graphics/ui/time-frame.png create mode 100644 graphics/ui/time-frame.png.import create mode 100644 scenes/letter.tscn delete mode 100644 scripts/adventurer_data.gd delete mode 100644 scripts/adventurer_data.gd.uid create mode 100644 scripts/adventurer_profile_window.gd create mode 100644 scripts/adventurer_profile_window.gd.uid create mode 100644 scripts/adventurer_sprite.gd create mode 100644 scripts/adventurer_sprite.gd.uid create mode 100644 scripts/enemy.gd create mode 100644 scripts/enemy.gd.uid create mode 100644 scripts/quest_sprite.gd create mode 100644 scripts/quest_sprite.gd.uid create mode 100644 scripts/quest_view.gd create mode 100644 scripts/quest_view.gd.uid create mode 100644 scripts/questor_sprite.gd create mode 100644 scripts/questor_sprite.gd.uid create mode 100644 templates/enemies/goo.tscn create mode 100644 templates/player_profile_window.tscn create mode 100644 templates/quest_view.tscn create mode 100644 templates/questor_sprite.tscn diff --git a/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd b/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd index af6878c..77edd06 100644 --- a/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd +++ b/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd @@ -7,7 +7,7 @@ extends DialogicLayoutBase @export var follow_viewport: bool = false @export_subgroup("Global") -@export var global_bg_color: Color = Color(0, 0, 0, 0.9) +@export var global_bg_color: Color = Color(0.0, 0.0, 0.0, 0.9) @export var global_font_color: Color = Color("white") @export_file('*.ttf', '*.tres') var global_font: String = "" @export var global_font_size: int = 18 @@ -17,5 +17,3 @@ func _apply_export_overrides() -> void: # apply layer set(&'layer', canvas_layer) set(&'follow_viewport_enabled', follow_viewport) - - diff --git a/data/statblock.gd b/data/statblock.gd new file mode 100644 index 0000000..60d101d --- /dev/null +++ b/data/statblock.gd @@ -0,0 +1,19 @@ +class_name StatBlock extends Resource + +@export var STR : int = 1 +@export var DEX : int = 1 +@export var INT : int = 1 +@export var CHA : int = 1 +@export var FAI : int = 1 +@export var LUK : int = 1 + + +static func copy(block : StatBlock) -> StatBlock: + var b = StatBlock.new() + b.STR = block.STR + b.DEX = block.DEX + b.INT = block.INT + b.CHA = block.CHA + b.FAI = block.FAI + b.LUK = block.LUK + return b diff --git a/data/statblock.gd.uid b/data/statblock.gd.uid new file mode 100644 index 0000000..87ebcda --- /dev/null +++ b/data/statblock.gd.uid @@ -0,0 +1 @@ +uid://727tgvtmq4nb diff --git a/dialogic/timelines/letter.dtl b/dialogic/timelines/letter.dtl new file mode 100644 index 0000000..be605d8 --- /dev/null +++ b/dialogic/timelines/letter.dtl @@ -0,0 +1,2 @@ +[style] +I never imagined that one day I'd be in charge of a guild. To be honest, I never really imagined what my future would look like. I've never been very good at anything. I just lived every day working the best I could and hoping that somehow, someway, the world would show me what to do. And then my grandma died. diff --git a/dialogic/timelines/letter.dtl.uid b/dialogic/timelines/letter.dtl.uid new file mode 100644 index 0000000..831e30f --- /dev/null +++ b/dialogic/timelines/letter.dtl.uid @@ -0,0 +1 @@ +uid://3kgohx1vl354 diff --git a/external/test-qsvchar.gif b/external/test-qsvchar.gif new file mode 100644 index 0000000000000000000000000000000000000000..26a00adc802dfefbc9d041c4df15f1934b69af64 GIT binary patch literal 11595 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 HDWM4fSee># literal 0 HcmV?d00001 diff --git a/graphics/questview/goo.png.import b/graphics/questview/goo.png.import new file mode 100644 index 0000000..5598374 --- /dev/null +++ b/graphics/questview/goo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1mkagt2y0jah" +path="res://.godot/imported/goo.png-1a22a17096d99476fbfdfc170eeb38f0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/questview/goo.png" +dest_files=["res://.godot/imported/goo.png-1a22a17096d99476fbfdfc170eeb38f0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/graphics/ui/time-frame.png b/graphics/ui/time-frame.png new file mode 100644 index 0000000000000000000000000000000000000000..225cc3a65e8ddc79fa0f6765b43f7f7340b7cf14 GIT binary patch literal 333 zcmV-T0kZyyP)Px$2T4RhR5*>TlQB!fP!vXwuacp3Xb=h+3PN$HZgvproCxl?C>v7RRtBh9 zRnVGXzHoZ&M&kP6NCA8%Ul+hyS&$iV6hIVfyVGrLl!Z>WMHFj$6(GM|1aVYhGlzn- z=c0(C04&q+hJ*3e@^CQ5G7WDPP_68{koLR@nGvT1;QHaH*KQ=ieBq#V+V>xFev$rf fm9rE%rk(i)dRv4h2vW0I00000NkvXXu0mjfLpG4_ literal 0 HcmV?d00001 diff --git a/graphics/ui/time-frame.png.import b/graphics/ui/time-frame.png.import new file mode 100644 index 0000000..6101e7d --- /dev/null +++ b/graphics/ui/time-frame.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwaiuy7yf7tu3" +path="res://.godot/imported/time-frame.png-dff508c214f219e3e4e3d466b31d166b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/ui/time-frame.png" +dest_files=["res://.godot/imported/time-frame.png-dff508c214f219e3e4e3d466b31d166b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/project.godot b/project.godot index 8c94d55..c819dc5 100644 --- a/project.godot +++ b/project.godot @@ -28,7 +28,8 @@ directories/dch_directory={ "pom": "res://dialogic/characters/pom.dch" } directories/dtl_directory={ -"intro": "res://dialogic/timelines/intro.dtl" +"intro": "res://dialogic/timelines/intro.dtl", +"letter": "res://dialogic/timelines/letter.dtl" } glossary/default_case_sensitive=true extensions_folder="res://addons/dialogic_additions" @@ -93,6 +94,11 @@ dialogic_default_action={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) ] } +profile={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"location":0,"echo":false,"script":null) +] +} [limbo_ai] diff --git a/scenes/letter.tscn b/scenes/letter.tscn new file mode 100644 index 0000000..48a4ed0 --- /dev/null +++ b/scenes/letter.tscn @@ -0,0 +1,252 @@ +[gd_scene load_steps=2 format=3 uid="uid://dytxmk3tg3jg7"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hfigq"] +bg_color = Color(0.47, 0.34466666, 0, 0.38431373) +corner_detail = 1 +expand_margin_left = 1.0 +expand_margin_top = 1.0 +expand_margin_right = 1.0 +expand_margin_bottom = 1.0 + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect2" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 426.99997 +offset_top = 362.0 +offset_right = 1527.0 +offset_bottom = 762.0 +rotation = 0.063534126 +color = Color(0.75, 0.615, 0.48, 1) + +[node name="ColorRect3" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 491.99997 +offset_top = 104.0 +offset_right = 1361.0 +offset_bottom = 1114.0 +rotation = -0.09339391 +color = Color(0, 0, 0, 0.3764706) + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 467.99997 +offset_top = 77.99999 +offset_right = 1338.0 +offset_bottom = 1078.0 +rotation = -0.09339391 +color = Color(1, 0.92333335, 0.77, 1) + +[node name="Label" type="Label" parent="ColorRect"] +layout_mode = 0 +offset_left = 17.0 +offset_top = 100.0 +offset_right = 850.0 +offset_bottom = 985.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 24 +text = "To My Dear Grandchild: + +If you're receiving this letter, you should know I've either been declared +dead or missing. Try not to cry dear, it will only embarrass us both if I +show back up later. I'm sure you don't remember me too well. That's +mostly my fault. I've always been an adventurer at heart and regret +never spending as much time on my family as my adventurers. + +Enough of that. Of all of my family, you are the child I have decided +to leave the charter to my guild gate. I know, I know, you have never +been an adventurer. Neither was I when I started! Truly, every story +your parents told me about you only convinced me more that you +(yes YOU) were the grandchild most like me. You haven't always been +very dedicated or good at staying on task. Me neither! But as I think +you will learn, sometimes caring for the needs of others is the recipe +for figuring out how to make progress on the things that matter to us. +It was for me and I hope it will be for you as well. + + + +PS: Fill out the magic guild card I included with this letter. +It will register you in the adventurer's guild! + +PPS: Also pay the bill! Sorry, nana wasn't good with numbers. XOXO" + +[node name="Label2" type="Label" parent="ColorRect"] +layout_mode = 0 +offset_left = 533.0 +offset_top = 764.0 +offset_right = 670.0 +offset_bottom = 835.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 24 +text = "All My Love, +Nana " +horizontal_alignment = 2 + +[node name="HSeparator" type="HSeparator" parent="ColorRect"] +layout_mode = 0 +offset_left = 1.2114974 +offset_top = 351.64548 +offset_right = 871.2115 +offset_bottom = 355.64548 +theme_override_styles/separator = SubResource("StyleBoxFlat_hfigq") + +[node name="HSeparator2" type="HSeparator" parent="ColorRect"] +layout_mode = 0 +offset_left = 1.207931 +offset_top = 684.094 +offset_right = 871.20795 +offset_bottom = 688.094 +theme_override_styles/separator = SubResource("StyleBoxFlat_hfigq") + +[node name="Control" type="Control" parent="."] +visible = false +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="ColorRect2" type="ColorRect" parent="Control"] +layout_mode = 0 +offset_left = 523.0 +offset_top = 319.0 +offset_right = 1423.0 +offset_bottom = 819.0 +color = Color(0, 0, 0, 0.44705883) + +[node name="ColorRect" type="ColorRect" parent="Control"] +layout_mode = 0 +offset_left = 499.0 +offset_top = 298.0 +offset_right = 1399.0 +offset_bottom = 798.0 +color = Color(0.92, 0.7918133, 0.5704, 1) + +[node name="PortraitSpot" type="ColorRect" parent="Control"] +layout_mode = 0 +offset_left = 523.0 +offset_top = 320.0 +offset_right = 651.0 +offset_bottom = 448.0 +color = Color(0.63, 0.63, 0.63, 1) + +[node name="Label" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 662.0 +offset_top = 317.0 +offset_right = 713.0 +offset_bottom = 340.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Guild Member Registration" + +[node name="Label2" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 662.0 +offset_top = 338.0 +offset_right = 917.0 +offset_bottom = 361.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Name: _____________________________" + +[node name="Label3" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 662.0 +offset_top = 365.0 +offset_right = 917.0 +offset_bottom = 388.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Pronouns" + +[node name="Label4" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 533.0 +offset_top = 727.0 +offset_right = 788.0 +offset_bottom = 750.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Signature: _______________________________________________________________________________________" + +[node name="Label5" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 533.0 +offset_top = 507.0 +offset_right = 1214.0 +offset_bottom = 530.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 24 +text = "I do solemnly swear to adventure safely but surely, to defend wisely +but truly, and to meet every challenge with the valor and dignity of +my station." + +[node name="Label6" type="Label" parent="Control"] +layout_mode = 0 +offset_left = 525.0 +offset_top = 459.0 +offset_right = 1206.0 +offset_bottom = 482.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Branch: Nestor's Village" + +[node name="OptionButton" type="OptionButton" parent="Control"] +layout_mode = 0 +offset_left = 662.0 +offset_top = 392.0 +offset_right = 694.0 +offset_bottom = 412.0 +selected = 0 +item_count = 4 +popup/item_0/text = "She" +popup/item_0/id = 1 +popup/item_1/text = "He" +popup/item_1/id = 0 +popup/item_2/text = "They" +popup/item_2/id = 2 +popup/item_3/text = "It" +popup/item_3/id = 3 + +[node name="OptionButton2" type="OptionButton" parent="Control"] +layout_mode = 0 +offset_left = 746.0 +offset_top = 392.0 +offset_right = 822.0 +offset_bottom = 423.0 +selected = 0 +item_count = 4 +popup/item_0/text = "Her" +popup/item_0/id = 1 +popup/item_1/text = "Him" +popup/item_1/id = 0 +popup/item_2/text = "Them" +popup/item_2/id = 2 +popup/item_3/text = "It" +popup/item_3/id = 3 + +[node name="OptionButton3" type="OptionButton" parent="Control"] +layout_mode = 0 +offset_left = 835.0 +offset_top = 392.0 +offset_right = 915.0 +offset_bottom = 423.0 +selected = 0 +allow_reselect = true +item_count = 4 +popup/item_0/text = "Hers" +popup/item_0/id = 1 +popup/item_1/text = "His" +popup/item_1/id = 0 +popup/item_2/text = "Theirs" +popup/item_2/id = 2 +popup/item_3/text = "Its" +popup/item_3/id = 3 + +[node name="PortraitSpot2" type="ColorRect" parent="Control"] +layout_mode = 0 +offset_left = 1239.0 +offset_top = 638.0 +offset_right = 1367.0 +offset_bottom = 766.0 +color = Color(0.63, 0.63, 0.63, 1) diff --git a/scripts/adventurer.gd b/scripts/adventurer.gd index 7c928d1..4c630e3 100644 --- a/scripts/adventurer.gd +++ b/scripts/adventurer.gd @@ -1,74 +1,74 @@ -class_name Adventurer extends Npc +class_name Adventurer extends Node -func _ready() -> void: - nav_agent.navigation_finished.connect(_on_nav_agent_finished) - pass -func _physics_process(delta: float) -> void: - if nav_agent.is_navigation_finished(): - if interaction_target: - try_interact(interaction_target) - #If they have an interaction target within range - #clear the target - #try_interact +enum Gender{ + MASC, + FEMME, + NONBINARY +} + +var given_name : String = "Test" +var surname : String = "Testing" +var gender : Gender = Gender.MASC +var life : int = 1 +var max_life : int = 1 +var energy : int = 1 +var max_energy : int = 1 +var level : int = 1 +var exp : int = 0 +var job : JobData +var stats : StatBlock +var gold : int = 0 +var quest : Quest +var weapon : Weapon +var armor : Armor +var accessory : Accessory +var inventory : Dictionary[Vector2, Item] = {} +var inventory_size : Vector2i = Vector2i(6,1) + +var quest_sprite : QuestSprite + +func _init() -> void: + stats = StatBlock.new() + +func generate() -> void: + if job == null: return - var curr_pos: Vector2 = global_position - var next_path_pos: Vector2 = nav_agent.get_next_path_position() + stats.STR = randi_range(job.min_STR, job.max_STR) + stats.DEX = randi_range(job.min_DEX, job.max_DEX) + stats.INT = randi_range(job.min_INT, job.max_INT) + stats.CHA = randi_range(job.min_CHA, job.max_CHA) + stats.FAI = randi_range(job.min_FAI, job.max_FAI) + stats.LUK = randi_range(job.min_LUK, job.max_LUK) - velocity = curr_pos.direction_to(next_path_pos) * movement_speed - move_and_slide() - #If they virtually didn't move - if !stuck: - if (global_position - last_position).length_squared() < 5: - stuck = true - stuck_time_remaining = 1 + max_life = stats.STR * 10 + stats.CHA * 10 + max_energy = stats.INT * 10 + stats.FAI * 10 + life = max_life + energy = max_energy + +func assign_quest(quest : Quest) -> void: + self.quest = quest + quest.initiate(self) + +func full_name() -> String: + return given_name + " " + surname + +func gain_level() -> void: + level += 1 + #TODO: Make stats improve based on job + Game.notice("%s has reached level %d!" % [full_name(), level]) + +func gain_exp(amount : int) -> void: + exp += amount + while exp >= get_tnl(): + exp -= get_tnl() + gain_level() + +func gain_gold(amount :int) -> void: + gold += amount + +func get_tnl() -> int: + if job: + return job.get_tnl(level) else: - if stuck_time_remaining > 0: - stuck_time_remaining -= delta - if stuck_time_remaining <= 0: - nav_agent.target_position = global_position - navigation_failed.emit() - last_position = global_position - -func approach(pos : Vector2) -> void: - stuck = false - var rid = get_world_2d().get_navigation_map() - var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos) - set_movement_target(point) - -func approach_and_interact(obj : Interactable) -> void: - set_movement_target(obj.global_position) - nav_agent.target_desired_distance = interaction_range - 5 - interaction_target = obj - -func try_interact(obj : Interactable) -> void: - var df = obj.global_position - global_position - if df.length() > interaction_range: - approach_and_interact(obj) - else: - interact(obj) - interaction_target = null - -func interact(obj : Interactable) -> void: - obj.interact(self) - -func set_movement_target(target : Vector2) -> void: - nav_agent.target_position = target - -func show_speech_bubble(bubble_type : String) -> void: - bubble.try_show_speech(bubble_type) - - - -func _on_nav_agent_finished() -> void: - navigation_finished.emit() - - -func _on_mouse_entered() -> void: - profile_popup = popup_template.instantiate() - add_child(profile_popup) - profile_popup.setup(data.name, data.level, data.job.name, activity) - - -func _on_mouse_exited() -> void: - profile_popup.queue_free() + return level * 10 diff --git a/scripts/adventurer.gd.uid b/scripts/adventurer.gd.uid index 796ee2b..853197c 100644 --- a/scripts/adventurer.gd.uid +++ b/scripts/adventurer.gd.uid @@ -1 +1 @@ -uid://cjqumk0kw2vte +uid://0jl2qbvtmsik diff --git a/scripts/adventurer_data.gd b/scripts/adventurer_data.gd deleted file mode 100644 index a8a2288..0000000 --- a/scripts/adventurer_data.gd +++ /dev/null @@ -1,78 +0,0 @@ -class_name AdventurerData extends Node - -class StatBlock: - var STR : int = 1 - var DEX : int = 1 - var INT : int = 1 - var CHA : int = 1 - var FAI : int = 1 - var LUK : int = 1 - -enum Gender{ - MASC, - FEMME, - NONBINARY -} - -var given_name : String = "Test" -var surname : String = "Testing" -var gender : Gender = Gender.MASC -var life : int = 1 -var max_life : int = 1 -var energy : int = 1 -var max_energy : int = 1 -var level : int = 1 -var exp : int = 0 -var job : JobData -var stats : StatBlock -var gold : int = 0 -var quest : Quest -var weapon : Weapon -var armor : Armor -var accessory : Accessory -var inventory : Dictionary[Vector2, Item] = {} -var inventory_size : Vector2i = Vector2i(6,1) -func _init() -> void: - stats = StatBlock.new() - -func generate() -> void: - if job == null: - return - stats.STR = randi_range(job.min_STR, job.max_STR) - stats.DEX = randi_range(job.min_DEX, job.max_DEX) - stats.INT = randi_range(job.min_INT, job.max_INT) - stats.CHA = randi_range(job.min_CHA, job.max_CHA) - stats.FAI = randi_range(job.min_FAI, job.max_FAI) - stats.LUK = randi_range(job.min_LUK, job.max_LUK) - - max_life = stats.STR * 10 + stats.CHA * 10 - max_energy = stats.INT * 10 + stats.FAI * 10 - life = max_life - energy = max_energy - -func assign_quest(quest : Quest) -> void: - self.quest = quest - quest.initiate(self) - -func full_name() -> String: - return given_name + " " + surname - -func gain_level() -> void: - level += 1 - #TODO: Make stats improve based on job - Game.notice("%s has reached level %d!" % [full_name(), level]) - -func gain_exp(amount : int) -> void: - exp += amount - while exp >= get_tnl(): - exp -= get_tnl() - gain_level() - -func gain_gold(amount :int) -> void: - gold += amount - -func get_tnl() -> int: - if job: - return job.get_tnl(level) - else: - return level * 10 diff --git a/scripts/adventurer_data.gd.uid b/scripts/adventurer_data.gd.uid deleted file mode 100644 index 853197c..0000000 --- a/scripts/adventurer_data.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://0jl2qbvtmsik diff --git a/scripts/adventurer_profile_window.gd b/scripts/adventurer_profile_window.gd new file mode 100644 index 0000000..45cb683 --- /dev/null +++ b/scripts/adventurer_profile_window.gd @@ -0,0 +1,40 @@ +class_name AdventurerProfileWindow extends ProfileWindow + +var data : Adventurer +@onready var nameLabel = %NameLabel +@onready var jobLabel = %JobLabel +@onready var expLabel : Label = %ExpLabel +@onready var levelLabel :Label = %LevelLabel +@onready var lifeLabel :Label = %LifeLabel +@onready var energyLabel :Label = %EnergyLabel + +@onready var strLabel :Label = %STRLabel +@onready var dexLabel :Label = %DEXLabel +@onready var intLabel :Label = %INTLabel +@onready var chaLabel :Label = %CHALabel +@onready var faiLabel :Label = %FAILabel +@onready var lukLabel :Label = %LUKLabel + + +func setup(adv : Adventurer) -> void: + data = adv + nameLabel.text = data.full_name() + if data.job: + jobLabel.text = data.job.name + else: + jobLabel.text = "ERROR" + levelLabel.text = str(data.level) + expLabel.text = "Exp: %d/%d" % [data.exp, data.get_tnl()] + lifeLabel.text = "Life: " + str(data.life) + "/" + str(data.max_life) + energyLabel.text = "Energy: " + str(data.energy) + "/" + str(data.max_energy) + strLabel.text = str(data.stats.STR) + dexLabel.text = str(data.stats.DEX) + intLabel.text = str(data.stats.INT) + chaLabel.text = str(data.stats.CHA) + faiLabel.text = str(data.stats.FAI) + lukLabel.text = str(data.stats.LUK) + #TODO: Show equipment + populate_items() + +func populate_items() -> void: + pass diff --git a/scripts/adventurer_profile_window.gd.uid b/scripts/adventurer_profile_window.gd.uid new file mode 100644 index 0000000..634d7cc --- /dev/null +++ b/scripts/adventurer_profile_window.gd.uid @@ -0,0 +1 @@ +uid://c0adqs12cwkkc diff --git a/scripts/adventurer_sprite.gd b/scripts/adventurer_sprite.gd new file mode 100644 index 0000000..5a57558 --- /dev/null +++ b/scripts/adventurer_sprite.gd @@ -0,0 +1,74 @@ +class_name AdventurerSprite extends Npc + +func _ready() -> void: + nav_agent.navigation_finished.connect(_on_nav_agent_finished) + pass + +func _physics_process(delta: float) -> void: + if nav_agent.is_navigation_finished(): + if interaction_target: + try_interact(interaction_target) + #If they have an interaction target within range + #clear the target + #try_interact + return + var curr_pos: Vector2 = global_position + var next_path_pos: Vector2 = nav_agent.get_next_path_position() + + velocity = curr_pos.direction_to(next_path_pos) * movement_speed + move_and_slide() + #If they virtually didn't move + if !stuck: + if (global_position - last_position).length_squared() < 5: + stuck = true + stuck_time_remaining = 1 + else: + if stuck_time_remaining > 0: + stuck_time_remaining -= delta + if stuck_time_remaining <= 0: + nav_agent.target_position = global_position + navigation_failed.emit() + last_position = global_position + +func approach(pos : Vector2) -> void: + stuck = false + var rid = get_world_2d().get_navigation_map() + var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos) + set_movement_target(point) + +func approach_and_interact(obj : Interactable) -> void: + set_movement_target(obj.global_position) + nav_agent.target_desired_distance = interaction_range - 5 + interaction_target = obj + +func try_interact(obj : Interactable) -> void: + var df = obj.global_position - global_position + if df.length() > interaction_range: + approach_and_interact(obj) + else: + interact(obj) + interaction_target = null + +func interact(obj : Interactable) -> void: + obj.interact(self) + +func set_movement_target(target : Vector2) -> void: + nav_agent.target_position = target + +func show_speech_bubble(bubble_type : String) -> void: + bubble.try_show_speech(bubble_type) + + + +func _on_nav_agent_finished() -> void: + navigation_finished.emit() + + +func _on_mouse_entered() -> void: + profile_popup = popup_template.instantiate() + add_child(profile_popup) + profile_popup.setup(data.name, data.level, data.job.name, activity) + + +func _on_mouse_exited() -> void: + profile_popup.queue_free() diff --git a/scripts/adventurer_sprite.gd.uid b/scripts/adventurer_sprite.gd.uid new file mode 100644 index 0000000..796ee2b --- /dev/null +++ b/scripts/adventurer_sprite.gd.uid @@ -0,0 +1 @@ +uid://cjqumk0kw2vte diff --git a/scripts/enemy.gd b/scripts/enemy.gd new file mode 100644 index 0000000..b055c9d --- /dev/null +++ b/scripts/enemy.gd @@ -0,0 +1,7 @@ +class_name Enemy extends QuestSprite + + + + +func set_animation(anim_name : String) -> void: + anim_player.play(anim_name) diff --git a/scripts/enemy.gd.uid b/scripts/enemy.gd.uid new file mode 100644 index 0000000..1f0e24f --- /dev/null +++ b/scripts/enemy.gd.uid @@ -0,0 +1 @@ +uid://fxixa11vqdrn diff --git a/scripts/game_manager.gd b/scripts/game_manager.gd index c376577..f2c8927 100644 --- a/scripts/game_manager.gd +++ b/scripts/game_manager.gd @@ -2,19 +2,26 @@ extends Node var player : Player = null var panel : GamePanel = null +var player_profile : Window = null var quest_log : QuestLog = null var top_menu : TopMenu = null -var active : bool = true +var open : bool = true var end_shift_confirmation : ConfirmationDialog var end_shift_confirm_template = preload("res://templates/end_shift_confirmation.tscn") +var player_profile_template = preload("res://templates/player_profile_window.tscn") + func _ready() -> void: DisplayServer.register_additional_output(self) end_shift_confirmation = end_shift_confirm_template.instantiate() add_child(end_shift_confirmation) func _process(delta: float) -> void: - if active and Input.is_action_just_pressed("switch modes"): - confirm_end_shift() + if open: + if Input.is_action_just_pressed("profile"): + toggle_player_profile() + if Input.is_action_just_pressed("switch modes"): + confirm_end_shift() + func add_quest_progress_bar(quest : Quest) -> void: panel.add_quest_progress_bar(quest) @@ -25,10 +32,22 @@ func confirm_end_shift() -> void: func setup_visitor_ui(spawner: VisitorSpawner)-> void: if panel: panel.connect_visitor_spawner(spawner) + +func toggle_player_profile(): + if player_profile != null: + player_profile.queue_free() + player_profile = null + else: + player_profile = player_profile_template.instantiate() + add_child(player_profile) + player_profile.setup(player.data) + func end_shift() -> void: - active = false - panel.switch_panel(active) + open = false + if player_profile != null: + toggle_player_profile() + panel.switch_panel(open) var window = get_window() window.mode = Window.MODE_WINDOWED var size = DisplayServer.screen_get_size() @@ -45,7 +64,11 @@ func end_shift() -> void: top_menu.hide() panel.get_parent().global_position = Vector2i(5,5) window.size = Vector2i(415,700) + panel.populate_quest_views() panel.populate_quest_bars() func notice(msg : String, time : float = 1) -> void: panel.notice(msg, time) + +func calculate_kill_exp(killer : QuestSprite, killed : QuestSprite) -> int: + return clamp(1, (killed.level - killer.level) * 5, 100) diff --git a/scripts/guild.gd b/scripts/guild.gd index f6c1182..2ae7bcd 100644 --- a/scripts/guild.gd +++ b/scripts/guild.gd @@ -20,7 +20,7 @@ const job_list = [ var jobs : Dictionary[String, JobData] = {} -var members : Array[AdventurerData] = [] +var members : Array[Adventurer] = [] var quests : Dictionary[Quest,bool] = {} var hall : Guildhall = null var visitor_spawner : VisitorSpawner = null @@ -55,14 +55,14 @@ func _ready() -> void: for job : JobData in job_list: jobs[job.name] = job -func register_guild_member(member : AdventurerData, first : bool = false) -> void: +func register_guild_member(member : Adventurer, first : bool = false) -> void: members.append(member) Game.top_menu.add_member(member) changed.emit() if first: Game.notice("%s has joined the guild!" % member.name, 5) -func has_guild_member(member : AdventurerData) -> bool: +func has_guild_member(member : Adventurer) -> bool: if member == null: return false return members.has(member) @@ -72,13 +72,13 @@ func add_quest(quest : Quest) -> void: Game.top_menu.add_quest(quest) #Game.quest_log.add_entry(quest) -func assign_quest(member : AdventurerData, quest : Quest) -> void: +func assign_quest(member : Adventurer, quest : Quest) -> void: member.assign_quest(quest) quests[quest] = true #Mark it as active func spawn_visitor(pos : Vector2) -> void: - var data : AdventurerData = visitors["test"].data.instantiate() - var sprite : Adventurer = visitors["test"].sprite.instantiate() + var data : Adventurer = visitors["test"].data.instantiate() + var sprite : AdventurerSprite = visitors["test"].sprite.instantiate() var r = randf() if r > 0.8: data.gender = 2 #Nonbinary diff --git a/scripts/guild_employee.gd b/scripts/guild_employee.gd index d37354d..47173a7 100644 --- a/scripts/guild_employee.gd +++ b/scripts/guild_employee.gd @@ -1,4 +1,4 @@ -class_name GuildEmployee extends Adventurer +class_name GuildEmployee extends AdventurerSprite @export var speech :String @onready var queue : GuildQueue = $Queue diff --git a/scripts/guild_queue.gd b/scripts/guild_queue.gd index 4914554..189f7b4 100644 --- a/scripts/guild_queue.gd +++ b/scripts/guild_queue.gd @@ -4,27 +4,27 @@ var length : int : get: return len(members) @export var direction : Vector2 = Vector2.ZERO -var members : Array[Adventurer] = [] +var members : Array[AdventurerSprite] = [] -var front : Adventurer : +var front : AdventurerSprite : get: return null if len(members) == 0 else members[0] signal advanced() -func add_member(member : Adventurer) -> void: +func add_member(member : AdventurerSprite) -> void: members.append(member) -func remove_member(member : Adventurer) -> void: +func remove_member(member : AdventurerSprite) -> void: members.erase(member) -func try_advance() -> Adventurer: +func try_advance() -> AdventurerSprite: if length > 0: return advance() else: return null -func advance() -> Adventurer: +func advance() -> AdventurerSprite: advanced.emit() return front diff --git a/scripts/guildhall.gd b/scripts/guildhall.gd index 519a935..14b2013 100644 --- a/scripts/guildhall.gd +++ b/scripts/guildhall.gd @@ -19,5 +19,5 @@ func register_employee(employee: GuildEmployee) -> void: func register_interactables(equipment: Interactable) -> void: interactables[equipment.name] = equipment -func add_sprite(sprite : Adventurer) -> void: +func add_sprite(sprite : AdventurerSprite) -> void: sprite_node.add_child(sprite) diff --git a/scripts/item_slot.gd b/scripts/item_slot.gd index 8d4326d..8b0ac90 100644 --- a/scripts/item_slot.gd +++ b/scripts/item_slot.gd @@ -1,10 +1,20 @@ -extends Control +class_name ItemSlot extends Control #var item_display_window_template = preload("res://templates/item_display_window.tscn") var dragging : bool = false var last_click : int = 0 var item : Item @onready var item_sprite : TextureRect = $Item + +func assign(itm : Item) -> void: + item = item + item_sprite.texture = item.image + +func swap(item_slot : ItemSlot) -> void: + var itm = item + assign(itm) + item_slot.assign(itm) + func _on_gui_input(event: InputEvent) -> void: var mmevt = event as InputEventMouseMotion var mbevt = event as InputEventMouseButton diff --git a/scripts/main_panel.gd b/scripts/main_panel.gd index 5f21ed4..a98084c 100644 --- a/scripts/main_panel.gd +++ b/scripts/main_panel.gd @@ -2,6 +2,7 @@ class_name GamePanel extends MarginContainer const notice_template = preload("res://templates/notice_panel.tscn") const quest_progress_bar_template = preload("res://templates/quest_progress_bar.tscn") +const quest_view_template = preload("res://templates/quest_view.tscn") signal time_changed(time : float) @@ -18,12 +19,20 @@ func add_quest_progress_bar(quest : Quest) -> void: var qpb : QuestProgressBar = quest_progress_bar_template.instantiate() %QuestList.add_child(qpb) qpb.setup(quest) + #TODO: Change the hero portrait to match if quest.steps > 1: for i in range(quest.steps-1): qpb.add_waypoint(float(i) / quest.steps, quest.step_messages[i]) +func add_quest_view(quest : Quest, visible : bool) -> void: + var qv : QuestView = quest_view_template.instantiate() + qv.visible = visible + %QuestView.add_child(qv) + qv.setup(quest) + + func switch_panel(active : bool) -> void: %OpenShift.visible = active %WorkingShift.visible = !active @@ -47,6 +56,14 @@ func connect_visitor_spawner(spawner : VisitorSpawner) -> void: func update_visitor_count(current : int, total : int) -> void: %OpenList/VisitorsLabel.text = "Visitors: %d/%d" % [current, total] +func populate_quest_views() -> void: + var count : int = 0 + for quest in Guild.quests: + if quest.is_taken(): + count+=1 + add_quest_view(quest, count == 1) + %QuestViewerButton.disabled = (count == 0) + func populate_quest_bars() -> void: var count : int = 0 @@ -64,6 +81,7 @@ func notice(msg : String, time : float) -> void: var dragging : bool = false var drag_pos : Vector2 + func _on_drag_region_gui_input(event: InputEvent) -> void: if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT: diff --git a/scripts/member_panel_entry.gd b/scripts/member_panel_entry.gd index f2c7518..2b98f83 100644 --- a/scripts/member_panel_entry.gd +++ b/scripts/member_panel_entry.gd @@ -8,7 +8,7 @@ var enabled: bool: set(value): enable(value) -var data : AdventurerData +var data : Adventurer func enable(en: bool) -> void: @@ -18,7 +18,7 @@ func enable(en: bool) -> void: else: mouse_filter=Control.MOUSE_FILTER_IGNORE -func setup(member : AdventurerData) -> void: +func setup(member : Adventurer) -> void: data = member %NameLabel.text = data.given_name + " " + data.surname %LevelLabel.text = str(data.level) diff --git a/scripts/npc.gd b/scripts/npc.gd index ff78eea..19d260c 100644 --- a/scripts/npc.gd +++ b/scripts/npc.gd @@ -9,7 +9,7 @@ var profile_popup @onready var movement_target_position : Vector2 = global_position @onready var nav_agent : NavigationAgent2D = $NavigationAgent2D -var data : AdventurerData = null +var data : Adventurer = null var interaction_target = null var last_position : Vector2 = Vector2.ZERO var stuck : bool = false diff --git a/scripts/npc_profile_window.gd b/scripts/npc_profile_window.gd index a55213a..192460a 100644 --- a/scripts/npc_profile_window.gd +++ b/scripts/npc_profile_window.gd @@ -1,49 +1 @@ -extends Window - -var dragging : bool = false -var data : AdventurerData -@onready var nameLabel = %NameLabel -@onready var jobLabel = %JobLabel -@onready var expLabel : Label = %ExpLabel -@onready var levelLabel :Label = %LevelLabel -@onready var lifeLabel :Label = %LifeLabel -@onready var energyLabel :Label = %EnergyLabel - -@onready var strLabel :Label = %STRLabel -@onready var dexLabel :Label = %DEXLabel -@onready var intLabel :Label = %INTLabel -@onready var chaLabel :Label = %CHALabel -@onready var faiLabel :Label = %FAILabel -@onready var lukLabel :Label = %LUKLabel - - -func setup(adv : AdventurerData) -> void: - data = adv - nameLabel.text = data.full_name() - if data.job: - jobLabel.text = data.job.name - else: - jobLabel.text = "ERROR" - levelLabel.text = str(data.level) - expLabel.text = "Exp: %d/%d" % [data.exp, data.get_tnl()] - lifeLabel.text = "Life: " + str(data.life) + "/" + str(data.max_life) - energyLabel.text = "Energy: " + str(data.energy) + "/" + str(data.max_energy) - strLabel.text = str(data.stats.STR) - dexLabel.text = str(data.stats.DEX) - intLabel.text = str(data.stats.INT) - chaLabel.text = str(data.stats.CHA) - faiLabel.text = str(data.stats.FAI) - lukLabel.text = str(data.stats.LUK) - #TODO: Show equipment - -func _on_close_requested() -> void: - queue_free() - - -func _on_drag_region_gui_input(event: InputEvent) -> void: - if event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_LEFT: - dragging = event.pressed - elif dragging and event is InputEventMouseMotion: - position += Vector2i(event.screen_relative) - +class_name NpcProfileWindow extends AdventurerProfileWindow diff --git a/scripts/player.gd b/scripts/player.gd index 4ddeb04..cf09097 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -7,11 +7,11 @@ class_name Player extends Person var interaction_target = null @export var interaction_range : float = 75 @export var stop_range : float = 25 -var data : AdventurerData +var data : Adventurer func _ready() -> void: Game.player = self - data = AdventurerData.new() + data = Adventurer.new() data.name = "Player" setup.call_deferred() diff --git a/scripts/profile_window.gd b/scripts/profile_window.gd index 77820dc..11adde5 100644 --- a/scripts/profile_window.gd +++ b/scripts/profile_window.gd @@ -1,5 +1,15 @@ -extends Window +class_name ProfileWindow extends Window + +var dragging : bool = false -func _on_close_button_pressed() -> void: +func _on_close_requested() -> void: queue_free() + +func _on_drag_region_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT: + dragging = event.pressed + elif dragging and event is InputEventMouseMotion: + position += Vector2i(event.screen_relative) + diff --git a/scripts/quest.gd b/scripts/quest.gd index 94c7ec6..7345692 100644 --- a/scripts/quest.gd +++ b/scripts/quest.gd @@ -1,6 +1,7 @@ class_name Quest extends Object + enum Status{ OPEN, TAKEN, @@ -11,49 +12,140 @@ enum Status{ } class Event: + var enemy_types: Dictionary[String, PackedScene] = { + "goo": preload("res://templates/enemies/goo.tscn") + } enum Type{ WAIT, COMBAT, CHOICE } + + enum CombatState{ + FIGHTING, + VICTORY, + DEFEAT + } var type : Type = Type.WAIT var enemies : Array[String] = [] var time : float = 1 var time_elapsed signal completed() + signal failed() var participants : Array = [] var turn_queue : Array = [] var busy_list : Array = [] + var combat_state var dex_speed : int - var start(quest : Quest) -> void: + func start(quest : Quest) -> void: match(type): Type.WAIT: - pass + return + Type.COMBAT: + combat_state = CombatState.FIGHTING + var enemy_list = [] + for enemy_name in enemies: + enemy_list.append(enemy_types[enemy_name].instantiate()) + quest.questview.set_questor_animation("idle") + for enemy in enemy_list: + quest.questview.pause_setting() + quest.questview.place_enemy(enemy) + quest.questview.set_enemy_animation(enemy, "idle") + start_combat([quest.questor.quest_sprite], enemy_list) + func start_combat(adventurers : Array, enemies : Array) -> void: participants = [] participants.append_array(adventurers) participants.append_array(enemies) - + var c_order : Array = [] var dex_speed = 0 for p in participants: - c_order.append([p, p.stats.dex]) - if p.stats.dex > dex_speed: - dex_speed = p.stats.dex + c_order.append([p, p.stats.DEX]) + if p.stats.DEX > dex_speed: + dex_speed = p.stats.DEX c_order.sort_custom(func(a,b): return a[1] > b[1]) var delay = 5 var last_time = 0 for c in c_order: + c[0].busy.connect(_on_busy.bind(c[0])) + c[0].action_complete.connect(_on_combat_action_complete.bind(c[0])) + c[0].died.connect(_on_death.bind(c[0])) var time = delay * dex_speed / c[1] turn_queue.append({"combatant":c[0], "time": time - last_time}) last_time = time - func execute_attack(combatant, target) -> void: - busy_list.append(target) - #TODO: Make the combatant execute an attack - #TODO: Make the target take damage + func execute_attack(combatant : QuestSprite, target : QuestSprite) -> void: + var tween = combatant.create_tween() + tween.tween_interval(.25) + tween.tween_callback(combatant.attack.bind(target)) + + func add_to_turn_queue(combatant) -> void: + #Calculate time + var time = dex_speed / combatant.stats.DEX + #Walk through list to find insertion point + var idx = -1 + for i in range(len(turn_queue)): + if turn_queue[i].time > time: + idx = i + break + else: + time -= turn_queue[i].time + var entry = {"combatant":combatant, "time":time} + if idx == -1: + turn_queue.append(entry) + else: + turn_queue[idx].time -= time + turn_queue.insert(idx,entry) + + func _on_busy(combatant : QuestSprite) -> void: + busy_list.append(combatant) + + func _on_death(killer : QuestSprite, combatant : QuestSprite) -> void: + busy_list.erase(combatant) + remove_from_queue(combatant) + participants.erase(combatant) + if killer != combatant: + var xp = Game.calculate_kill_exp(killer, combatant) + print("%s has earned %d exp" % [killer.name, xp]) + killer.exp += xp + var enemy_list : Array = get_enemy_list(killer) + if len(enemy_list) == 0: + if killer is QuestorSprite: + victory() + else: + defeat() + + func victory(): + print("Questor won!") + combat_state = CombatState.VICTORY + for p : QuestorSprite in participants: + p.check_levelup() + #TODO: Notify player if level up occurs + time = 10 + + func defeat(): + print("Questor lost!") + combat_state = CombatState.DEFEAT + failed.emit() + + func remove_from_queue(combatant : QuestSprite) -> void: + var idx = -1 + for i in range(len(turn_queue)): + if turn_queue[i].combatant == combatant: + idx = i + break + if idx != -1: + turn_queue.remove_at(idx) + else: + printerr("Tried to remove someone not in the turn queue") + + func _on_combat_action_complete(requeue : bool, combatant : QuestSprite) -> void: + busy_list.erase(combatant) + if requeue: + add_to_turn_queue(combatant) func execute_action(combatant) -> void: busy_list = [combatant] @@ -74,21 +166,29 @@ class Event: func process(delta : float) -> void: #TODO: Make quest combat work - if type == Type.COMBAT: - if len(busy_list) < 1: - if len(turn_queue) > 0: - turn_queue[0].time -= delta - if turn_queue[0].time <= 0: - var c = turn_queue.pop_front() - if len(turn_queue) > 0: - turn_queue[0].time += c.time - execute_action(c.combatant) - else: - resolve_combat() - - time_elapsed += delta - if time_elapsed >= time: - completed.emit() + match(type): + Type.COMBAT: + match(combat_state): + CombatState.FIGHTING: + if len(busy_list) < 1: + if len(turn_queue) > 0: + turn_queue[0].time -= delta + if turn_queue[0].time <= 0: + var c = turn_queue.pop_front() + print("%s taking a turn!" % [c.combatant.name]) + if len(turn_queue) > 0: + turn_queue[0].time += c.time + execute_action(c.combatant) + else: + resolve_combat() + CombatState.VICTORY: + time_elapsed += delta + if time_elapsed >= time: + completed.emit() + Type.WAIT: + time_elapsed += delta + if time_elapsed >= time: + completed.emit() var name : String = "A Basic Quest" var desc : String = "The default quest, with no special anything." @@ -104,14 +204,15 @@ var progress : float = 0 var current_step : int = 0 var taken : bool = false var status : Status = Status.OPEN +var questview : QuestView = null -var questor : AdventurerData = null +var questor : Adventurer = null signal status_changed(status : Status) func _init() -> void: pass -func initiate(member : AdventurerData) -> void: +func initiate(member : Adventurer) -> void: questor = member status = Status.TAKEN status_changed.emit(Status.TAKEN) @@ -138,7 +239,7 @@ func num_events() -> int: return len(events) #TODO: Put in quest requirements -func is_eligible(member : AdventurerData) -> bool: +func is_eligible(member : Adventurer) -> bool: return !taken func is_taken() -> bool: diff --git a/scripts/quest_progress_bar.gd b/scripts/quest_progress_bar.gd index b81be8b..c4f3eea 100644 --- a/scripts/quest_progress_bar.gd +++ b/scripts/quest_progress_bar.gd @@ -15,6 +15,7 @@ var quest : Quest = null var current_event : Quest.Event = null var time_elapsed : float = 0 var next_waypoint = 0 +var failed : bool = false #signal value_changed(value : float) #var min_value #var max_value @@ -29,10 +30,11 @@ func _ready() -> void: hero.position = hero_offset + Vector2(length * bar.value / bar.max_value, 0) func _process(delta: float) -> void: + if failed: + return if time_elapsed < quest.length: if current_event != null: - if current_event.type != Quest.Event.Type.COMBAT: - current_event.process(delta) + current_event.process(delta) else: time_elapsed += delta progress_quest() @@ -69,7 +71,8 @@ func update_waypoints(value : float) -> void: func start_event(event : Quest.Event, offset : float) -> void: current_event = event current_event.completed.connect(_on_event_complete) - current_event.start() + current_event.failed.connect(_on_event_failed) + current_event.start(quest) event.time_elapsed = offset func setup(quest : Quest) -> void: @@ -93,10 +96,26 @@ func progress_quest() -> void: quest.complete() update_waypoints(bar.value) +func set_fill_color(color : Color) -> void: + %Start/Fill.self_modulate = color + %End/Fill.self_modulate = color + $ProgressBar.tint_progress = color + for wp : Waypoint in waypoints: + wp.fill_color = color func _on_event_complete() -> void: #TODO: Show event message! speech_bubble.show_message("Event complete!") + if current_event.type == Quest.Event.Type.COMBAT: + quest.questview.unpause_setting() + for p : QuestorSprite in current_event.participants: + p.set_animation("running") waypoints[next_waypoint].blink(false) next_waypoint += 1 current_event = null + +func _on_event_failed() -> void: + failed = true + set_fill_color(Color.RED) + quest.fail() + diff --git a/scripts/quest_sprite.gd b/scripts/quest_sprite.gd new file mode 100644 index 0000000..13cc1da --- /dev/null +++ b/scripts/quest_sprite.gd @@ -0,0 +1,38 @@ +class_name QuestSprite extends Control + +var life : int = 1 +var max_life : int = 1 +var energy : int = 1 +var max_energy : int = 1 +var level : int = 1 +var exp : int = 0 + +@export var stats : StatBlock +var gold : int = 0 + + +@onready var anim_player : AnimationPlayer = $AnimationPlayer +signal died(killer :QuestSprite) +signal action_complete(requeue : bool) +signal busy() + + +func attack(target : QuestSprite) -> void: + print("Attack by %s to %s" % [name, target.name]) + target.take_damage(self, 10) + action_complete.emit(true) + +func take_damage(source : QuestSprite, amount : int) -> void: + busy.emit() + life = clampi(life - amount, 0, max_life) + if life == 0: + print("%s killed %s!" % [source.name, name]) + die(source) + else: + print("%s hit %s for %d damage!" % [source.name, name, amount]) + action_complete.emit(false) + + +func die(killer : QuestSprite) -> void: + died.emit(killer) + queue_free() diff --git a/scripts/quest_sprite.gd.uid b/scripts/quest_sprite.gd.uid new file mode 100644 index 0000000..3c0dbfa --- /dev/null +++ b/scripts/quest_sprite.gd.uid @@ -0,0 +1 @@ +uid://c7tmerbioa0vn diff --git a/scripts/quest_view.gd b/scripts/quest_view.gd new file mode 100644 index 0000000..0028479 --- /dev/null +++ b/scripts/quest_view.gd @@ -0,0 +1,33 @@ +class_name QuestView extends Panel + +const questor_template = preload("res://templates/questor_sprite.tscn") + +@onready var questorSprite : QuestorSprite +@onready var setting = $Setting +var quest : Quest + + +func setup(qst : Quest) -> void: + quest = qst + quest.questview = self + questorSprite = questor_template.instantiate() + questorSprite.setup(quest.questor) + add_child(questorSprite) + questorSprite.global_position = $QuestorPosition.global_position + + +func set_questor_animation(anim_name : String) -> void: + questorSprite.set_animation(anim_name) + +func set_enemy_animation(enemy : Enemy, anim_name : String) -> void: + enemy.set_animation(anim_name) + +func place_enemy(enemy : Enemy) -> void: + add_child(enemy) + enemy.global_position = $EnemyPosition.global_position + +func pause_setting() -> void: + setting.process_mode = Node.PROCESS_MODE_DISABLED + +func unpause_setting() -> void: + setting.process_mode = Node.PROCESS_MODE_INHERIT diff --git a/scripts/quest_view.gd.uid b/scripts/quest_view.gd.uid new file mode 100644 index 0000000..d42ed2a --- /dev/null +++ b/scripts/quest_view.gd.uid @@ -0,0 +1 @@ +uid://bm4826vxrmuqh diff --git a/scripts/questor_sprite.gd b/scripts/questor_sprite.gd new file mode 100644 index 0000000..1ebcff8 --- /dev/null +++ b/scripts/questor_sprite.gd @@ -0,0 +1,33 @@ +class_name QuestorSprite extends QuestSprite + + +var data : Adventurer = null + +func _ready() -> void: + if data: + life = data.life + max_life = data.max_life + energy = data.energy + max_energy = data.max_energy + level = data.level + exp = data.exp + stats = StatBlock.copy(data.stats) + gold = data.gold + +func set_animation(anim_name : String) -> void: + anim_player.play(anim_name) + +func setup(adv : Adventurer) -> void: + data = adv + life = data.life + max_life = data.max_life + energy = data.energy + max_energy = data.max_energy + level = data.level + exp = data.exp + stats = StatBlock.copy(data.stats) + gold = data.gold + adv.quest_sprite = self + +func check_levelup() -> void: + data.gain_exp(exp) diff --git a/scripts/questor_sprite.gd.uid b/scripts/questor_sprite.gd.uid new file mode 100644 index 0000000..686d5a3 --- /dev/null +++ b/scripts/questor_sprite.gd.uid @@ -0,0 +1 @@ +uid://ce0vugvrwvppb diff --git a/scripts/test_scene.gd b/scripts/test_scene.gd index 8b2991a..dc81725 100644 --- a/scripts/test_scene.gd +++ b/scripts/test_scene.gd @@ -1,14 +1,19 @@ extends Node2D var test_adv = preload("res://templates/test_adventurer.tscn") + @onready var door_player : AudioStreamPlayer = $AudioStreamPlayer func _ready() -> void: - #var adv : AdventurerData = test_adv.instantiate() as AdventurerData + #var adv : Adventurer = test_adv.instantiate() as Adventurer #Guild.register_guild_member(adv) var quest : Quest = Quest.new() var evt : Quest.Event = Quest.Event.new() + evt.type = Quest.Event.Type.COMBAT + evt.enemies = ["goo"] evt.time = 10 quest.events.append(evt) Guild.add_quest(quest) + Guild.assign_quest(Game.player.data, quest) + #Game.end_shift() #var tween = create_tween() #tween.tween_interval(3) #tween.tween_callback(Callable($DoorLight/AnimationPlayer.play).bind("open")) diff --git a/scripts/top_menu.gd b/scripts/top_menu.gd index c8b2a39..aa04b20 100644 --- a/scripts/top_menu.gd +++ b/scripts/top_menu.gd @@ -29,7 +29,7 @@ func _on_quests_button_pressed() -> void: for child in quest_list.get_children(): child.enabled = quests.visible -func add_member(member : AdventurerData) -> void: +func add_member(member : Adventurer) -> void: var entry = member_panel_entry_template.instantiate() entry.setup(member) members_list.add_child(entry) diff --git a/scripts/waypoint.gd b/scripts/waypoint.gd index 3a82727..ef9ab29 100644 --- a/scripts/waypoint.gd +++ b/scripts/waypoint.gd @@ -12,6 +12,11 @@ var fill: bool : if value != filled: set_fill(value) +var fill_color: Color : + get: return $Fill.self_modulate + set(value): + $Fill.self_modulate = value + func blink(blnk : bool) -> void: if blinking == blnk: return diff --git a/templates/enemies/goo.tscn b/templates/enemies/goo.tscn new file mode 100644 index 0000000..2e68719 --- /dev/null +++ b/templates/enemies/goo.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=5 format=3 uid="uid://c31w28fcqw4ra"] + +[ext_resource type="Script" uid="uid://fxixa11vqdrn" path="res://scripts/enemy.gd" id="1_82j8k"] +[ext_resource type="Texture2D" uid="uid://1mkagt2y0jah" path="res://graphics/questview/goo.png" id="2_87tms"] +[ext_resource type="Script" uid="uid://727tgvtmq4nb" path="res://data/statblock.gd" id="2_fehp8"] + +[sub_resource type="Resource" id="Resource_bfuvr"] +script = ExtResource("2_fehp8") +metadata/_custom_type_script = "uid://727tgvtmq4nb" + +[node name="Goo" type="Control"] +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_82j8k") +stats = SubResource("Resource_bfuvr") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(5, -47) +texture = ExtResource("2_87tms") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/templates/guildhall.tscn b/templates/guildhall.tscn index 414de0e..73770a8 100644 --- a/templates/guildhall.tscn +++ b/templates/guildhall.tscn @@ -63,14 +63,12 @@ offset = Vector2(0, -80) polygon = PackedVector2Array(-86, -160, -152, -160, -152, -107, -148, -75, -128, -35, -57, 0, 56, 0, 127, -34, 148, -75, 152, -107, 152, -160, 86, -160, 86, -115, 75, -93, 52, -81, -51, -81, -75, -92, -86, -114) [node name="Receptionist" parent="Sprites" instance=ExtResource("5_l3mu1")] -visible = false position = Vector2(457, 32) [node name="Queue" parent="Sprites/Receptionist" index="3"] position = Vector2(0, 97) [node name="Player" type="CharacterBody2D" parent="Sprites"] -visible = false position = Vector2(451, 430) script = ExtResource("2_5n4iw") diff --git a/templates/main_panel.tscn b/templates/main_panel.tscn index acba77c..20e413f 100644 --- a/templates/main_panel.tscn +++ b/templates/main_panel.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=9 format=3 uid="uid://c8ofw6na082gv"] +[gd_scene load_steps=10 format=3 uid="uid://c8ofw6na082gv"] [ext_resource type="Script" uid="uid://dhw85vqlvw33s" path="res://scripts/main_panel.gd" id="1_pdekv"] [ext_resource type="Script" uid="uid://4jrp67ckp7vt" path="res://scripts/timer_label.gd" id="2_5rs2c"] [ext_resource type="StyleBox" uid="uid://by1jk8r2avjp4" path="res://styles/open_shift_panel.tres" id="2_b7y1i"] +[ext_resource type="Texture2D" uid="uid://bwaiuy7yf7tu3" path="res://graphics/ui/time-frame.png" id="3_7oi8q"] [ext_resource type="StyleBox" uid="uid://b7vjpwageyi6m" path="res://styles/working_shift_panel.tres" id="4_b7y1i"] [ext_resource type="Texture2D" uid="uid://cs7bvpn6jgofn" path="res://graphics/ui/options.png" id="5_6vw8v"] [ext_resource type="PackedScene" uid="uid://du4hyv7egc7ny" path="res://templates/quest_view_window.tscn" id="6_er2tk"] @@ -43,6 +44,19 @@ custom_minimum_size = Vector2(401, 216) layout_mode = 2 theme_override_styles/panel = ExtResource("2_b7y1i") +[node name="NinePatchRect" type="NinePatchRect" parent="VBoxContainer/OpenShift"] +layout_mode = 0 +offset_left = 9.0 +offset_top = 54.0 +offset_right = 200.0 +offset_bottom = 76.5 +scale = Vector2(2, 2) +texture = ExtResource("3_7oi8q") +patch_margin_left = 7 +patch_margin_top = 7 +patch_margin_right = 7 +patch_margin_bottom = 7 + [node name="Margin" type="MarginContainer" parent="VBoxContainer/OpenShift"] layout_mode = 0 offset_left = 74.0 @@ -106,6 +120,20 @@ offset_right = 391.0 offset_bottom = 44.0 texture_normal = ExtResource("5_6vw8v") +[node name="NinePatchRect" type="NinePatchRect" parent="VBoxContainer/WorkingShift"] +layout_mode = 1 +anchors_preset = -1 +offset_left = 9.0 +offset_top = 86.0 +offset_right = 200.0 +offset_bottom = 108.5 +scale = Vector2(2, 2) +texture = ExtResource("3_7oi8q") +patch_margin_left = 7 +patch_margin_top = 7 +patch_margin_right = 7 +patch_margin_bottom = 7 + [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/WorkingShift"] layout_mode = 0 offset_left = 13.0 @@ -184,8 +212,6 @@ layout_mode = 2 stream = ExtResource("6_osxme") volume_db = -10.31 -[connection signal="time_changed" from="." to="VBoxContainer/OpenShift/Margin/OpenList/TimerLabel" method="_on_time_changed"] -[connection signal="time_changed" from="." to="VBoxContainer/WorkingShift/MarginContainer/WorkingList/TimerLabel" method="_on_time_changed"] [connection signal="pressed" from="VBoxContainer/OpenShift/Margin/OpenList/Button" to="." method="_on_end_shift_pressed"] [connection signal="gui_input" from="VBoxContainer/WorkingShift/DragRegion" to="." method="_on_drag_region_gui_input"] [connection signal="pressed" from="VBoxContainer/WorkingShift/MarginContainer/WorkingList/HBoxContainer/QuestViewerButton" to="." method="_on_quest_viewer_button_pressed"] diff --git a/templates/player_profile_window.tscn b/templates/player_profile_window.tscn new file mode 100644 index 0000000..d60b8b2 --- /dev/null +++ b/templates/player_profile_window.tscn @@ -0,0 +1,839 @@ +[gd_scene load_steps=16 format=3 uid="uid://bg23lrwwpi3xi"] + +[ext_resource type="Script" uid="uid://ccsiubi5y75qg" path="res://scripts/npc_profile_window.gd" id="1_mjwm2"] +[ext_resource type="Texture2D" uid="uid://cbt6po52ad37x" path="res://external/profile-window.png" id="2_p33nb"] +[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://graphics/icon.svg" id="3_8aeex"] +[ext_resource type="FontFile" uid="uid://bfkgcmorncykx" path="res://fonts/Bagnard.tres" id="3_mjwm2"] +[ext_resource type="Texture2D" uid="uid://bblr27slj6ap0" path="res://graphics/portraits/farmer_f.png" id="4_cdnuw"] +[ext_resource type="Theme" uid="uid://dlobmn4esosk3" path="res://styles/stat_font.tres" id="5_kiyqa"] +[ext_resource type="FontFile" uid="uid://cju0vb3cw5qoj" path="res://fonts/Bagnard.otf" id="6_0icff"] +[ext_resource type="Texture2D" uid="uid://bnyl6eaynixm5" path="res://graphics/ui/gear-heading.png" id="7_la6dy"] +[ext_resource type="Texture2D" uid="uid://cjjtgrr56guj0" path="res://graphics/ui/item-slot.png" id="8_c770f"] +[ext_resource type="Texture2D" uid="uid://blt2b7f6iqb8j" path="res://graphics/questview/test-char.png" id="9_cq03q"] +[ext_resource type="Texture2D" uid="uid://d1btg2hfnjx6r" path="res://graphics/ui/inventory-heading.png" id="10_rldp4"] +[ext_resource type="Script" uid="uid://cw6yo5opbrpr8" path="res://scripts/item_slot.gd" id="11_b43fo"] + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ktflt"] +blend_mode = 3 + +[sub_resource type="Gradient" id="Gradient_1nmd1"] +offsets = PackedFloat32Array(0.2754717, 0.36226416, 0.43773586) +colors = PackedColorArray(1, 1, 1, 1, 0.46274376, 0.4643005, 0.5605066, 1, 1, 1, 1, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_bj16a"] +gradient = SubResource("Gradient_1nmd1") +width = 100 +height = 49 +fill_to = Vector2(0, 1) + +[node name="Profile Window" type="Window"] +transparent_bg = true +oversampling_override = 1.0 +initial_position = 1 +size = Vector2i(707, 857) +wrap_controls = true +unresizable = true +borderless = true +always_on_top = true +transparent = true +popup_window = true +script = ExtResource("1_mjwm2") + +[node name="CloseButton" type="Button" parent="."] +modulate = Color(1, 1, 1, 0) +anchors_preset = -1 +offset_left = 586.0 +offset_top = 15.0 +offset_right = 625.0 +offset_bottom = 54.0 + +[node name="DragRegion" type="Control" parent="."] +layout_mode = 3 +offset_left = 2.0 +offset_top = 11.0 +offset_right = 584.0 +offset_bottom = 56.0 + +[node name="TextureRect" type="TextureRect" parent="."] +anchors_preset = -1 +offset_right = 635.0 +offset_bottom = 843.0 +texture = ExtResource("2_p33nb") + +[node name="ColorRect" type="ColorRect" parent="."] +anchors_preset = -1 +offset_left = 112.0 +offset_top = 14.0 +offset_right = 262.0 +offset_bottom = 54.0 +color = Color(0.4745098, 0.34509805, 0.23529412, 1) + +[node name="Label5" type="Label" parent="."] +anchors_preset = -1 +offset_left = 190.0 +offset_top = 17.0 +offset_right = 275.0 +offset_bottom = 61.0 +theme_override_colors/font_color = Color(0.88235295, 0.7764706, 0.5058824, 1) +theme_override_fonts/font = ExtResource("3_mjwm2") +theme_override_font_sizes/font_size = 24 +text = "Player" + +[node name="HSeparator" type="Control" parent="."] +custom_minimum_size = Vector2(0, 100) +layout_mode = 3 +offset_left = 3.0 +offset_top = 4.0 +offset_right = 629.0 +offset_bottom = 839.0 + +[node name="TextureRect2" type="TextureRect" parent="."] +anchors_preset = -1 +offset_left = 3.0 +offset_top = 4.0 +offset_right = 629.0 +offset_bottom = 839.0 + +[node name="PortraitFrame" type="TextureRect" parent="."] +self_modulate = Color(1, 1, 1, 0) +clip_contents = true +custom_minimum_size = Vector2(153, 153) +anchors_preset = -1 +offset_left = 27.0 +offset_top = 103.0 +offset_right = 180.0 +offset_bottom = 256.0 +texture = ExtResource("3_8aeex") +expand_mode = 1 + +[node name="Portrait" type="TextureRect" parent="PortraitFrame"] +unique_name_in_owner = true +layout_mode = 0 +offset_right = 76.5 +offset_bottom = 76.5 +scale = Vector2(2, 2) +texture = ExtResource("4_cdnuw") +expand_mode = 1 + +[node name="NameLabel" type="Label" parent="."] +unique_name_in_owner = true +anchors_preset = -1 +offset_left = 74.0 +offset_top = 54.0 +offset_right = 178.0 +offset_bottom = 104.0 +theme_override_colors/font_color = Color(0.33, 0.17600001, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 36 +text = "Name" + +[node name="JobLabel" type="Label" parent="."] +unique_name_in_owner = true +anchors_preset = -1 +offset_left = 188.0 +offset_top = 100.0 +offset_right = 272.0 +offset_bottom = 134.0 +theme_override_colors/font_color = Color(0.33, 0.17600001, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 24 +text = "Class" + +[node name="LevelLabel" type="Label" parent="."] +unique_name_in_owner = true +anchors_preset = -1 +offset_left = 188.0 +offset_top = 127.0 +offset_right = 272.0 +offset_bottom = 161.0 +theme_override_colors/font_color = Color(0.33, 0.17600001, 0, 1) +theme_override_font_sizes/font_size = 24 +text = "Lv ##" + +[node name="ExpLabel" type="Label" parent="."] +unique_name_in_owner = true +anchors_preset = -1 +offset_left = 188.0 +offset_top = 156.0 +offset_right = 314.0 +offset_bottom = 190.0 +theme_override_colors/font_color = Color(0.33, 0.17600001, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 24 +text = "Exp: ##/##" + +[node name="LifeLabel" type="Label" parent="."] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 0) +anchors_preset = -1 +offset_left = 26.0 +offset_top = 273.0 +offset_right = 652.0 +offset_bottom = 307.0 +theme_override_font_sizes/font_size = 24 +text = "Life: ####/####" + +[node name="EnergyLabel" type="Label" parent="."] +unique_name_in_owner = true +anchors_preset = -1 +offset_left = 234.0 +offset_top = 273.0 +offset_right = 860.0 +offset_bottom = 307.0 +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 24 +text = "Energy: ####/####" + +[node name="STRLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 110.0 +offset_top = 302.0 +offset_right = 210.0 +offset_bottom = 346.0 +theme = ExtResource("5_kiyqa") +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 1 +theme_override_constants/shadow_offset_y = 1 +theme_override_constants/outline_size = 1 +theme_override_fonts/font = ExtResource("6_0icff") +theme_override_font_sizes/font_size = 32 +text = "457" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="STRLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="INTLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 110.0 +offset_top = 364.0 +offset_right = 210.0 +offset_bottom = 408.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="INTLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="Label" type="Label" parent="."] +modulate = Color(0.4, 0.22666667, 0, 1) +anchors_preset = -1 +offset_left = 65.0 +offset_top = 405.0 +offset_right = 139.0 +offset_bottom = 450.0 +theme_override_constants/outline_size = 2 +theme_override_font_sizes/font_size = 32 +text = "ATK" + +[node name="Label2" type="Label" parent="."] +modulate = Color(0.4, 0.22666667, 0, 1) +anchors_preset = -1 +offset_left = 201.0 +offset_top = 405.0 +offset_right = 275.0 +offset_bottom = 450.0 +theme_override_constants/outline_size = 2 +theme_override_font_sizes/font_size = 32 +text = "MAG" + +[node name="Label3" type="Label" parent="."] +modulate = Color(0.4, 0.22666667, 0, 1) +anchors_preset = -1 +offset_left = 330.0 +offset_top = 405.0 +offset_right = 408.0 +offset_bottom = 450.0 +theme_override_constants/outline_size = 2 +theme_override_font_sizes/font_size = 32 +text = "PDEF" + +[node name="Label4" type="Label" parent="."] +modulate = Color(0.4, 0.22666667, 0, 1) +anchors_preset = -1 +offset_left = 481.0 +offset_top = 405.0 +offset_right = 569.0 +offset_bottom = 450.0 +theme_override_constants/outline_size = 2 +theme_override_font_sizes/font_size = 32 +text = "MDEF" + +[node name="ATKLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 43.0 +offset_top = 436.0 +offset_right = 143.0 +offset_bottom = 480.0 +theme = ExtResource("5_kiyqa") +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 1 +theme_override_constants/shadow_offset_y = 1 +theme_override_constants/outline_size = 1 +theme_override_fonts/font = ExtResource("6_0icff") +theme_override_font_sizes/font_size = 32 +text = "457" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="ATKLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="MAGLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 188.0 +offset_top = 435.0 +offset_right = 288.0 +offset_bottom = 479.0 +theme = ExtResource("5_kiyqa") +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 1 +theme_override_constants/shadow_offset_y = 1 +theme_override_constants/outline_size = 1 +theme_override_fonts/font = ExtResource("6_0icff") +theme_override_font_sizes/font_size = 32 +text = "457" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="MAGLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="PDEFLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 316.0 +offset_top = 435.0 +offset_right = 416.0 +offset_bottom = 479.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="PDEFLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="MDEFLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 471.0 +offset_top = 435.0 +offset_right = 571.0 +offset_bottom = 479.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="MDEFLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="DEXLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 111.0 +offset_top = 333.0 +offset_right = 211.0 +offset_bottom = 377.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="DEXLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="CHALabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 254.0 +offset_top = 302.0 +offset_right = 354.0 +offset_bottom = 346.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="CHALabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="FAILabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 254.0 +offset_top = 333.0 +offset_right = 354.0 +offset_bottom = 377.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="FAILabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="LUKLabel" type="Label" parent="."] +unique_name_in_owner = true +clip_children = 2 +anchors_preset = -1 +offset_left = 254.0 +offset_top = 364.0 +offset_right = 354.0 +offset_bottom = 408.0 +theme = ExtResource("5_kiyqa") +text = "9999" +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="TextureRect" type="TextureRect" parent="LUKLabel"] +material = SubResource("CanvasItemMaterial_ktflt") +layout_mode = 1 +anchors_preset = -1 +offset_right = 100.0 +offset_bottom = 64.0 +texture = SubResource("GradientTexture2D_bj16a") + +[node name="GearBanner" type="TextureRect" parent="."] +anchors_preset = -1 +offset_left = -89.0 +offset_top = 485.0 +offset_right = 382.0 +offset_bottom = 509.0 +texture = ExtResource("7_la6dy") + +[node name="Sideview" type="NinePatchRect" parent="."] +anchors_preset = -1 +offset_left = 13.0 +offset_top = 543.0 +offset_right = 238.0 +offset_bottom = 768.0 +texture = ExtResource("8_c770f") +patch_margin_left = 6 +patch_margin_top = 6 +patch_margin_right = 6 +patch_margin_bottom = 6 + +[node name="TempChar" type="TextureRect" parent="Sideview"] +layout_mode = 0 +offset_left = 47.0 +offset_top = 55.0 +offset_right = 175.0 +offset_bottom = 183.0 +texture = ExtResource("9_cq03q") + +[node name="GearGrid" type="GridContainer" parent="."] +anchors_preset = -1 +offset_left = 241.0 +offset_top = 545.0 +offset_right = 462.0 +offset_bottom = 766.0 + +[node name="TextureRect" type="TextureRect" parent="GearGrid"] +layout_mode = 2 +texture = ExtResource("8_c770f") + +[node name="TextureRect2" type="TextureRect" parent="GearGrid"] +layout_mode = 2 +texture = ExtResource("8_c770f") + +[node name="TextureRect3" type="TextureRect" parent="GearGrid"] +layout_mode = 2 +texture = ExtResource("8_c770f") + +[node name="VSeparator" type="VSeparator" parent="."] +modulate = Color(1.2044971, 0.7664488, 0.43147072, 1) +custom_minimum_size = Vector2(0, 275) +anchors_preset = -1 +offset_left = 314.0 +offset_top = 512.0 +offset_right = 318.0 +offset_bottom = 812.0 +scale = Vector2(2, 1) + +[node name="InventoryBanner" type="TextureRect" parent="."] +anchors_preset = -1 +offset_left = 236.0 +offset_top = 485.0 +offset_right = 707.0 +offset_bottom = 509.0 +texture = ExtResource("10_rldp4") + +[node name="InventoryGrid" type="GridContainer" parent="."] +anchors_preset = -1 +offset_left = 325.0 +offset_top = 513.0 +offset_right = 621.0 +offset_bottom = 809.0 +columns = 4 + +[node name="ItemSlot" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot2" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot2"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot2"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot3" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot3"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot3"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot4" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot4"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot4"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot5" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot5"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot5"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot6" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot6"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot6"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot7" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot7"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot7"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot8" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot8"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot8"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot9" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot9"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot9"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot10" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot10"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot10"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot11" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot11"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot11"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot12" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot12"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot12"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot13" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot13"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot13"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot14" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot14"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot14"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot15" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot15"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot15"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[node name="ItemSlot16" type="Control" parent="InventoryGrid"] +custom_minimum_size = Vector2(71, 71) +layout_mode = 2 +script = ExtResource("11_b43fo") + +[node name="Square" type="TextureRect" parent="InventoryGrid/ItemSlot16"] +layout_mode = 0 +offset_right = 71.0 +offset_bottom = 71.0 +texture = ExtResource("8_c770f") + +[node name="Item" type="TextureRect" parent="InventoryGrid/ItemSlot16"] +layout_mode = 0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 67.0 +offset_bottom = 67.0 + +[connection signal="close_requested" from="." to="." method="_on_close_requested"] +[connection signal="focus_exited" from="." to="." method="_on_close_requested"] +[connection signal="pressed" from="CloseButton" to="." method="_on_close_requested"] +[connection signal="gui_input" from="DragRegion" to="." method="_on_drag_region_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot" to="InventoryGrid/ItemSlot" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot2" to="InventoryGrid/ItemSlot2" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot3" to="InventoryGrid/ItemSlot3" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot4" to="InventoryGrid/ItemSlot4" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot5" to="InventoryGrid/ItemSlot5" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot6" to="InventoryGrid/ItemSlot6" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot7" to="InventoryGrid/ItemSlot7" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot8" to="InventoryGrid/ItemSlot8" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot9" to="InventoryGrid/ItemSlot9" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot10" to="InventoryGrid/ItemSlot10" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot11" to="InventoryGrid/ItemSlot11" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot12" to="InventoryGrid/ItemSlot12" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot13" to="InventoryGrid/ItemSlot13" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot14" to="InventoryGrid/ItemSlot14" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot15" to="InventoryGrid/ItemSlot15" method="_on_gui_input"] +[connection signal="gui_input" from="InventoryGrid/ItemSlot16" to="InventoryGrid/ItemSlot16" method="_on_gui_input"] diff --git a/templates/quest_view.tscn b/templates/quest_view.tscn new file mode 100644 index 0000000..1a3a8ab --- /dev/null +++ b/templates/quest_view.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=6 format=3 uid="uid://ytfwb1vyrmsx"] + +[ext_resource type="Script" uid="uid://bm4826vxrmuqh" path="res://scripts/quest_view.gd" id="1_gmxj1"] +[ext_resource type="Texture2D" uid="uid://b7jry0kqho7y7" path="res://graphics/questview/forest-back.png" id="2_0cnce"] +[ext_resource type="Texture2D" uid="uid://bu18dxqnd3hf6" path="res://graphics/questview/forest-back2.png" id="3_dvgqk"] +[ext_resource type="Texture2D" uid="uid://ci7ngqo1sh7ao" path="res://graphics/questview/ground.png" id="4_0yhlr"] +[ext_resource type="Texture2D" uid="uid://cr0sb3p1r7bdq" path="res://graphics/questview/forest-mid.png" id="5_h4ad0"] + +[node name="QuestView" type="Panel"] +custom_minimum_size = Vector2(375, 325) +anchors_preset = -1 +offset_left = 12.0 +offset_right = 387.0 +offset_bottom = 325.0 +script = ExtResource("1_gmxj1") + +[node name="Setting" type="Control" parent="."] +clip_contents = true +layout_mode = 1 +offset_right = 375.0 +offset_bottom = 325.0 + +[node name="Control" type="Control" parent="Setting"] +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="StageParallax" type="Parallax2D" parent="Setting/Control"] +repeat_size = Vector2(750, 0) +autoscroll = Vector2(-30, 0) +ignore_camera_scroll = true + +[node name="Background" type="TextureRect" parent="Setting/Control/StageParallax"] +anchors_preset = -1 +offset_top = -50.0 +offset_right = 750.0 +offset_bottom = 375.0 +texture = ExtResource("2_0cnce") + +[node name="StageParallax3" type="Parallax2D" parent="Setting/Control"] +scale = Vector2(0.8, 0.8) +repeat_size = Vector2(750, 0) +autoscroll = Vector2(-35, 0) +ignore_camera_scroll = true + +[node name="Background" type="TextureRect" parent="Setting/Control/StageParallax3"] +modulate = Color(1.179842, 1.179842, 1.179842, 1) +anchors_preset = -1 +offset_right = 750.0 +offset_bottom = 425.0 +texture = ExtResource("3_dvgqk") + +[node name="BackgroundParallax" type="Parallax2D" parent="Setting/Control"] +repeat_size = Vector2(475, 0) +autoscroll = Vector2(-45, 0) +ignore_camera_scroll = true + +[node name="TextureRect" type="TextureRect" parent="Setting/Control/BackgroundParallax"] +anchors_preset = -1 +offset_top = -50.0 +offset_right = 475.0 +offset_bottom = 375.0 +texture = ExtResource("4_0yhlr") + +[node name="StageParallax2" type="Parallax2D" parent="Setting/Control"] +repeat_size = Vector2(750, 0) +autoscroll = Vector2(-45, 0) +ignore_camera_scroll = true + +[node name="Foreground" type="TextureRect" parent="Setting/Control/StageParallax2"] +anchors_preset = -1 +offset_top = -50.0 +offset_right = 750.0 +offset_bottom = 375.0 +texture = ExtResource("5_h4ad0") + +[node name="EnemyPosition" type="Control" parent="."] +anchors_preset = 0 +offset_left = 292.0 +offset_top = 276.0 +offset_right = 292.0 +offset_bottom = 276.0 + +[node name="QuestorPosition" type="Control" parent="."] +layout_mode = 1 +offset_left = 89.0 +offset_top = 272.0 +offset_right = 89.0 +offset_bottom = 272.0 diff --git a/templates/quest_view_window.tscn b/templates/quest_view_window.tscn index 869d002..992e606 100644 --- a/templates/quest_view_window.tscn +++ b/templates/quest_view_window.tscn @@ -1,154 +1,7 @@ -[gd_scene load_steps=10 format=3 uid="uid://du4hyv7egc7ny"] - -[ext_resource type="Texture2D" uid="uid://b7jry0kqho7y7" path="res://graphics/questview/forest-back.png" id="1_pphhk"] -[ext_resource type="Texture2D" uid="uid://bu18dxqnd3hf6" path="res://graphics/questview/forest-back2.png" id="2_4qpsm"] -[ext_resource type="Texture2D" uid="uid://cr0sb3p1r7bdq" path="res://graphics/questview/forest-mid.png" id="2_mburs"] -[ext_resource type="Texture2D" uid="uid://ci7ngqo1sh7ao" path="res://graphics/questview/ground.png" id="2_rcl5q"] -[ext_resource type="Texture2D" uid="uid://c5d0u7ir1y0t2" path="res://graphics/testchar.png" id="5_4qpsm"] - -[sub_resource type="Animation" id="Animation_gy3gd"] -resource_name = "idle" -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} - -[sub_resource type="Animation" id="Animation_7jhts"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} - -[sub_resource type="Animation" id="Animation_5om5g"] -resource_name = "running" -length = 0.66667 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.06666667, 0.13333334, 0.2, 0.26666668, 0.33333334, 0.4, 0.46666667, 0.53333336, 0.6, 0.6666667), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_pylgq"] -_data = { -&"RESET": SubResource("Animation_7jhts"), -&"idle": SubResource("Animation_gy3gd"), -&"running": SubResource("Animation_5om5g") -} +[gd_scene format=3 uid="uid://du4hyv7egc7ny"] [node name="QuestViewWindow" type="Panel"] anchors_preset = -1 offset_left = 1.0 offset_right = 401.0 offset_bottom = 325.0 - -[node name="Panel" type="Panel" parent="."] -custom_minimum_size = Vector2(375, 325) -layout_mode = 1 -anchors_preset = -1 -offset_left = 12.0 -offset_right = 387.0 -offset_bottom = 325.0 - -[node name="Setting" type="Control" parent="Panel"] -clip_contents = true -layout_mode = 1 -offset_right = 375.0 -offset_bottom = 325.0 - -[node name="Control" type="Control" parent="Panel/Setting"] -anchors_preset = 0 -offset_right = 40.0 -offset_bottom = 40.0 - -[node name="StageParallax" type="Parallax2D" parent="Panel/Setting/Control"] -repeat_size = Vector2(750, 0) -autoscroll = Vector2(-30, 0) -ignore_camera_scroll = true - -[node name="Background" type="TextureRect" parent="Panel/Setting/Control/StageParallax"] -anchors_preset = -1 -offset_top = -50.0 -offset_right = 750.0 -offset_bottom = 375.0 -texture = ExtResource("1_pphhk") - -[node name="StageParallax3" type="Parallax2D" parent="Panel/Setting/Control"] -scale = Vector2(0.8, 0.8) -repeat_size = Vector2(750, 0) -autoscroll = Vector2(-35, 0) -ignore_camera_scroll = true - -[node name="Background" type="TextureRect" parent="Panel/Setting/Control/StageParallax3"] -modulate = Color(1.179842, 1.179842, 1.179842, 1) -anchors_preset = -1 -offset_right = 750.0 -offset_bottom = 425.0 -texture = ExtResource("2_4qpsm") - -[node name="BackgroundParallax" type="Parallax2D" parent="Panel/Setting/Control"] -repeat_size = Vector2(475, 0) -autoscroll = Vector2(-45, 0) -ignore_camera_scroll = true - -[node name="TextureRect" type="TextureRect" parent="Panel/Setting/Control/BackgroundParallax"] -anchors_preset = -1 -offset_top = -50.0 -offset_right = 475.0 -offset_bottom = 375.0 -texture = ExtResource("2_rcl5q") - -[node name="StageParallax2" type="Parallax2D" parent="Panel/Setting/Control"] -repeat_size = Vector2(750, 0) -autoscroll = Vector2(-45, 0) -ignore_camera_scroll = true - -[node name="Foreground" type="TextureRect" parent="Panel/Setting/Control/StageParallax2"] -anchors_preset = -1 -offset_top = -50.0 -offset_right = 750.0 -offset_bottom = 375.0 -texture = ExtResource("2_mburs") - -[node name="SideviewSprite" type="Control" parent="Panel"] -anchors_preset = 0 -offset_left = 89.0 -offset_top = 274.0 -offset_right = 89.0 -offset_bottom = 274.0 - -[node name="Sprite" type="Sprite2D" parent="Panel/SideviewSprite"] -position = Vector2(0, -53) -texture = ExtResource("5_4qpsm") -hframes = 4 -vframes = 3 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Panel/SideviewSprite"] -libraries = { -&"": SubResource("AnimationLibrary_pylgq") -} -autoplay = "running" diff --git a/templates/questor_sprite.tscn b/templates/questor_sprite.tscn new file mode 100644 index 0000000..26c7469 --- /dev/null +++ b/templates/questor_sprite.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=7 format=3 uid="uid://cdtpyg5ohniax"] + +[ext_resource type="Script" uid="uid://ce0vugvrwvppb" path="res://scripts/questor_sprite.gd" id="1_0ev5i"] +[ext_resource type="Texture2D" uid="uid://c5d0u7ir1y0t2" path="res://graphics/testchar.png" id="2_w1b7t"] + +[sub_resource type="Animation" id="Animation_7jhts"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_gy3gd"] +resource_name = "idle" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_5om5g"] +resource_name = "running" +length = 0.66667 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.06666667, 0.13333334, 0.2, 0.26666668, 0.33333334, 0.4, 0.46666667, 0.53333336, 0.6, 0.6666667), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_pylgq"] +_data = { +&"RESET": SubResource("Animation_7jhts"), +&"idle": SubResource("Animation_gy3gd"), +&"running": SubResource("Animation_5om5g") +} + +[node name="QuestorSprite" type="Control"] +layout_mode = 3 +offset_left = 89.0 +offset_top = 274.0 +offset_right = 89.0 +offset_bottom = 274.0 +script = ExtResource("1_0ev5i") + +[node name="Sprite" type="Sprite2D" parent="."] +position = Vector2(0, -53) +texture = ExtResource("2_w1b7t") +hframes = 4 +vframes = 3 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_pylgq") +} +autoplay = "running" diff --git a/templates/test_adventurer.tscn b/templates/test_adventurer.tscn index a12750b..b206911 100644 --- a/templates/test_adventurer.tscn +++ b/templates/test_adventurer.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://djirqtsrttqwe"] -[ext_resource type="Script" uid="uid://0jl2qbvtmsik" path="res://scripts/adventurer_data.gd" id="1_jdutx"] +[ext_resource type="Script" uid="uid://0jl2qbvtmsik" path="res://scripts/adventurer.gd" id="1_jdutx"] [node name="Test Guildmember" type="Node"] script = ExtResource("1_jdutx") diff --git a/templates/test_adventurer_sprite.tscn b/templates/test_adventurer_sprite.tscn index 690c2a8..140742b 100644 --- a/templates/test_adventurer_sprite.tscn +++ b/templates/test_adventurer_sprite.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=3 uid="uid://dew8gxu55ex6q"] -[ext_resource type="Script" uid="uid://cjqumk0kw2vte" path="res://scripts/adventurer.gd" id="1_kt0f0"] +[ext_resource type="Script" uid="uid://cjqumk0kw2vte" path="res://scripts/adventurer_sprite.gd" id="1_kt0f0"] [ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://graphics/basic-sprite.png" id="2_i6rus"] [ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://templates/speech_bubble.tscn" id="3_lqojj"] [ext_resource type="BehaviorTree" uid="uid://dght2flegv70i" path="res://ai/trees/adventurer.tres" id="4_86mwh"]