178 lines
5.5 KiB
GDScript
178 lines
5.5 KiB
GDScript
extends Node
|
|
|
|
class_name CharacterStats
|
|
|
|
var current_level:int
|
|
var current_health:float
|
|
var current_mana:float
|
|
var max_health:int setget set_max_health
|
|
var max_mana:int setget set_max_mana
|
|
var attack:int
|
|
var defense:int
|
|
var dexterity:int
|
|
var speed:int
|
|
var vitality:int
|
|
var wisdown:int
|
|
|
|
var health_min_scale:int
|
|
var mana_min_scale:int
|
|
var attack_min_scale:int
|
|
var defense_min_scale:int
|
|
var dexterity_min_scale:int
|
|
var speed_min_scale:int
|
|
var vitality_min_scale:int
|
|
var wisdown_min_scale:int
|
|
|
|
var health_max_scale:int
|
|
var mana_max_scale:int
|
|
var attack_max_scale:int
|
|
var defense_max_scale:int
|
|
var dexterity_max_scale:int
|
|
var speed_max_scale:int
|
|
var vitality_max_scale:int
|
|
var wisdown_max_scale:int
|
|
|
|
var health_bonus_scale:int
|
|
var mana_bonus_scale:int
|
|
var attack_bonus_scale:int
|
|
var defense_bonus_scale:int
|
|
var dexterity_bonus_scale:int
|
|
var speed_bonus_scale:int
|
|
var vitality_bonus_scale:int
|
|
var wisdown_bonus_scale:int
|
|
|
|
var current_xp:int
|
|
var next_level_xp:int
|
|
var xp_scale:int = 100
|
|
|
|
var regen_health:float
|
|
var regen_mana:float
|
|
var attack_multiplier:float
|
|
var attack_speed:float
|
|
var velocity:float
|
|
|
|
func initialize(stats: CharacterBaseStats):
|
|
max_health = stats.health
|
|
max_mana = stats.mana
|
|
attack = stats.attack
|
|
defense = stats.defense
|
|
dexterity = stats.dexterity
|
|
speed = stats.speed
|
|
vitality = stats.vitality
|
|
wisdown = stats.wisdown
|
|
health_min_scale = stats.health_min_scale
|
|
mana_min_scale = stats.mana_min_scale
|
|
attack_min_scale = stats.attack_min_scale
|
|
defense_min_scale = stats.defense_min_scale
|
|
dexterity_min_scale = stats.dexterity_min_scale
|
|
speed_min_scale = stats.speed_min_scale
|
|
vitality_min_scale = stats.vitality_min_scale
|
|
wisdown_min_scale = stats.wisdown_min_scale
|
|
health_max_scale = stats.health_max_scale
|
|
mana_max_scale = stats.mana_max_scale
|
|
attack_max_scale = stats.attack_max_scale
|
|
defense_max_scale = stats.defense_max_scale
|
|
dexterity_max_scale = stats.dexterity_max_scale
|
|
speed_max_scale = stats.speed_max_scale
|
|
vitality_max_scale = stats.vitality_max_scale
|
|
wisdown_max_scale = stats.wisdown_max_scale
|
|
health_bonus_scale = stats.health_bonus_scale
|
|
mana_bonus_scale = stats.mana_bonus_scale
|
|
attack_bonus_scale = stats.attack_bonus_scale
|
|
defense_bonus_scale = stats.defense_bonus_scale
|
|
dexterity_bonus_scale = stats.dexterity_bonus_scale
|
|
speed_bonus_scale = stats.speed_bonus_scale
|
|
vitality_bonus_scale = stats.vitality_bonus_scale
|
|
wisdown_bonus_scale = stats.wisdown_bonus_scale
|
|
yield(get_tree().create_timer(0.1), "timeout")
|
|
stats_change()
|
|
|
|
func gain_experience(amount: int):
|
|
current_xp = amount
|
|
while current_xp >= next_level_xp:
|
|
current_xp -= next_level_xp
|
|
level_up()
|
|
|
|
func level_up():
|
|
if (current_level % 5) == 0:
|
|
max_health += health_bonus_scale
|
|
max_mana += mana_bonus_scale
|
|
attack += attack_bonus_scale
|
|
defense += defense_bonus_scale
|
|
dexterity += dexterity_bonus_scale
|
|
speed += speed_bonus_scale
|
|
vitality += vitality_bonus_scale
|
|
wisdown += wisdown_bonus_scale
|
|
else:
|
|
max_health += int(rand_range(float(health_min_scale), float(health_max_scale)))
|
|
max_mana += int(rand_range(float(mana_min_scale), float(mana_max_scale)))
|
|
attack += int(rand_range(float(attack_min_scale), float(attack_max_scale)))
|
|
defense += int(rand_range(float(defense_min_scale), float(defense_max_scale)))
|
|
dexterity += int(rand_range(float(dexterity_min_scale), float(dexterity_max_scale)))
|
|
speed += int(rand_range(float(speed_min_scale), float(speed_max_scale)))
|
|
vitality += int(rand_range(float(vitality_min_scale), float(vitality_max_scale)))
|
|
wisdown += int(rand_range(float(wisdown_min_scale), float(wisdown_max_scale)))
|
|
stats_change()
|
|
|
|
func stats_change():
|
|
if current_level >= 20:
|
|
return
|
|
current_level += 1
|
|
next_level_xp += xp_scale
|
|
current_health = max_health
|
|
current_mana = max_mana
|
|
regen_health = 0.2 + 10 * (float(vitality) / 50)
|
|
regen_mana = 0.2 + 5 * (float(wisdown) / 50)
|
|
attack_multiplier = 0.75 + 1.5 *(float(attack) / 70)
|
|
attack_speed = 1/(1 + 5 * (float(dexterity) / 70))
|
|
velocity = 2 + 10 * (float(speed) / 50)
|
|
GlobalSignals.emit_signal("health_changed", current_health)
|
|
GlobalSignals.emit_signal("mana_changed", current_mana)
|
|
GlobalSignals.emit_signal("attack_change", attack_multiplier)
|
|
GlobalSignals.emit_signal("dexterity_change", attack_speed)
|
|
GlobalSignals.emit_signal("velocity_change", velocity)
|
|
|
|
func take_damage(amount: float):
|
|
var damage
|
|
var percent_damage := amount * 0.1
|
|
if (amount - defense) >= percent_damage:
|
|
damage = amount - defense
|
|
current_health -= damage
|
|
else:
|
|
damage = percent_damage
|
|
current_health -= damage
|
|
current_health = clamp(current_health, 0, max_health)
|
|
GlobalSignals.emit_signal("health_changed", current_health)
|
|
GlobalSignals.emit_signal("damage_receive", damage)
|
|
if current_health == 0:
|
|
GlobalSignals.emit_signal("on_death")
|
|
|
|
func heal(amount: float):
|
|
current_health += amount
|
|
current_health = clamp(current_health, 0, max_health)
|
|
GlobalSignals.emit_signal("health_changed", current_health)
|
|
GlobalSignals.emit_signal("health_recover", amount)
|
|
|
|
func mana_heal(amount: float):
|
|
current_mana += amount
|
|
current_mana = clamp(current_mana, 0, max_mana)
|
|
GlobalSignals.emit_signal("health_changed", current_mana)
|
|
GlobalSignals.emit_signal("mana_recover", amount)
|
|
|
|
func regen():
|
|
current_health += regen_health
|
|
current_mana += regen_mana
|
|
current_health = clamp(current_health, 0, max_health)
|
|
current_mana = clamp(current_mana, 0, max_mana)
|
|
GlobalSignals.emit_signal("health_changed", current_health)
|
|
GlobalSignals.emit_signal("mana_changed", current_mana)
|
|
|
|
func set_max_health(value: int):
|
|
max_health = max(0, value)
|
|
|
|
func set_max_mana(value: int):
|
|
max_mana = max(0, value)
|
|
|
|
func _on_Regen_timeout():
|
|
regen()
|