From 22e2ecd4c9b0a5ce20cb184f821454140ccd8c6f Mon Sep 17 00:00:00 2001 From: Hecht Date: Mon, 8 Sep 2025 20:58:52 +0200 Subject: [PATCH] Added conversion from object oriented fight to array-of-rounds --- scenes/Global/API.gd | 8 +- scenes/Global/FightLib.gd | 199 +++++++++++++++++++++++---------- scenes/Main/FightSetup.tscn | 6 + scenes/Main/fight_setup.gd | 7 ++ scenes/Main/fight_setup.gd.uid | 1 + 5 files changed, 162 insertions(+), 59 deletions(-) create mode 100644 scenes/Main/FightSetup.tscn create mode 100644 scenes/Main/fight_setup.gd create mode 100644 scenes/Main/fight_setup.gd.uid diff --git a/scenes/Global/API.gd b/scenes/Global/API.gd index 5afdd38..0c5c350 100644 --- a/scenes/Global/API.gd +++ b/scenes/Global/API.gd @@ -20,9 +20,7 @@ var _all_characters: Dictionary = {} var _techniques: Dictionary = {} var _techniques_array : Array = [] - -# Called when the node enters the scene tree for the first time. -func _ready(): +func initialize_api(): _http_request.base_address = "http://localhost:8000" _http_request.auth_token = "_sGFrChRV6ML0eWZC2qSUZzEGNLPbAhP4dwmnWhQ5bQ9xIi2pwHWQ1CzybFPDLeK8dTNx6GgWdR-Jcz-Z9_aC0hlY2h0fDIwMjQtMDYtMTNUMTk6MTU6MzkrMDA6MDA=" @@ -44,6 +42,10 @@ func _ready(): user_name = chunks.slice(64).get_string_from_utf8().split('|')[0] +# Called when the node enters the scene tree for the first time. +func _ready(): + initialize_api() + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): pass diff --git a/scenes/Global/FightLib.gd b/scenes/Global/FightLib.gd index 0e6de71..f82715b 100644 --- a/scenes/Global/FightLib.gd +++ b/scenes/Global/FightLib.gd @@ -1,78 +1,165 @@ extends Node -class Motion: - pass +class Someone extends Object: + var name : String + + func _init(name : String) -> void: + self.name = name + +class Motion extends Object: + var originator : Someone + var animation : String + var stamina_change : float + + func _init(originator : Someone, animation : String, stamina_change : float = 0) -> void: + self.originator = originator + self.animation = animation + self.stamina_change = stamina_change class Recover extends Motion: ''' Animation ''' pass -class Action extends Motion: - pass +class Reaction extends Motion: + var hp_change : float -class ActionOnSelf extends Action: - pass + func _init(originator : Someone, animation: String, stamina_costs: float, hp_change : float): + super._init(originator, animation, -stamina_costs) + self.hp_change = hp_change -class Wait extends ActionOnSelf: - ''' Animation ''' - pass +class Counter extends Reaction: + var damage : float -class Buff extends ActionOnSelf: - ''' Animation ''' - pass + func _init(originator : Someone, animation: String, stamina_costs: float, damage : float): + super._init(originator, animation, -stamina_costs, 0) + self.damage = damage -class ActionOnOpponent extends Action: - pass +class Defense extends Reaction: + var successful : bool -class Attack extends ActionOnOpponent: - ''' Animation ''' - func get_damage() -> int: - return 0 + func _init(originator : Someone, animation: String, stamina_costs: float, hp_change : float): + super._init(originator, animation, -stamina_costs, hp_change) + self.successful = hp_change == 0.0 -class Debuff extends ActionOnOpponent: - ''' Animation ''' - pass +class Block extends Defense: + func _init(originator : Someone, animation : String, stamina_costs: float, hp_change : float): + super._init(originator, animation, stamina_costs, hp_change) -class Reaction extends Motion: - pass +class Evade extends Defense: + ''' Successfully, evaded? ''' + + func _init(originator : Someone, animation : String, stamina_costs: float, hp_change : float): + super._init(originator, animation, stamina_costs, hp_change) -class Counter extends Reaction: - ''' Animation ''' - pass +class Absorb extends Reaction: + ''' Actually, accept being hit ''' + + func _init(originator : Someone, animation: String, stamina_costs: float, hp_change : float): + super._init(originator, animation, -stamina_costs, hp_change) -class Defense extends Reaction: - func was_successful() -> bool: - return true -class Block extends Defense: - ''' Animation ''' +class Action extends Motion: pass -class Evade extends Defense: - ''' Animation ''' +class ActionOnSelf extends Action: pass -class Round: - pass +class Wait extends ActionOnSelf: + func _init(originator : Someone, animation : String, stamina_gain : float): + super._init(originator, animation, stamina_gain) -var actions = ["Attack", "Block", "Evade"] - -var rounds : Array[Round] = [ - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), - Round.new(), -] +class Buff extends ActionOnSelf: + func _init(originator : Someone, animation : String) -> void: + super._init(originator, animation, 1.0) + +class ActionOnOpponent extends Action: + var opponent : Someone + var reaction : Reaction + + func _init(originator : Someone, animation : String, opponent : Someone, stamina_costs : float, reaction : Reaction) -> void: + super._init(originator, animation, -stamina_costs) + self.opponent = opponent + self.reaction = reaction + +class Attack extends ActionOnOpponent: + var damage : float + + func _init(originator : Someone, animation : String, opponent : Someone, stamina_costs : float, reaction : Reaction) -> void: + super._init(originator, animation, opponent, stamina_costs, reaction) + +class Debuff extends ActionOnOpponent: + func _init(originator : Someone, animation : String, opponent : Someone, stamina_costs : float, reaction : Reaction) -> void: + super._init(originator, animation, opponent, stamina_costs, reaction) + +class PlayerAnimation extends Object: + var animation : String + var hp_change : float + var stamina_change : float + +class Round extends Object: + var action: int + var animations : Array[PlayerAnimation] + +func convertReaction2PlayerAnimation(reaction : Reaction) -> PlayerAnimation: + if reaction == null: + return null + var a = PlayerAnimation.new() + a.animation = reaction.animation + a.hp_change = -reaction.hp_change + return a + +func getReaction(motion : Motion) -> Reaction: + if motion is ActionOnOpponent: + return motion.reaction + + return null + +func convertMotion2PlayerAnimation(motion : Motion) -> PlayerAnimation: + var a = PlayerAnimation.new() + a.animation = motion.animation + a.stamina_change = motion.stamina_change + return a + +func convertMotion2Round(lhs : Someone, rhs : Someone, motion : Motion) -> Round: + var round = Round.new() + + round.action = 0 if motion.originator == lhs else 1 + round.animations.append(convertMotion2PlayerAnimation(motion)) + var reaction = getReaction(motion) + round.animations.append(convertReaction2PlayerAnimation(reaction)) + + if reaction is Counter: + round.animations[0].hp_change = -reaction.damage + + return round + +# TODO: breakdown to a simpler transferable class +func convert(lhs : Someone, rhs : Someone, motions : Array[Motion]) -> Array[Round]: + var rounds : Array[Round] = [] + for motion in motions: + rounds.push_back(convertMotion2Round(lhs, rhs, motion)) + + return rounds + +func _init() -> void: + var player1 : Someone = Someone.new("John") + var player2 : Someone = Someone.new("Joe") + + var rounds : Array[Motion] = [ + Attack.new(player1, "Kick", player2, 1.0, Absorb.new(player2, "Hit", 1, 12.0)), + Buff.new(player2, "SSJ"), + Attack.new(player1, "Punch", player2, 2.0, Block.new(player2, "Block", 1.0, true)), + Wait.new(player2, "Wait", 5.0) + ] + + var r2 = self.convert(player1, player2, rounds) + + for r in r2: + var activeIndex = r.action + var reactiveIndex = 0 if r.action == 1 else 0 + var orientation = "Left" if r.action == 1 else "Right" + + print("%s Player {'Animation': '%s', 'hp_change': %f, 'stamina_change': %f}" % [orientation, r.animations[0].animation, r.animations[0].hp_change, r.animations[0].stamina_change]) + if r.animations[1] != null: + print("Other Player {'Animation': '%s', 'hp_change': %f, 'stamina_change': %f}" % [r.animations[1].animation, r.animations[1].hp_change, r.animations[1].stamina_change]) + print() diff --git a/scenes/Main/FightSetup.tscn b/scenes/Main/FightSetup.tscn new file mode 100644 index 0000000..0df59a6 --- /dev/null +++ b/scenes/Main/FightSetup.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bmid6fvrq22bj"] + +[ext_resource type="Script" uid="uid://bwchifcb7bh05" path="res://scenes/Main/fight_setup.gd" id="1_l4m47"] + +[node name="FightSetup" type="Node2D"] +script = ExtResource("1_l4m47") diff --git a/scenes/Main/fight_setup.gd b/scenes/Main/fight_setup.gd new file mode 100644 index 0000000..1871d5d --- /dev/null +++ b/scenes/Main/fight_setup.gd @@ -0,0 +1,7 @@ +extends Node2D + +const FightLib = preload("res://scenes/Global/FightLib.gd") + +# Called when the node enters the scene tree for the first time. +func _ready(): + FightLib.new() diff --git a/scenes/Main/fight_setup.gd.uid b/scenes/Main/fight_setup.gd.uid new file mode 100644 index 0000000..556f88c --- /dev/null +++ b/scenes/Main/fight_setup.gd.uid @@ -0,0 +1 @@ +uid://bwchifcb7bh05