extends Node2D @export var type : Game.BASE_TYPE @onready var menu : Area2D = $MenuCollider @onready var ship : MainShip = get_tree().current_scene.get_node("MainShip") var want_to_sell : Array[Item] = [] var want_to_buy : Array[Item] = [] var sell_prices : Array[float] = [] var buy_prices : Array[float] = [] var available_hulls : Array[String] = [] var available_engines : Array[String] = [] var available_shields : Array[String] = [] var available_weapons : Array[String] = [] var hulls_prices : Dictionary var engines_prices : Dictionary var shields_prices : Dictionary var weapons_prices : Dictionary var quest : Quest = Quest.new() const available_quests : Array[Quest.TYPE]= [Quest.TYPE.ELIMINATION, Quest.TYPE.DELIVERY] const restrictions_foreach_type : Dictionary = { Quest.TYPE.ELIMINATION : [Quest.RESTRICTIONS.NO_DEATHS, Quest.RESTRICTIONS.TIMER], Quest.TYPE.DELIVERY : [Quest.RESTRICTIONS.NO_DEATHS, Quest.RESTRICTIONS.NO_WEAPON, Quest.RESTRICTIONS.TIMER] } func _ready(): fetch_modules() randomize() ship.minimap.add_marker(self, "base") match type: Game.BASE_TYPE.POWER: want_to_sell.append(Game.get_item("Energy Cell")) want_to_buy.append(Game.get_item("Raw Materials")) want_to_buy.append(Game.get_item("Water Barrel")) want_to_buy.append(Game.get_item("Food Supplies")) Game.BASE_TYPE.MINING: want_to_sell.append(Game.get_item("Raw Materials")) want_to_sell.append(Game.get_item("Water Barrel")) want_to_buy.append(Game.get_item("Energy Cell")) want_to_buy.append(Game.get_item("Food Supplies")) Game.BASE_TYPE.FOOD: want_to_sell.append(Game.get_item("Food Supplies")) want_to_buy.append(Game.get_item("Water Barrel")) want_to_buy.append(Game.get_item("Energy Cell")) want_to_buy.append(Game.get_item("Raw Materials")) Game.BASE_TYPE.TRADING: want_to_sell.append(Game.get_item("Food Supplies")) want_to_sell.append(Game.get_item("Water Barrel")) want_to_sell.append(Game.get_item("Energy Cell")) want_to_sell.append(Game.get_item("Raw Materials")) want_to_buy.append(Game.get_item("Food Supplies")) want_to_buy.append(Game.get_item("Water Barrel")) want_to_buy.append(Game.get_item("Energy Cell")) want_to_buy.append(Game.get_item("Raw Materials")) get_tree().current_scene.scene_ready.connect(post_ready) func post_ready(): update_prices() generate_quest() func update_prices(): sell_prices = [] buy_prices = [] var price : float for item in want_to_sell: if type != Game.BASE_TYPE.TRADING: price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 else: price = randi_range((item.max_price + item.min_price) / 2 * 100, item.max_price * 100) / 100.0 sell_prices.append(price) for item in want_to_buy: if type != Game.BASE_TYPE.TRADING: price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 else: price = randi_range(item.min_price * 100, (item.max_price + item.min_price) / 2 * 100) / 100.0 buy_prices.append(price) for hull in available_hulls: var item = Game.get_item(hull) price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 hulls_prices[hull] = price for engine in available_engines: var item = Game.get_item(engine) price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 engines_prices[engine] = price for shield in available_shields: var item = Game.get_item(shield) price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 shields_prices[shield] = price for weapon in available_weapons: var item = Game.get_item(weapon) price = randi_range(item.min_price * 100, item.max_price * 100) / 100.0 weapons_prices[weapon] = price func generate_quest(): var difficulty : float = randi_range(100, 300) / 100.0 var reward_multi : float = randi_range(100, max(difficulty/1.5 * 100, 100)) / 100.0 var quest_type : Quest.TYPE = available_quests.pick_random() var progress_max : int var reward_money : int var restrictions : Array[Quest.RESTRICTIONS] = [] var data : Dictionary = {} for restriction in restrictions_foreach_type[quest_type]: var hit = randi_range(0, 1) if hit: restrictions.append(restriction) match quest_type: Quest.TYPE.ELIMINATION: progress_max = difficulty * 2 reward_money = 50 * progress_max * reward_multi if restrictions.has(Quest.RESTRICTIONS.TIMER): data['timer'] = int(difficulty * 30) Quest.TYPE.DELIVERY: var bases : Array[Node] = get_tree().current_scene.bases.get_children() bases.erase(self) data['destination'] = bases.pick_random() reward_money = 50 if restrictions.has(Quest.RESTRICTIONS.TIMER): data['timer'] = int(difficulty * 30) var reward_multiplier = 1 for rest in restrictions: reward_multiplier += 0.5 reward_money *= reward_multiplier quest.create(quest_type, progress_max, reward_money, restrictions, data) ## Loads all available modules in memory func fetch_modules(): available_hulls.clear() var dir = DirAccess.open("res://scenes/hulls") var modules = dir.get_files() available_hulls = check_for_item(modules) available_engines.clear() dir = DirAccess.open("res://scenes/engines") modules = dir.get_files() available_engines = check_for_item(modules) available_shields.clear() dir = DirAccess.open("res://scenes/shields") modules = dir.get_files() available_shields = check_for_item(modules) available_weapons.clear() dir = DirAccess.open("res://scenes/weapons/presets") modules = dir.get_files() available_weapons = check_for_item(modules) func check_for_item(modules : Array[String]) -> Array[String]: var returnable : Array[String] = [] for module in modules: var itm = module.trim_suffix(".tscn") if Game.get_item(itm).name != Game.DEFAULT_ITEM.name: returnable.append(itm) return returnable