Combat base added

This commit is contained in:
gamer147
2026-04-02 08:29:24 -04:00
parent 470e89b15b
commit ce92c6e435
14 changed files with 402 additions and 18 deletions

View File

@@ -25,11 +25,9 @@ func _ready() -> void:
func snap_to_grid(pos: Vector2) -> Vector2:
return Vector2(floorf(pos.x / TILE_SIZE), floorf(pos.y / TILE_SIZE)) * TILE_SIZE
func world_to_coords(pos: Vector2) -> Vector2i:
return Vector2i(snap_to_grid(pos) / TILE_SIZE)
func coords_to_world(coords: Vector2i) -> Vector2:
return Vector2(coords) * TILE_SIZE

50
nodes/combat_system.gd Normal file
View File

@@ -0,0 +1,50 @@
class_name CombatSystem extends Node
func create_proposal(attacker: Unit, defender: Unit) -> CombatProposal:
var proposal := CombatProposal.new()
proposal.attacker = _snapshot(attacker, defender)
proposal.defender = _snapshot(defender, attacker)
return proposal
func _snapshot(unit: Unit, opponent: Unit) -> CombatProposal.CombatantStats:
var stats := CombatProposal.CombatantStats.new()
stats.unit = unit
stats.hp = unit.current_stats.current_hp
stats.sp = unit.current_stats.current_sp
stats.hit = unit.current_stats.hit - opponent.current_stats.eva
stats.atk = unit.current_stats.phys_atk
stats.def = unit.current_stats.phys_def
stats.spd = unit.current_stats.spd
return stats
func process_combat(attacker: Unit, defender: Unit) -> void:
var proposal := create_proposal(attacker, defender)
var atk_name := attacker.current_info.name
var def_name := defender.current_info.name
print("=== Combat: %s vs %s ===" % [atk_name, def_name])
print(" %s — HP:%d ATK:%d DEF:%d HIT:%d" % [atk_name, proposal.attacker.hp, proposal.attacker.atk, proposal.attacker.def, proposal.attacker.hit])
print(" %s — HP:%d ATK:%d DEF:%d HIT:%d" % [def_name, proposal.defender.hp, proposal.defender.atk, proposal.defender.def, proposal.defender.hit])
apply_proposal(proposal)
print(" Result: %s HP=%d, %s HP=%d" % [atk_name, attacker.current_stats.current_hp, def_name, defender.current_stats.current_hp])
func apply_proposal(proposal: CombatProposal) -> void:
var atk_stats := proposal.attacker
var def_stats := proposal.defender
var atk_unit := atk_stats.unit
var def_unit := def_stats.unit
# Attacker strikes
var atk_roll := randi_range(1, 100)
if atk_roll <= atk_stats.hit:
var damage := maxi(atk_stats.atk - def_stats.def, 0)
def_unit.current_stats.current_hp -= damage
# Counterattack if defender survives
if def_unit.current_stats.current_hp > 0:
var def_roll := randi_range(1, 100)
if def_roll <= def_stats.hit:
var damage := maxi(def_stats.atk - atk_stats.def, 0)
atk_unit.current_stats.current_hp -= damage

View File

@@ -0,0 +1 @@
uid://cf4ivrcbky0s3

View File

@@ -4,6 +4,8 @@ const SPEED = 192.0
@export var dl_map: CombatMap
signal combat_requested(attacker: Unit, defender: Unit)
var _selected_unit: Unit = null
var _target_pos: Vector2
var _goal_pos: Vector2
@@ -16,7 +18,10 @@ func _unhandled_input(event: InputEvent) -> void:
var clicked_unit := _get_unit_at(world_pos)
if clicked_unit:
_select_unit(clicked_unit)
if _selected_unit and clicked_unit != _selected_unit:
combat_requested.emit(_selected_unit, clicked_unit)
else:
_select_unit(clicked_unit)
get_viewport().set_input_as_handled()
elif _selected_unit:
var snapped_pos := dl_map.snap_to_grid(world_pos)