class_name Adventurer extends Node enum Gender{ MASC, FEMME, NONBINARY } var given_name : String = "Test" var surname : String = "Testing" var gender : Gender = Gender.MASC var life : int = 1 var max_life : int = 1 var energy : int = 1 var max_energy : int = 1 var level : int = 1 var exp : int = 0 var job : JobData var stats : StatBlock var gold : int = 0 var quest : Quest var weapon : Weapon var armor : Armor var accessory : Accessory var inventory : Dictionary[Vector2, Item] = {} var inventory_size : Vector2i = Vector2i(3,2) var inventory_count : int = 0 var quest_sprite : QuestSprite signal changed() signal levelled() signal died() func _init() -> void: stats = StatBlock.new() func generate() -> void: if job == null: return stats.STR = randi_range(job.min_STR, job.max_STR) stats.DEX = randi_range(job.min_DEX, job.max_DEX) stats.INT = randi_range(job.min_INT, job.max_INT) stats.CHA = randi_range(job.min_CHA, job.max_CHA) stats.FAI = randi_range(job.min_FAI, job.max_FAI) stats.LUK = randi_range(job.min_LUK, job.max_LUK) max_life = stats.STR * 10 + stats.CHA * 10 max_energy = stats.INT * 10 + stats.FAI * 10 life = max_life energy = max_energy changed.emit() func assign_quest(quest : Quest) -> void: self.quest = quest quest.initiate(self) changed.emit() func full_name() -> String: return given_name + " " + surname func gain_level() -> void: level += 1 #TODO: Make stats improve based on job Game.notice("%s has reached level %d!" % [full_name(), level]) #TODO: Make Sideview display level up changed.emit() levelled.emit() func gain_exp(amount : int) -> void: exp += amount while exp >= get_tnl(): exp -= get_tnl() gain_level() changed.emit() func gain_gold(amount :int) -> void: gold += amount changed.emit() func get_tnl() -> int: if job: return job.get_tnl(level) else: return level * 10 func find_open_inventory_slot(item : Item) -> Vector2: var first_open : Vector2 = Vector2(-1,-1) for j in range(inventory_size.y): for i in range(inventory_size.x): var curr_slot : Item = inventory.get(Vector2(i,j)) if curr_slot != null: #TODO: Figure out how to handle split stacking later? if curr_slot.name == item.name and curr_slot.max_quantity < curr_slot.quantity + item.quantity: return Vector2(i,j) elif first_open == Vector2(-1,-1): first_open = Vector2(i,j) return first_open func try_pickup_item(item : Item) -> bool: if inventory_count >= inventory_size.x * inventory_size.y: return false pickup_item(item) return true func pickup_item(item : Item) -> void: var open_slot = find_open_inventory_slot(item) if inventory.has(open_slot): inventory[open_slot].quantity += item.quantity else: if inventory_count >= inventory_size.x * inventory_size.y: printerr("Cannot fit additional item!") inventory[open_slot] = item inventory_count+=1 changed.emit() func move_item(from : Vector2, to: Vector2) -> void: if !inventory.has(from): printerr("Cannot move item from %s to %s, %s is empty!" % [from, to, from]) var itm = inventory[from] if inventory.has(to): var itm2 = inventory[to] inventory[from] = itm2 else: inventory.erase(from) inventory[to] = itm changed.emit()