Save file functionality

This commit is contained in:
2024-06-18 11:33:55 -04:00
parent 082b1353bc
commit 3a1b69a987
30 changed files with 428 additions and 1346 deletions

248
Game.gd
View File

@@ -1,248 +0,0 @@
extends Control
var score = 0
var clickAdd = 1
var scorePerSec = 1
var scoreMultiplier = 1
#Click Upgrades Costs
var clickUpgradeReq1 = 10
var clickUpgradeReq10 = 100
var clickUpgradeReq20 = 1000
var clickUpgradeReq40 = 10000
var clickUpgradeReq60 = 100000
var clickUpgradeReq80 = 1000000
var clickUpgradeReq100 = 10000000
var clickUpgradeReq200 = 100000000
var clickUpgradeReq400 = 1000000000
# Click Upgrades Amount
var clickUpgradeAmt1 = 1
var clickUpgradeAmt10 = 10
var clickUpgradeAmt20 = 20
var clickUpgradeAmt40 = 40
var clickUpgradeAmt60 = 60
var clickUpgradeAmt80 = 80
var clickUpgradeAmt100 = 100
var clickUpgradeAmt200 = 200
var clickUpgradeAmt400 = 400
# Passive Upgrades Costs
var passiveUpgradeReq2 = 100
var passiveUpgradeReq10 = 1000
var passiveUpgradeReq20 = 10000
var passiveUpgradeReq50 = 100000
var passiveUpgradeReq100 = 1000000
var passiveUpgradeReq200 = 10000000
var passiveUpgradeReq500 = 100000000
var passiveUpgradeReq1000 = 1000000000
var passiveUpgradeReq10000 = 10000000000
# Passive Upgrades Amount
var passiveUpgradeAmt2 = 2
var passiveUpgradeAmt10 = 10
var passiveUpgradeAmt20 = 20
var passiveUpgradeAmt50 = 50
var passiveUpgradeAmt100 = 100
var passiveUpgradeAmt200 = 200
var passiveUpgradeAmt500 = 500
var passiveUpgradeAmt1000 = 1000
var passiveUpgradeAmt10000 = 10000
# Called when the node enters the scene tree for the first time.
func _ready():
$ClickUpgrades.get_popup().connect("id_pressed",clickUpgrade)
$PassiveUpgrades.get_popup().connect("id_pressed",passiveUpgrade)
$Timer.connect("timeout", _on_Timer_timeout)
#Code for the Click Me Button (deprecated)
#$Click.pressed.connect(self._on_button_pressed)
#Prints all input events, only for debugging
#func _input(event):
#print(event.as_text())
func _on_Timer_timeout():
score += scorePerSec * scoreMultiplier
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
#Displays normal numbers until commas are needed
if score > 999:
$Score.text = str(scoreFormat(score))
else:
$Score.text = str(score) #Changes the score number
#This checks any input that comes in
func _input(event):
#Function to record every left click as a "Click" to add to the score
if event.is_action_pressed("left_mouse"):
_on_button_pressed()
#Formats the score string so commas are inserted
func scoreFormat(score):
# Convert value to string.
var str_value: String = str(score)
# Loop backward starting at the last 3 digits,
# add comma then, repeat every 3rd step.
for i in range(str_value.length()-3, 0, -3):
str_value = str_value.insert(i, ",")
score = str_value
return score
func _on_button_pressed():
score += clickAdd * scoreMultiplier
func clickUpgrade(id):
match id:
0:
if score >= clickUpgradeReq1:
print ("Score sufficient")
score -=clickUpgradeReq1
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt1
else:
print("not enough score")
1:
if score >= clickUpgradeReq10:
print ("Score sufficient")
score -=clickUpgradeReq10
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt10
else:
print("not enough score")
2:
if score >= clickUpgradeReq20:
print ("Score sufficient")
score -=clickUpgradeReq20
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt20
else:
print("not enough score")
3:
if score >= clickUpgradeReq40:
print ("Score sufficient")
score -=clickUpgradeReq40
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt40
else:
print("not enough score")
4:
if score >= clickUpgradeReq60:
print ("Score sufficient")
score -=clickUpgradeReq60
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt60
else:
print("not enough score")
5:
if score >= clickUpgradeReq80:
print ("Score sufficient")
score -=clickUpgradeReq80
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt80
else:
print("not enough score")
6:
if score >= clickUpgradeReq100:
print ("Score sufficient")
score -=clickUpgradeReq100
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt100
else:
print("not enough score")
7:
if score >= clickUpgradeReq200:
print ("Score sufficient")
score -=clickUpgradeReq200
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt200
else:
print("not enough score")
8:
if score >= clickUpgradeReq400:
print ("Score sufficient")
score -=clickUpgradeReq400
$ClickUpgrades.get_popup().set_item_disabled(id, true)
clickAdd += clickUpgradeAmt400
else:
print("not enough score")
func passiveUpgrade(id):
match id:
0:
if score >= passiveUpgradeReq2:
print ("Score sufficient")
score -=passiveUpgradeReq2
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt2
else:
print("not enough score")
1:
if score >= passiveUpgradeReq10:
print ("Score sufficient")
score -=passiveUpgradeReq10
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt10
else:
print("not enough score")
2:
if score >= passiveUpgradeReq20:
print ("Score sufficient")
score -=passiveUpgradeReq20
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt20
else:
print("not enough score")
3:
if score >= passiveUpgradeReq50:
print ("Score sufficient")
score -=passiveUpgradeReq50
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt50
else:
print("not enough score")
4:
if score >= passiveUpgradeReq100:
print ("Score sufficient")
score -=passiveUpgradeReq100
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt100
else:
print("not enough score")
5:
if score >= passiveUpgradeReq200:
print ("Score sufficient")
score -=passiveUpgradeReq200
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt200
else:
print("not enough score")
6:
if score >= passiveUpgradeReq500:
print ("Score sufficient")
score -=passiveUpgradeReq500
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt500
else:
print("not enough score")
7:
if score >= passiveUpgradeReq1000:
print ("Score sufficient")
score -=passiveUpgradeReq1000
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt1000
else:
print("not enough score")
8:
if score >= passiveUpgradeReq10000:
print ("Score sufficient")
score -=passiveUpgradeReq10000
$PassiveUpgrades.get_popup().set_item_disabled(id, true)
scorePerSec = passiveUpgradeAmt10000
else:
print("not enough score")

182
Game.tscn
View File

@@ -1,182 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://xh0p6v5ir05f"]
[ext_resource type="Script" path="res://Root.gd" id="1_fof5y"]
[ext_resource type="Script" path="res://UI.gd" id="1_rdmp6"]
[node name="Root" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_fof5y")
[node name="Header" type="CanvasLayer" parent="."]
[node name="UI" type="Control" parent="Header"]
layout_mode = 3
anchors_preset = 0
offset_right = 1152.0
offset_bottom = 40.0
[node name="PanelContainer" type="GridContainer" parent="Header/UI"]
layout_mode = 0
offset_right = 1152.0
offset_bottom = 40.0
columns = 5
script = ExtResource("1_rdmp6")
[node name="ScoreLabel" type="Label" parent="Header/UI/PanelContainer"]
layout_mode = 2
text = "Score:"
[node name="Score" type="Label" parent="Header/UI/PanelContainer"]
layout_mode = 2
text = "0"
[node name="Click" type="Button" parent="Header/UI/PanelContainer"]
visible = false
layout_mode = 2
shortcut_in_tooltip = false
text = "Click Me"
flat = true
[node name="Timer" type="Timer" parent="Header/UI/PanelContainer"]
autostart = true
[node name="ClickUpgrades" type="MenuButton" parent="Header/UI/PanelContainer"]
layout_mode = 2
text = "Click Upgrades"
item_count = 9
popup/item_0/text = "+1 Cost:10"
popup/item_0/id = 0
popup/item_1/text = "+10 Cost: 100"
popup/item_1/id = 1
popup/item_2/text = "+20 Cost:1,000"
popup/item_2/id = 2
popup/item_3/text = "+40 Cost: 10,000"
popup/item_3/id = 3
popup/item_4/text = "+60 Cost: 100,000"
popup/item_4/id = 4
popup/item_5/text = "+80 Cost: 1,000,000"
popup/item_5/id = 5
popup/item_6/text = "+100 Cost: 10,000,000"
popup/item_6/id = 6
popup/item_7/text = "+200 Cost: 100,000,000"
popup/item_7/id = 7
popup/item_8/text = "+400 Cost: 1,000,000,000"
popup/item_8/id = 8
[node name="PassiveUpgrades" type="MenuButton" parent="Header/UI/PanelContainer"]
layout_mode = 2
text = "Passive Upgrades"
item_count = 9
popup/item_0/text = "2/s Cost: 100"
popup/item_0/id = 0
popup/item_1/text = "10/s Cost: 1,000"
popup/item_1/id = 1
popup/item_2/text = "20/s Cost: 10,000"
popup/item_2/id = 2
popup/item_3/text = "50/s Cost: 100,000"
popup/item_3/id = 3
popup/item_4/text = "100/s Cost:1,000,000"
popup/item_4/id = 4
popup/item_5/text = "200/s Cost: 10,000,000"
popup/item_5/id = 5
popup/item_6/text = "500/s Cost: 100,000,000"
popup/item_6/id = 6
popup/item_7/text = "1,000/s Cost: 1,000,000,000"
popup/item_7/id = 7
popup/item_8/text = "10,000/s Cost: 10,000,000,000"
popup/item_8/id = 8
[node name="TeamButton" type="Button" parent="Header/UI/PanelContainer"]
layout_mode = 2
text = "Team"
flat = true
alignment = 0
[node name="Team" type="Panel" parent="."]
layout_mode = 0
offset_left = 2.0
offset_top = 40.0
offset_right = 1152.0
offset_bottom = 648.0
[node name="GridContainer" type="GridContainer" parent="Team"]
layout_mode = 0
offset_left = 63.0
offset_top = 109.0
offset_right = 1150.0
offset_bottom = 609.0
columns = 5
[node name="TeamMember1" type="Button" parent="Team/GridContainer"]
layout_mode = 2
text = "
Add Team Here++++++
"
[node name="TeamMember2" type="Button" parent="Team/GridContainer"]
layout_mode = 2
text = "Add Team Here++++++"
[node name="TeamMember3" type="Button" parent="Team/GridContainer"]
layout_mode = 2
text = "Add Team Here++++++"
[node name="TeamMember4" type="Button" parent="Team/GridContainer"]
layout_mode = 2
text = "Add Team Here++++++"
[node name="TeamMember5" type="Button" parent="Team/GridContainer"]
layout_mode = 2
text = "Add Team Here++++++"
[node name="MemberInventory" type="ColorRect" parent="."]
layout_mode = 0
offset_left = 2.0
offset_top = 40.0
offset_right = 1152.0
offset_bottom = 649.0
color = Color(0.219501, 0.219501, 0.219501, 1)
[node name="CenterContainer" type="CenterContainer" parent="MemberInventory"]
layout_mode = 0
offset_right = 1150.0
offset_bottom = 608.0
[node name="user Int" type="CanvasLayer" parent="."]
[node name="MemberInterface" type="Control" parent="user Int"]
layout_mode = 3
anchors_preset = 0
offset_left = 21.2617
offset_top = 125.673
offset_right = 61.2617
offset_bottom = 165.673
[node name="MemberInventory" type="PanelContainer" parent="user Int/MemberInterface"]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0

View File

@@ -26,9 +26,9 @@ var damagePerSecMember1: int = 0
var damagePerClickMember1: int = 0
var damageMultiplierMember1: int = 1
##Textures
var texture_member1 : Texture = null
var texture_member1 = ""
# Function to set texture for member 1
func set_texture1(texture: Texture):
func set_texture1(texture: String):
texture_member1 = texture
# Function to get texture for member 1
@@ -41,9 +41,9 @@ var damagePerSecMember2: int = 0
var damagePerClickMember2: int = 0
var damageMultiplierMember2: int = 1
var texture_member2 : Texture = null
var texture_member2 = ""
# Function to set texture for member 2
func set_texture2(texture: Texture):
func set_texture2(texture: String):
texture_member2 = texture
# Function to get texture for member 2
@@ -56,9 +56,9 @@ var damagePerSecMember3: int = 0
var damagePerClickMember3: int = 0
var damageMultiplierMember3: int = 1
var texture_member3 : Texture = null
var texture_member3 = ""
# Function to set texture for member 3
func set_texture3(texture: Texture):
func set_texture3(texture: String):
texture_member3 = texture
# Function to get texture for member 3
@@ -70,9 +70,9 @@ func get_texture3() -> Texture:
var damagePerSecMember4: int = 0
var damagePerClickMember4: int = 0
var damageMultiplierMember4: int = 1
var texture_member4 : Texture = null
var texture_member4 = ""
# Function to set texture for member 4
func set_texture4(texture: Texture):
func set_texture4(texture: String):
texture_member4 = texture
# Function to get texture for member 4
@@ -84,9 +84,9 @@ func get_texture4() -> Texture:
var damagePerSecMember5: int = 0
var damagePerClickMember5: int = 0
var damageMultiplierMember5: int = 1
var texture_member5 : Texture = null
var texture_member5 = ""
# Function to set texture for member 5
func set_texture5(texture: Texture):
func set_texture5(texture: String):
texture_member5 = texture
# Function to get texture for member 5

View File

@@ -1,20 +0,0 @@
[gd_resource type="Resource" script_class="InventoryData" load_steps=7 format=3 uid="uid://cvuvn1voknqbj"]
[ext_resource type="Script" path="res://MemberInventory/Inventory_Data.gd" id="1_pvibr"]
[ext_resource type="Resource" path="res://Member/Members/apple.tres" id="2_aboym"]
[ext_resource type="Script" path="res://MemberInventory/Slot_Data.gd" id="3_22rk4"]
[ext_resource type="Resource" path="res://Member/Members/blue_book.tres" id="4_fg6vr"]
[sub_resource type="Resource" id="Resource_vnpe5"]
script = ExtResource("3_22rk4")
memberData = ExtResource("2_aboym")
quantity = 11
[sub_resource type="Resource" id="Resource_cm5vi"]
script = ExtResource("3_22rk4")
memberData = ExtResource("4_fg6vr")
quantity = 5
[resource]
script = ExtResource("1_pvibr")
slot_datas = Array[ExtResource("3_22rk4")]([null, null, SubResource("Resource_vnpe5"), null, null, null, SubResource("Resource_cm5vi"), null, null, null, null, null, null, null, null, null, null, null])

View File

@@ -1,611 +0,0 @@
extends Node
const Rarity = {
"COMMON":0.8,
"UNCOMMON": 0.4,
"RARE": 0.2,
"SUPERRARE": 0.1,
"LEGENDARY": 0.05
}
var members = {
"squire": {
"name": "Squire",
"description": "Someone who does things for someone else, not very impressive.",
"perSec": 1,
"clickAdd": 1,
"scoreMultiplier": 1,
"isObtained": true,
"memberAmount": 1,
"texturePath": "res://Images/Members/Squire.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"archer": {
"name": "Archer",
"description": "Better at accurate clicks than consistent damage",
"perSec": 2,
"clickAdd": 2,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Archer.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"mage": {
"name": "Mage",
"description": "A good mix of DPS and click power",
"perSec": 3,
"clickAdd": 3,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Mage.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"warrior": {
"name": "Warrior",
"description": "Strong and brave fighter",
"perSec": 4,
"clickAdd": 4,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Warrior.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"healer": {
"name": "Healer",
"description": "Skilled in healing magic",
"perSec": 5,
"clickAdd": 5,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Healer.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"knight": {
"name": "Knight",
"description": "Valiant defender of the realm",
"perSec": 6,
"clickAdd": 6,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Knight.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"assassin": {
"name": "Assassin",
"description": "Expert in stealth and quick kills",
"perSec": 7,
"clickAdd": 7,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Assassin.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"paladin": {
"name": "Paladin",
"description": "Holy warrior with healing abilities",
"perSec": 8,
"clickAdd": 8,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Paladin.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"ranger": {
"name": "Ranger",
"description": "Skilled in ranged combat and survival",
"perSec": 9,
"clickAdd": 9,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Ranger.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"bard": {
"name": "Bard",
"description": "Musical magician with supportive abilities",
"perSec": 10,
"clickAdd": 10,
"scoreMultiplier": 1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Bard.png",
"tier": 1,
"rarity": Rarity.COMMON
},
"crusader": {
"name": "Crusader",
"description": "Devout warrior on a holy quest",
"perSec": 11,
"clickAdd": 11,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Crusader.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"druid": {
"name": "Druid",
"description": "Nature mage with control over the elements",
"perSec": 12,
"clickAdd": 12,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Druid.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"samurai": {
"name": "Samurai",
"description": "Noble warrior with unmatched skill",
"perSec": 13,
"clickAdd": 13,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Samurai.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"ninja": {
"name": "Ninja",
"description": "Stealthy assassin with deadly precision",
"perSec": 14,
"clickAdd": 14,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Ninja.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"summoner": {
"name": "Summoner",
"description": "Mage with the ability to summon creatures",
"perSec": 15,
"clickAdd": 15,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Summoner.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"shaman": {
"name": "Shaman",
"description": "Spiritual healer and magic user",
"perSec": 16,
"clickAdd": 16,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Shaman.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"necromancer": {
"name": "Necromancer",
"description": "Dark mage with control over the dead",
"perSec": 17,
"clickAdd": 17,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Necromancer.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"berserker": {
"name": "Berserker",
"description": "Fierce warrior with unstoppable rage",
"perSec": 18,
"clickAdd": 18,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Berserker.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"monk": {
"name": "Monk",
"description": "Master of martial arts and inner peace",
"perSec": 19,
"clickAdd": 19,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Monk.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"alchemist": {
"name": "Alchemist",
"description": "Skilled in the art of potion-making",
"perSec": 20,
"clickAdd": 20,
"scoreMultiplier": 1.1,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Alchemist.png",
"tier": 2,
"rarity": Rarity.UNCOMMON
},
"barbarian": {
"name": "Barbarian",
"description": "Savage warrior with immense strength",
"perSec": 21,
"clickAdd": 21,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Barbarian.png",
"tier": 3,
"rarity": Rarity.RARE
},
"illusionist": {
"name": "Illusionist",
"description": "Mage with mastery over illusions",
"perSec": 22,
"clickAdd": 22,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Illusionist.png",
"tier": 3,
"rarity": Rarity.RARE
},
"warlock": {
"name": "Warlock",
"description": "Dark mage with forbidden knowledge",
"perSec": 23,
"clickAdd": 23,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Warlock.png",
"tier": 3,
"rarity": Rarity.RARE
},
"pirate": {
"name": "Pirate",
"description": "Swashbuckling rogue of the seas",
"perSec": 24,
"clickAdd": 24,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Pirate.png",
"tier": 3,
"rarity": Rarity.RARE
},
"gladiator": {
"name": "Gladiator",
"description": "Champion of the arena",
"perSec": 25,
"clickAdd": 25,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Gladiator.png",
"tier": 3,
"rarity": Rarity.RARE
},
"rune_master": {
"name": "Rune Master",
"description": "Mage with mastery over runic magic",
"perSec": 26,
"clickAdd": 26,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Rune_Master.png",
"tier": 3,
"rarity": Rarity.RARE
},
"beastmaster": {
"name": "Beastmaster",
"description": "Warrior with control over beasts",
"perSec": 27,
"clickAdd": 27,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Beastmaster.png",
"tier": 3,
"rarity": Rarity.RARE
},
"elementalist": {
"name": "Elementalist",
"description": "Mage with control over the elements",
"perSec": 28,
"clickAdd": 28,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Elementalist.png",
"tier": 3,
"rarity": Rarity.RARE
},
"shadow_knight": {
"name": "Shadow Knight",
"description": "Dark warrior with control over shadows",
"perSec": 29,
"clickAdd": 29,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Shadow_Knight.png",
"tier": 3,
"rarity": Rarity.RARE
},
"archmage": {
"name": "Archmage",
"description": "Supreme master of magical arts",
"perSec": 30,
"clickAdd": 30,
"scoreMultiplier": 1.2,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Archmage.png",
"tier": 3,
"rarity": Rarity.RARE
},
"dark_paladin": {
"name": "Dark Paladin",
"description": "Corrupted knight with dark powers",
"perSec": 31,
"clickAdd": 31,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Dark_Paladin.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"demon_hunter": {
"name": "Demon Hunter",
"description": "Expert in slaying demonic creatures",
"perSec": 32,
"clickAdd": 32,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Demon_Hunter.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"spirit_guardian": {
"name": "Spirit Guardian",
"description": "Protector of the spiritual realm",
"perSec": 33,
"clickAdd": 33,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Spirit_Guardian.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"phoenix": {
"name": "Phoenix",
"description": "Immortal bird of fire and rebirth",
"perSec": 34,
"clickAdd": 34,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Phoenix.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"dragon_rider": {
"name": "Dragon Rider",
"description": "Warrior who rides a mighty dragon",
"perSec": 35,
"clickAdd": 35,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Dragon_Rider.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"soul_reaper": {
"name": "Soul Reaper",
"description": "Harvester of souls from the afterlife",
"perSec": 36,
"clickAdd": 36,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Soul_Reaper.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"stormcaller": {
"name": "Stormcaller",
"description": "Mage with control over storms",
"perSec": 37,
"clickAdd": 37,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Stormcaller.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"blade_dancer": {
"name": "Blade Dancer",
"description": "Agile warrior with deadly precision",
"perSec": 38,
"clickAdd": 38,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Blade_Dancer.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"celestial_mage": {
"name": "Celestial Mage",
"description": "Mage with power over celestial bodies",
"perSec": 39,
"clickAdd": 39,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Celestial_Mage.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"void_walker": {
"name": "Void Walker",
"description": "Mage with control over void magic",
"perSec": 40,
"clickAdd": 40,
"scoreMultiplier": 1.3,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Void_Walker.png",
"tier": 4,
"rarity": Rarity.SUPERRARE
},
"eternal_knight": {
"name": "Eternal Knight",
"description": "Immortal protector of the realm",
"perSec": 41,
"clickAdd": 41,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Eternal_Knight.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"chaos_warrior": {
"name": "Chaos Warrior",
"description": "Warrior with control over chaos",
"perSec": 42,
"clickAdd": 42,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Chaos_Warrior.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"starfall_mage": {
"name": "Starfall Mage",
"description": "Mage with control over falling stars",
"perSec": 43,
"clickAdd": 43,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Starfall_Mage.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"abyssal_warlock": {
"name": "Abyssal Warlock",
"description": "Dark mage with control over the abyss",
"perSec": 44,
"clickAdd": 44,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Abyssal_Warlock.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"lunar_knight": {
"name": "Lunar Knight",
"description": "Warrior with power over the moon",
"perSec": 45,
"clickAdd": 45,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Lunar_Knight.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"cosmic_mage": {
"name": "Cosmic Mage",
"description": "Mage with control over cosmic energy",
"perSec": 46,
"clickAdd": 46,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Cosmic_Mage.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"shadow_assassin": {
"name": "Shadow Assassin",
"description": "Master assassin with control over shadows",
"perSec": 47,
"clickAdd": 47,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Shadow_Assassin.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"firelord": {
"name": "Firelord",
"description": "Mage with mastery over fire",
"perSec": 48,
"clickAdd": 48,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Firelord.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"ice_queen": {
"name": "Ice Queen",
"description": "Mage with mastery over ice",
"perSec": 49,
"clickAdd": 49,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Ice_Queen.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
},
"celeste_the_starcaller": {
"name": "Celeste the Starcaller",
"description": "Mage with control over stars",
"perSec": 50,
"clickAdd": 50,
"scoreMultiplier": 1.4,
"isObtained": false,
"memberAmount": 1,
"texturePath": "res://Images/Members/Celeste_the_Starcaller.png",
"tier": 5,
"rarity": Rarity.LEGENDARY
}
}

View File

@@ -1,5 +0,0 @@
extends Resource
class_name InventoryData
@export var slot_datas: Array[Slot_Data]

View File

@@ -1,14 +0,0 @@
extends Resource
class_name Slot_Data
const MAX_STACK_SIZE: int = 99
@export var memberData: Member_Data
@export_range(1, MAX_STACK_SIZE) var quantity: int = 1: set = set_quantity
func set_quantity(value: int) -> void:
quantity = value
if quantity > 1 and not memberData.stackable:
quantity = 1
push_error("%s is not stackable, setting quantity to 1" % memberData.name)

33
Root.gd
View File

@@ -8,39 +8,6 @@ func _ready():
pass
#User Data copy if needed
var files_to_copy = [
"MemberDatabase/memberData.json",
"Boss/bossData.json"
]
var user_directory = OS.get_user_data_dir()
func copy_file_if_not_exists(file_name: String):
var user_file_path = "user://" + file_name
if not FileAccess.file_exists(user_file_path):
var res_file_path = "res://" + file_name
if FileAccess.file_exists(res_file_path):
var file = FileAccess.open(res_file_path, FileAccess.READ)
if file:
var data = file.get_as_text()
file.close()
# Write to user:// directory
var user_file = FileAccess.open(user_file_path, FileAccess.WRITE)
if user_file:
user_file.store_string(data)
user_file.close()
print("Copied ", file_name, " to user:// directory.")
else:
print("Failed to open destination file: ", user_file_path)
user_file.get_open_error()
else:
print("Failed to open source file: ", res_file_path)
else:
print("Source file ", res_file_path, " not found.")
else:
print("File ", user_file_path, " already exists.")

26
Save/saveData.json Normal file
View File

@@ -0,0 +1,26 @@
{
"damagePerClick": 1,
"damagePerSec": 1,
"damageMultiplier": 1,
"totalDamage": 0,
"damagePerSecMember1": 0,
"damagePerClickMember1": 0,
"damageMultiplierMember1": 1,
"textureMember1": "",
"damagePerSecMember2": 0,
"damagePerClickMember2": 0,
"damageMultiplierMember2": 1,
"textureMember2": "",
"damagePerSecMember3": 0,
"damagePerClickMember3": 0,
"damageMultiplierMember3": 1,
"textureMember3": "",
"damagePerSecMember4": 0,
"damagePerClickMember4": 0,
"damageMultiplierMember4": 1,
"textureMember4": "",
"damagePerSecMember5": 0,
"damagePerClickMember5": 0,
"damageMultiplierMember5": 1,
"textureMember5": ""
}

View File

@@ -1,9 +1,10 @@
[gd_scene load_steps=5 format=3 uid="uid://xh0p6v5ir05f"]
[gd_scene load_steps=6 format=3 uid="uid://xh0p6v5ir05f"]
[ext_resource type="Script" path="res://Root.gd" id="1_dtx5s"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_g0muc"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="3_q5rri"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_7wp2t"]
[ext_resource type="Script" path="res://Root.gd" id="1_lggo0"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="2_o6t6l"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_1o3gu"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_3csg5"]
[ext_resource type="Script" path="res://Scenes/saveTimer.gd" id="5_85eop"]
[node name="Root" type="Control"]
layout_mode = 3
@@ -14,7 +15,7 @@ offset_right = 768.0
offset_bottom = 432.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_dtx5s")
script = ExtResource("1_lggo0")
[node name="UI" type="Control" parent="."]
anchors_preset = 0
@@ -27,17 +28,17 @@ offset_bottom = 1080.0
offset_left = 3.0
offset_right = 395.0
offset_bottom = 40.0
script = ExtResource("3_q5rri")
script = ExtResource("2_o6t6l")
[node name="ScoreLabel" type="Label" parent="UI/CanvasLayer/Header"]
[node name="ScoreLabel" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "Score:"
[node name="Score" type="Label" parent="UI/CanvasLayer/Header"]
[node name="Score" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "0"
[node name="Timer" type="Timer" parent="UI/CanvasLayer/Header"]
[node name="Timer" type="Timer" parent="UI/CanvasLayer/Header" groups=["Persist"]]
autostart = true
[node name="ClickUpgrades" type="MenuButton" parent="UI/CanvasLayer/Header"]
@@ -93,37 +94,42 @@ layout_mode = 2
text = "Team"
flat = true
alignment = 0
script = ExtResource("3_g0muc")
script = ExtResource("3_1o3gu")
[node name="Bossbutton" type="Button" parent="UI/CanvasLayer/Header"]
layout_mode = 2
text = "Bosses"
flat = true
alignment = 0
script = ExtResource("4_7wp2t")
script = ExtResource("4_3csg5")
[node name="ClickAddLabel" type="Label" parent="UI/CanvasLayer/Header"]
[node name="ClickAddLabel" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "ClickAdd:"
[node name="ClickAdd" type="Label" parent="UI/CanvasLayer/Header"]
[node name="ClickAdd" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "0"
[node name="PerSecLabel" type="Label" parent="UI/CanvasLayer/Header"]
[node name="PerSecLabel" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "PerSec:
"
[node name="PerSec" type="Label" parent="UI/CanvasLayer/Header"]
[node name="PerSec" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "0"
[node name="MultiplierLabel" type="Label" parent="UI/CanvasLayer/Header"]
[node name="MultiplierLabel" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "Multiplier:
"
[node name="Multiplier" type="Label" parent="UI/CanvasLayer/Header"]
[node name="Multiplier" type="Label" parent="UI/CanvasLayer/Header" groups=["Persist"]]
layout_mode = 2
text = "0"
[node name="saveTimer" type="Timer" parent="UI/CanvasLayer/Header"]
wait_time = 5.0
autostart = true
script = ExtResource("5_85eop")

View File

@@ -1,12 +1,13 @@
[gd_scene load_steps=8 format=3 uid="uid://2xiybbxvsdwi"]
[gd_scene load_steps=9 format=3 uid="uid://2xiybbxvsdwi"]
[ext_resource type="Script" path="res://Root.gd" id="1_dq55c"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="2_e5bkm"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_2wxqa"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_0lt4t"]
[ext_resource type="Script" path="res://User Interface/BossGrid.gd" id="5_1d3gb"]
[ext_resource type="Script" path="res://User Interface/Boss1.gd" id="6_pp6ep"]
[ext_resource type="Script" path="res://User Interface/CharacterRoll.gd" id="7_7lppr"]
[ext_resource type="Script" path="res://Root.gd" id="1_woypb"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="2_0hr4q"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_e754c"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_sjkwo"]
[ext_resource type="Script" path="res://User Interface/BossGrid.gd" id="5_8idyi"]
[ext_resource type="Script" path="res://Scenes/saveTimer.gd" id="5_wpe6x"]
[ext_resource type="Script" path="res://User Interface/Boss1.gd" id="6_ea00f"]
[ext_resource type="Script" path="res://User Interface/CharacterRoll.gd" id="7_jle1x"]
[node name="Root" type="Control"]
layout_mode = 3
@@ -17,7 +18,7 @@ offset_right = 768.0
offset_bottom = 432.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_dq55c")
script = ExtResource("1_woypb")
[node name="UI" type="Control" parent="."]
anchors_preset = 0
@@ -30,7 +31,7 @@ offset_bottom = 1080.0
offset_left = 3.0
offset_right = 395.0
offset_bottom = 40.0
script = ExtResource("2_e5bkm")
script = ExtResource("2_0hr4q")
[node name="ScoreLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -96,14 +97,14 @@ layout_mode = 2
text = "Team"
flat = true
alignment = 0
script = ExtResource("3_2wxqa")
script = ExtResource("3_e754c")
[node name="Bossbutton" type="Button" parent="UI/CanvasLayer/Header"]
layout_mode = 2
text = "Bosses"
flat = true
alignment = 0
script = ExtResource("4_0lt4t")
script = ExtResource("4_sjkwo")
[node name="ClickAddLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -131,6 +132,11 @@ text = "Multiplier:
layout_mode = 2
text = "0"
[node name="saveTimer" type="Timer" parent="UI/CanvasLayer/Header"]
wait_time = 5.0
autostart = true
script = ExtResource("5_wpe6x")
[node name="BossFights" type="PanelContainer" parent="UI"]
layout_mode = 0
offset_left = 857.0
@@ -140,13 +146,13 @@ offset_bottom = 422.0
[node name="BossGrid" type="GridContainer" parent="UI/BossFights"]
layout_mode = 2
script = ExtResource("5_1d3gb")
script = ExtResource("5_8idyi")
[node name="Boss1" type="TextureButton" parent="UI/BossFights/BossGrid"]
layout_mode = 2
script = ExtResource("6_pp6ep")
script = ExtResource("6_ea00f")
[node name="CharacterRoll" type="PanelContainer" parent="UI/BossFights/BossGrid"]
visible = false
layout_mode = 2
script = ExtResource("7_7lppr")
script = ExtResource("7_jle1x")

123
Scenes/saveTimer.gd Normal file
View File

@@ -0,0 +1,123 @@
extends Timer
var save_data = {}
func saveGame():
#var save_game = FileAccess.open("user://Save/savegame.save", FileAccess.WRITE)
#var save_nodes = get_tree().get_nodes_in_group("Persist")
#for node in save_nodes:
#if node.scene_file_path.is_empty():
#print("persistent node '%s' is not an instanced scene, skipped" % node.name)
#continue
#
## Check the node has a save function.
#if !node.has_method("save"):
#print("persistent node '%s' is missing a save() function, skipped" % node.name)
#continue
#
## Call the node's save function.
#var node_data = node.call("save")
#
## JSON provides a static method to serialized JSON string.
#var json_string = JSON.stringify(node_data)
#
## Store the save dictionary as a new line in the save file.
#save_game.store_line(json_string)
#func save():
#var save_dict = {
#"filename" : get_scene_file_path(),
#"parent" : get_parent().get_path(),
#"damagePerClick" : Global.globalDamagePerClick,
#"damagePerSec" : Global.globalDamagePerSec,
#"damageMultiplier" : Global.globalDamageMultiplier,
#"totalDamage" : Global.globalDamage
#}
var file_path = "user://Save/saveData.json"
var file = FileAccess.open(file_path, FileAccess.WRITE)
if file:
var json_text = JSON.stringify(save_data)
file.store_string(json_text)
file.close()
print("Game Data Saved")
else:
print("Failed to open file: ", file_path)
func load_save_data():
#If using json
var file = FileAccess.open("user://Save/saveData.json", FileAccess.READ)
#var file = FileAccess.open("user://memberData.json", FileAccess.READ)
if file:
var json_text = file.get_as_text()
#print (json_text)
file.close()
var json = JSON.new()
var json_result = json.parse(json_text)
#print (json_result)
if json_result == OK:
save_data = json.get_data()
print("Save data loaded successfully.")
#print(character_data)
else:
print("Failed to parse JSON: ", json_result.error_string)
else:
print("Save data file not found.")
func _ready():
# Initialize data or load from file if necessary
#$saveTimer.connect("timeout", _on_Timer_timeout)
connect("timeout", _on_Timer_timeout)
#var current_scene = get_tree().current_scene
#if current_scene:
## Verify the saveTimer node exists in the current scene
#var timer_node = current_scene.get_node("saveTimer") # Adjust the path as necessary
#if timer_node:
#print("Timer node found: ", timer_node)
#timer_node.connect("timeout", _on_Timer_timeout)
#timer_node.start()
#else:
#print("saveTimer node not found")
#else:
#print("Current scene not found")
func _on_Timer_timeout():
load_save_data()
save_data["damagePerClick"] = Global.globalDamagePerClick
save_data["damagePerSec"] = Global.globalDamagePerSec
save_data["damageMultiplier"] = Global.globalDamageMultiplier
save_data["totalDamage"] = Global.globalDamage
save_data["damagePerSecMember1"] = Global.damagePerSecMember1
save_data["damagePerClickMember1"] = Global.damagePerClickMember1
save_data["damageMultiplierMember1"] = Global.damageMultiplierMember1
if Global.texture_member1:
save_data["textureMember1"] = Global.texture_member1
save_data["damagePerSecMember2"] = Global.damagePerSecMember2
save_data["damagePerClickMember2"] = Global.damagePerClickMember2
save_data["damageMultiplierMember2"] = Global.damageMultiplierMember2
if Global.texture_member2:
save_data["textureMember2"] = Global.texture_member2
save_data["damagePerSecMember3"] = Global.damagePerSecMember3
save_data["damagePerClickMember3"] = Global.damagePerClickMember3
save_data["damageMultiplierMember3"] = Global.damageMultiplierMember3
if Global.texture_member3:
save_data["textureMember3"] = Global.texture_member3
save_data["damagePerSecMember4"] = Global.damagePerSecMember4
save_data["damagePerClickMember4"] = Global.damagePerClickMember4
save_data["damageMultiplierMember4"] = Global.damageMultiplierMember4
if Global.texture_member4:
save_data["textureMember4"] = Global.texture_member4
save_data["damagePerSecMember5"] = Global.damagePerSecMember5
save_data["damagePerClickMember5"] = Global.damagePerClickMember5
save_data["damageMultiplierMember5"] = Global.damageMultiplierMember5
if Global.texture_member5:
save_data["textureMember5"] = Global.texture_member5
saveGame()
func _process(delta):
pass

16
Scenes/savemanager.tscn Normal file
View File

@@ -0,0 +1,16 @@
[gd_scene load_steps=2 format=3 uid="uid://b70r8ttk10fgd"]
[ext_resource type="Script" path="res://Scenes/saveTimer.gd" id="1_5di46"]
[node name="saveManager" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="saveTimer" type="Timer" parent="."]
wait_time = 60.0
autostart = true
script = ExtResource("1_5di46")

View File

@@ -1,15 +1,15 @@
[gd_scene load_steps=11 format=3 uid="uid://blwuy4v4qqyna"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="1_ldil2"]
[ext_resource type="Script" path="res://Root.gd" id="1_mv0o0"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="2_nwe87"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="3_c1mhp"]
[ext_resource type="Script" path="res://User Interface/AspectRatioContainer.gd" id="4_eqraq"]
[ext_resource type="Script" path="res://User Interface/Member1.gd" id="5_574fx"]
[ext_resource type="Script" path="res://User Interface/Member2.gd" id="6_a2aw7"]
[ext_resource type="Script" path="res://User Interface/Member3.gd" id="7_o40hd"]
[ext_resource type="Script" path="res://User Interface/Member4.gd" id="8_0l7ds"]
[ext_resource type="Script" path="res://User Interface/Member5.gd" id="9_yaflp"]
[ext_resource type="Script" path="res://Root.gd" id="1_6ykb6"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="2_63y2i"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_yy4wh"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_nmd48"]
[ext_resource type="Script" path="res://Scenes/saveTimer.gd" id="5_6vp5u"]
[ext_resource type="Script" path="res://User Interface/Member1.gd" id="6_dqecs"]
[ext_resource type="Script" path="res://User Interface/Member2.gd" id="7_ddddf"]
[ext_resource type="Script" path="res://User Interface/Member3.gd" id="8_d2bof"]
[ext_resource type="Script" path="res://User Interface/Member4.gd" id="9_2ploj"]
[ext_resource type="Script" path="res://User Interface/Member5.gd" id="10_vu24c"]
[node name="Root" type="Control"]
layout_mode = 3
@@ -18,7 +18,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_mv0o0")
script = ExtResource("1_6ykb6")
[node name="UI" type="Control" parent="."]
layout_mode = 3
@@ -32,7 +32,7 @@ offset_bottom = 1080.0
offset_left = 3.0
offset_right = 395.0
offset_bottom = 40.0
script = ExtResource("1_ldil2")
script = ExtResource("2_63y2i")
[node name="ScoreLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -45,67 +45,19 @@ text = "0"
[node name="Timer" type="Timer" parent="UI/CanvasLayer/Header"]
autostart = true
[node name="ClickUpgrades" type="MenuButton" parent="UI/CanvasLayer/Header"]
visible = false
layout_mode = 2
text = "Click Upgrades"
item_count = 9
popup/item_0/text = "+1 Cost:10"
popup/item_0/id = 0
popup/item_1/text = "+10 Cost: 100"
popup/item_1/id = 1
popup/item_2/text = "+20 Cost:1,000"
popup/item_2/id = 2
popup/item_3/text = "+40 Cost: 10,000"
popup/item_3/id = 3
popup/item_4/text = "+60 Cost: 100,000"
popup/item_4/id = 4
popup/item_5/text = "+80 Cost: 1,000,000"
popup/item_5/id = 5
popup/item_6/text = "+100 Cost: 10,000,000"
popup/item_6/id = 6
popup/item_7/text = "+200 Cost: 100,000,000"
popup/item_7/id = 7
popup/item_8/text = "+400 Cost: 1,000,000,000"
popup/item_8/id = 8
[node name="PassiveUpgrades" type="MenuButton" parent="UI/CanvasLayer/Header"]
visible = false
layout_mode = 2
text = "Passive Upgrades"
item_count = 9
popup/item_0/text = "2/s Cost: 100"
popup/item_0/id = 0
popup/item_1/text = "10/s Cost: 1,000"
popup/item_1/id = 1
popup/item_2/text = "20/s Cost: 10,000"
popup/item_2/id = 2
popup/item_3/text = "50/s Cost: 100,000"
popup/item_3/id = 3
popup/item_4/text = "100/s Cost:1,000,000"
popup/item_4/id = 4
popup/item_5/text = "200/s Cost: 10,000,000"
popup/item_5/id = 5
popup/item_6/text = "500/s Cost: 100,000,000"
popup/item_6/id = 6
popup/item_7/text = "1,000/s Cost: 1,000,000,000"
popup/item_7/id = 7
popup/item_8/text = "10,000/s Cost: 10,000,000,000"
popup/item_8/id = 8
[node name="TeamButton" type="Button" parent="UI/CanvasLayer/Header"]
layout_mode = 2
text = "Team"
flat = true
alignment = 0
script = ExtResource("2_nwe87")
script = ExtResource("3_yy4wh")
[node name="Bossbutton" type="Button" parent="UI/CanvasLayer/Header"]
layout_mode = 2
text = "Bosses"
flat = true
alignment = 0
script = ExtResource("3_c1mhp")
script = ExtResource("4_nmd48")
[node name="ClickAddLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -133,55 +85,59 @@ text = "Multiplier:
layout_mode = 2
text = "0"
[node name="saveTimer" type="Timer" parent="UI/CanvasLayer/Header"]
wait_time = 5.0
autostart = true
script = ExtResource("5_6vp5u")
[node name="AspectRatioContainer" type="AspectRatioContainer" parent="UI"]
layout_mode = 0
offset_left = -2.60654
offset_top = 271.396
offset_right = 1917.39
offset_bottom = 800.396
script = ExtResource("4_eqraq")
offset_left = -3.0
offset_top = 40.0
offset_right = 1152.0
offset_bottom = 648.0
[node name="TeamScreen" type="HBoxContainer" parent="UI/AspectRatioContainer"]
visibility_layer = 2
layout_mode = 2
alignment = 1
[node name="Member1" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen"]
[node name="Member1" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen" groups=["Persist"]]
custom_minimum_size = Vector2(200, 10)
layout_mode = 2
script = ExtResource("5_574fx")
script = ExtResource("6_dqecs")
[node name="VSeparator" type="VSeparator" parent="UI/AspectRatioContainer/TeamScreen"]
layout_mode = 2
[node name="Member2" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen"]
[node name="Member2" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen" groups=["Persist"]]
custom_minimum_size = Vector2(200, 10)
layout_mode = 2
script = ExtResource("6_a2aw7")
script = ExtResource("7_ddddf")
[node name="VSeparator2" type="VSeparator" parent="UI/AspectRatioContainer/TeamScreen"]
layout_mode = 2
[node name="Member3" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen"]
[node name="Member3" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen" groups=["Persist"]]
custom_minimum_size = Vector2(200, 10)
layout_mode = 2
script = ExtResource("7_o40hd")
script = ExtResource("8_d2bof")
[node name="VSeparator3" type="VSeparator" parent="UI/AspectRatioContainer/TeamScreen"]
layout_mode = 2
[node name="Member4" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen"]
[node name="Member4" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen" groups=["Persist"]]
custom_minimum_size = Vector2(200, 10)
layout_mode = 2
script = ExtResource("8_0l7ds")
script = ExtResource("9_2ploj")
[node name="VSeparator4" type="VSeparator" parent="UI/AspectRatioContainer/TeamScreen"]
layout_mode = 2
[node name="Member5" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen"]
[node name="Member5" type="TextureButton" parent="UI/AspectRatioContainer/TeamScreen" groups=["Persist"]]
custom_minimum_size = Vector2(200, 10)
layout_mode = 2
script = ExtResource("9_yaflp")
script = ExtResource("10_vu24c")
[node name="Label" type="Label" parent="UI/AspectRatioContainer/TeamScreen"]
visible = false

View File

@@ -1,11 +1,12 @@
[gd_scene load_steps=7 format=3 uid="uid://jleorcxdlvge"]
[gd_scene load_steps=8 format=3 uid="uid://jleorcxdlvge"]
[ext_resource type="Script" path="res://Root.gd" id="1_8y42b"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="2_mowpw"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="3_oxquv"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="4_l25dw"]
[ext_resource type="Script" path="res://TeamSelection.gd" id="5_3rdmh"]
[ext_resource type="Script" path="res://MemberDatabase/MemberDatabase.gd" id="6_ukmgy"]
[ext_resource type="Script" path="res://Root.gd" id="1_4wos3"]
[ext_resource type="Script" path="res://MemberDatabase/MemberDatabase.gd" id="2_d1pbg"]
[ext_resource type="Script" path="res://User Interface/Header.gd" id="3_5456x"]
[ext_resource type="Script" path="res://User Interface/TeamButton.gd" id="4_15yu8"]
[ext_resource type="Script" path="res://User Interface/Bossbutton.gd" id="5_1vjo7"]
[ext_resource type="Script" path="res://Scenes/saveTimer.gd" id="6_6bpyy"]
[ext_resource type="Script" path="res://TeamSelection.gd" id="6_aruh2"]
[node name="Root" type="Control"]
layout_mode = 3
@@ -16,14 +17,14 @@ offset_right = 768.0
offset_bottom = 432.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_8y42b")
script = ExtResource("1_4wos3")
[node name="MemberDatabase" type="Control" parent="."]
visible = false
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("6_ukmgy")
script = ExtResource("2_d1pbg")
[node name="UI" type="Control" parent="."]
anchors_preset = 0
@@ -36,7 +37,7 @@ offset_bottom = 1080.0
offset_left = 3.0
offset_right = 395.0
offset_bottom = 40.0
script = ExtResource("2_mowpw")
script = ExtResource("3_5456x")
[node name="ScoreLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -102,14 +103,14 @@ layout_mode = 2
text = "Team"
flat = true
alignment = 0
script = ExtResource("3_oxquv")
script = ExtResource("4_15yu8")
[node name="Bossbutton" type="Button" parent="UI/CanvasLayer/Header"]
layout_mode = 2
text = "Bosses"
flat = true
alignment = 0
script = ExtResource("4_l25dw")
script = ExtResource("5_1vjo7")
[node name="ClickAddLabel" type="Label" parent="UI/CanvasLayer/Header"]
layout_mode = 2
@@ -137,6 +138,11 @@ text = "Multiplier:
layout_mode = 2
text = "0"
[node name="saveTimer" type="Timer" parent="UI/CanvasLayer/Header"]
wait_time = 5.0
autostart = true
script = ExtResource("6_6bpyy")
[node name="TeamSelection" type="GridContainer" parent="UI"]
layout_mode = 0
offset_left = 3.0
@@ -144,4 +150,4 @@ offset_top = 40.0
offset_right = 1923.0
offset_bottom = 1120.0
columns = 10
script = ExtResource("5_3rdmh")
script = ExtResource("6_aruh2")

94
Scenes/titleScreen.gd Normal file
View File

@@ -0,0 +1,94 @@
extends Control
var files_to_copy = [
"MemberDatabase/memberData.json",
"Boss/bossData.json",
"Save/saveData.json"
]
var user_directory = OS.get_user_data_dir()
var save_data = {}
func copy_file_if_not_exists(file_name: String):
var user_file_path = "user://" + file_name
if not FileAccess.file_exists(user_file_path):
var res_file_path = "res://" + file_name
if FileAccess.file_exists(res_file_path):
var file = FileAccess.open(res_file_path, FileAccess.READ)
if file:
var data = file.get_as_text()
file.close()
# Write to user:// directory
var user_file = FileAccess.open(user_file_path, FileAccess.WRITE)
if user_file:
user_file.store_string(data)
user_file.close()
print("Copied ", file_name, " to user:// directory.")
else:
print("Failed to open destination file: ", user_file_path)
user_file.get_open_error()
else:
print("Failed to open source file: ", res_file_path)
else:
print("Source file ", res_file_path, " not found.")
else:
print("File ", user_file_path, " already exists.")
func load_saved_game():
#If using json
var file = FileAccess.open("user://Save/saveData.json", FileAccess.READ)
#var file = FileAccess.open("user://memberData.json", FileAccess.READ)
if file:
var json_text = file.get_as_text()
#print (json_text)
file.close()
var json = JSON.new()
var json_result = json.parse(json_text)
#print (json_result)
if json_result == OK:
save_data = json.get_data()
print("Save data loaded successfully.")
#print(character_data)
else:
print("Failed to parse JSON: ", json_result.error_string)
else:
print("Save data file not found.")
#Sets the global variables to what was saved
Global.globalDamage = save_data["totalDamage"]
Global.globalDamagePerClick = save_data["damagePerClick"]
Global.globalDamagePerSec = save_data["damagePerSec"]
Global.globalDamageMultiplier = save_data["damageMultiplier"]
Global.damagePerSecMember1 = save_data["damagePerSecMember1"]
Global.damagePerClickMember1 = save_data["damagePerClickMember1"]
Global.damageMultiplierMember1 = save_data["damageMultiplierMember1"]
Global.texture_member1 = save_data["textureMember1"]
Global.damagePerSecMember2 = save_data["damagePerSecMember2"]
Global.damagePerClickMember2 = save_data["damagePerClickMember2"]
Global.damageMultiplierMember2 = save_data["damageMultiplierMember2"]
Global.texture_member2 = save_data["textureMember2"]
Global.damagePerSecMember3 = save_data["damagePerSecMember3"]
Global.damagePerClickMember3 = save_data["damagePerClickMember3"]
Global.damageMultiplierMember3 = save_data["damageMultiplierMember3"]
Global.texture_member3 = save_data["textureMember3"]
Global.damagePerSecMember4 = save_data["damagePerSecMember4"]
Global.damagePerClickMember4 = save_data["damagePerClickMember4"]
Global.damageMultiplierMember4 = save_data["damageMultiplierMember4"]
Global.texture_member4 = save_data["textureMember4"]
Global.damagePerSecMember5 = save_data["damagePerSecMember5"]
Global.damagePerClickMember5 = save_data["damagePerClickMember5"]
Global.damageMultiplierMember5 = save_data["damageMultiplierMember5"]
Global.texture_member5 = save_data["textureMember5"]
# Called when the node enters the scene tree for the first time.
func _ready():
for file_name in files_to_copy:
copy_file_if_not_exists(file_name) # Replace with function body.
load_saved_game()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

29
Scenes/titleScreen.tscn Normal file
View File

@@ -0,0 +1,29 @@
[gd_scene load_steps=3 format=3 uid="uid://c1kf17y3j7jhy"]
[ext_resource type="Script" path="res://TitleClick.gd" id="1_8fgbc"]
[ext_resource type="Script" path="res://Scenes/titleScreen.gd" id="1_euijw"]
[node name="TitleScreen" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = 768.0
offset_bottom = 432.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_euijw")
[node name="Title Text" type="RichTextLabel" parent="."]
layout_mode = 0
offset_right = 2422.0
offset_bottom = 1080.0
text = "Title Screen
Click Anywhere"
[node name="TitleClick" type="LinkButton" parent="Title Text"]
layout_mode = 0
offset_right = 1920.0
offset_bottom = 1080.0
script = ExtResource("1_8fgbc")

View File

@@ -60,7 +60,7 @@ func _on_button_exited(button: TextureButton):
# Update the global singleton for the given index
func update_global_texture_singleton(texture: Texture):
func update_global_texture_singleton(texture: String):
match Global.currentMemberSelected:
0:
Global.set_texture1(texture)
@@ -79,7 +79,8 @@ func _on_button_pressed(button: TextureButton, member: Dictionary):
## Print the name of the button
##print("Button pressed: ", button.name)
var selected_texture = button.texture_normal
var selected_texture = button.texture_normal.resource_path
print(selected_texture)
#var texture = button.texture_normal
# Logic to determine which target button to update (this can be based on user selection or some other logic)
# For this example, we'll update the first available slot
@@ -96,7 +97,7 @@ func _on_button_pressed(button: TextureButton, member: Dictionary):
Global.teamScreenVisible = true
Global.teamSelectionVisible = false
get_tree().change_scene_to_file("res://team.tscn")
get_tree().change_scene_to_file("res://Scenes/team.tscn")

15
TitleClick.gd Normal file
View File

@@ -0,0 +1,15 @@
extends LinkButton
# Called when the node enters the scene tree for the first time.
func _ready():
self.connect("pressed", Callable(self, "_on_Button_pressed"))
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _on_Button_pressed():
get_tree().change_scene_to_file("res://Scenes/UserInterface.tscn")

View File

@@ -8,7 +8,7 @@ func _ready():
# Function to handle the button press
func _on_Button_pressed():
get_tree().change_scene_to_file("res://bossFights.tscn")
get_tree().change_scene_to_file("res://Scenes/bossFights.tscn")
#if Global.bossScreenVisible == false:
#Global.bossScreenVisible = true
#Global.teamScreenVisible = false

View File

@@ -6,19 +6,20 @@ func _ready():
# Connect the pressed signal to the _on_Button_pressed function
self.connect("pressed", Callable(self, "_on_Button_pressed"))
func _process(delta):
#Checks if the texture needs to be set
if Global.texture_member1:
self.texture_normal = Global.texture_member1
self.texture_normal = load(Global.texture_member1)
# Function to handle the button press
func _on_Button_pressed():
#MemberDatabase.load_character_data()
get_tree().change_scene_to_file("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://Scenes/teamSelection.tscn")
Global.currentMemberSelected = 0

View File

@@ -12,12 +12,12 @@ func _ready():
func _process(delta):
#Checks if the texture needs to be set
if Global.texture_member2:
self.texture_normal = Global.texture_member2
self.texture_normal = load(Global.texture_member2)
# Function to handle the button press
func _on_Button_pressed():
get_tree().change_scene_to_file("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://Scenes/teamSelection.tscn")
Global.currentMemberSelected = 1

View File

@@ -12,13 +12,13 @@ func _ready():
func _process(delta):
#Checks if the texture needs to be set
if Global.texture_member3:
self.texture_normal = Global.texture_member3
self.texture_normal = load(Global.texture_member3)
# Function to handle the button press
func _on_Button_pressed():
#This is an array, numbers will not match
get_tree().change_scene_to_file("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://Scenes/teamSelection.tscn")
Global.currentMemberSelected = 2
Global.teamScreenVisible = false

View File

@@ -12,12 +12,12 @@ func _ready():
func _process(delta):
#Checks if the texture needs to be set
if Global.texture_member4:
self.texture_normal = Global.texture_member4
self.texture_normal = load(Global.texture_member4)
# Function to handle the button press
func _on_Button_pressed():
get_tree().change_scene_to_file("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://Scenes/teamSelection.tscn")
Global.currentMemberSelected = 3

View File

@@ -12,12 +12,12 @@ func _ready():
func _process(delta):
#Checks if the texture needs to be set
if Global.texture_member5:
self.texture_normal = Global.texture_member5
self.texture_normal = load(Global.texture_member5)
# Function to handle the button press
func _on_Button_pressed():
get_tree().change_scene_to_file("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://Scenes/teamSelection.tscn")
Global.currentMemberSelected = 4

View File

@@ -9,7 +9,7 @@ func _ready():
func _on_Button_pressed():
#var new_scene = load("res://teamSelection.tscn")
get_tree().change_scene_to_file("res://team.tscn")
get_tree().change_scene_to_file("res://Scenes/team.tscn")
#if Global.teamScreenVisible == false:
#Global.teamSelectionVisible = false

View File

@@ -1,21 +0,0 @@
extends PanelContainer
const Slot = preload("res://slot.tscn")
@onready var member_grid = $MarginContainer/MemberGrid
func _ready() -> void:
var inv_data = preload("res://Inventory.tres")
populate_member_grid(inv_data.slot_datas)
func populate_member_grid(slot_datas: Array[Slot_Data]) -> void:
for child in member_grid.get_children():
child.queue_free()
for slot_data in slot_datas:
var slot = Slot.instantiate()
member_grid.add_child(slot)
#Populates slot
if slot_data:
slot.set_slot_data(slot_data)

View File

@@ -1,19 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://djb50o2drdkk1"]
[ext_resource type="Script" path="res://inventory.gd" id="1_51xtg"]
[node name="Inventory" type="PanelContainer"]
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("1_51xtg")
[node name="MarginContainer" type="MarginContainer" parent="."]
layout_mode = 2
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8
theme_override_constants/margin_bottom = 8
[node name="MemberGrid" type="GridContainer" parent="MarginContainer"]
layout_mode = 2
columns = 54

14
slot.gd
View File

@@ -1,14 +0,0 @@
extends PanelContainer
@onready var texture_rect = $MarginContainer/TextureRect
@onready var quantity_label = $"Quantity Label"
func set_slot_data(slot_data: Slot_Data) -> void:
var member_data = slot_data.memberData
#Updates texture
texture_rect.texture = member_data.texture
tooltip_text = "%s\n%s" % [member_data.name, member_data.description]
if slot_data.quantity > 1:
quantity_label.text = "x%s" % slot_data.quantity
quantity_label.show()

View File

@@ -1,30 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://cacut43x6gvco"]
[ext_resource type="Script" path="res://slot.gd" id="1_lwvfm"]
[node name="Slot" type="PanelContainer"]
custom_minimum_size = Vector2(64, 64)
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("1_lwvfm")
[node name="MarginContainer" type="MarginContainer" parent="."]
layout_mode = 2
theme_override_constants/margin_left = 4
theme_override_constants/margin_top = 4
theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
[node name="TextureRect" type="TextureRect" parent="MarginContainer"]
layout_mode = 2
expand_mode = 1
stretch_mode = 5
[node name="Quantity Label" type="Label" parent="."]
visible = false
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 0
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_constants/outline_size = 3
text = "x99"