WeaponMasteryManager

 avatar
unknown
python
a month ago
4.0 kB
3
Indexable
extends Node

enum MasteryLevel {
	NONE,
	TEST,
	APPRENTICE,
	ADVANCED,
	EXPERT,
	MASTER
}

# Define requirements per weapon type
const WEAPON_MASTERY_REQUIREMENTS = {
	"sword": {
		MasteryLevel.TEST: 10,
		MasteryLevel.APPRENTICE: 100,
		MasteryLevel.ADVANCED: 300,
		MasteryLevel.EXPERT: 500,
		MasteryLevel.MASTER: 1000
	},
	"axe": {
		MasteryLevel.TEST: 50,
		MasteryLevel.APPRENTICE: 500,
		MasteryLevel.ADVANCED: 1000,
		MasteryLevel.EXPERT: 2000,
		MasteryLevel.MASTER: 3000
	}
	# Add more weapons with their own requirements
}

# Default requirements for weapons not specifically defined
const DEFAULT_MASTERY_REQUIREMENTS = {
	MasteryLevel.TEST: 10,
	MasteryLevel.APPRENTICE: 100,
	MasteryLevel.ADVANCED: 300,
	MasteryLevel.EXPERT: 600,
	MasteryLevel.MASTER: 1000
}

const SAVE_FILE_PATH = "user://weapon_mastery.save"

var mastery_data = {}

func _ready():
	load_mastery_data()
	print_mastery_stats()

func load_mastery_data():
	if FileAccess.file_exists(SAVE_FILE_PATH):
		var file = FileAccess.open(SAVE_FILE_PATH, FileAccess.READ)
		mastery_data = file.get_var()
	else:
		mastery_data = {}
		save_mastery_data()

func save_mastery_data():
	var file = FileAccess.open(SAVE_FILE_PATH, FileAccess.WRITE)
	file.store_var(mastery_data)

func get_weapon_kills(weapon_id: String) -> int:
	if !mastery_data.has(weapon_id):
		mastery_data[weapon_id] = {"kills": 0}
		save_mastery_data()
	return mastery_data[weapon_id]["kills"]

func add_weapon_kill(weapon_id: String):
	if !mastery_data.has(weapon_id):
		print("Initializing mastery data for weapon: %s" % weapon_id)  # Debug
		mastery_data[weapon_id] = {"kills": 0}
	
	mastery_data[weapon_id]["kills"] += 1
	save_mastery_data()
	print("Weapon %s kills: %d" % [weapon_id, mastery_data[weapon_id]["kills"]])
	
	# Print when mastery level changes
	var new_level = get_mastery_level(weapon_id)
	if mastery_data[weapon_id]["kills"] == get_requirement_for_level(weapon_id, new_level):
		print("NEW MASTERY LEVEL for %s: %s" % [weapon_id, get_mastery_level_name(new_level)])

func get_requirement_for_level(weapon_id: String, level: MasteryLevel) -> int:
	# First check if weapon has specific requirements
	if WEAPON_MASTERY_REQUIREMENTS.has(weapon_id):
		if WEAPON_MASTERY_REQUIREMENTS[weapon_id].has(level):
			return WEAPON_MASTERY_REQUIREMENTS[weapon_id][level]
	
	# Fall back to default requirements if specific ones don't exist
	if DEFAULT_MASTERY_REQUIREMENTS.has(level):
		return DEFAULT_MASTERY_REQUIREMENTS[level]
		
	# If no requirement found, return a very high number to prevent level up
	return 999999



func get_mastery_level(weapon_id: String) -> MasteryLevel:
	var kills = get_weapon_kills(weapon_id)
	
	# Use either specific requirements or defaults
	var requirements = WEAPON_MASTERY_REQUIREMENTS[weapon_id] if WEAPON_MASTERY_REQUIREMENTS.has(weapon_id) else DEFAULT_MASTERY_REQUIREMENTS
	
	# Check levels from highest to lowest
	for level in range(MasteryLevel.MASTER, MasteryLevel.NONE, -1):
		# Only check levels that have requirements defined
		if requirements.has(level):
			if kills >= get_requirement_for_level(weapon_id, level):
				return level
	
	return MasteryLevel.NONE

func get_mastery_level_name(level: MasteryLevel) -> String:
	return MasteryLevel.keys()[level]

func print_mastery_stats():
	print("\n=== WEAPON MASTERY STATS ===")
	if mastery_data.is_empty():
		print("No mastery data found!")  # Debug
		return
		
	print("Current mastery data:", mastery_data)  # Debug
	
	for weapon_id in mastery_data:
		var kills = mastery_data[weapon_id]["kills"]
		var level = get_mastery_level(weapon_id)
		var next_level = level + 1 if level < MasteryLevel.MASTER else level
		var current_req = get_requirement_for_level(weapon_id, next_level)
		
		print("%s - Level: %s (Kills: %d/%d)" % 
			[weapon_id, get_mastery_level_name(level), kills, current_req])
	print("===========================\n")

func has_mastery_requirement(weapon_id: String, required_level: MasteryLevel) -> bool:
	return get_mastery_level(weapon_id) >= required_level
Leave a Comment