Files
pomchronicles/scripts/adventurer.gd

129 lines
3.1 KiB
GDScript

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()