Files
Dawn-Godot/battle/fighter/BattleFighter.gd
2026-01-14 21:54:38 -06:00

110 lines
2.4 KiB
GDScript

class_name BattleFighter
enum Status {
NORMAL,
DEAD,
}
enum FighterTeam {
PLAYER,
ENEMY
}
enum FighterController {
PLAYER,
AI
}
# Health
var health:int
var maxHealth:int
var mp:int
var maxMp:int
var status:Status
# Identity
var team:FighterTeam
var controller:FighterController
# Stats
var attack:int
var defense:int
var speed:int
var magic:int
var luck:int
# Equipment
# Moves
var movePrimary:BattleMove
var movesMagical:Array[BattleMove]
var movesAbility:Array[BattleMove]
# Signals
signal healthChanged(difference:int, crit:bool)
signal mpChanged(difference:int)
signal statusChanged(oldStatus:Status, newStatus:Status)
func _init(params:Dictionary) -> void:
self.maxHealth = params.get('maxHealth', 100)
self.maxMp = params.get('maxMp', 50)
self.attack = params.get('attack', 10)
self.defense = params.get('defense', 5)
self.speed = params.get('speed', 5)
self.magic = params.get('magic', 5)
self.luck = params.get('luck', 1)
self.team = params.get('team', FighterTeam.ENEMY)
self.controller = params.get('controller', FighterController.PLAYER)
self.movePrimary = params.get('movePrimary', null)
if params.has('movesMagical'):
movesMagical.append_array(params['movesMagical'])
if params.has('movesAbility'):
movesAbility.append_array(params['movesAbility'])
self.health = self.maxHealth
self.mp = self.maxMp
func damage(amount:int, crit:bool) -> void:
assert(amount > 0)
if status == Status.DEAD:
return
health = max(health - amount, 0)
healthChanged.emit(-amount, crit)
if health == 0:
var oldStatus = status
status = Status.DEAD
statusChanged.emit(oldStatus, status)
func heal(amount:int) -> void:
assert(amount > 0)
if status == Status.DEAD:
return
health = min(health + amount, maxHealth)
healthChanged.emit(amount, false)
func revive(health:int) -> void:
assert(health > 0)
if status != Status.DEAD:
return
health = min(health, maxHealth)
status = Status.NORMAL
self.health = health
statusChanged.emit(Status.DEAD, Status.NORMAL)
healthChanged.emit(health)
func mpConsume(amount:int) -> void:
assert(amount > 0)
mp = max(mp - amount, 0)
mpChanged.emit(-amount)
func mpRestore(amount:int) -> void:
assert(amount > 0)
mp = min(mp + amount, maxMp)
mpChanged.emit(amount)
func isCrit() -> bool:
# 10% chance of a crit
var chance = 10 + min(luck * 5, 60)
var roll = randi() % 100
return roll < chance