UpgradeManager

 avatar
unknown
python
2 months ago
3.9 kB
3
Indexable
extends Node

@export var experience_manager: Node
@export var upgrade_screen_scene: PackedScene

var current_upgrades = {}
var upgrade_pool: WeightedTable = WeightedTable.new()

# Preload upgrades
var upgrade_axe = preload("res://resources/upgrades/axe.tres")
var upgrade_axe_damage = preload("res://resources/upgrades/axe_damage.tres")
var upgrade_sword_rate = preload("res://resources/upgrades/sword_rate.tres")
var upgrade_sword_damage = preload("res://resources/upgrades/sword_damage.tres")
var upgrade_sword_life_steal = preload("res://resources/upgrades/sword_life_steal.tres")
var upgrade_player_speed = preload("res://resources/upgrades/player_speed.tres")
var upgrade_anvil = preload("res://resources/upgrades/anvil.tres")
var upgrade_anvil_count = preload("res://resources/upgrades/anvil_count.tres")
var upgrade_scythe = preload("res://resources/upgrades/scythe.tres")
var upgrade_damage_aura = preload("res://resources/upgrades/damage_aura.tres")

# Mastery requirements for upgrades
const mastery_requirements = {
	"sword_life_steal": {
		"weapon_id": "sword",
		"level": WeaponMasteryManager.MasteryLevel.TEST
	},
	"anvil_count": {
		"weapon_id": "anvil",
		"level": WeaponMasteryManager.MasteryLevel.TEST
	}
}

# Base upgrade weights
const base_weights = {
	"axe": 8,
	"anvil": 800,
	"sword_rate": 10,
	"sword_damage": 10,
	"player_speed": 6,
	"scythe": 4,
	"damage_aura": 6,
	"sword_life_steal": 5
}

func _ready():
	initialize_upgrade_pool()
	if experience_manager:
		experience_manager.level_up.connect(on_level_up)
	else:
		push_error("experience_manager not assigned in upgrade_manager")

func initialize_upgrade_pool():
	for upgrade_id in base_weights:
		var upgrade = get("upgrade_" + upgrade_id)
		if upgrade:
			upgrade_pool.add_item(upgrade, base_weights[upgrade_id])

func meets_mastery_requirement(upgrade_id: String) -> bool:
	if !mastery_requirements.has(upgrade_id):
		return true
		
	var req = mastery_requirements[upgrade_id]
	var controller = get_tree().get_first_node_in_group(req.weapon_id + "_controller")
	if !controller or !controller.has_node("WeaponMasteryComponent"):
		return false
		
	var mastery = controller.get_node("WeaponMasteryComponent")
	return mastery.has_mastery_requirement(req.level)

func pick_upgrades() -> Array[AbilityUpgrade]:
	var available_upgrades: Array[Dictionary] = []
	
	for item in upgrade_pool.items:
		var upgrade = item["item"] as AbilityUpgrade
		if meets_mastery_requirement(upgrade.id):
			available_upgrades.append(item)
	
	var filtered_pool = WeightedTable.new()
	for item in available_upgrades:
		filtered_pool.add_item(item["item"], item["weight"])
	
	var chosen_upgrades: Array[AbilityUpgrade] = []
	for i in 2:
		if filtered_pool.items.size() == chosen_upgrades.size():
			break
		var chosen = filtered_pool.pick_item(chosen_upgrades)
		if chosen:
			chosen_upgrades.append(chosen)
	
	return chosen_upgrades

func update_upgrade_pool(chosen_upgrade: AbilityUpgrade):
	match chosen_upgrade.id:
		"axe":
			upgrade_pool.add_item(upgrade_axe_damage, 8)
		"anvil":
			upgrade_pool.add_item(upgrade_anvil_count, 7000)

func apply_upgrade(upgrade: AbilityUpgrade):
	if !current_upgrades.has(upgrade.id):
		current_upgrades[upgrade.id] = {
			"resource": upgrade,
			"quantity": 1
		}
	else:
		current_upgrades[upgrade.id]["quantity"] += 1
	
	if upgrade.max_quantity > 0:
		var current_quantity = current_upgrades[upgrade.id]["quantity"]
		if current_quantity == upgrade.max_quantity:
			upgrade_pool.remove_item(upgrade)
			
	update_upgrade_pool(upgrade)
	GameEvents.emit_ability_upgrade_added(upgrade, current_upgrades)

func on_upgrade_selected(upgrade: AbilityUpgrade):
	apply_upgrade(upgrade)

func on_level_up(current_level: int):
	var upgrade_screen = upgrade_screen_scene.instantiate()
	add_child(upgrade_screen)
	var upgrades = pick_upgrades()
	upgrade_screen.set_ability_upgrades(upgrades)
	upgrade_screen.upgrade_selected.connect(on_upgrade_selected)
Leave a Comment