Extracted the fight calculation
							parent
							
								
									fef8caec93
								
							
						
					
					
						commit
						84cff2ebbf
					
				| @ -1,165 +1,28 @@ | ||||
| extends Node | ||||
| 
 | ||||
| class Someone extends Object: | ||||
| 	var name : String | ||||
| const MotionLib = preload("res://scenes/Global/MotionLib.gd") | ||||
| 
 | ||||
| 	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 ''' | ||||
| class Skill: | ||||
| 	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: | ||||
| class Action extends Skill: | ||||
| 	pass | ||||
| 
 | ||||
| class ActionOnSelf extends Action: | ||||
| class Reaction extends Skill: | ||||
| 	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 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 motions : 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) | ||||
| 	] | ||||
| class Passive extends Skill: | ||||
| 	pass | ||||
| 
 | ||||
| 	var rounds = self.convert(player1, player2, motions) | ||||
| class Stats: | ||||
| 	var strength : int | ||||
| 	var constituion : int | ||||
| 	var agility : int | ||||
| 	var chi : int | ||||
| 
 | ||||
| 	for round in rounds: | ||||
| 		var activeIndex = round.action | ||||
| 		var reactiveIndex = 0 if round.action == 1 else 0 | ||||
| 		var orientation = "Left" if round.action == 1 else "Right" | ||||
| class CharacterLineup: | ||||
| 	var stats : Stats | ||||
| 	var skills  : Array[Skill] | ||||
| 
 | ||||
| 		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() | ||||
| func calculateFight(player1 : CharacterLineup, player2 : CharacterLineup) -> MotionLib.MotionReport: | ||||
| 	return MotionLib.MotionReport.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 | ||||
| @ -1,7 +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(): | ||||
| 	FightLib.new() | ||||
| 	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() | ||||
|  | ||||
					Loading…
					
					
				
		Reference in New Issue