diff --git a/items/doublelasermk1.tres b/items/doublelasermk1.tres new file mode 100644 index 0000000..ca57ada --- /dev/null +++ b/items/doublelasermk1.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://cxbsw78sqdqyg"] + +[ext_resource type="Script" path="res://scripts/item.gd" id="1_7fodh"] + +[resource] +script = ExtResource("1_7fodh") +name = "Double Laser Mk.I" +description = "It gets twice as better than a crappy one." +min_price = 200.0 +max_price = 250.0 +weight = 0.0 +type = 1 diff --git a/items/hullmk2.tres b/items/hullmk2.tres new file mode 100644 index 0000000..f6df0d6 --- /dev/null +++ b/items/hullmk2.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="Item" load_steps=3 format=3 uid="uid://dcu7danm4lucy"] + +[ext_resource type="Texture2D" uid="uid://dbwvej0c5bl52" path="res://sprites/ship mk1.png" id="1_eqmv1"] +[ext_resource type="Script" path="res://scripts/item.gd" id="1_xq0fp"] + +[resource] +script = ExtResource("1_xq0fp") +name = "HullMk2" +description = "Upgraded version of standart hull." +min_price = 200.0 +max_price = 300.0 +weight = 0.0 +icon = ExtResource("1_eqmv1") +type = 2 diff --git a/items/singlelasermk1.tres b/items/singlelasermk1.tres new file mode 100644 index 0000000..d9e7846 --- /dev/null +++ b/items/singlelasermk1.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://bh1thpb5padtm"] + +[ext_resource type="Script" path="res://scripts/item.gd" id="1_abxbi"] + +[resource] +script = ExtResource("1_abxbi") +name = "Single Laser Mk.I" +description = "This one looks nice. Definitely not that deadly as it was advertised." +min_price = 50.0 +max_price = 100.0 +weight = 0.0 +type = 1 diff --git a/items/singlerocketmk1.tres b/items/singlerocketmk1.tres new file mode 100644 index 0000000..2d53b84 --- /dev/null +++ b/items/singlerocketmk1.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://gg7ju73wve6w"] + +[ext_resource type="Script" path="res://scripts/item.gd" id="1_r753s"] + +[resource] +script = ExtResource("1_r753s") +name = "Single Rocket Mk.I" +description = "Erm...Still better than laser..." +min_price = 150.0 +max_price = 200.0 +weight = 0.0 +type = 1 diff --git a/items/starterengine.tres b/items/starterengine.tres new file mode 100644 index 0000000..2cb557d --- /dev/null +++ b/items/starterengine.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://d365u87r3hvb5"] + +[ext_resource type="Script" path="res://scripts/item.gd" id="1_q5jvx"] + +[resource] +script = ExtResource("1_q5jvx") +name = "Starter Engine" +description = "The first one to be made." +min_price = 50.0 +max_price = 100.0 +weight = 0.0 +type = 0 diff --git a/items/starterhull.tres b/items/starterhull.tres new file mode 100644 index 0000000..2b90272 --- /dev/null +++ b/items/starterhull.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="Item" load_steps=3 format=3 uid="uid://14rkvp6cksg5"] + +[ext_resource type="Texture2D" uid="uid://dbwvej0c5bl52" path="res://sprites/ship mk1.png" id="1_5dwb0"] +[ext_resource type="Script" path="res://scripts/item.gd" id="1_e4j4a"] + +[resource] +script = ExtResource("1_e4j4a") +name = "StarterHull" +description = "The very basic hull, even YOU could afford that." +min_price = 200.0 +max_price = 250.0 +weight = 0.0 +icon = ExtResource("1_5dwb0") +type = 2 diff --git a/items/startershield.tres b/items/startershield.tres new file mode 100644 index 0000000..1fc1814 --- /dev/null +++ b/items/startershield.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://ceygt2ddj80sf"] + +[ext_resource type="Script" path="res://scripts/item.gd" id="1_k57go"] + +[resource] +script = ExtResource("1_k57go") +name = "Starter Shield" +description = "You needed that so desperately so you didn't think of getting a better one later." +min_price = 100.0 +max_price = 150.0 +weight = 0.0 +type = 3 diff --git a/project.godot b/project.godot index 372beb0..3d5bef7 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="GammaCosmicRays" config/tags=PackedStringArray("main_project") run/main_scene="res://scenes/MainMenu.tscn" -config/features=PackedStringArray("4.1", "Forward Plus") +config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" [display] @@ -78,6 +78,11 @@ pause={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) ] } +hide_menu={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} [layer_names] diff --git a/scenes/MainShip.tscn b/scenes/MainShip.tscn index fa8a643..96d1ef9 100644 --- a/scenes/MainShip.tscn +++ b/scenes/MainShip.tscn @@ -31,6 +31,8 @@ metadata/_edit_horizontal_guides_ = [] [node name="SecondaryWeapon" type="Node2D" parent="."] +[node name="SingleLaser" parent="SecondaryWeapon" instance=ExtResource("4_s724s")] + [node name="Shield" parent="." instance=ExtResource("6_nihas")] [node name="Camera" type="Camera2D" parent="."] diff --git a/scenes/hulls/HullMk2.tscn b/scenes/hulls/HullMk2.tscn new file mode 100644 index 0000000..5f624a4 --- /dev/null +++ b/scenes/hulls/HullMk2.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://c02jesitrkrm5"] + +[ext_resource type="PackedScene" uid="uid://bbho4h6tg4jca" path="res://scenes/hulls/starterhull.tscn" id="1_miiwm"] + +[node name="Hull" instance=ExtResource("1_miiwm")] +max_hp = 40.0 +max_fuel = 9000.0 +max_weight = 150.0 +id = "HullMk2" diff --git a/scenes/hulls/starterhull.tscn b/scenes/hulls/starterhull.tscn index b215c7c..8e4a8f9 100644 --- a/scenes/hulls/starterhull.tscn +++ b/scenes/hulls/starterhull.tscn @@ -8,5 +8,6 @@ script = ExtResource("1_em4j0") max_fuel = 6000 [node name="HullSprite" type="Sprite2D" parent="."] +z_index = -1 position = Vector2(16, 0) texture = ExtResource("2_tvpkh") diff --git a/scenes/menus/BaseMenu.tscn b/scenes/menus/BaseMenu.tscn index b3deb20..e08ef68 100644 --- a/scenes/menus/BaseMenu.tscn +++ b/scenes/menus/BaseMenu.tscn @@ -77,7 +77,8 @@ layout_mode = 0 offset_top = 576.0 offset_right = 640.0 offset_bottom = 640.0 -text = "Fly off base to exit this menu." +text = "Press [TAB] to show / hide menu +Fly off the base to exit menu" horizontal_alignment = 1 vertical_alignment = 1 @@ -114,49 +115,50 @@ script = ExtResource("2_ld3o5") [node name="SellList" type="ItemList" parent="TradingMenu"] layout_mode = 0 +offset_left = 1.0 offset_top = 64.0 offset_right = 320.0 -offset_bottom = 512.0 +offset_bottom = 576.0 [node name="BuyList" type="ItemList" parent="TradingMenu"] layout_mode = 0 offset_left = 320.0 offset_top = 64.0 -offset_right = 640.0 -offset_bottom = 512.0 +offset_right = 639.0 +offset_bottom = 576.0 [node name="SellInput" type="LineEdit" parent="TradingMenu"] layout_mode = 0 offset_left = 1.0 -offset_top = 512.0 +offset_top = 576.0 offset_right = 160.0 -offset_bottom = 576.0 +offset_bottom = 639.0 placeholder_text = "Amount to buy" alignment = 1 [node name="BuyInput" type="LineEdit" parent="TradingMenu"] layout_mode = 0 offset_left = 320.0 -offset_top = 512.0 +offset_top = 576.0 offset_right = 480.0 -offset_bottom = 576.0 +offset_bottom = 639.0 placeholder_text = "Amount to sell" alignment = 1 [node name="BuyButton" type="Button" parent="TradingMenu"] layout_mode = 0 offset_left = 160.0 -offset_top = 512.0 +offset_top = 576.0 offset_right = 320.0 -offset_bottom = 576.0 +offset_bottom = 639.0 text = "Buy selected item" [node name="SellButton" type="Button" parent="TradingMenu"] layout_mode = 0 offset_left = 480.0 -offset_top = 512.0 +offset_top = 576.0 offset_right = 639.0 -offset_bottom = 576.0 +offset_bottom = 639.0 text = "Sell selected item" [node name="QuestMenu" type="NinePatchRect" parent="."] @@ -294,7 +296,6 @@ offset_bottom = 511.0 text = "Accept quest" [node name="EquipmentMenu" type="NinePatchRect" parent="."] -visible = false layout_mode = 0 offset_left = 320.0 offset_top = 40.0 @@ -324,6 +325,138 @@ offset_bottom = 40.0 text = "X" script = ExtResource("2_ld3o5") +[node name="AvailableItems" type="ItemList" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 1.0 +offset_top = 128.0 +offset_right = 320.0 +offset_bottom = 368.0 + +[node name="BuyableItems" type="ItemList" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 1.0 +offset_top = 400.0 +offset_right = 320.0 +offset_bottom = 639.0 + +[node name="LabelAvailable" type="Label" parent="EquipmentMenu"] +layout_mode = 0 +offset_top = 96.0 +offset_right = 320.0 +offset_bottom = 128.0 +text = "Available modules" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="LabelBuyable" type="Label" parent="EquipmentMenu"] +layout_mode = 0 +offset_top = 368.0 +offset_right = 320.0 +offset_bottom = 400.0 +text = "Buyable modules" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="LabelSelectedItemInfo" type="Label" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 96.0 +offset_right = 640.0 +offset_bottom = 128.0 +text = "Selected module info:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HullSelect" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 1.0 +offset_top = 64.0 +offset_right = 160.0 +offset_bottom = 96.0 +disabled = true +text = "Hull" + +[node name="EngineSelect" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 160.0 +offset_top = 64.0 +offset_right = 320.0 +offset_bottom = 96.0 +text = "Engine" + +[node name="ShieldSelect" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 64.0 +offset_right = 480.0 +offset_bottom = 96.0 +text = "Shield" + +[node name="WeaponSelect" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 480.0 +offset_top = 64.0 +offset_right = 639.0 +offset_bottom = 96.0 +text = "Weapon" + +[node name="LabelInfoBlock" type="Label" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 128.0 +offset_right = 640.0 +offset_bottom = 368.0 +text = "Select a module to receive info about it." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 1 + +[node name="LabelSelectedItemInfo2" type="Label" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 368.0 +offset_right = 640.0 +offset_bottom = 400.0 +text = "Selected module actions:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="BuySellButton" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 400.0 +offset_right = 639.0 +offset_bottom = 464.0 +disabled = true +text = "Buy / Sell selected" + +[node name="EquipButton" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 464.0 +offset_right = 639.0 +offset_bottom = 528.0 +disabled = true +text = "Equip selected" + +[node name="EquipPrimaryButton" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 528.0 +offset_right = 639.0 +offset_bottom = 584.0 +disabled = true +text = "Equip selected as primary weapon" + +[node name="EquipSecondaryButton" type="Button" parent="EquipmentMenu"] +layout_mode = 0 +offset_left = 320.0 +offset_top = 584.0 +offset_right = 639.0 +offset_bottom = 639.0 +disabled = true +text = "Equip selected as secondary weapon" + [node name="InfoMenu" type="NinePatchRect" parent="."] visible = false layout_mode = 0 @@ -354,3 +487,13 @@ offset_right = 639.0 offset_bottom = 40.0 text = "X" script = ExtResource("2_ld3o5") + +[node name="Label" type="Label" parent="InfoMenu"] +layout_mode = 0 +offset_top = 64.0 +offset_right = 640.0 +offset_bottom = 640.0 +text = "Actually, this section is WIP. +Part of the factions system." +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/scenes/weapons/presets/DoubleLaserMk1.tscn b/scenes/weapons/presets/DoubleLaserMk1.tscn index ceecf90..c474f18 100644 --- a/scenes/weapons/presets/DoubleLaserMk1.tscn +++ b/scenes/weapons/presets/DoubleLaserMk1.tscn @@ -12,6 +12,7 @@ ammo_type = "Laser Energy" ammo_consumption = 2.0 shoot_timer = NodePath("ShootingTimer") spawner_points = [NodePath("SpawnerSprite1/Spawner1"), NodePath("SpawnerSprite2/Spawner2")] +id = "DoubleLaserMk1" [node name="SpawnerSprite1" type="Sprite2D" parent="."] position = Vector2(4, -12) diff --git a/scenes/weapons/presets/SingleRocketMk1.tscn b/scenes/weapons/presets/SingleRocketMk1.tscn index 06b67f7..566c9e4 100644 --- a/scenes/weapons/presets/SingleRocketMk1.tscn +++ b/scenes/weapons/presets/SingleRocketMk1.tscn @@ -12,6 +12,7 @@ ammo_type = "Rockets" ammo_consumption = 1.0 shoot_timer = NodePath("ShootingTimer") spawner_points = [NodePath("Spawner")] +id = "SingleRocketMk1" [node name="ShootingTimer" type="Timer" parent="."] wait_time = 0.5 diff --git a/scripts/Space.gd b/scripts/Space.gd index 0c4c19c..a3c555a 100644 --- a/scripts/Space.gd +++ b/scripts/Space.gd @@ -38,18 +38,17 @@ func _ready(): ship.hull.fuel = save['fuel'] ship.hull.ammunition = save['ammo'] ship.hull.cargo = save['cargo'] - if save.has('primaryweapon'): - for node in ship.primary_slot.get_children(): - node.queue_free() - var weapon_inst = Game.get_weapon(save['primaryweapon']).instantiate() - weapon_inst.id = save['primaryweapon'] - ship.primary_slot.add_child(weapon_inst) - if save.has('secondaryweapon'): - for node in ship.secondary_slot.get_children(): - node.queue_free() - var weapon_inst = Game.get_weapon(save['secondaryweapon']).instantiate() - weapon_inst.id = save['secondaryweapon'] - ship.secondary_slot.add_child(weapon_inst) + if save.has('ship_equipment'): + var hull = Game.get_module(save['ship_equipment']['hull'], 'hull').instantiate() + var engine = Game.get_module(save['ship_equipment']['hull'], 'engine').instantiate() + var shield = Game.get_module(save['ship_equipment']['hull'], 'shield').instantiate() + var primary_weapon = Game.get_weapon(save['ship_equipment']['primary_weapon']).instantiate() + var secondary_weapon = Game.get_weapon(save['ship_equipment']['secondary_weapon']).instantiate() + ship.change_hull(hull) + ship.change_engine(engine) + ship.change_shield(shield) + ship.change_primary_weapon(primary_weapon) + ship.change_secondary_weapon(secondary_weapon) if save.has('quest'): var data = save['quest'] var type = data['type'] as Quest.TYPE diff --git a/scripts/game.gd b/scripts/game.gd index afa0f06..40bd69c 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -2,12 +2,15 @@ extends Node class_name Game -enum ITEM_TYPE {VALUABLE, WEAPON, MODULE, AMMUNITION} +enum ITEM_TYPE {VALUABLE, WEAPON, HULL, SHIELD, ENGINE, AMMUNITION} enum AMMO_TYPE {NULL, LASER_ENERGY, ROCKETS} enum BASE_TYPE {POWER, MINING, FOOD, TRADING, MODULE} const DEFAULT_ITEM = preload("res://items/test_item.tres") const DEFAULT_WEAPON = preload("res://scenes/weapons/presets/SingleLaserMk1.tscn") +const DEFAULT_HULL = preload("res://scenes/hulls/starterhull.tscn") +const DEFAULT_ENGINE = preload("res://scenes/engines/starterengine.tscn") +const DEFAULT_SHIELD = preload("res://scenes/shields/startershield.tscn") const salt = "2ndbeam" const gameversion = "Ictar 1.1" @@ -40,10 +43,13 @@ static func profile_save(scene : Node) -> void: 'data' : scene.ship.quest.data, 'got_reward' : scene.ship.quest_completed } - if scene.ship.primary_slot.get_child_count() > 0: - profile.profile_meta['game']['primaryweapon'] = scene.ship.primary_slot.get_child(0).id - if scene.ship.secondary_slot.get_child_count() > 0: - profile.profile_meta['game']['secondaryweapon'] = scene.ship.secondary_slot.get_child(0).id + profile.profile_meta['game']['ship_equipment'] = { + 'hull' : scene.ship.hull.id, + 'engine' : scene.ship.engine.id, + 'shield' : scene.ship.shield.id, + 'primary_weapon' : scene.ship.primary_slot.get_child(0).id, + 'secondary_weapon' : scene.ship.secondary_slot.get_child(0).id + } profile_save_from_meta(profile.profile_meta) ## Saves profile with provided profile meta @@ -102,11 +108,10 @@ static func profile_legit_check(profile_meta : Dictionary) -> Dictionary: static func get_item(id : String) -> Item: var path_name = id.to_lower().replace(" ", "_") var path = "res://items/{name}.tres".format({"name": path_name}) - var res = load(path) - if res != null: + if FileAccess.file_exists(path): + var res = load(path) return res.duplicate() - else: - return DEFAULT_ITEM.duplicate() + return DEFAULT_ITEM ## Returns weapon packed scene if it exists or DEFAULT_WEAPON instead static func get_weapon(id : String) -> PackedScene: @@ -116,3 +121,17 @@ static func get_weapon(id : String) -> PackedScene: return res else: return DEFAULT_WEAPON + +static func get_module(id : String, type : String) -> PackedScene: + var path = "res://scenes/{type}s/{name}.tscn".format({"name": id, "type": type}) + var res = load(path) + if res != null: + return res + match type: + "hull": + return DEFAULT_HULL + "engine": + return DEFAULT_ENGINE + "shield": + return DEFAULT_SHIELD + return DEFAULT_HULL diff --git a/scripts/menu/BaseMenu.gd b/scripts/menu/BaseMenu.gd index 3e9918c..e71b719 100644 --- a/scripts/menu/BaseMenu.gd +++ b/scripts/menu/BaseMenu.gd @@ -16,7 +16,31 @@ var base @onready var new_quest = $QuestMenu/NewQuest @onready var accept_quest = $QuestMenu/NewQuest/AcceptQuest @onready var new_quest_status = $QuestMenu/NewQuest/QuestStatus -var base_types = ["Power Supply", "Mining", "Food Production", "Trading", "Modules"] +@onready var available_modules = $EquipmentMenu/AvailableItems +@onready var buyable_modules = $EquipmentMenu/BuyableItems +@onready var select_hull = $EquipmentMenu/HullSelect +@onready var select_engine = $EquipmentMenu/EngineSelect +@onready var select_shield = $EquipmentMenu/ShieldSelect +@onready var select_weapon = $EquipmentMenu/WeaponSelect +@onready var buy_sell_mod = $EquipmentMenu/BuySellButton +@onready var equip_mod = $EquipmentMenu/EquipButton +@onready var equip_primary = $EquipmentMenu/EquipPrimaryButton +@onready var equip_secondary = $EquipmentMenu/EquipSecondaryButton +@onready var label_mod_info = $EquipmentMenu/LabelInfoBlock +var base_types = ["Power Supply", "Mining", "Food Production", "Trading"] +var equipment_category = "hull" +var focused_mod_id = -1 +var focused_list = null +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 available_list : Array[String] = [] +var buyable_list : Array[String] = [] func _ready(): update_lists() @@ -28,8 +52,34 @@ func _ready(): abandon_quest.button_up.connect(quest_abandon) complete_quest.button_up.connect(quest_complete) accept_quest.button_up.connect(quest_accept) + select_hull.button_up.connect(select_hull_mod) + select_engine.button_up.connect(select_engine_mod) + select_shield.button_up.connect(select_shield_mod) + select_weapon.button_up.connect(select_weapon_mod) + buy_sell_mod.button_up.connect(buy_or_sell_mod) + equip_mod.button_up.connect(equip_module) + equip_primary.button_up.connect(equip_weapon_primary) + equip_secondary.button_up.connect(equip_weapon_secondary) + available_modules.item_clicked.connect(available_mod_focus) + buyable_modules.item_clicked.connect(buyable_mod_focus) + available_modules.empty_clicked.connect(modules_list_empty_click) + buyable_modules.empty_clicked.connect(modules_list_empty_click) quest_status_update() + buy_sell_mod.disabled = true + equip_mod.disabled = true + equip_primary.disabled = true + equip_secondary.disabled = true + available_hulls = base.available_hulls + available_engines = base.available_engines + available_shields = base.available_shields + available_weapons = base.available_weapons + hulls_prices = base.hulls_prices + engines_prices = base.engines_prices + shields_prices = base.shields_prices + weapons_prices = base.weapons_prices + select_hull_mod() +## Updates buy and sell list in trading menu with available items func update_lists(): buy_list.clear() sell_list.clear() @@ -49,6 +99,7 @@ func update_lists(): var sell_text = "{name} <- {price} MU".format(format) sell_list.add_item(sell_text, base.want_to_sell[i].icon) +## Event handler for buy option in trading menu func buy_item(): var amount = int(sell_input.text) amount = clamp(amount, 0, amount) @@ -74,6 +125,7 @@ func buy_item(): ship.money -= total_price print(ship.hull.cargo) +## Event handler for sell option in trading menu func sell_item(): if len(buy_list.get_selected_items()) == 0: buy_input.text = "" @@ -106,12 +158,14 @@ func buy_text_changed(_new_text): func sell_text_changed(_new_text): sell_input.placeholder_text = "Amount to buy" +## Event handler for abandoning in active quest menu func quest_abandon(): ship.quest.fail() current_quest.visible = false new_quest.visible = true quest_status_update() +## Event handler for completion in active quest menu func quest_complete(): if !ship.quest_completed: return @@ -121,6 +175,7 @@ func quest_complete(): new_quest.visible = true quest_status_update() +## Event handler for acception in new quest menu func quest_accept(): ship.quest.create(base.quest.type, base.quest.progress_max, base.quest.reward_money, base.quest.restrictions, base.quest.data) ship.quest.progress = 0 @@ -128,6 +183,7 @@ func quest_accept(): current_quest.visible = true quest_status_update() +## Updates text in quest menu, either new or active func quest_status_update(): var ship_has_quest = !ship.quest.new or ship.quest_completed var upd_quest = ship.quest if ship_has_quest else base.quest @@ -165,3 +221,288 @@ func quest_status_update(): } upd_text.text = template.format(formatting) complete_quest.disabled = !ship.quest_completed + +## Hull selection in equipment menu +func select_hull_mod(): + equipment_category = "hull" + select_hull.disabled = true + select_engine.disabled = false + select_shield.disabled = false + select_weapon.disabled = false + available_modules.clear() + buyable_modules.clear() + available_list = available_hulls.filter(func(index): return ship.hulls.has(index)) + buyable_list = available_hulls.filter(func(index): return !ship.hulls.has(index)) + add_available(available_list) + add_buyable(buyable_list) + +## Engine selection in equipment menu +func select_engine_mod(): + equipment_category = "engine" + select_hull.disabled = false + select_engine.disabled = true + select_shield.disabled = false + select_weapon.disabled = false + available_modules.clear() + buyable_modules.clear() + available_list = available_engines.filter(func(index): return ship.engines.has(index)) + buyable_list = available_engines.filter(func(index): return !ship.engines.has(index)) + add_available(available_list) + add_buyable(buyable_list) + +## Shield selection in equipment menu +func select_shield_mod(): + equipment_category = "shield" + select_hull.disabled = false + select_engine.disabled = false + select_shield.disabled = true + select_weapon.disabled = false + available_modules.clear() + buyable_modules.clear() + available_list = available_shields.filter(func(index): return ship.shields.has(index)) + buyable_list = available_shields.filter(func(index): return !ship.shields.has(index)) + add_available(available_list) + add_buyable(buyable_list) + +## Weapon selection in equipment menu +func select_weapon_mod(): + equipment_category = "weapon" + select_hull.disabled = false + select_engine.disabled = false + select_shield.disabled = false + select_weapon.disabled = true + available_modules.clear() + buyable_modules.clear() + available_list = available_weapons.filter(func(index): return ship.weapons.has(index)) + buyable_list = available_weapons.filter(func(index): return !ship.weapons.has(index)) + add_available(available_list) + add_buyable(buyable_list) + +func add_available(avail_list): + if len(avail_list) < 1: + return + for i in range(len(avail_list)): + var meta = { + 'type' : equipment_category, + 'item' : avail_list[i], + 'equipped' : false, + 'primary' : false, + 'secondary' : false + } + match equipment_category: + 'hull': + meta['price'] = hulls_prices[avail_list[i]] + meta['equipped'] = ship.hull.id == avail_list[i] + print(ship.hull.id, avail_list[i]) + 'engine': + meta['price'] = engines_prices[avail_list[i]] + meta['equipped'] = ship.engine.id == avail_list[i] + 'shield': + meta['price'] = shields_prices[avail_list[i]] + meta['equipped'] = ship.shield.id == avail_list[i] + 'weapon': + meta['price'] = weapons_prices[avail_list[i]] + meta['primary'] = ship.primary_slot.get_child(0).id == avail_list[i] + meta['secondary'] = ship.secondary_slot.get_child(0).id == avail_list[i] + var embed = { + 'prefix' : '', + 'name' : Game.get_item(avail_list[i]).name, + 'price' : meta['price'] + } + if meta['equipped']: + embed['prefix'] = '(Equipped) ' + elif meta['primary'] and !meta['secondary']: + embed['prefix'] = '(Primary) ' + elif meta['secondary'] and !meta['primary']: + embed['prefix'] = '(Secondary) ' + elif meta['primary'] and meta['secondary']: + embed['prefix'] = '(Both) ' + var text = "{prefix}{name} -> {price} MU".format(embed) + available_modules.add_item(text) + available_modules.set_item_metadata(i, meta) + +func add_buyable(buy_list): + if len(buy_list) < 1: + return + for i in range(len(buy_list)): + var meta = { + 'type' : equipment_category, + 'item' : buy_list[i], + 'equipped' : false, + 'primary' : false, + 'secondary' : false + } + match equipment_category: + 'hull': + meta['price'] = hulls_prices[buy_list[i]] + 'engine': + meta['price'] = engines_prices[buy_list[i]] + 'shield': + meta['price'] = shields_prices[buy_list[i]] + 'weapon': + meta['price'] = weapons_prices[buy_list[i]] + var embed = { + 'name' : Game.get_item(buy_list[i]).name, + 'price' : meta['price'] + } + var text = "{name} -> {price} MU".format(embed) + buyable_modules.add_item(text) + buyable_modules.set_item_metadata(i, meta) + +## Available modules focused in equipment menu +func available_mod_focus(index : int, _at, _mouse): + var meta = available_modules.get_item_metadata(index) + if equipment_category == "weapon": + buy_sell_mod.disabled = meta['primary'] or meta['secondary'] + equip_mod.disabled = true + equip_primary.disabled = meta['primary'] + equip_secondary.disabled = meta['secondary'] + else: + buy_sell_mod.disabled = meta['equipped'] + equip_mod.disabled = meta['equipped'] + equip_primary.disabled = true + equip_secondary.disabled = true + focused_mod_id = index + focused_list = available_modules + set_module_info_text(meta['item']) + +## Buyable modules focused in equipment menu +func buyable_mod_focus(index : int, _at, _mouse): + var meta = buyable_modules.get_item_metadata(index) + buy_sell_mod.disabled = ship.money < meta['price'] + equip_mod.disabled = true + equip_primary.disabled = true + equip_secondary.disabled = true + focused_mod_id = index + focused_list = buyable_modules + set_module_info_text(meta['item']) + +## Disable all actions with modules cuz it's not focused in equipment menu +func mod_unfocus(): + buy_sell_mod.disabled = true + equip_mod.disabled = true + equip_primary.disabled = true + equip_secondary.disabled = true + label_mod_info.text = "Select a module to receive info about it." + +func modules_list_empty_click(_at, _mouse): + mod_unfocus() + +func buy_module(): + var meta = buyable_modules.get_item_metadata(buyable_modules.get_selected_items()[0]) + var price = meta['price'] + var item = meta['item'] + if ship.money < price: + return + ship.money -= price + match equipment_category: + 'hull': + ship.hulls.append(item) + select_hull_mod() + 'engine': + ship.engines.append(item) + select_engine_mod() + 'shield': + ship.shields.append(item) + select_shield_mod() + 'weapon': + ship.weapons.append(item) + select_weapon_mod() + +func sell_module(): + var meta = available_modules.get_item_metadata(available_modules.get_selected_items()[0]) + if meta['equipped'] or meta['primary'] or meta['secondary']: + return + var price = meta['price'] + var item = meta['item'] + ship.money += price + match equipment_category: + 'hull': + ship.hulls.erase(item) + select_hull_mod() + 'engine': + ship.engines.erase(item) + select_engine_mod() + 'shield': + ship.shields.erase(item) + select_shield_mod() + 'weapon': + ship.weapons.erase(item) + select_weapon_mod() + +func buy_or_sell_mod(): + if equip_mod.disabled and equip_primary.disabled: + buy_module() + return + sell_module() + mod_unfocus() + +func equip_module(): + var meta = available_modules.get_item_metadata(available_modules.get_selected_items()[0]) + match equipment_category: + 'hull': + ship.change_hull(meta['item']) + select_hull_mod() + 'engine': + ship.change_engine(meta['item']) + select_engine_mod() + 'shield': + ship.change_shield(meta['item']) + select_shield_mod() + mod_unfocus() + +func equip_weapon_primary(): + var meta = available_modules.get_item_metadata(available_modules.get_selected_items()[0]) + ship.change_primary_weapon(meta['item']) + get_tree().create_timer(0.05).timeout.connect(select_weapon_mod) + mod_unfocus() + +func equip_weapon_secondary(): + var meta = available_modules.get_item_metadata(available_modules.get_selected_items()[0]) + ship.change_secondary_weapon(meta['item']) + get_tree().create_timer(0.05).timeout.connect(select_weapon_mod) + mod_unfocus() + +func set_module_info_text(item): + var itm = Game.get_item(item) + var module + var format + if equipment_category == "weapon": + module = Game.get_weapon(item).instantiate() + else: + module = Game.get_module(item, equipment_category).instantiate() + var text = "{description}\nStats:\n".format({'description':itm.description}) + match equipment_category: + 'hull': + format = { + 'maxhp' : module.max_hp, + 'maxfuel' : module.max_fuel, + 'maxcargo' : module.max_weight + } + text += "Max strength: {maxhp} HS\nFuel capacity: {maxfuel} FU\nCargo weight: {maxcargo} WU".format(format) + 'engine': + format = { + 'maxspeed' : module.max_speed, + 'maxturbo' : module.max_turbo_speed, + 'acceleration' : module.acceleration, + 'fuelcons' : module.fuel_consumption, + 'rotation' : module.rotation_speed + } + text += "Max speed (normal): {maxspeed} MU/sec\nMax speed (turbo): {maxturbo} MU/sec\nAcceleration: {acceleration} MU/sec\nFuel consumption: {fuelcons} FU/sec\nRotation speed: {rotation} deg/sec".format(format) + 'shield': + format = { + 'maxcap' : module.max_capacity, + 'recharge' : module.shield_charge_rate, + 'delay' : module.recharge_timer.wait_time, + 'laser' : module.laser_charge_rate + } + text += "Max capacity: {maxcap} SU\nСharge rate: {recharge} SU/sec\nRecharge delay: {delay} seconds\nLaser Сharge rate: {las} LE/sec".format(format) + 'weapon': + format = { + 'spread' : module.spread, + 'ammotype' : module.ammo_type, + 'ammocons' : module.ammo_consumption, + 'firerate' : 1.0 / module.shoot_timer.wait_time + } + text += "Ammo type: {ammotype}\nAmmo consumption: {ammocons} units/usage\nFirerate: {firerate} usages/second\nSpread: {spread} degrees".format(format) + label_mod_info.text = text diff --git a/scripts/menu/MainMenu.gd b/scripts/menu/MainMenu.gd index 5ce5359..b1d8a7c 100644 --- a/scripts/menu/MainMenu.gd +++ b/scripts/menu/MainMenu.gd @@ -64,7 +64,7 @@ func change_menu(id): 5: # First-timer Create Profile b1.id = "Null" b2.id = "FirstCreateProfileConfirm" - b3.id = "Null" + b3.id = "ExitGame" b4.id = "Null" b5.id = "Null" input.visible = true diff --git a/scripts/misc/BaseMenuOpen.gd b/scripts/misc/BaseMenuOpen.gd index 9d11666..30bc153 100644 --- a/scripts/misc/BaseMenuOpen.gd +++ b/scripts/misc/BaseMenuOpen.gd @@ -3,14 +3,20 @@ extends Area2D @export var menu : PackedScene @onready var base_collider = $"../BaseCollider/BaseColliderDetector" var menu_inst +var ship_in_menu = false func onbcbodyentered(body): if body is MainShip: body.engine.speed = 0 +func _input(event): + if event is InputEventKey and ship_in_menu: + if Input.is_action_just_released("hide_menu"): + menu_inst.visible = !menu_inst.visible func _on_body_entered(body): if body is MainShip: + ship_in_menu = true body.allow_shooting = false menu_inst = menu.instantiate() menu_inst.modulate = get_parent().modulate @@ -26,3 +32,4 @@ func _on_body_exited(body): body.allow_shooting = true body.minimap.visible = true menu_inst.queue_free() + ship_in_menu = false diff --git a/scripts/misc/CameraTweaks.gd b/scripts/misc/CameraTweaks.gd index 4a6f168..e5c7b6b 100644 --- a/scripts/misc/CameraTweaks.gd +++ b/scripts/misc/CameraTweaks.gd @@ -1,11 +1,23 @@ extends Camera2D -@onready var engine = $"../Engine" +@onready var ship = get_parent() +var engine @onready var cur_scale = zoom.x @onready var min_scale = cur_scale / 1.5 @onready var max_scale = cur_scale * 2 +var rdy = false + +func _ready(): + get_tree().create_timer(0.05).timeout.connect(is_rdy) + +func is_rdy(): + rdy = true + engine = ship.engine func _process(_delta): + if !rdy: + return + engine = ship.engine var speed_percentage = engine.max_speed / engine.speed var factor : float if get_parent().allow_shooting: diff --git a/scripts/misc/Counter.gd b/scripts/misc/Counter.gd index e642edd..6b217d9 100644 --- a/scripts/misc/Counter.gd +++ b/scripts/misc/Counter.gd @@ -2,10 +2,23 @@ extends Label @export var counter_id : String @onready var ship = $"../../.." -@onready var hull = $"../../../Hull" -@onready var shield = $"../../../Shield" +var hull +var shield +var rdy = false + +func _ready(): + get_tree().create_timer(0.05).timeout.connect(is_rdy) + +func is_rdy(): + rdy = true + hull = ship.hull + shield = ship.shield func _process(_delta) -> void: + if !rdy: + return + hull = ship.hull + shield = ship.shield match counter_id: "ammo": text = str(hull.ammunition) diff --git a/scripts/misc/SpeedLine.gd b/scripts/misc/SpeedLine.gd index d4e74d7..d81b156 100644 --- a/scripts/misc/SpeedLine.gd +++ b/scripts/misc/SpeedLine.gd @@ -1,8 +1,20 @@ extends Line2D -@onready var engine = $"../../../Engine" +@onready var ship = $"../../.." +var engine +var rdy = false +func _ready(): + get_tree().create_timer(0.05).timeout.connect(is_rdy) + +func is_rdy(): + rdy = true + engine = ship.engine + func _process(_delta): + if !rdy: + return + engine = ship.engine var speed_percentage : float = engine.speed / engine.max_speed * 100 var new_points = [Vector2.ZERO, Vector2(speed_percentage, 0)] points = PackedVector2Array(new_points) diff --git a/scripts/objects/Base.gd b/scripts/objects/Base.gd index 7194b41..2fc5db0 100644 --- a/scripts/objects/Base.gd +++ b/scripts/objects/Base.gd @@ -10,6 +10,15 @@ 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 = { @@ -18,6 +27,7 @@ const restrictions_foreach_type : Dictionary = { } func _ready(): + fetch_modules() randomize() ship.minimap.add_marker(self, "base") match type: @@ -57,16 +67,32 @@ func update_prices(): var price : float for item in want_to_sell: if type != Game.BASE_TYPE.TRADING: - price = randi_range(item.min_price, item.max_price * 100) / 100.0 + 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, item.max_price * 100) / 100.0 + 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 @@ -98,3 +124,33 @@ func generate_quest(): 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 diff --git a/scripts/objects/Hull.gd b/scripts/objects/Hull.gd index 5a33a13..664f143 100644 --- a/scripts/objects/Hull.gd +++ b/scripts/objects/Hull.gd @@ -5,6 +5,7 @@ class_name Hull @export var max_hp : float = 30 @export var max_fuel : float = 1000 @export var max_weight : float = 100 +@export var id : String = "starterhull" @onready var hp : float = max_hp @onready var fuel : float = max_fuel diff --git a/scripts/objects/MainShip.gd b/scripts/objects/MainShip.gd index 2ee8042..0465476 100644 --- a/scripts/objects/MainShip.gd +++ b/scripts/objects/MainShip.gd @@ -17,6 +17,11 @@ var money : float = 1000 var quest : Quest = Quest.new() var quest_completed : bool = false +var hulls : Array[String] = ["starterhull"] +var engines : Array[String] = ["starterengine"] +var shields : Array[String] = ["startershield"] +var weapons : Array[String] = ["SingleLaserMk1"] + signal destroyed func _ready(): @@ -24,9 +29,6 @@ func _ready(): quest.quest_ended.connect(kill_quest) quest.quest_failed.connect(kill_quest) destroyed.connect(quest._restriction_no_deaths) - - secondary_slot.add_child(Game.get_weapon("SingleRocketMk1").instantiate()) - #quest.create(Quest.TYPE.ELIMINATION, 2, 200) func _process(_delta): @@ -64,3 +66,40 @@ func enemy_destroyed(_enemy): return if quest.type == quest.TYPE.ELIMINATION: quest.do_progress() + +func change_hull(new): + var new_hull = Game.get_module(new, 'hull').instantiate() + var old_hull = hull + add_child(new_hull) + hull = new_hull + hull.hp = old_hull.hp + hull.fuel = old_hull.fuel + get_tree().create_timer(0.05).timeout.connect(old_hull.queue_free) + +func change_engine(new): + var new_engine = Game.get_module(new, 'engine').instantiate() + var old_engine = engine + add_child(new_engine) + engine = new_engine + get_tree().create_timer(0.05).timeout.connect(old_engine.queue_free) + +func change_shield(new): + var new_shield = Game.get_module(new, 'shield').instantiate() + var old_shield = shield + add_child(shield) + shield = new_shield + get_tree().create_timer(0.05).timeout.connect(old_shield.queue_free) + +func change_primary_weapon(new): + var weapon = Game.get_weapon(new).instantiate() + if primary_slot.get_child_count() > 0: + for child in primary_slot.get_children(): + child.queue_free() + primary_slot.add_child(weapon) + +func change_secondary_weapon(new): + var weapon = Game.get_weapon(new).instantiate() + if secondary_slot.get_child_count() > 0: + for child in secondary_slot.get_children(): + child.queue_free() + secondary_slot.add_child(weapon) diff --git a/scripts/objects/Shield.gd b/scripts/objects/Shield.gd index 6ad23cc..2de0179 100644 --- a/scripts/objects/Shield.gd +++ b/scripts/objects/Shield.gd @@ -7,6 +7,7 @@ class_name Shield @export var recharge_timer : Timer @export var laser_timer : Timer @export var laser_charge_rate : float = 20 +@export var id : String = "startershield" @onready var ship = get_parent() @onready var capacity : float = max_capacity var can_recharge : bool = false diff --git a/scripts/objects/ShipEngine.gd b/scripts/objects/ShipEngine.gd index 9898280..792c91e 100644 --- a/scripts/objects/ShipEngine.gd +++ b/scripts/objects/ShipEngine.gd @@ -7,17 +7,28 @@ class_name ShipEngine @export var acceleration : float = 50 @export var fuel_consumption : float = 100 @export var rotation_speed : int = 90 +@export var id : String = "starterengine" @onready var ship = get_parent() -@onready var hull = $"../Hull" +var hull var speed = 0 var min_speed = max_speed / -4 var turbo_enabled = false var alternative_movement = false var destination_angle : float var destination_difference : float +var rdy = false +func _ready(): + get_tree().create_timer(0.05).timeout.connect(is_rdy) + +func is_rdy(): + rdy = true + hull = ship.hull func _physics_process(delta): + if !rdy: + return + hull = ship.hull var turbo_input = Input.get_action_raw_strength("turbo") var acceleration_input = Input.get_axis("deccelerate", "accelerate") if ship is MainShip else 1.0 var rotation_input = Input.get_axis("rotateleft","rotateright") diff --git a/scripts/objects/weapon.gd b/scripts/objects/weapon.gd index 66de558..3f6e61f 100644 --- a/scripts/objects/weapon.gd +++ b/scripts/objects/weapon.gd @@ -9,7 +9,7 @@ class_name Weapon @export var shoot_timer : Timer @export var shoot_action : String = "" @export var spawner_points : Array[Node2D] -var id : String = "SingleLaserMk1" +@export var id : String = "SingleLaserMk1" @onready var ship = $"../.." @onready var slot = $".."