Splitting up the fight calculation in different layers #1

Open
Hecht wants to merge 3 commits from foo into master

@ -17,7 +17,7 @@ config/icon="res://icon.svg"
[autoload] [autoload]
API="*res://scenes/Global/API.tscn" API="res://scenes/Global/API.tscn"
Dialogic="*res://addons/dialogic/Core/DialogicGameHandler.gd" Dialogic="*res://addons/dialogic/Core/DialogicGameHandler.gd"
[dialogic] [dialogic]

@ -20,9 +20,7 @@ var _all_characters: Dictionary = {}
var _techniques: Dictionary = {} var _techniques: Dictionary = {}
var _techniques_array : Array = [] var _techniques_array : Array = []
func initialize_api():
# Called when the node enters the scene tree for the first time.
func _ready():
_http_request.base_address = "http://localhost:8000" _http_request.base_address = "http://localhost:8000"
_http_request.auth_token = "_sGFrChRV6ML0eWZC2qSUZzEGNLPbAhP4dwmnWhQ5bQ9xIi2pwHWQ1CzybFPDLeK8dTNx6GgWdR-Jcz-Z9_aC0hlY2h0fDIwMjQtMDYtMTNUMTk6MTU6MzkrMDA6MDA=" _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] 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. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta): func _process(_delta):
pass pass

@ -1,78 +1,28 @@
extends Node extends Node
class Motion: const MotionLib = preload("res://scenes/Global/MotionLib.gd")
pass
class Recover extends Motion:
''' Animation '''
pass
class Action extends Motion:
pass
class ActionOnSelf extends Action:
pass
class Wait extends ActionOnSelf:
''' Animation '''
pass
class Buff extends ActionOnSelf: class Skill:
''' Animation '''
pass pass
class ActionOnOpponent extends Action: class Action extends Skill:
pass pass
class Attack extends ActionOnOpponent: class Reaction extends Skill:
''' Animation '''
func get_damage() -> int:
return 0
class Debuff extends ActionOnOpponent:
''' Animation '''
pass
class Reaction extends Motion:
pass pass
class Counter extends Reaction: class Passive extends Skill:
''' Animation '''
pass pass
class Defense extends Reaction: class Stats:
func was_successful() -> bool: var strength : int
return true var constituion : int
var agility : int
class Block extends Defense: var chi : int
''' Animation '''
pass
class Evade extends Defense:
''' Animation '''
pass
class Round:
pass
var actions = ["Attack", "Block", "Evade"] class CharacterLineup:
var stats : Stats
var skills : Array[Skill]
var rounds : Array[Round] = [ func calculateFight(player1 : CharacterLineup, player2 : CharacterLineup) -> MotionLib.MotionReport:
Round.new(), return MotionLib.MotionReport.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(),
]

@ -1 +1 @@
uid://btq7nf3fo58d3 uid://wkn5qvs3fw82

@ -0,0 +1,108 @@
extends Node
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 Reaction extends Motion:
var hp_change : float
func _init(originator : Someone, animation: String, stamina_costs: float, hp_change : float):
super._init(originator, animation, -stamina_costs)
self.hp_change = hp_change
class Counter extends Reaction:
var damage : float
func _init(originator : Someone, animation: String, stamina_costs: float, damage : float):
super._init(originator, animation, -stamina_costs, 0)
self.damage = damage
class Defense extends Reaction:
var successful : bool
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 Block extends Defense:
func _init(originator : Someone, animation : String, stamina_costs: float, hp_change : float):
super._init(originator, animation, stamina_costs, hp_change)
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 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 Action extends Motion:
pass
class ActionOnSelf extends Action:
pass
class Wait extends ActionOnSelf:
func _init(originator : Someone, animation : String, stamina_gain : float):
super._init(originator, animation, stamina_gain)
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 MotionReport:
var player1 : Someone
var player2 : Someone
var motions : Array[Motion]
func _init():
self.player1 = Someone.new("John")
self.player2 = Someone.new("Joe")
self.motions = [
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)
]

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

@ -0,0 +1,52 @@
extends Node
const MotionLib = preload("res://scenes/Global/MotionLib.gd")
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]
class RenderReport:
var rounds: Array[Round]
func _init(report : MotionLib.MotionReport):
self.rounds = []
for motion in report.motions:
self.rounds.push_back(self.convertMotion2Round(report.player1, report.player2, motion))
func convertReaction2PlayerAnimation(reaction : MotionLib.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 : MotionLib.Motion) -> MotionLib.Reaction:
if motion is MotionLib.ActionOnOpponent:
return motion.reaction
return null
func convertMotion2PlayerAnimation(motion : MotionLib.Motion) -> PlayerAnimation:
var a = PlayerAnimation.new()
a.animation = motion.animation
a.stamina_change = motion.stamina_change
return a
func convertMotion2Round(lhs : MotionLib.Someone, rhs : MotionLib.Someone, motion : MotionLib.Motion) -> Round:
var round = Round.new()
round.action = 0 if motion.originator == lhs else 1
round.animations.append(self.convertMotion2PlayerAnimation(motion))
var reaction = self.getReaction(motion)
round.animations.append(self.convertReaction2PlayerAnimation(reaction))
if reaction is MotionLib.Counter:
round.animations[0].hp_change = -reaction.damage
return round

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

@ -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")

@ -0,0 +1,23 @@
extends Node2D
const MotionLib = preload("res://scenes/Global/MotionLib.gd")
const RenderLib = preload("res://scenes/Global/RenderLib.gd")
const FightLib = preload("res://scenes/Global/FightLib.gd")
# Called when the node enters the scene tree for the first time.
func _ready():
var player1 = FightLib.CharacterLineup.new()
var player2 = FightLib.CharacterLineup.new()
var m : MotionLib.MotionReport = FightLib.new().calculateFight(player1, player2)
var r : RenderLib.RenderReport = RenderLib.RenderReport.new(m)
for round in r.rounds:
var activeIndex = round.action
var reactiveIndex = 0 if round.action == 1 else 0
var orientation = "Left" if round.action == 1 else "Right"
print("%s Player {'Animation': '%s', 'hp_change': %f, 'stamina_change': %f}" % [orientation, round.animations[0].animation, round.animations[0].hp_change, round.animations[0].stamina_change])
if round.animations[1] != null:
print("Other Player {'Animation': '%s', 'hp_change': %f, 'stamina_change': %f}" % [round.animations[1].animation, round.animations[1].hp_change, round.animations[1].stamina_change])
print()

@ -0,0 +1 @@
uid://bwchifcb7bh05
Loading…
Cancel
Save