Quest restrictions (2/3) and current quest info

This commit is contained in:
2ndbeam 2024-06-02 20:40:10 +03:00
commit 9bff79e019
13 changed files with 53 additions and 16 deletions

View file

@ -14,6 +14,11 @@ const TAKE_QUEST = "BASE_TAKE_QUEST"
const ACCEPT_QUEST = "BASE_QUEST_ACCEPT"
## This message will trigger quest node to take quest from player
const CANCEL_QUEST = "BASE_QUEST_CANCEL"
## This message will trigger quest node to get quest info
const QUEST_INFO = "BASE_QUEST_INFO"
## Quest progress template
const QUEST_PROGRESS = "{cur} / {max}"
@onready var dialogue = $DialogueView
@onready var buy_sell = $"../../BuySell"
@ -48,13 +53,22 @@ func send_message(msg: Message):
format["amount"] = actions_menu.buy_sell_amount
format["item_name"] = item_name
TAKE_QUEST:
quest.make_answer(quest.quest)
format["answer"] = quest.answer
if quest.answer == tr(quest.NO_QUEST):
get_tree().create_timer(0.05).timeout.connect(actions_menu.transit_menu.bind(0))
ACCEPT_QUEST:
actions_menu.player_ship.quest = quest.assign_to_player()
var player_ship = actions_menu.player_ship
player_ship.quest = quest.assign_to_player()
player_ship.quest.quest_failed.connect(player_ship.on_quest_failed)
CANCEL_QUEST:
actions_menu.player_ship.quest = null
QUEST_INFO:
var cur_quest = actions_menu.player_ship.quest
quest.get_info(cur_quest)
format["answer"] = quest.info
format["given_by"] = tr(cur_quest.data["given_by"])
format["progress"] = QUEST_PROGRESS.format({"cur": cur_quest.progress, "max": cur_quest.progress_max})
var new_msg = tr(msg.fact + "_RECEIVED").format(format)
var old_len = len(dialogue.get_parsed_text())

View file

@ -3,10 +3,7 @@ extends Node
var base: Base
## Quest this node holds
var quest: Quest:
set(value):
has_quest = value != null
quest = value
var quest: Quest
## Const of answer when quest is null
const NO_QUEST = "BASE_TAKE_QUEST_FAILED"
@ -23,8 +20,11 @@ const RESTRICTIONS = {
Quest.Restriction.NoWeapon: "BASE_QUEST_RESTRICTION_NO_WEAPON",
Quest.Restriction.Timer: "BASE_QUEST_RESTRICTION_TIMER"
}
var has_quest: bool = false
## Answer about fetching quest
var answer: String = ""
## Last quest info
var info: String = ""
func _ready():
get_tree().create_timer(0.05).timeout.connect(fetch_quest)
@ -34,11 +34,17 @@ func fetch_quest():
quest = base.quest
make_answer(quest)
## Makes quest fetch answer
func make_answer(quest: Quest):
var has_quest = quest != null
if !has_quest:
answer = tr(NO_QUEST)
return
get_info(quest)
answer = tr(HAS_QUEST).format({"quest_info": info})
## Gets quest info
func get_info(quest: Quest):
var quest_format = {}
match quest.type:
Quest.Type.Elimination:
@ -52,11 +58,11 @@ func make_answer(quest: Quest):
quest_format["restrictions"] = restrictions
quest_format["reward"] = quest.reward_money
var quest_info = tr(QUEST_TYPE[quest.type]).format(quest_format)
var final_format = {"quest_info": quest_info}
answer = tr(HAS_QUEST).format(final_format)
info = quest_info
## Assigns quest to player by returning it and nullifying self quest
func assign_to_player() -> Quest:
quest.data["given_by"] = base.base_name
quest.status = Quest.Status.Taken
var temp_quest = quest
quest = null

View file

@ -19,6 +19,8 @@ signal dock_requested
@export var menu: PackedScene
## Faction that this base represents
@export var faction: Game.Faction
## Name of this base
@export var base_name: String
## List of items that this base sells
@export var items_on_sell: Array[Item]
@ -42,6 +44,7 @@ var touching_dock = false
var player_ship = null
func _ready():
get_tree().current_scene.bases.append(self)
mouse_entered.connect(star_system.set_targeted_node.bind(self))
mouse_exited.connect(star_system.clear_targeted_node)
gate_area.body_entered.connect(gate_area_body_entered)

View file

@ -26,5 +26,8 @@ func destroy():
docking_base = null
selected_node = null
if quest != null:
if Quest.Restriction.NoDeaths in quest.restrictions:
quest.fail()
quest.trigger_restriction(Quest.Restriction.NoDeaths)
func on_quest_failed(_bool: bool):
quest.quest_failed.disconnect(on_quest_failed)
quest = null

View file

@ -44,8 +44,7 @@ func _process(_delta) -> void:
func shoot() -> void:
if ship is PlayerShip:
if ship.quest != null:
if Quest.Restriction.NoWeapon in ship.quest.restrictions:
ship.quest.fail()
ship.quest.trigger_restriction(Quest.Restriction.NoWeapon)
for spawner in spawner_points:
var projectile_instance = projectile.instantiate()
ProjectileContainer.instance.add_child(projectile_instance)

View file

@ -22,6 +22,8 @@ var targeted_node: Node2D = null
var player_ship: PlayerShip
## Pause controller reference
var pause_controller: Control
## All bases in the system
var bases: Array[Base]
func _ready():
player_ship = get_node_or_null("FactionPlayer/PlayerShip")
@ -61,3 +63,11 @@ func set_targeted_node(node):
func clear_targeted_node():
targeted_node = null
## Returns base with given name
func find_base_by_name(base_name: String) -> Base:
for base in bases:
if base.base_name == base_name:
return base
return null