Weighted character selection

This commit is contained in:
2024-06-14 15:33:36 -04:00
parent ee6fa21177
commit 082b1353bc
36 changed files with 2914 additions and 160 deletions

View File

@@ -26,7 +26,7 @@ func create_boss_button(boss: Dictionary) -> TextureButton:
func _on_button_hovered(button: TextureButton, boss: Dictionary):
#current_member = member
#Generates the hovered tooltips
#The backslash \ allows you to continue to the next line while concatenating the string
var tooltip_text = "" + str(boss["name"]) + "\n" + "" + str(boss["description"]) + "\n" + "Total Health: " + str(boss["totalHealth"]) + "\n" + \
"Minimum DPS Required: " + str(boss["minDPS"])
@@ -38,7 +38,18 @@ func _on_button_exited(button: TextureButton):
func _on_button_pressed(button: TextureButton, boss: Dictionary):
#var character_manager = get_node("/root/Root/UI/CharacterRoll")
#character_manager.roll_character()
$CharacterRoll.roll_character()
#Checks you have the prerquisites, deducts damage
if Global.globalDamagePerClick >= int(boss["minClickDmg"]):
if Global.globalDamagePerSec >= int(boss["minDPS"]):
if Global.globalDamage >= int(boss["totalHealth"]):
var damageCost = int(boss["totalHealth"])
var bossTier = boss["bossTier"]
Global.globalDamage -= damageCost
$CharacterRoll.roll_character(bossTier)
else:
print("Not enough Total Damage!")
else:
print("Not enough DPS!")
else:
print("Not enough Damage per Click!")

View File

@@ -2,11 +2,20 @@ extends PanelContainer
func _ready():
load_character_inventory()
#pass
var character_data = []
var getMembers = []
const Rarity = {
"COMMON":1.0,
"UNCOMMON": 0.8,
"RARE": 0.4,
"SUPERRARE": 0.08,
"LEGENDARY": 0.02
}
func load_character_inventory():
var file_path = "user://MemberDatabase/memberData.json"
if FileAccess.file_exists(file_path):
@@ -52,17 +61,34 @@ func update_character(index, new_data):
else:
print("Invalid character index: ", index)
func roll_character():
func roll_character(bossTier):
if character_data.size() == 0:
print("No characters in inventory.")
return
print("Boss tier is:", bossTier)
getMembers = character_data["members"]
var random_index = randi() % getMembers.size()
var random_character = getMembers[random_index]
if not random_character["isObtained"]:
random_character["isObtained"] = true
random_character["memberAmount"] += 1
save_character_inventory()
print("Rolled character: ", random_character["name"])
var rolledcharacter = choose_weighted_random_member(getMembers)
print("Weighted Character:", rolledcharacter)
for entry in getMembers:
if entry["name"] == rolledcharacter["name"]:
#var random_character = getMembers[entry]
#print ("Matched", entry["name"], "to", rolledcharacter["name"])
if not rolledcharacter["isObtained"]:
rolledcharacter["isObtained"] = true
rolledcharacter["memberAmount"] += 1
save_character_inventory()
func choose_weighted_random_member(getMembers):
var total_weight = 0.0
for member in getMembers:
total_weight += Rarity.get(member["rarity"], 0)
var random_value = randf() * total_weight
var cumulative_weight = 0.0
for member in getMembers:
cumulative_weight += Rarity.get(member["rarity"], 0)
if random_value < cumulative_weight:
return member
return null # Fallback if something goes wrong