Initial project sync
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
class_name ActionData
|
||||
extends Resource
|
||||
|
||||
@export var id: StringName
|
||||
@export var display_name: String
|
||||
@export var input_pattern: Array[StringName] = []
|
||||
@export var base_cost := 0.0
|
||||
@export var base_reward := 0.0
|
||||
@export var damage_mult := 1.0
|
||||
@export var move_mult_x := 0.0
|
||||
@export var move_mult_y := 0.0
|
||||
@export var knockback_mult_x := 0.0
|
||||
@export var knockback_mult_y := 0.0
|
||||
@export var hit_type: StringName = &"melee"
|
||||
@export var range := 0.0
|
||||
@export var target_type: StringName = &"single"
|
||||
@export var armor_level := 0
|
||||
@export var clear_window := true
|
||||
@export var can_chain := false
|
||||
@export var special: StringName = &""
|
||||
@export var startup_beats := 0.25
|
||||
@export var active_beats := 0.25
|
||||
@export var recovery_beats := 0.5
|
||||
@export_range(0.0, 1.0, 0.05) var cancel_from := 0.5
|
||||
@export var allowed_ground_states: Array[StringName] = [&"Grounded", &"Airborne"]
|
||||
@export var allowed_action_phases: Array[StringName] = [&"Neutral"]
|
||||
@export var action_tags: Array[StringName] = []
|
||||
@export var defense_tags: Array[StringName] = []
|
||||
@export var cancel_into_tags: Array[StringName] = []
|
||||
@export var on_hit_effects: Array[Resource] = []
|
||||
|
||||
@export var animation: StringName
|
||||
|
||||
var action_beats: float:
|
||||
get:
|
||||
return startup_beats + active_beats + recovery_beats
|
||||
@@ -0,0 +1 @@
|
||||
uid://cooudhoob8dn4
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_a12lf"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_a12lf")
|
||||
id = &"air_attack_left"
|
||||
display_name = "Air Attack Left"
|
||||
input_pattern = Array[StringName]([&"A"])
|
||||
base_reward = 10.0
|
||||
damage_mult = 1.3
|
||||
move_mult_x = -5.8
|
||||
move_mult_y = -1.6
|
||||
hit_type = &"melee"
|
||||
range = 75.0
|
||||
clear_window = true
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Airborne"])
|
||||
action_tags = Array[StringName]([&"basic", &"air", &"left"])
|
||||
animation = &"atk_air"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_a12rh"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_a12rh")
|
||||
id = &"air_attack_right"
|
||||
display_name = "Air Attack Right"
|
||||
input_pattern = Array[StringName]([&"D"])
|
||||
base_reward = 10.0
|
||||
damage_mult = 1.3
|
||||
move_mult_x = 5.8
|
||||
move_mult_y = -1.6
|
||||
hit_type = &"melee"
|
||||
range = 75.0
|
||||
clear_window = true
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Airborne"])
|
||||
action_tags = Array[StringName]([&"basic", &"air", &"right"])
|
||||
animation = &"atk_air"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_block_start"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_block_start")
|
||||
id = &"block_start"
|
||||
display_name = "Block Start"
|
||||
input_pattern = Array[StringName]([&"S"])
|
||||
damage_mult = 0.0
|
||||
move_mult_x = 0.0
|
||||
move_mult_y = 0.0
|
||||
hit_type = &"defense"
|
||||
clear_window = false
|
||||
startup_beats = 0.1
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.2
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"block", &"down"])
|
||||
defense_tags = Array[StringName]([&"parry"])
|
||||
animation = &"block_start"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_c5flf"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_c5flf")
|
||||
id = &"combo_finisher_left"
|
||||
display_name = "Combo Finisher Left"
|
||||
input_pattern = Array[StringName]([&"A", &"A", &"SP"])
|
||||
base_cost = 30.0
|
||||
knockback_mult_x = 2.0
|
||||
damage_mult = 2.2
|
||||
move_mult_x = -1.3
|
||||
hit_type = &"melee"
|
||||
range = 95.0
|
||||
clear_window = true
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"left"])
|
||||
animation = &"combo_finisher"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_c5frh"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_c5frh")
|
||||
id = &"combo_finisher_right"
|
||||
display_name = "Combo Finisher Right"
|
||||
input_pattern = Array[StringName]([&"D", &"D", &"SP"])
|
||||
base_cost = 30.0
|
||||
knockback_mult_x = 2.0
|
||||
damage_mult = 2.2
|
||||
move_mult_x = 1.3
|
||||
hit_type = &"melee"
|
||||
range = 95.0
|
||||
clear_window = true
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"right"])
|
||||
animation = &"combo_finisher"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_h5slf"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_h5slf")
|
||||
id = &"dash_slash_left"
|
||||
display_name = "Dash Slash Left"
|
||||
input_pattern = Array[StringName]([&"A", &"SP"])
|
||||
base_cost = 20.0
|
||||
knockback_mult_x = 1.5
|
||||
damage_mult = 1.6
|
||||
move_mult_x = -2.6
|
||||
hit_type = &"melee"
|
||||
range = 95.0
|
||||
clear_window = true
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.25
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"left", &"dash_through"])
|
||||
animation = &"dash_slash"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_d5srh"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_d5srh")
|
||||
id = &"dash_slash_right"
|
||||
display_name = "Dash Slash Right"
|
||||
input_pattern = Array[StringName]([&"D", &"SP"])
|
||||
base_cost = 20.0
|
||||
knockback_mult_x = 1.5
|
||||
damage_mult = 1.6
|
||||
move_mult_x = 2.6
|
||||
hit_type = &"melee"
|
||||
range = 95.0
|
||||
clear_window = true
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.25
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"right", &"dash_through"])
|
||||
animation = &"dash_slash"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_2way_shoot"
|
||||
display_name = "Boss 2-Way Shoot"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.45
|
||||
knockback_mult_x = 0.5
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
armor_level = 1
|
||||
startup_beats = 0.75
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"ranged"])
|
||||
animation = &"boss_2way_shoot"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_combo_1"
|
||||
display_name = "Boss Combo 1"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 1.6
|
||||
knockback_mult_x = 0.4
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 70.0
|
||||
startup_beats = 0.75
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"melee"])
|
||||
animation = &"boss_ground_combo_1"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_combo_2"
|
||||
display_name = "Boss Combo 2"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 1.8
|
||||
knockback_mult_x = 0.5
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 76.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"melee"])
|
||||
animation = &"boss_ground_combo_2"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_combo_3"
|
||||
display_name = "Boss Combo 3"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 2.2
|
||||
knockback_mult_x = 1.2
|
||||
knockback_mult_y = 0.2
|
||||
hit_type = &"melee"
|
||||
range = 96.0
|
||||
armor_level = 1
|
||||
startup_beats = 0.75
|
||||
active_beats = 0.5
|
||||
recovery_beats = 1.0
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"melee", &"heavy"])
|
||||
animation = &"boss_ground_combo_3"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_dash"
|
||||
display_name = "Boss Dash"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.0
|
||||
move_mult_x = 2.5
|
||||
knockback_mult_x = 0.0
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"movement"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.25
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"move"])
|
||||
animation = &"boss_dash"
|
||||
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_lunging_stab"
|
||||
display_name = "Boss Lunging Stab"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 3.0
|
||||
move_mult_x = 2.0
|
||||
knockback_mult_x = 1.6
|
||||
knockback_mult_y = 0.3
|
||||
hit_type = &"melee"
|
||||
range = 130.0
|
||||
armor_level = 2
|
||||
startup_beats = 2.0
|
||||
active_beats = 0.5
|
||||
recovery_beats = 1.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"melee", &"heavy", &"action"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"boss_lunging_stab"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_retreat_dash"
|
||||
display_name = "Boss Retreat Dash"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.0
|
||||
move_mult_x = 1.4
|
||||
knockback_mult_x = 0.0
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"movement"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.25
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"move", &"retreat"])
|
||||
animation = &"boss_dash"
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_shoot_1"
|
||||
display_name = "Boss Shoot 1"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.4
|
||||
knockback_mult_x = 0.3
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.25
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"ranged"])
|
||||
animation = &"boss_shoot_1"
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"boss_shoot_2"
|
||||
display_name = "Boss Shoot 2"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.4
|
||||
knockback_mult_x = 0.3
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.25
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"boss", &"ranged"])
|
||||
animation = &"boss_shoot_2"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_jin_zhan_1_attack"
|
||||
display_name = "Jin Zhan 1 Slash"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.55
|
||||
knockback_mult_x = 2.4
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 130.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"jin_zhan", &"melee"])
|
||||
animation = &"jin_zhan_1_attack"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_jin_zhan_3_attack_1"
|
||||
display_name = "Jin Zhan 3 Slash 1"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.5
|
||||
knockback_mult_x = 2.4
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 130.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"jin_zhan", &"melee"])
|
||||
animation = &"jin_zhan_3_attack_1"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_jin_zhan_3_attack_2"
|
||||
display_name = "Jin Zhan 3 Slash 2"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.6
|
||||
knockback_mult_x = 2.4
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 130.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"jin_zhan", &"melee"])
|
||||
animation = &"jin_zhan_3_attack_2"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_jin_zhan_3_attack_3"
|
||||
display_name = "Jin Zhan 3 Slash 3"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.75
|
||||
knockback_mult_x = 2.4
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"melee"
|
||||
range = 130.0
|
||||
startup_beats = 0.75
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"jin_zhan", &"melee"])
|
||||
animation = &"jin_zhan_3_attack_3"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_yuan_cheng_1_attack_1"
|
||||
display_name = "Yuan Cheng 1 Shot 1"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.45
|
||||
knockback_mult_x = 0.25
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
range = 520.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"yuan_cheng", &"ranged"])
|
||||
animation = &"yuan_cheng_1_attack_1"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_yuan_cheng_1_attack_2"
|
||||
display_name = "Yuan Cheng 1 Shot 2"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.55
|
||||
knockback_mult_x = 0.3
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
range = 540.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"yuan_cheng", &"ranged"])
|
||||
animation = &"yuan_cheng_1_attack_2"
|
||||
@@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_action"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_action")
|
||||
id = &"minion_yuan_cheng_2_attack"
|
||||
display_name = "Yuan Cheng 2 Shot"
|
||||
input_pattern = Array[StringName]([])
|
||||
base_reward = 0.0
|
||||
damage_mult = 0.65
|
||||
knockback_mult_x = 0.35
|
||||
knockback_mult_y = 0.0
|
||||
hit_type = &"projectile"
|
||||
range = 560.0
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"enemy", &"minion", &"yuan_cheng", &"ranged"])
|
||||
animation = &"yuan_cheng_2_attack"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_f3x8p"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_f3x8p")
|
||||
id = &"ground_attack_left_1"
|
||||
display_name = "Ground Attack Left 1"
|
||||
input_pattern = Array[StringName]([&"A"])
|
||||
base_reward = 10.0
|
||||
damage_mult = 1.0
|
||||
move_mult_x = -1.0
|
||||
hit_type = &"melee"
|
||||
range = 70.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"left"])
|
||||
animation = &"atk_ground_1"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_rx60x"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_rx60x")
|
||||
id = &"ground_attack_left_2"
|
||||
display_name = "Ground Attack Left 2"
|
||||
input_pattern = Array[StringName]([&"A", &"A"])
|
||||
base_reward = 12.0
|
||||
damage_mult = 1.2
|
||||
move_mult_x = -1.1
|
||||
hit_type = &"melee"
|
||||
range = 70.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"left"])
|
||||
animation = &"atk_ground_2"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_9l3la"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_9l3la")
|
||||
id = &"ground_attack_left_3"
|
||||
display_name = "Ground Attack Left 3"
|
||||
input_pattern = Array[StringName]([&"A", &"A", &"A"])
|
||||
base_reward = 15.0
|
||||
damage_mult = 1.5
|
||||
move_mult_x = -1.2
|
||||
hit_type = &"melee"
|
||||
range = 80.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"left"])
|
||||
animation = &"atk_ground_3"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_r05pk"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_r05pk")
|
||||
id = &"ground_attack_right_1"
|
||||
display_name = "Ground Attack Right 1"
|
||||
input_pattern = Array[StringName]([&"D"])
|
||||
base_reward = 10.0
|
||||
damage_mult = 1.0
|
||||
move_mult_x = 1.0
|
||||
hit_type = &"melee"
|
||||
range = 70.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"right"])
|
||||
animation = &"atk_ground_1"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_o2w5j"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_o2w5j")
|
||||
id = &"ground_attack_right_2"
|
||||
display_name = "Ground Attack Right 2"
|
||||
input_pattern = Array[StringName]([&"D", &"D"])
|
||||
base_reward = 12.0
|
||||
damage_mult = 1.2
|
||||
move_mult_x = 1.1
|
||||
hit_type = &"melee"
|
||||
range = 70.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"right"])
|
||||
animation = &"atk_ground_2"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_t3wrd"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_t3wrd")
|
||||
id = &"ground_attack_right_3"
|
||||
display_name = "Ground Attack Right 3"
|
||||
input_pattern = Array[StringName]([&"D", &"D", &"D"])
|
||||
base_reward = 15.0
|
||||
damage_mult = 1.5
|
||||
move_mult_x = 1.2
|
||||
hit_type = &"melee"
|
||||
range = 80.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.75
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"right"])
|
||||
animation = &"atk_ground_3"
|
||||
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_g6slf"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_g6slf")
|
||||
id = &"ground_smash_left"
|
||||
display_name = "Ground Smash Left"
|
||||
input_pattern = Array[StringName]([&"A", &"A", &"A", &"SP"])
|
||||
base_cost = 40.0
|
||||
knockback_mult_x = 2.2
|
||||
damage_mult = 2.8
|
||||
move_mult_x = -0.8
|
||||
knockback_mult_y = 1.8
|
||||
hit_type = &"melee"
|
||||
range = 110.0
|
||||
clear_window = true
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 1.0
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"left", &"knockup"])
|
||||
animation = &"ground_smash"
|
||||
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_g6srh"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_g6srh")
|
||||
id = &"ground_smash_right"
|
||||
display_name = "Ground Smash Right"
|
||||
input_pattern = Array[StringName]([&"D", &"D", &"D", &"SP"])
|
||||
base_cost = 40.0
|
||||
knockback_mult_x = 2.2
|
||||
damage_mult = 2.8
|
||||
move_mult_x = 0.8
|
||||
knockback_mult_y = 1.8
|
||||
hit_type = &"melee"
|
||||
range = 110.0
|
||||
clear_window = true
|
||||
startup_beats = 0.5
|
||||
active_beats = 0.25
|
||||
recovery_beats = 1.0
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"skill", &"right", &"knockup"])
|
||||
animation = &"ground_smash"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_xjy11"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_xjy11")
|
||||
id = &"jian_yu_left_lv1"
|
||||
display_name = "Jian Yu Left Lv1"
|
||||
damage_mult = 1.8
|
||||
move_mult_x = 0.0
|
||||
base_cost = 20.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"left"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_ytpcs"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ytpcs")
|
||||
id = &"jian_yu_left_lv2"
|
||||
display_name = "Jian Yu Left Lv2"
|
||||
damage_mult = 2.8
|
||||
move_mult_x = 0.0
|
||||
base_cost = 35.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"left"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_95us2"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_95us2")
|
||||
id = &"jian_yu_left_lv3"
|
||||
display_name = "Jian Yu Left Lv3"
|
||||
damage_mult = 4.2
|
||||
move_mult_x = 0.0
|
||||
base_cost = 50.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"left"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_hlh5a"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_hlh5a")
|
||||
id = &"jian_yu_right_lv1"
|
||||
display_name = "Jian Yu Right Lv1"
|
||||
damage_mult = 1.8
|
||||
move_mult_x = 0.0
|
||||
base_cost = 20.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"right"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_6sg6r"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_6sg6r")
|
||||
id = &"jian_yu_right_lv2"
|
||||
display_name = "Jian Yu Right Lv2"
|
||||
damage_mult = 2.8
|
||||
move_mult_x = 0.0
|
||||
base_cost = 35.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"right"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_v06qg"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_v06qg")
|
||||
id = &"jian_yu_right_lv3"
|
||||
display_name = "Jian Yu Right Lv3"
|
||||
damage_mult = 4.2
|
||||
move_mult_x = 0.0
|
||||
base_cost = 50.0
|
||||
knockback_mult_x = 0.8
|
||||
knockback_mult_y = 0.6
|
||||
range = 280.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"right"])
|
||||
defense_tags = Array[StringName]([&"super_armor"])
|
||||
animation = &"blade_rain_cast"
|
||||
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_2smdg"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_2smdg")
|
||||
id = &"launcher_up"
|
||||
display_name = "Launcher Up"
|
||||
input_pattern = Array[StringName]([&"W"])
|
||||
base_reward = 12.0
|
||||
damage_mult = 1.2
|
||||
move_mult_x = 0.6
|
||||
move_mult_y = 1.8
|
||||
knockback_mult_y = 1.8
|
||||
hit_type = &"melee"
|
||||
range = 60.0
|
||||
clear_window = false
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Grounded"])
|
||||
action_tags = Array[StringName]([&"basic", &"launcher", &"knockup"])
|
||||
animation = &"rising_slash"
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_p13ds"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_p13ds")
|
||||
id = &"plunging_strike"
|
||||
display_name = "Plunging Strike"
|
||||
input_pattern = Array[StringName]([&"S"])
|
||||
base_reward = 15.0
|
||||
damage_mult = 1.8
|
||||
move_mult_y = -2.6
|
||||
knockback_mult_y = 1.4
|
||||
hit_type = &"melee"
|
||||
range = 85.0
|
||||
clear_window = true
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.5
|
||||
recovery_beats = 0.5
|
||||
cancel_from = 0.5
|
||||
allowed_ground_states = Array[StringName]([&"Airborne"])
|
||||
action_tags = Array[StringName]([&"basic", &"air", &"down", &"knockup"])
|
||||
animation = &"plunge_start"
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_b1z3o"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_b1z3o")
|
||||
id = &"zhan_bo_lv1"
|
||||
display_name = "Zhan Bo Lv1"
|
||||
damage_mult = 1.2
|
||||
base_cost = 15.0
|
||||
knockback_mult_x = 1.0
|
||||
hit_type = &"projectile"
|
||||
range = 380.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"projectile"])
|
||||
animation = &"blade_wave_cast"
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_3aixl"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_3aixl")
|
||||
id = &"zhan_bo_lv2"
|
||||
display_name = "Zhan Bo Lv2"
|
||||
damage_mult = 2.0
|
||||
base_cost = 25.0
|
||||
knockback_mult_x = 1.3
|
||||
hit_type = &"projectile"
|
||||
range = 460.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"projectile"])
|
||||
animation = &"blade_wave_cast"
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="ActionData" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/action_data.gd" id="1_ig9pq"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ig9pq")
|
||||
id = &"zhan_bo_lv3"
|
||||
display_name = "Zhan Bo Lv3"
|
||||
damage_mult = 3.2
|
||||
base_cost = 40.0
|
||||
knockback_mult_x = 1.6
|
||||
hit_type = &"projectile"
|
||||
range = 540.0
|
||||
special = &"charge_cast"
|
||||
startup_beats = 0.25
|
||||
active_beats = 0.25
|
||||
recovery_beats = 0.5
|
||||
allowed_action_phases = Array[StringName]([&"Charging"])
|
||||
action_tags = Array[StringName]([&"charge", &"projectile"])
|
||||
animation = &"blade_wave_cast"
|
||||
@@ -0,0 +1,28 @@
|
||||
class_name BeatChart
|
||||
extends Resource
|
||||
|
||||
@export var chart_id: StringName = &""
|
||||
@export var total_beats := 0
|
||||
@export var tracks: Array = []
|
||||
@export var initial_time_phase: StringName = &"past"
|
||||
|
||||
|
||||
func all_events() -> Array:
|
||||
var result: Array = []
|
||||
for track in tracks:
|
||||
if not track is Resource:
|
||||
continue
|
||||
for event in track.call("sorted_events"):
|
||||
result.append(event)
|
||||
result.sort_custom(func(a: Resource, b: Resource) -> bool:
|
||||
var a_position := float(a.call("beat_position"))
|
||||
var b_position := float(b.call("beat_position"))
|
||||
if is_equal_approx(a_position, b_position):
|
||||
return str(a.get("event_type")) < str(b.get("event_type"))
|
||||
return a_position < b_position
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
func is_empty() -> bool:
|
||||
return all_events().is_empty()
|
||||
@@ -0,0 +1 @@
|
||||
uid://b0jn7bu4w1co7
|
||||
@@ -0,0 +1,34 @@
|
||||
class_name ChartEvent
|
||||
extends Resource
|
||||
|
||||
@export var event_id: StringName = &""
|
||||
@export var beat_index := 0
|
||||
@export var subdivision := 0
|
||||
@export var subdivisions_per_beat := 1
|
||||
@export var event_type: StringName = &""
|
||||
@export var target_id: StringName = &""
|
||||
@export var action_id: StringName = &""
|
||||
@export var payload: Dictionary = {}
|
||||
@export var lead_beats := 1.0
|
||||
@export var time_phase_mask: StringName = &"both"
|
||||
|
||||
|
||||
func matches_time_phase(time_phase: StringName) -> bool:
|
||||
if time_phase_mask.is_empty() or time_phase_mask == &"both":
|
||||
return true
|
||||
return time_phase_mask == time_phase
|
||||
|
||||
|
||||
func beat_position() -> float:
|
||||
var safe_subdivisions := maxi(1, subdivisions_per_beat)
|
||||
return float(beat_index) + float(subdivision) / float(safe_subdivisions)
|
||||
|
||||
|
||||
func time_seconds(beat_time: float) -> float:
|
||||
return beat_position() * maxf(0.001, beat_time)
|
||||
|
||||
|
||||
func key() -> StringName:
|
||||
if not event_id.is_empty():
|
||||
return event_id
|
||||
return StringName("%s:%s:%d:%d" % [event_type, target_id, beat_index, subdivision])
|
||||
@@ -0,0 +1 @@
|
||||
uid://bsbmwl7n6uil5
|
||||
@@ -0,0 +1,27 @@
|
||||
class_name ChartTrack
|
||||
extends Resource
|
||||
|
||||
@export var track_id: StringName = &""
|
||||
@export var track_type: StringName = &""
|
||||
@export var events: Array = []
|
||||
@export var time_phase_mask: StringName = &"both"
|
||||
|
||||
|
||||
func sorted_events() -> Array:
|
||||
var result: Array = []
|
||||
for event in events:
|
||||
if event is Resource:
|
||||
_apply_track_time_phase_mask(event)
|
||||
result.append(event)
|
||||
result.sort_custom(func(a: Resource, b: Resource) -> bool:
|
||||
return float(a.call("beat_position")) < float(b.call("beat_position"))
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
func _apply_track_time_phase_mask(event: Resource) -> void:
|
||||
if time_phase_mask.is_empty() or time_phase_mask == &"both":
|
||||
return
|
||||
var event_mask := StringName(str(event.get("time_phase_mask")))
|
||||
if event_mask.is_empty() or event_mask == &"both":
|
||||
event.set("time_phase_mask", time_phase_mask)
|
||||
@@ -0,0 +1 @@
|
||||
uid://t7etuk7uw3ns
|
||||
@@ -0,0 +1,105 @@
|
||||
[gd_resource type="Resource" script_class="BeatChart" load_steps=15 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/chart_event.gd" id="1_event"]
|
||||
[ext_resource type="Script" path="res://resources/chart_track.gd" id="2_track"]
|
||||
[ext_resource type="Script" path="res://resources/beat_chart.gd" id="3_chart"]
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_combo_1"
|
||||
beat_index = 2
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_1"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_combo_2"
|
||||
beat_index = 4
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_2"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_3"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_combo_3"
|
||||
beat_index = 6
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_3"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_stab"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_lunging_stab"
|
||||
beat_index = 10
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_lunging_stab"
|
||||
lead_beats = 2.0
|
||||
time_phase_mask = &"past"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_shoot_1"
|
||||
beat_index = 16
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_1"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_shoot_2"
|
||||
beat_index = 18
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_2"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_dash"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_dash"
|
||||
beat_index = 20
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_dash"
|
||||
lead_beats = 1.0
|
||||
time_phase_mask = &"past"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_2way"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage7_2way_shoot"
|
||||
beat_index = 22
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_2way_shoot"
|
||||
lead_beats = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_melee"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_melee"
|
||||
track_type = &"boss"
|
||||
time_phase_mask = &"past"
|
||||
events = Array[Resource]([SubResource("ChartEvent_melee_1"), SubResource("ChartEvent_melee_2"), SubResource("ChartEvent_melee_3")])
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_ranged"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_ranged"
|
||||
track_type = &"boss"
|
||||
time_phase_mask = &"future"
|
||||
events = Array[Resource]([SubResource("ChartEvent_ranged_1"), SubResource("ChartEvent_ranged_2"), SubResource("ChartEvent_ranged_2way")])
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_special"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_special"
|
||||
track_type = &"boss"
|
||||
events = Array[Resource]([SubResource("ChartEvent_special_stab"), SubResource("ChartEvent_special_dash")])
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_chart")
|
||||
chart_id = &"stage7_boss_opening"
|
||||
total_beats = 32
|
||||
tracks = Array[Resource]([SubResource("ChartTrack_melee"), SubResource("ChartTrack_ranged"), SubResource("ChartTrack_special")])
|
||||
@@ -0,0 +1,195 @@
|
||||
[gd_resource type="Resource" script_class="BeatChart" format=3 uid="uid://3xrcwnvo4ih3"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bsbmwl7n6uil5" path="res://resources/chart_event.gd" id="1_event"]
|
||||
[ext_resource type="Script" uid="uid://t7etuk7uw3ns" path="res://resources/chart_track.gd" id="2_track"]
|
||||
[ext_resource type="Script" uid="uid://b0jn7bu4w1co7" path="res://resources/beat_chart.gd" id="3_chart"]
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m1_combo_1"
|
||||
beat_index = 2
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_1"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m1_combo_2"
|
||||
beat_index = 4
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_2"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_3"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m1_combo_3"
|
||||
beat_index = 6
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_3"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_dash_in"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m2_dash_in"
|
||||
beat_index = 24
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_dash"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_4"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m2_combo_1"
|
||||
beat_index = 26
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_1"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_5"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m2_combo_2"
|
||||
beat_index = 28
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_2"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_melee_6"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_m3_combo_3"
|
||||
beat_index = 50
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_combo_3"
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_melee"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_melee"
|
||||
track_type = &"boss"
|
||||
events = [SubResource("ChartEvent_melee_1"), SubResource("ChartEvent_melee_2"), SubResource("ChartEvent_melee_3"), SubResource("ChartEvent_melee_dash_in"), SubResource("ChartEvent_melee_4"), SubResource("ChartEvent_melee_5"), SubResource("ChartEvent_melee_6")]
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r1_shoot_1"
|
||||
beat_index = 16
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_1"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r1_shoot_2"
|
||||
beat_index = 18
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_2"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_retreat"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r1_retreat"
|
||||
beat_index = 20
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_retreat_dash"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_2way"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r2_2way"
|
||||
beat_index = 22
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_2way_shoot"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_3"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r2_shoot_1"
|
||||
beat_index = 34
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_1"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_4"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r2_shoot_2"
|
||||
beat_index = 36
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_2"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_ranged_5"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_r3_shoot_1"
|
||||
beat_index = 46
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_shoot_1"
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_ranged"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_ranged"
|
||||
track_type = &"boss"
|
||||
events = [SubResource("ChartEvent_ranged_1"), SubResource("ChartEvent_ranged_2"), SubResource("ChartEvent_ranged_retreat"), SubResource("ChartEvent_ranged_2way"), SubResource("ChartEvent_ranged_3"), SubResource("ChartEvent_ranged_4"), SubResource("ChartEvent_ranged_5")]
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_stab_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_s1_lunging_stab"
|
||||
beat_index = 10
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_lunging_stab"
|
||||
lead_beats = 2.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_stab_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_s2_lunging_stab"
|
||||
beat_index = 42
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_lunging_stab"
|
||||
lead_beats = 2.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_2way"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_s3_2way"
|
||||
beat_index = 54
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_2way_shoot"
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_special_retreat"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_s3_retreat"
|
||||
beat_index = 58
|
||||
event_type = &"enemy_action"
|
||||
target_id = &"Boss"
|
||||
action_id = &"boss_retreat_dash"
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_special"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_boss_special"
|
||||
track_type = &"boss"
|
||||
events = [SubResource("ChartEvent_special_stab_1"), SubResource("ChartEvent_special_stab_2"), SubResource("ChartEvent_special_2way"), SubResource("ChartEvent_special_retreat")]
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_time_anchor_1"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_ta_08"
|
||||
beat_index = 8
|
||||
event_type = &"time_anchor"
|
||||
lead_beats = 2.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartEvent_time_anchor_2"]
|
||||
script = ExtResource("1_event")
|
||||
event_id = &"stage9_ta_40"
|
||||
beat_index = 40
|
||||
event_type = &"time_anchor"
|
||||
lead_beats = 2.0
|
||||
|
||||
[sub_resource type="Resource" id="ChartTrack_time_anchor"]
|
||||
script = ExtResource("2_track")
|
||||
track_id = &"track_time_anchor"
|
||||
track_type = &"time_anchor"
|
||||
events = [SubResource("ChartEvent_time_anchor_1"), SubResource("ChartEvent_time_anchor_2")]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_chart")
|
||||
chart_id = &"stage9_boss_duel"
|
||||
total_beats = 64
|
||||
tracks = [SubResource("ChartTrack_melee"), SubResource("ChartTrack_ranged"), SubResource("ChartTrack_special"), SubResource("ChartTrack_time_anchor")]
|
||||
@@ -0,0 +1,7 @@
|
||||
class_name ActionRuleModifier
|
||||
extends Resource
|
||||
|
||||
@export var blocked_action_tags: Array[StringName] = []
|
||||
@export var allowed_action_tags: Array[StringName] = []
|
||||
@export var allow_movement_while_charging := false
|
||||
@export var block_movement := false
|
||||
@@ -0,0 +1 @@
|
||||
uid://cphgi446ov1i6
|
||||
@@ -0,0 +1,7 @@
|
||||
class_name DefenseModifier
|
||||
extends Resource
|
||||
|
||||
@export var defense_state: StringName = &""
|
||||
@export var damage_mult := 1.0
|
||||
@export var interrupts := true
|
||||
@export var required_attack_tags: Array[StringName] = []
|
||||
@@ -0,0 +1 @@
|
||||
uid://b10ssegsbqfn
|
||||
@@ -0,0 +1,25 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=4 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_burst_damage"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
operation = "multiply"
|
||||
value = 1.2
|
||||
|
||||
[sub_resource type="Resource" id="Resource_burst_cost"]
|
||||
script = ExtResource("2")
|
||||
stat = &"cost_mult"
|
||||
operation = "multiply"
|
||||
value = 0.0
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_burst_power"
|
||||
display_name = "Burst Power"
|
||||
duration_type = &"beats"
|
||||
duration = 16.0
|
||||
max_stacks = 1
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_burst_damage"), SubResource("Resource_burst_cost")])
|
||||
@@ -0,0 +1,16 @@
|
||||
class_name EffectDefinition
|
||||
extends Resource
|
||||
|
||||
@export var id: StringName
|
||||
@export var display_name: String
|
||||
@export var duration_type: StringName = &"seconds"
|
||||
@export var duration := 0.0
|
||||
@export var max_stacks := 1
|
||||
@export var stat_modifiers: Array[Resource] = []
|
||||
@export var defense_modifiers: Array[Resource] = []
|
||||
@export var action_rule_modifiers: Array[Resource] = []
|
||||
@export var trigger_event: StringName = &""
|
||||
@export var trigger_effects: Array[Resource] = []
|
||||
@export var required_event_action_tags: Array[StringName] = []
|
||||
@export var blocked_event_action_tags: Array[StringName] = []
|
||||
@export var until_event: StringName = &""
|
||||
@@ -0,0 +1 @@
|
||||
uid://cvlmwyu6iqb8g
|
||||
@@ -0,0 +1,16 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://bop6tpmynvgqf"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_haste_move"]
|
||||
script = ExtResource("2")
|
||||
stat = &"move_speed"
|
||||
value = 1.25
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_haste"
|
||||
display_name = "Haste"
|
||||
duration = 2.0
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_haste_move")])
|
||||
@@ -0,0 +1,19 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/defense_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_hurt_super_armor_defense"]
|
||||
script = ExtResource("2")
|
||||
defense_state = &"SuperArmor"
|
||||
damage_mult = 1.0
|
||||
interrupts = false
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"hurt_super_armor"
|
||||
display_name = "Hurt Super Armor"
|
||||
duration_type = &"seconds"
|
||||
duration = 0.5
|
||||
max_stacks = 1
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_hurt_super_armor_defense")])
|
||||
@@ -0,0 +1,92 @@
|
||||
class_name EffectInstance
|
||||
extends RefCounted
|
||||
|
||||
var definition: Resource
|
||||
var remaining := 0.0
|
||||
var stacks := 1
|
||||
var source: Variant = &"-"
|
||||
|
||||
|
||||
static func create(next_definition: Resource, next_source: Variant = &"-") -> RefCounted:
|
||||
var script: Script = load("res://resources/effects/effect_instance.gd")
|
||||
var instance: RefCounted = script.new()
|
||||
instance.definition = next_definition
|
||||
instance.remaining = float(next_definition.get("duration"))
|
||||
if StringName(str(next_definition.get("duration_type"))) == &"until_event":
|
||||
instance.remaining = 1.0
|
||||
instance.source = next_source
|
||||
return instance
|
||||
|
||||
|
||||
func is_expired() -> bool:
|
||||
return remaining <= 0.0 and StringName(str(definition.get("duration_type"))) != &"infinite"
|
||||
|
||||
|
||||
func tick_time(delta: float) -> void:
|
||||
var duration_type := StringName(str(definition.get("duration_type")))
|
||||
if duration_type == &"seconds":
|
||||
remaining -= delta
|
||||
|
||||
|
||||
func tick_beats(beats: float) -> void:
|
||||
var duration_type := StringName(str(definition.get("duration_type")))
|
||||
if duration_type == &"beats":
|
||||
remaining -= beats
|
||||
|
||||
|
||||
func tick_event(event_name: StringName, context: Dictionary = {}) -> void:
|
||||
if not matches_event_context(context):
|
||||
return
|
||||
var duration_type := StringName(str(definition.get("duration_type")))
|
||||
if duration_type == &"actions" and event_name == &"on_action_start":
|
||||
remaining -= 1.0
|
||||
elif duration_type == &"hits" and event_name == &"on_hit":
|
||||
remaining -= 1.0
|
||||
elif duration_type == &"hurts" and event_name == &"on_hurt":
|
||||
remaining -= 1.0
|
||||
elif duration_type == &"measures" and event_name == &"on_measure_start":
|
||||
remaining -= 1.0
|
||||
elif duration_type == &"until_event" and event_name == StringName(str(definition.get("until_event"))):
|
||||
remaining = 0.0
|
||||
|
||||
|
||||
func matches_event_context(context: Dictionary = {}) -> bool:
|
||||
var action_tags := _event_action_tags(context)
|
||||
var required_tags := _string_name_array(definition.get("required_event_action_tags"))
|
||||
if not required_tags.is_empty() and not _has_any(action_tags, required_tags):
|
||||
return false
|
||||
var blocked_tags := _string_name_array(definition.get("blocked_event_action_tags"))
|
||||
if not blocked_tags.is_empty() and _has_any(action_tags, blocked_tags):
|
||||
return false
|
||||
return true
|
||||
|
||||
|
||||
func _event_action_tags(context: Dictionary) -> Array[StringName]:
|
||||
if context.has("action_tags"):
|
||||
return _string_name_array(context["action_tags"])
|
||||
var action: Resource = context.get("action", null) as Resource
|
||||
if action != null:
|
||||
return _string_name_array(action.get("action_tags"))
|
||||
var result = context.get("result", {})
|
||||
if result is Dictionary:
|
||||
if result.has("action_tags"):
|
||||
return _string_name_array(result["action_tags"])
|
||||
var result_action: Resource = result.get("action", null) as Resource
|
||||
if result_action != null:
|
||||
return _string_name_array(result_action.get("action_tags"))
|
||||
return []
|
||||
|
||||
|
||||
func _string_name_array(value: Variant) -> Array[StringName]:
|
||||
var result: Array[StringName] = []
|
||||
if value is Array:
|
||||
for item: Variant in value:
|
||||
result.append(StringName(str(item)))
|
||||
return result
|
||||
|
||||
|
||||
func _has_any(values: Array[StringName], candidates: Array[StringName]) -> bool:
|
||||
for value: StringName in values:
|
||||
if candidates.has(value):
|
||||
return true
|
||||
return false
|
||||
@@ -0,0 +1 @@
|
||||
uid://bvqpc3oh47qdb
|
||||
@@ -0,0 +1,14 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/effect_haste.tres" id="2"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_on_landed_haste"
|
||||
display_name = "On Landed Haste"
|
||||
duration_type = &"infinite"
|
||||
duration = 0.0
|
||||
max_stacks = 1
|
||||
trigger_event = &"on_landed"
|
||||
trigger_effects = Array[Resource]([ExtResource("2")])
|
||||
@@ -0,0 +1,14 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/effect_perfect_damage_buff.tres" id="2"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_on_perfect_damage_reward"
|
||||
display_name = "On Perfect Damage Reward"
|
||||
duration_type = &"infinite"
|
||||
duration = 0.0
|
||||
max_stacks = 1
|
||||
trigger_event = &"on_perfect"
|
||||
trigger_effects = Array[Resource]([ExtResource("2")])
|
||||
@@ -0,0 +1,17 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://ccy324lau1u7c"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_perfect_damage"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
value = 1.25
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_perfect_damage_buff"
|
||||
display_name = "Perfect Damage Buff"
|
||||
duration_type = &"hits"
|
||||
duration = 1.0
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_perfect_damage")])
|
||||
@@ -0,0 +1,17 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/action_rule_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_root_rule"]
|
||||
script = ExtResource("2")
|
||||
block_movement = true
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_root"
|
||||
display_name = "Root"
|
||||
duration_type = &"seconds"
|
||||
duration = 1.5
|
||||
max_stacks = 1
|
||||
action_rule_modifiers = Array[Resource]([SubResource("Resource_root_rule")])
|
||||
@@ -0,0 +1,17 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/action_rule_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_silence_rule"]
|
||||
script = ExtResource("2")
|
||||
blocked_action_tags = Array[StringName]([&"skill"])
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_silence"
|
||||
display_name = "Silence"
|
||||
duration_type = &"seconds"
|
||||
duration = 2.0
|
||||
max_stacks = 1
|
||||
action_rule_modifiers = Array[Resource]([SubResource("Resource_silence_rule")])
|
||||
@@ -0,0 +1,19 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_slow_move"]
|
||||
script = ExtResource("2")
|
||||
stat = &"move_speed"
|
||||
operation = "multiply"
|
||||
value = 0.5
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_slow"
|
||||
display_name = "Slow"
|
||||
duration_type = &"seconds"
|
||||
duration = 2.0
|
||||
max_stacks = 1
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_slow_move")])
|
||||
@@ -0,0 +1,19 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/defense_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_invincible_defense"]
|
||||
script = ExtResource("2")
|
||||
defense_state = &"Invincible"
|
||||
damage_mult = 1.0
|
||||
interrupts = false
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_temporary_invincible"
|
||||
display_name = "Temporary Invincible"
|
||||
duration_type = &"seconds"
|
||||
duration = 0.5
|
||||
max_stacks = 1
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_invincible_defense")])
|
||||
@@ -0,0 +1,19 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/defense_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_super_armor_defense"]
|
||||
script = ExtResource("2")
|
||||
defense_state = &"SuperArmor"
|
||||
damage_mult = 1.0
|
||||
interrupts = false
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_temporary_super_armor"
|
||||
display_name = "Temporary Super Armor"
|
||||
duration_type = &"seconds"
|
||||
duration = 1.0
|
||||
max_stacks = 1
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_super_armor_defense")])
|
||||
@@ -0,0 +1,6 @@
|
||||
class_name StatModifier
|
||||
extends Resource
|
||||
|
||||
@export var stat: StringName
|
||||
@export_enum("add", "multiply") var operation := "multiply"
|
||||
@export var value := 1.0
|
||||
@@ -0,0 +1 @@
|
||||
uid://brratisl42y1l
|
||||
@@ -0,0 +1,19 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" load_steps=3 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_attack_buff_damage"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
operation = "add"
|
||||
value = 0.5
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"time_anchor_attack_buff"
|
||||
display_name = "Time Anchor Attack Buff"
|
||||
duration_type = &"infinite"
|
||||
duration = 0.0
|
||||
max_stacks = 7
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_attack_buff_damage")])
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://djg52uwagbdat"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
[ext_resource type="Script" uid="uid://b10ssegsbqfn" path="res://resources/effects/defense_modifier.gd" id="3"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_taken_down"]
|
||||
script = ExtResource("3")
|
||||
damage_mult = 0.25
|
||||
|
||||
[sub_resource type="Resource" id="Resource_damage_up"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
value = 1.4
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_tp_future_enemy_strong"
|
||||
display_name = "Future Phase Strong"
|
||||
duration_type = &"infinite"
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_damage_up")])
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_taken_down")])
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://dkg4j1an7jclo"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
[ext_resource type="Script" uid="uid://b10ssegsbqfn" path="res://resources/effects/defense_modifier.gd" id="3"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_taken_up"]
|
||||
script = ExtResource("3")
|
||||
damage_mult = 2.5
|
||||
|
||||
[sub_resource type="Resource" id="Resource_damage_down"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
value = 0.7
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_tp_future_enemy_weak"
|
||||
display_name = "Future-Strong Enemy Weakened"
|
||||
duration_type = &"infinite"
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_damage_down")])
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_taken_up")])
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://e1bbntw3dfsx"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
[ext_resource type="Script" uid="uid://b10ssegsbqfn" path="res://resources/effects/defense_modifier.gd" id="3"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_taken_down"]
|
||||
script = ExtResource("3")
|
||||
damage_mult = 0.25
|
||||
|
||||
[sub_resource type="Resource" id="Resource_damage_up"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
value = 1.4
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_tp_past_enemy_strong"
|
||||
display_name = "Past Phase Strong"
|
||||
duration_type = &"infinite"
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_damage_up")])
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_taken_down")])
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="EffectDefinition" format=3 uid="uid://bougox245ioo"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvlmwyu6iqb8g" path="res://resources/effects/effect_definition.gd" id="1"]
|
||||
[ext_resource type="Script" uid="uid://brratisl42y1l" path="res://resources/effects/stat_modifier.gd" id="2"]
|
||||
[ext_resource type="Script" uid="uid://b10ssegsbqfn" path="res://resources/effects/defense_modifier.gd" id="3"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_taken_up"]
|
||||
script = ExtResource("3")
|
||||
damage_mult = 2.5
|
||||
|
||||
[sub_resource type="Resource" id="Resource_damage_down"]
|
||||
script = ExtResource("2")
|
||||
stat = &"damage_mult"
|
||||
value = 0.7
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
id = &"effect_tp_past_enemy_weak"
|
||||
display_name = "Past-Strong Enemy Weakened"
|
||||
duration_type = &"infinite"
|
||||
stat_modifiers = Array[Resource]([SubResource("Resource_damage_down")])
|
||||
defense_modifiers = Array[Resource]([SubResource("Resource_taken_up")])
|
||||
@@ -0,0 +1,24 @@
|
||||
class_name JudgementPolicy
|
||||
extends Resource
|
||||
|
||||
@export var entries: Dictionary = {}
|
||||
|
||||
|
||||
func multiplier(label: StringName, channel: StringName, fallback := 1.0) -> float:
|
||||
var entry := _entry_for(label)
|
||||
if entry.is_empty():
|
||||
return fallback
|
||||
if entry.has(str(channel)):
|
||||
return float(entry[str(channel)])
|
||||
if entry.has(channel):
|
||||
return float(entry[channel])
|
||||
return fallback
|
||||
|
||||
|
||||
func _entry_for(label: StringName) -> Dictionary:
|
||||
var key := str(label).to_lower()
|
||||
if entries.has(key) and entries[key] is Dictionary:
|
||||
return entries[key]
|
||||
if entries.has(label) and entries[label] is Dictionary:
|
||||
return entries[label]
|
||||
return {}
|
||||
@@ -0,0 +1 @@
|
||||
uid://bklc74dqht34e
|
||||
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="JudgementPolicy" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/judgement_policy.gd" id="1_policy"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_policy")
|
||||
entries = {
|
||||
"bad": {
|
||||
"cost": 1.2,
|
||||
"damage": 0.7,
|
||||
"reward": 0.6
|
||||
},
|
||||
"good": {
|
||||
"cost": 1.0,
|
||||
"damage": 0.85,
|
||||
"reward": 0.8
|
||||
},
|
||||
"perfect": {
|
||||
"cost": 0.8,
|
||||
"damage": 1.0,
|
||||
"reward": 1.0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
class_name PlayerSkillBindings
|
||||
extends Resource
|
||||
|
||||
@export var charge_entries: Array[Dictionary] = []
|
||||
@export var burst_action_id: StringName = &""
|
||||
@export var counter_action_id: StringName = &""
|
||||
@export var blade_chain_action_id: StringName = &""
|
||||
|
||||
|
||||
func charge_entry_for_symbol(symbol: StringName) -> Dictionary:
|
||||
for entry: Dictionary in charge_entries:
|
||||
if StringName(str(entry.get("symbol", &""))) == symbol:
|
||||
return entry.duplicate(true)
|
||||
return {}
|
||||
|
||||
|
||||
func cast_action_id(entry: Dictionary, level: int) -> StringName:
|
||||
var cast_ids: Dictionary = entry.get("cast_action_ids", {})
|
||||
if cast_ids.has(level):
|
||||
return StringName(str(cast_ids[level]))
|
||||
var level_key := str(level)
|
||||
if cast_ids.has(level_key):
|
||||
return StringName(str(cast_ids[level_key]))
|
||||
return &""
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://bfhpj4kxpw50e
|
||||
@@ -0,0 +1,38 @@
|
||||
[gd_resource type="Resource" script_class="PlayerSkillBindings" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/player_action_bindings.gd" id="1_xjc2f"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_xjc2f")
|
||||
charge_entries = Array[Dictionary]([{
|
||||
"symbol": &"A",
|
||||
"entry_mode": &"after_tap",
|
||||
"cast_trigger": &"on_release",
|
||||
"cast_action_ids": {
|
||||
1: &"jian_yu_left_lv1",
|
||||
2: &"jian_yu_left_lv2",
|
||||
3: &"jian_yu_left_lv3"
|
||||
}
|
||||
}, {
|
||||
"symbol": &"D",
|
||||
"entry_mode": &"after_tap",
|
||||
"cast_trigger": &"on_release",
|
||||
"cast_action_ids": {
|
||||
1: &"jian_yu_right_lv1",
|
||||
2: &"jian_yu_right_lv2",
|
||||
3: &"jian_yu_right_lv3"
|
||||
}
|
||||
}, {
|
||||
"symbol": &"S",
|
||||
"entry_mode": &"after_tap",
|
||||
"cast_trigger": &"on_secondary_key",
|
||||
"cast_key": &"SP",
|
||||
"cast_action_ids": {
|
||||
1: &"zhan_bo_lv1",
|
||||
2: &"zhan_bo_lv2",
|
||||
3: &"zhan_bo_lv3"
|
||||
}
|
||||
}])
|
||||
burst_action_id = &"burst_activate"
|
||||
counter_action_id = &"counter_projectile"
|
||||
blade_chain_action_id = &"blade_chain_projectile_2"
|
||||
@@ -0,0 +1,9 @@
|
||||
[gd_resource type="Resource" script_class="TimeAnchorFrequencyProfile" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/time_anchor_frequency_profile.gd" id="1"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
streak_thresholds = Array[int]([0, 8, 16])
|
||||
anchors_per_window = Array[int]([1, 2, 4])
|
||||
window_beats = 4
|
||||
@@ -0,0 +1,34 @@
|
||||
class_name TimeAnchorFrequencyProfile
|
||||
extends Resource
|
||||
|
||||
@export var streak_thresholds: Array[int] = [0, 8, 16]
|
||||
@export var anchors_per_window: Array[int] = [1, 2, 4]
|
||||
@export var window_beats := 4
|
||||
|
||||
|
||||
func interval_for_streak(streak: int) -> int:
|
||||
var anchors := anchors_per_window_for_streak(streak)
|
||||
return maxi(1, int(ceil(float(window_beats) / float(maxi(1, anchors)))))
|
||||
|
||||
|
||||
func anchors_per_window_for_streak(streak: int) -> int:
|
||||
var count := 1
|
||||
for index: int in range(streak_thresholds.size()):
|
||||
if index >= anchors_per_window.size():
|
||||
break
|
||||
if streak >= streak_thresholds[index]:
|
||||
count = clampi(anchors_per_window[index], 1, maxi(1, window_beats))
|
||||
return count
|
||||
|
||||
|
||||
func anchor_offsets_for_streak(streak: int) -> Array[int]:
|
||||
var safe_window := maxi(1, window_beats)
|
||||
var count := anchors_per_window_for_streak(streak)
|
||||
if count <= 1:
|
||||
return [safe_window]
|
||||
if count == 2:
|
||||
return [maxi(1, int(ceil(float(safe_window) * 0.5))), safe_window]
|
||||
var offsets: Array[int] = []
|
||||
for beat_offset: int in range(1, safe_window + 1):
|
||||
offsets.append(beat_offset)
|
||||
return offsets
|
||||
@@ -0,0 +1 @@
|
||||
uid://bvfrkrccl0pl
|
||||
@@ -0,0 +1,12 @@
|
||||
[gd_resource type="Resource" script_class="TimePhaseProfile" load_steps=4 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/time_phase_profile.gd" id="1"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/time_phase/effect_tp_future_enemy_weak.tres" id="2"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/time_phase/effect_tp_future_enemy_strong.tres" id="3"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
past_effects = Array[Resource]([ExtResource("2")])
|
||||
future_effects = Array[Resource]([ExtResource("3")])
|
||||
past_visual_key = &"past"
|
||||
future_visual_key = &"future"
|
||||
@@ -0,0 +1,12 @@
|
||||
[gd_resource type="Resource" script_class="TimePhaseProfile" load_steps=4 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://resources/time_phase_profile.gd" id="1"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/time_phase/effect_tp_past_enemy_strong.tres" id="2"]
|
||||
[ext_resource type="Resource" path="res://resources/effects/time_phase/effect_tp_past_enemy_weak.tres" id="3"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
past_effects = Array[Resource]([ExtResource("2")])
|
||||
future_effects = Array[Resource]([ExtResource("3")])
|
||||
past_visual_key = &"past"
|
||||
future_visual_key = &"future"
|
||||
@@ -0,0 +1,15 @@
|
||||
class_name TimePhaseProfile
|
||||
extends Resource
|
||||
|
||||
@export var past_effects: Array[Resource] = []
|
||||
@export var future_effects: Array[Resource] = []
|
||||
@export var past_visual_key: StringName = &"past"
|
||||
@export var future_visual_key: StringName = &"future"
|
||||
|
||||
|
||||
func effects_for_time_phase(time_phase: StringName) -> Array[Resource]:
|
||||
return future_effects if time_phase == &"future" else past_effects
|
||||
|
||||
|
||||
func visual_key_for_time_phase(time_phase: StringName) -> StringName:
|
||||
return future_visual_key if time_phase == &"future" else past_visual_key
|
||||
@@ -0,0 +1 @@
|
||||
uid://cp1s5pnihfd0
|
||||
Reference in New Issue
Block a user