From 37cd28d611bd9dc29668a44d91108b0427848162 Mon Sep 17 00:00:00 2001 From: 2ndbeam <166764593+2ndbeam@users.noreply.github.com> Date: Sat, 25 May 2024 00:10:13 +0300 Subject: [PATCH] Rewritten quest base --- scenes/Base/base_menu.tscn | 6 ++- scripts/Base/Menu/quest.gd | 12 +++++ scripts/Base/base.gd | 3 ++ scripts/Classes/quest.gd | 89 +++++++++++++++++++++++++++----------- 4 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 scripts/Base/Menu/quest.gd diff --git a/scenes/Base/base_menu.tscn b/scenes/Base/base_menu.tscn index 9327f8c..85d0459 100644 --- a/scenes/Base/base_menu.tscn +++ b/scenes/Base/base_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://crq284yed2if5"] +[gd_scene load_steps=11 format=3 uid="uid://crq284yed2if5"] [ext_resource type="Script" path="res://scripts/Base/base_menu.gd" id="1_3hgu4"] [ext_resource type="Theme" uid="uid://dmb8bcdghdjd" path="res://main_theme.tres" id="1_p1gsn"] @@ -9,6 +9,7 @@ [ext_resource type="Resource" uid="uid://2ohcxoor22hr" path="res://menus/Base Menu/root_menu.tres" id="6_78in3"] [ext_resource type="Script" path="res://scripts/Base/Menu/close_button.gd" id="8_1k57w"] [ext_resource type="Script" path="res://scripts/Base/Menu/buy_sell.gd" id="9_u6g71"] +[ext_resource type="Script" path="res://scripts/Base/Menu/quest.gd" id="10_3dg7h"] [node name="BaseMenu" type="Control"] layout_mode = 3 @@ -188,4 +189,7 @@ script = ExtResource("8_1k57w") [node name="BuySell" type="Node" parent="."] script = ExtResource("9_u6g71") +[node name="Quest" type="Node" parent="."] +script = ExtResource("10_3dg7h") + [connection signal="button_up" from="MenuBackground/CloseButtonBack/CloseButton" to="MenuBackground/CloseButtonBack/CloseButton" method="_on_button_up"] diff --git a/scripts/Base/Menu/quest.gd b/scripts/Base/Menu/quest.gd new file mode 100644 index 0000000..8458cc9 --- /dev/null +++ b/scripts/Base/Menu/quest.gd @@ -0,0 +1,12 @@ +extends Node + +var base: Base + +var quest: Quest + +func _ready(): + get_tree().create_timer(0.05).timeout.connect(fetch_quest) + +func fetch_quest(): + base = get_parent().base + quest = base.quest diff --git a/scripts/Base/base.gd b/scripts/Base/base.gd index 7044327..8f7ebb3 100644 --- a/scripts/Base/base.gd +++ b/scripts/Base/base.gd @@ -25,6 +25,9 @@ signal dock_requested ## List of items that this base buys @export var items_on_buy: Array[Item] +## Quest that is given on this base +@export var quest: Quest + ## List of prices for items that this base sells var sell_prices: Array[float] ## List of prices for items that this base buys diff --git a/scripts/Classes/quest.gd b/scripts/Classes/quest.gd index edf17d9..ca7e353 100644 --- a/scripts/Classes/quest.gd +++ b/scripts/Classes/quest.gd @@ -1,41 +1,80 @@ +extends Resource + class_name Quest -enum TYPE {ELIMINATION, DELIVERY, ESCORT, RACE, DIVERSE} -enum RESTRICTIONS{NO_DEATHS,NO_WEAPON,TIMER} +## Type of quest +enum Type { + ## eliminate N amount of targets + Elimination, + ## reach another base without deaths + Delivery, + ## Escort ship to another base + Escort, + ## Finish race on 1st place + Race, + ## Successfully complete minigame + Diverse + } -var type : Quest.TYPE = Quest.TYPE.ELIMINATION -var progress_max : int = 1 -var progress : int = 0 -var reward_money : float -var restrictions : Array[RESTRICTIONS] = [] -var data : Dictionary = {} -var new : bool = true +## Quest will fail if player breaks restrictions +enum Restriction{ + ## Fails if player gets destroyed + NoDeaths, + ## Fails if player uses weapon + NoWeapon, + ## Fails if timer reaches zero + Timer + } +## Quest status +enum Status{ + ## Quest is not given to player + Idle, + ## Quest is given to player + Taken, + ## Player can take reward for this quest + Reward + } + +@export var type : Type = Type.Elimination +@export var progress_max : int = 1 +var progress : int = 0: + set(value): + if value >= progress_max: + quest_ended.emit(true) +@export var reward_money : float +@export var restrictions : Array[Restriction] = [] +@export var data : Dictionary = {} +@export var status: Status + +## Emits when quest was given to player signal quest_added +## Emits when quest ends succesfully signal quest_ended +## Emits when quest fails signal quest_failed -func create(type : TYPE, progress_max : int, reward_money : float, restrictions : Array[RESTRICTIONS] = [], data : Dictionary = {}) -> void: - self.type = type - self.progress_max = progress_max - self.reward_money = reward_money - self.restrictions = restrictions - self.data = data - quest_added.emit(self) - self.new = false +## Creates quest with given parameters +static func create(type : Type, progress_max : int, reward_money : float, restrictions : Array[Restriction] = [], data : Dictionary = {}) -> void: + var quest = Quest.new() + quest.type = type + quest.progress_max = progress_max + quest.reward_money = reward_money + quest.restrictions = restrictions + quest.data = data + quest.status = Status.Taken + quest.quest_added.emit(quest) +## Progress by quest func do_progress() -> void: progress += 1 - if progress >= progress_max: - quest_ended.emit(true) +## Fail quest func fail() -> void: quest_failed.emit(false) + status = Status.Idle -func _restriction_no_deaths() -> void: - if restrictions.has(RESTRICTIONS.NO_DEATHS): - fail() - -func _restriction_no_weapon() -> void: - if restrictions.has(RESTRICTIONS.NO_WEAPON): +## Trigger restriction +func trigger_restriction(restriction: Restriction) -> void: + if restrictions.has(restriction): fail()