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 # 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.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