156 lines
5.6 KiB
GDScript
156 lines
5.6 KiB
GDScript
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.split('.', true, 1)[0]
|
|
if Game.get_item(itm).name != Game.DEFAULT_ITEM.name:
|
|
returnable.append(itm)
|
|
return returnable
|