Splitting up the fight calculation in different layers
			#1
			
				
			
		
		
	 Open
		
	
	
		
		
			
		
		
		
		
			
		
		
			
				
					Hecht
					wants to merge 3 commits from foo  into master
				
			
			
				| @ -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…
					
					
				
		Reference in New Issue