extends Node ## Array of menu actions represented as buttons @onready var actions: Array[Button] = [ $Action1, $Action2, $Action3, $Action4, $Action5, $Action6, $Action7, $Action8 ] var base var player_ship ## Script attached to transit buttons const TRANSIT_BUTTON_SCRIPT = preload("res://scripts/Classes/Menu/transit_button.gd") ## Buy/Sell item trigger const BUY_SELL_ITEM = "BUY_SELL_ITEM" ## Buy/Sell button placeholder const BASE_BUY_SELL = "BASE_BUY_SELL" ## Button to buy amount of item const BASE_BUY_ITEM = "BASE_BUY_ITEM" ## Button to sell amount of item const BASE_SELL_ITEM = "BASE_SELL_ITEM" ## Button to fetch quest const BASE_TAKE_QUEST = "BASE_TAKE_QUEST" ## Button to get current quest info const BASE_QUEST_INFO = "BASE_QUEST_INFO" ## Button to cancel current quest const BASE_QUEST_CANCEL = "BASE_QUEST_CANCEL" ## Button to get reward from quest const BASE_QUEST_REWARD = "BASE_QUEST_REWARD" ## Null button ID const NULL = "NULL" ## Menu which is loaded on ready @export var menu: Menu = null ## Is base buying from player or vice versa var buy: bool = false ## How many buy/sell options are available var buy_sell_options: int = -1 ## Which buy/sell tab should be opened (tab holds 6 items) var buy_sell_tab: int = 0 ## Which item is selected to buy/sell var buy_sell_selected_item: int = -1 ## How many items will be bought/sold var buy_sell_amount = 0 func _ready(): get_tree().create_timer(0.05).timeout.connect(post_ready) func post_ready(): base = get_parent().get_parent().get_parent().base player_ship = base.player_ship load_menu() ## Called when menu is changed func load_menu(): var format = {} # iterating through all actions for i in range(len(menu.item_ids)): actions[i].disabled = false match menu.item_ids[i]: BASE_BUY_SELL: if i <= buy_sell_options: var list = base.items_on_buy if buy else base.items_on_sell format["item_id"] = i + buy_sell_tab * 6 format["item_name"] = tr(list[i - 1 + buy_sell_tab * 6].name) menu.item_ids[i] = BUY_SELL_ITEM BASE_BUY_ITEM: format = get_buy_sell_button_format(buy_sell_selected_item, i) BASE_SELL_ITEM: format = get_buy_sell_button_format(buy_sell_selected_item, i) BASE_TAKE_QUEST: actions[i].disabled = player_ship.quest != null BASE_QUEST_INFO: actions[i].disabled = player_ship.quest == null BASE_QUEST_CANCEL: actions[i].disabled = player_ship.quest.status != Quest.Status.Taken BASE_QUEST_REWARD: actions[i].disabled = player_ship.quest.status != Quest.Status.Reward # disconnect previous action if actions[i] is TransitButton: actions[i].button_up.disconnect(transit_menu) elif actions[i] is MenuAction: actions[i].button_up.disconnect(actions[i].action) # disconnect previous script actions[i].set_script(null) actions[i].text = tr(menu.item_ids[i]).format(format) # assign new script match menu.item_actions[i]: Menu.Action.TransitAction: actions[i].set_script(TRANSIT_BUTTON_SCRIPT) Menu.Action.ButtonAction: actions[i].set_script(menu.item_data[i].load_script()) Menu.Action.ComboAction: actions[i].set_script(menu.item_data[i].load_script()) if "format" in actions[i]: actions[i].format = format if "id" in actions[i]: actions[i].id = i if "dialogue" in actions[i]: actions[i].dialogue = $"../../Dialogue" ## Called with transit_button, changes current menu func transit_menu(id: int): assert(id < len(menu.item_ids) and id >= 0) var new_menu = menu.item_data[id].load_menu().duplicate() menu = new_menu load_menu() func get_buy_sell_button_format(item_id: int, button_id: int) -> Dictionary: var amount = 0 var prices = base.buy_prices if buy else base.sell_prices var items = base.items_on_buy if buy else base.items_on_sell var item_name = items[item_id].name var price = prices[item_id] match button_id: 1: amount = 1 2: amount = 5 3: amount = 10 4: amount = 50 5: amount = 100 6: if buy: amount = roundi(player_ship.money / price) elif item_name in player_ship.cargo: amount = player_ship.cargo[item_name] 7: if buy: amount = roundi(player_ship.money / (price * 2)) elif item_name in player_ship.cargo: amount = roundi(player_ship.cargo[item_name] / 2) var total_cost = price * amount var format = { "amount": amount, "total_cost": total_cost, "item": item_name, "item_name": tr(item_name), "buy": buy } return format