命中停止技能位移标记

master
chendian 1 year ago
parent 7412ed2b9f
commit 57185025c4

@ -27,7 +27,7 @@ config/icon="res://icon.svg"
[aseprite_importers]
aseprite_executable_path="D:/Steam/steamapps/common/Aseprite/Aseprite.exe"
aseprite_executable_path="G:/Steam/steamapps/common/Aseprite/Aseprite.exe"
[autoload]
@ -55,7 +55,7 @@ import/use_multiple_threads=false
[editor_plugins]
enabled=PackedStringArray("res://addons/MagicaVoxel_Importer_with_Extensions/plugin.cfg", "res://addons/MetroidvaniaSystem/plugin.cfg", "res://addons/beehave/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg")
enabled=PackedStringArray("res://addons/MagicaVoxel_Importer_with_Extensions/plugin.cfg", "res://addons/MetroidvaniaSystem/plugin.cfg", "res://addons/beehave/plugin.cfg", "res://addons/nklbdev.aseprite_importers/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg")
[file_customization]

@ -0,0 +1,25 @@
[remap]
importer="Aseprite SpriteFrames Import"
type="SpriteFrames"
uid="uid://dhosak07ijfqx"
path="res://.godot/imported/_design_hero02.aseprite-79c77f72114ef9b21fb336c23a90a31d.res"
[deps]
source_file="res://resource/animation/character/_design_hero02.aseprite"
dest_files=["res://.godot/imported/_design_hero02.aseprite-79c77f72114ef9b21fb336c23a90a31d.res"]
[params]
spritesheet/layout=0
spritesheet/fixed_rows_count=1
spritesheet/fixed_columns_count=1
spritesheet/border_type=0
spritesheet/trim=false
spritesheet/ignore_empty=false
spritesheet/merge_duplicates=false
animation/default/name="default"
animation/default/direction=0
animation/default/repeat_count=0
animation/autoplay=""

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://btskck75as5kx"
path="res://.godot/imported/_design_hero02.png-5c1f69d72d2e179329e70b90a8c21702.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://resource/animation/character/_design_hero02.png"
dest_files=["res://.godot/imported/_design_hero02.png-5c1f69d72d2e179329e70b90a8c21702.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

@ -32,88 +32,88 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7]
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0.2, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Status:skill_move_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.2, 0.3),
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"values": [1.0, 0.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Status:skill_move_speed")
tracks/5/path = NodePath("Status:skill_float_speed")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [1.0, 0.0]
"values": [0.1, 1.0, 0.0]
}
tracks/6/type = "value"
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Status:skill_float_speed")
tracks/6/path = NodePath("Battle")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0.1, 1.0, 0.0]
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
}]
}
tracks/7/type = "method"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Battle")
tracks/7/path = NodePath("Effect")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0.2),
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
"method": &"cast_attack_particle1"
}]
}
tracks/8/type = "method"
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Effect")
tracks/8/path = NodePath("View:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle1"
}]
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7]
}

@ -32,88 +32,88 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0.2, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Status:skill_move_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.2, 0.3),
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"values": [1.0, 0.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Status:skill_move_speed")
tracks/5/path = NodePath("Status:skill_float_speed")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [1.0, 0.0]
"values": [0.1, 2.0, 0.0]
}
tracks/6/type = "value"
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Status:skill_float_speed")
tracks/6/path = NodePath("Battle")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0.1, 2.0, 0.0]
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
}]
}
tracks/7/type = "method"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Battle")
tracks/7/path = NodePath("Effect")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0.2),
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
"method": &"cast_attack_particle1"
}]
}
tracks/8/type = "method"
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Effect")
tracks/8/path = NodePath("View:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle1"
}]
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
}

@ -32,88 +32,88 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0.2, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Status:skill_move_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.2, 0.3),
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"values": [1.0, 0.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Status:skill_move_speed")
tracks/5/path = NodePath("Status:skill_float_speed")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [1.0, 0.0]
"values": [0.1, 1.0, 0.0]
}
tracks/6/type = "value"
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Status:skill_float_speed")
tracks/6/path = NodePath("Battle")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0.1, 1.0, 0.0]
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
}]
}
tracks/7/type = "method"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Battle")
tracks/7/path = NodePath("Effect")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0.2),
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack1"
"method": &"cast_attack_particle1"
}]
}
tracks/8/type = "method"
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Effect")
tracks/8/path = NodePath("View:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle1"
}]
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
}

@ -89,25 +89,13 @@ tracks/5/keys = {
"method": &"cast_after_image"
}]
}
tracks/6/type = "value"
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("View:frame")
tracks/6/path = NodePath("Effect")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4]
}
tracks/7/type = "method"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Effect")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
@ -115,3 +103,15 @@ tracks/7/keys = {
"method": &"cast_attack_particle1"
}]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("View:frame")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4]
}

@ -18,19 +18,20 @@ shadow_opacity = 0.5
shadow_blur = 0.0
[node name="OmniLight3D" type="OmniLight3D" parent="Light"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.65528, 1.65104, 2.25257)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.65528, 2.46471, 3.87274)
visible = false
omni_range = 12.6107
omni_range = 2.662
[node name="Ground" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.4, -1, 3.52)
use_collision = true
size = Vector3(12.8, 2, 7.04)
[node name="OmniLight3D2" type="OmniLight3D" parent="Light"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.4166, 0.721602, 2.99427)
light_color = Color(1, 0.109804, 0, 1)
light_energy = 1.001
omni_range = 3.333
[node name="GridMap" type="GridMap" parent="."]
mesh_library = ExtResource("2_d5afl")
cell_size = Vector3(0.64, 0.64, 0.64)
data = {
"cells": PackedInt32Array(0, 1, 65552, 19, 1, 65552, 19, 0, 65552, 19, 2, 65552, 19, 3, 65552, 19, 7, 65552, 19, 8, 65552, 19, 9, 65552, 19, 10, 65552, 18, 10, 65552, 17, 10, 65552, 16, 10, 65552, 0, 2, 65552, 0, 3, 65552, 0, 9, 65552, 15, 10, 65552, 14, 10, 65552, 13, 10, 65552, 12, 10, 65552, 11, 10, 65552, 8, 10, 65552, 7, 10, 65552, 6, 10, 65552, 5, 10, 65552, 4, 10, 65552, 3, 10, 65552, 2, 10, 65552, 1, 10, 65552, 0, 10, 65552, 0, 65535, 65552, 6, 65535, 65552, 7, 65535, 65552, 8, 65535, 65552, 9, 65535, 65552, 13, 65535, 65552, 14, 65535, 65552, 15, 65535, 65552, 16, 65535, 65552, 65549, 65535, 65552, 65550, 65535, 65552, 65551, 65535, 65552, 65552, 65535, 65552, 65553, 65535, 65552, 65554, 65535, 65552, 9, 10, 65552, 10, 10, 65552, 19, 6, 65552, 19, 5, 65552, 19, 4, 65552, 19, 65535, 65552, 18, 65535, 65552, 17, 65535, 65552, 10, 65535, 65552, 0, 6, 65552, 0, 7, 65552, 0, 8, 65552, 65545, 65535, 65552, 65544, 65535, 65552, 65543, 65535, 65552, 65634, 7, 917504, 65542, 65535, 65552, 65541, 65535, 65552, 65540, 65535, 65552, 65538, 65535, 65552, 65537, 65535, 65552, 65536, 65535, 65552, 65539, 65535, 65552, 65547, 65535, 65552, 65546, 65535, 65552, 65548, 65535, 65552, 65555, 65535, 65552, 1, 65535, 65552, 2, 65535, 65552, 3, 65535, 65552, 4, 65535, 65552, 5, 65535, 65552, 0, 0, 65552, 12, 65535, 65552, 11, 65535, 65552)
"cells": PackedInt32Array(0, 1, 1179652, 19, 1, 65567, 19, 0, 65567, 19, 2, 65567, 19, 3, 65567, 19, 7, 65567, 19, 8, 65567, 19, 9, 65567, 19, 10, 65567, 0, 2, 1179652, 0, 3, 1179652, 0, 9, 1179652, 0, 65535, 1179652, 6, 65535, 65567, 7, 65535, 65567, 8, 65535, 65567, 9, 65535, 65567, 13, 65535, 65567, 14, 65535, 65567, 15, 65535, 65567, 16, 65535, 65567, 19, 6, 65567, 19, 65535, 65567, 18, 65535, 65567, 17, 65535, 65567, 10, 65535, 65567, 0, 6, 1179652, 0, 7, 1179652, 0, 8, 1179652, 65634, 7, 917504, 1, 65535, 65567, 2, 65535, 65567, 3, 65535, 65567, 4, 65535, 65567, 5, 65535, 65567, 0, 0, 1179652, 12, 65535, 65567, 11, 65535, 65567, -65535, 0, 30, -65535, 65535, 30, -65534, 65535, 30, -65533, 65535, 30, -65533, 0, 30, -65534, 0, 30, -65532, 0, 30, -65531, 0, 30, -65530, 0, 30, -65529, 0, 30, -65528, 0, 30, -65527, 0, 30, -65526, 0, 30, -65525, 0, 30, -65524, 0, 30, -65523, 0, 30, -65522, 0, 30, -65521, 0, 30, -65520, 0, 30, -65519, 0, 30, -65518, 0, 30, -65517, 0, 30, -65517, 1, 30, -65517, 2, 30, -65517, 3, 30, -65518, 4, 30, -65518, 5, 30, -65517, 4, 30, -65518, 2, 30, -65518, 3, 30, -65518, 1, 30, -65519, 1, 30, -65520, 1, 30, -65521, 1, 30, -65522, 1, 30, -65523, 1, 30, -65524, 1, 30, -65525, 1, 30, -65528, 1, 30, -65530, 1, 30, -65531, 1, 30, -65519, 2, 30, -65517, 5, 30, -65517, 6, 30, -65517, 7, 30, -65517, 8, 30, -65517, 9, 30, -65517, 10, 30, -65518, 10, 30, -65519, 10, 30, -65520, 10, 30, -65520, 9, 30, -65521, 9, 30, -65522, 9, 30, -65523, 9, 30, -65524, 9, 30, -65525, 9, 30, -65526, 9, 30, -65525, 8, 30, -65524, 8, 30, -65523, 8, 30, -65522, 7, 30, -65521, 6, 30, -65520, 6, 30, -65520, 5, 30, -65519, 6, 30, -65519, 7, 30, -65518, 7, 30, -65518, 8, 30, -65519, 8, 30, -65519, 9, 30, -65518, 9, 30, -65521, 8, 30, -65520, 8, 30, -65518, 6, 30, -65520, 7, 30, -65522, 8, 30, -65521, 7, 30, -65519, 5, 30, -65519, 4, 30, -65520, 4, 30, -65521, 5, 30, -65522, 6, 30, -65521, 4, 30, -65519, 3, 30, -65520, 3, 30, -65522, 5, 30, -65521, 3, 30, -65523, 4, 30, -65524, 4, 30, -65523, 3, 30, -65522, 3, 30, -65520, 2, 30, -65523, 5, 30, -65522, 4, 30, -65524, 3, 30, -65525, 4, 30, -65525, 3, 30, -65526, 2, 30, -65527, 3, 30, -65528, 3, 30, -65529, 3, 30, -65530, 3, 30, -65531, 4, 30, -65532, 4, 30, -65532, 3, 30, -65533, 3, 30, -65534, 3, 30, -65534, 2, 30, -65535, 2, 30, -65535, 3, 30, -65535, 4, 30, -65535, 5, 30, -65535, 6, 30, -65535, 7, 30, -65535, 8, 30, -65535, 9, 30, -65535, 10, 30, -65534, 8, 30, -65534, 9, 30, -65533, 9, 30, -65531, 9, 30, -65530, 8, 30, -65529, 8, 30, -65528, 8, 30, -65526, 8, 30, -65527, 9, 30, -65529, 9, 30, -65530, 9, 30, -65527, 8, 30, -65528, 9, 30, -65532, 10, 30, -65533, 10, 30, -65532, 9, 30, -65534, 10, 30, -65531, 8, 30, -65529, 7, 30, -65527, 6, 30, -65526, 6, 30, -65525, 5, 30, -65526, 5, 30, -65528, 5, 30, -65530, 5, 30, -65531, 6, 30, -65532, 6, 30, -65533, 7, 30, -65532, 7, 30, -65531, 7, 30, -65533, 8, 30, -65530, 7, 30, -65529, 6, 30, -65530, 6, 30, -65532, 8, 30, -65531, 5, 30, -65532, 5, 30, -65533, 5, 30, -65533, 4, 30, -65534, 5, 30, -65534, 6, 30, -65534, 7, 30, -65533, 6, 30, -65533, 2, 30, -65534, 4, 30, -65531, 3, 30, -65526, 3, 30, -65529, 2, 30, -65527, 2, 30, -65528, 2, 30, -65531, 2, 30, -65530, 2, 30, -65532, 2, 30, -65529, 4, 30, -65530, 4, 30, -65529, 5, 30, -65524, 7, 30, -65523, 7, 30, -65526, 4, 30, -65528, 4, 30, -65527, 4, 30, -65528, 7, 30, -65528, 6, 30, -65525, 6, 30, -65523, 6, 30, -65526, 7, 30, -65527, 7, 30, -65524, 6, 30, -65525, 7, 30, -65527, 5, 30, -65521, 10, 30, -65522, 10, 30, -65523, 10, 30, -65525, 10, 30, -65526, 10, 30, -65527, 10, 30, -65528, 10, 30, -65529, 10, 30, -65530, 10, 30, -65531, 10, 30, -65524, 10, 30, -65531, 65535, 30, -65530, 65535, 30, -65532, 65535, 30, -65529, 65535, 30, -65528, 65535, 30, -65527, 65535, 30, -65519, 65535, 30, -65517, 65535, 30, -65518, 65535, 30, -65520, 65535, 30, -65521, 65535, 30, -65522, 65535, 30, -65523, 65535, 30, -65524, 65535, 30, -65525, 65535, 30, -65526, 65535, 30, -65524, 5, 30, -65521, 2, 30, -65522, 2, 30, -65523, 2, 30, -65524, 2, 30, -65525, 2, 30, -65526, 1, 30, -65527, 1, 30, -65529, 1, 30, -65532, 1, 30, -65533, 1, 30, -65534, 1, 30, -65535, 1, 30, -65536, 4, 30, -65536, 5, 30, 0, 10, 1179652, 10, 6, 524319, 9, 6, 720927, 8, 6, 655391, 9, 5, 196639, 8, 5, 131103, 10, 5, 1179679, 1, 10, 589855, 2, 10, 589855, 3, 10, 589855, 4, 10, 589855, 5, 10, 589855, 6, 10, 589855, 7, 10, 589855, 8, 10, 589855, 9, 10, 589855, 10, 10, 589855, 11, 10, 589855, 12, 10, 589855, 13, 10, 589855, 14, 10, 589855, 15, 10, 589855, 16, 10, 589855, 17, 10, 589855, 18, 10, 589855, 65536, 3, 524292, 65536, 2, 524292, 65536, 1, 524292, 65536, 0, 524292, 65536, 65535, 524292, 65536, 6, 524292, 65536, 7, 524292, 65536, 8, 524292, 65536, 10, 524292, 65536, 9, 524292, 1, 3, 25, 2, 3, 25, 1, 6, 25, 2, 6, 25)
}
metadata/_editor_floor_ = Vector3(0, 0, 0)

@ -308,7 +308,6 @@ offset_bottom = 40.0
script = ExtResource("3_6chl0")
[node name="LoadingPage" type="Control" parent="."]
visible = false
layout_mode = 3
anchors_preset = 0
offset_right = 40.0

@ -11,8 +11,8 @@ const input_alive_time: float = 0.5
const drag_ground: float = 20
const drag_air: float = 5
#地图
#const starting_level : String = "level01_forecourt.tscn"
const starting_level: String = "level00_test1.tscn"
const starting_level : String = "level02_01.tscn"
#const starting_level: String = "level00_test1.tscn"
const level_loading_min_time: float = 0.5
const level_loading_control_time: float = 0.2
#ui

@ -9,213 +9,218 @@ class_name Battle
class HitInfo:
var from: int
var to: int
var dir: Vector2
var attack: AttackCfg
var from: int
var to: int
var dir: Vector2
var attack: AttackCfg
func attack1():
var attack: AttackCfg = status.skill_cfg.get_attack1()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack1_box()
call_deferred("_attack", attack, attack_box)
var attack: AttackCfg = status.skill_cfg.get_attack1()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack1_box()
call_deferred("_attack", attack, attack_box)
func attack2():
var attack: AttackCfg = status.skill_cfg.get_attack2()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack2_box()
call_deferred("_attack", attack, attack_box)
var attack: AttackCfg = status.skill_cfg.get_attack2()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack2_box()
call_deferred("_attack", attack, attack_box)
func _attack(attack: AttackCfg, attack_box: AttackBoxCfg):
var pos: Vector3 = character.pos()
var attack_dir: Vector2 = status.skill_dir.normalized()
var offset_xz: Vector2 = attack_dir * attack_box.offset.x
var offset_y: float = attack_box.offset.y
pos += Vector3(offset_xz.x, offset_y, offset_xz.y)
var result: Array[Character] = Util.raycast_character(attack_box.shape, pos, attack_dir)
var is_stuck: bool = false
for target: Character in result:
if target.team() == character.team():
continue
target.add_attack(character.id(), attack_dir, attack)
is_stuck = true
if !is_stuck and !attack.is_force_pause:
skill.on_attack_miss()
var pos: Vector3 = character.pos()
var attack_dir: Vector2 = status.skill_dir.normalized()
var offset_xz: Vector2 = attack_dir * attack_box.offset.x
var offset_y: float = attack_box.offset.y
pos += Vector3(offset_xz.x, offset_y, offset_xz.y)
var result: Array[Character] = Util.raycast_character(attack_box.shape, pos, attack_dir)
var is_stuck: bool = false
for target: Character in result:
if target.team() == character.team():
continue
target.add_attack(character.id(), attack_dir, attack)
is_stuck = true
if !is_stuck and !attack.is_force_pause:
skill.on_attack_miss()
func add_attack(from: int, dir: Vector2, attack: AttackCfg):
var hit_info = HitInfo.new()
hit_info.from = from
hit_info.to = character.id()
hit_info.dir = dir
hit_info.attack = attack
settle(hit_info)
var hit_info = HitInfo.new()
hit_info.from = from
hit_info.to = character.id()
hit_info.dir = dir
hit_info.attack = attack
settle(hit_info)
func settle(hit_info: HitInfo) -> bool:
var character_from: Character = Global.character_mgr.get_character(hit_info.from) as Character
var character_to: Character = Global.character_mgr.get_character(hit_info.to) as Character
if !character_from or !character_to:
return false
var cfg_from: CharacterCfg = character_from.cfg()
var cfg_to: CharacterCfg = character_to.cfg()
var is_stun = character_to.get_status("is_stun")
var hp = character_to.get_status("hp")
var shield = character_to.get_status("shield")
var has_shield = shield > 0
var attack: AttackCfg = hit_info.attack
var is_floating: bool = attack.is_floating or not character_to.get_status("is_on_floor")
var is_hit_down: bool = attack.is_hit_down
var is_rebound: bool = attack.is_rebound
var is_break_shield: bool = false
var is_break_stun: bool = false
var is_block: bool = false
var is_kill: bool = false
var is_break_skill: bool = false
var pause_time: float = attack.pause_time
#造成伤害
var damage: float = attack.damage_rate * cfg_from.attack
if has_shield:
damage = min(shield, damage)
character_to.set_status("shield", shield-damage)
is_break_shield = damage == shield
if is_break_shield:
character_to.remove_buff("shield_recover_cd")
character_to.remove_buff("shield_recover")
has_shield = false
else:
character_to.remove_buff("shield_recover")
character_to.add_buff("shield_recover_cd", cfg_to.shield.recover_cd)
else:
damage = min(hp, damage)
character_to.set_status("hp", hp-damage)
is_kill = damage == hp
if is_kill:
character_to.add_buff("die", 1)
#眩晕值累加
if not is_stun:
var stun_damage: float = attack.stun_attack
var stun = character_to.get_status("stun")
var stun_max = character_to.get_status("stun_max")
stun_damage = min(stun_max-stun, stun_damage)
character_to.set_status("stun", stun+stun_damage)
is_break_stun = stun_damage == stun_max-stun
if is_break_stun:
is_stun = true
character_to.set_status("is_stun", true)
character_to.remove_buff("stun_recover_cd")
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_break_cd", cfg_to.stun.recover_break_cd)
else:
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_cd", cfg_to.stun.recover_cd)
#mp累加
character_from.add_mp(damage * cfg_from.mp.add_rate_attack)
character_from.remove_buff("mp_recover")
character_from.add_buff("mp_recover_cd", status.cfg.mp.recover_cd)
character_to.add_mp(damage * cfg_to.mp.add_rate_hit)
character_to.remove_buff("mp_recover")
character_to.add_buff("mp_recover_cd", status.cfg.mp.recover_cd)
#硬直等级
var break_level_def: int = cfg_to.shield.break_level_on if has_shield else cfg_to.shield.break_level_off
var break_level_sub: int = clampi(attack.break_level - break_level_def, 0, 3)
is_break_skill = break_level_sub > 0
if is_break_skill:
#取消技能
if character_to.get_status("is_skill_running"):
character_to.cancel_skill()
#停止移动
character_to.move_stop()
#受击动画
var trigger_hit: String = ""
if is_rebound: trigger_hit="rebound"
elif is_floating: trigger_hit = "air_hit_down" if is_hit_down else "air_hit_up"
elif is_stun: trigger_hit="stun_hit"
elif break_level_sub == 3: trigger_hit="lhit"
elif break_level_sub == 2: trigger_hit="mhit"
elif break_level_sub == 1: trigger_hit="hit"
character_to.set_view_trigger(trigger_hit)
#浮空 击落 强制位移
var hit_up_speed: float = attack.hit_up_speed
var hit_back_speed: float = attack.hit_back_speed
if is_floating:
character_to.add_buff("stagger", -1)
character_to.add_buff("floating", -1)
if hit_info.dir.x!=0:
character_to.set_status("is_right", hit_info.dir.x<0)
else:
character_to.add_buff("stagger", 1)
hit_up_speed = 0
if is_hit_down:
character_to.add_buff("hit_down", -1)
if hit_back_limit_curve:
var dir: Vector2 = character_from.pos2D() - character_to.pos2D()
var dist = clamp(dir.length(), 0, 1)
hit_back_speed = max(hit_back_limit_curve.sample(dist), hit_back_speed)
character_to.set_hit_move(hit_info.dir, hit_back_speed, hit_up_speed)
character_to.add_buff("hit_back", attack.hit_back_duration)
character_to.add_buff("hit_up", attack.hit_up_duration)
#受击特效
match attack.damage_type:
Enum.EDamageType.Sharp: character_to.cast_particle(ResourceManager.particle_hit_sharp, false)
Enum.EDamageType.Blunt: character_to.cast_particle(ResourceManager.particle_hit_blunt, false)
Enum.EDamageType.Ground: character_to.cast_particle(ResourceManager.particle_hit_ground, false)
#抖动
character_to.add_buff("shake_x", 0.2, true)
#闪白
character_to.add_buff("flash_white", 0.1)
#卡帧
character_from.set_pause_time(pause_time)
character_to.set_pause_time(pause_time)
#全局特效
Global.camera_mgr.effect(pause_time)
#伤害跳字
character_to.show_hit_damage(damage)
#状态跳字
if is_break_shield: character_to.show_hit_text("Break")
elif is_break_stun: character_to.show_hit_text("Stun")
elif not is_break_skill: character_to.show_hit_text("Block")
return true
var character_from: Character = Global.character_mgr.get_character(hit_info.from) as Character
var character_to: Character = Global.character_mgr.get_character(hit_info.to) as Character
if !character_from or !character_to:
return false
var cfg_from: CharacterCfg = character_from.cfg()
var cfg_to: CharacterCfg = character_to.cfg()
var is_stun = character_to.get_status("is_stun")
var hp = character_to.get_status("hp")
var shield = character_to.get_status("shield")
var has_shield = shield > 0
var attack: AttackCfg = hit_info.attack
var is_floating: bool = attack.is_floating or not character_to.get_status("is_on_floor")
var is_hit_down: bool = attack.is_hit_down
var is_rebound: bool = attack.is_rebound
var is_break_shield: bool = false
var is_break_stun: bool = false
var is_block: bool = false
var is_kill: bool = false
var is_break_skill: bool = false
var pause_time: float = attack.pause_time
#造成伤害
var damage: float = attack.damage_rate * cfg_from.attack
if has_shield:
damage = min(shield, damage)
character_to.set_status("shield", shield-damage)
is_break_shield = damage == shield
if is_break_shield:
character_to.remove_buff("shield_recover_cd")
character_to.remove_buff("shield_recover")
has_shield = false
else:
character_to.remove_buff("shield_recover")
character_to.add_buff("shield_recover_cd", cfg_to.shield.recover_cd)
else:
damage = min(hp, damage)
character_to.set_status("hp", hp-damage)
is_kill = damage == hp
if is_kill:
character_to.add_buff("die", 1)
#眩晕值累加
if not is_stun:
var stun_damage: float = attack.stun_attack
var stun = character_to.get_status("stun")
var stun_max = character_to.get_status("stun_max")
stun_damage = min(stun_max-stun, stun_damage)
character_to.set_status("stun", stun+stun_damage)
is_break_stun = stun_damage == stun_max-stun
if is_break_stun:
is_stun = true
character_to.set_status("is_stun", true)
character_to.remove_buff("stun_recover_cd")
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_break_cd", cfg_to.stun.recover_break_cd)
else:
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_cd", cfg_to.stun.recover_cd)
#mp累加
character_from.add_mp(damage * cfg_from.mp.add_rate_attack)
character_from.remove_buff("mp_recover")
character_from.add_buff("mp_recover_cd", status.cfg.mp.recover_cd)
character_to.add_mp(damage * cfg_to.mp.add_rate_hit)
character_to.remove_buff("mp_recover")
character_to.add_buff("mp_recover_cd", status.cfg.mp.recover_cd)
#硬直等级
var break_level_def: int = cfg_to.shield.break_level_on if has_shield else cfg_to.shield.break_level_off
var break_level_sub: int = clampi(attack.break_level - break_level_def, 0, 3)
is_break_skill = break_level_sub > 0
if is_break_skill:
#取消技能
if character_to.get_status("is_skill_running"):
character_to.cancel_skill()
#停止移动
character_to.move_stop()
#受击动画
var trigger_hit: String = ""
if is_rebound: trigger_hit="rebound"
elif is_floating: trigger_hit = "air_hit_down" if is_hit_down else "air_hit_up"
elif is_stun: trigger_hit="stun_hit"
elif break_level_sub == 3: trigger_hit="lhit"
elif break_level_sub == 2: trigger_hit="mhit"
elif break_level_sub == 1: trigger_hit="hit"
character_to.set_view_trigger(trigger_hit)
#浮空 击落 强制位移
var hit_up_speed: float = attack.hit_up_speed
var hit_back_speed: float = attack.hit_back_speed
if is_floating:
character_to.add_buff("stagger", -1)
character_to.add_buff("floating", -1)
if hit_info.dir.x!=0:
character_to.set_status("is_right", hit_info.dir.x<0)
else:
character_to.add_buff("stagger", 1)
hit_up_speed = 0
if is_hit_down:
character_to.add_buff("hit_down", -1)
if hit_back_limit_curve:
var dir: Vector2 = character_from.pos2D() - character_to.pos2D()
var dist = clamp(dir.length(), 0, 1)
hit_back_speed = max(hit_back_limit_curve.sample(dist), hit_back_speed)
character_to.set_hit_move(hit_info.dir, hit_back_speed, hit_up_speed)
character_to.add_buff("hit_back", attack.hit_back_duration)
character_to.add_buff("hit_up", attack.hit_up_duration)
#停止自身位移
if attack.is_stop_self:
character_from.move_stop()
character_from.set_status("skill_move_stop", true)
#受击特效
match attack.damage_type:
Enum.EDamageType.Sharp: character_to.cast_particle(ResourceManager.particle_hit_sharp, false)
Enum.EDamageType.Blunt: character_to.cast_particle(ResourceManager.particle_hit_blunt, false)
Enum.EDamageType.Ground: character_to.cast_particle(ResourceManager.particle_hit_ground, false)
#抖动
character_to.add_buff("shake_x", 0.2, true)
#闪白
character_to.add_buff("flash_white", 0.1)
#卡帧
character_from.set_pause_time(pause_time)
character_to.set_pause_time(pause_time)
#全局特效
Global.camera_mgr.effect(pause_time)
#伤害跳字
character_to.show_hit_damage(damage)
#状态跳字
if is_break_shield: character_to.show_hit_text("Break")
elif is_break_stun: character_to.show_hit_text("Stun")
elif not is_break_skill: character_to.show_hit_text("Block")
return true
func add_mp(value: float):
var mp = character.get_status("mp")
var mp_max = character.get_status("mp_max")
var mp_sub = character.get_status("mp_sub")
var mp_sub_max = character.get_status("mp_sub_max")
value = min(mp_sub_max-mp_sub, value)
if value == mp_sub_max-mp_sub:
var mp_add = min(mp_max-mp, 1)
if mp_add > 0:
character.set_status("mp", mp+mp_add)
character.set_status("mp_sub", 0)
else:
character.set_status("mp_sub", mp_sub_max)
character.remove_buff("mp_recover_cd")
character.remove_buff("mp_recover")
else:
character.set_status("mp_sub", mp_sub+value)
var mp = character.get_status("mp")
var mp_max = character.get_status("mp_max")
var mp_sub = character.get_status("mp_sub")
var mp_sub_max = character.get_status("mp_sub_max")
value = min(mp_sub_max-mp_sub, value)
if value == mp_sub_max-mp_sub:
var mp_add = min(mp_max-mp, 1)
if mp_add > 0:
character.set_status("mp", mp+mp_add)
character.set_status("mp_sub", 0)
else:
character.set_status("mp_sub", mp_sub_max)
character.remove_buff("mp_recover_cd")
character.remove_buff("mp_recover")
else:
character.set_status("mp_sub", mp_sub+value)
func check_ground():
skill.on_check_ground()
skill.on_check_ground()

@ -7,64 +7,64 @@ class_name Buff
class BuffInfo:
var name: String
var duration_max: float
var duration: float
var ignore_pause: bool
var name: String
var duration_max: float
var duration: float
var ignore_pause: bool
var buff_map: Dictionary = {} #命中信息
var buff_map: Dictionary = {} #buff信息
func _process(delta):
for buff_name in buff_map:
var buff_info = buff_map[buff_name]
if has_buff("pause") and buff_name!="pause" and !buff_info.ignore_pause:
continue
if buff_info.duration_max == -1:
trigger_buff_effect(buff_info, "update")
else:
if buff_info.duration == 0:
trigger_buff_effect(buff_info, "second")
buff_info.duration += delta
if buff_info.duration >= buff_info.duration_max:
buff_info.duration = buff_info.duration_max
trigger_buff_effect(buff_info, "update")
remove_buff(buff_name)
else:
trigger_buff_effect(buff_info, "update")
for buff_name in buff_map:
var buff_info = buff_map[buff_name]
if has_buff("pause") and buff_name!="pause" and !buff_info.ignore_pause:
continue
if buff_info.duration_max == -1:
trigger_buff_effect(buff_info, "update")
else:
if buff_info.duration == 0:
trigger_buff_effect(buff_info, "second")
buff_info.duration += delta
if buff_info.duration >= buff_info.duration_max:
buff_info.duration = buff_info.duration_max
trigger_buff_effect(buff_info, "update")
remove_buff(buff_name)
else:
trigger_buff_effect(buff_info, "update")
func trigger_buff_effect(buff: BuffInfo, trigger_name: String):
var buff_name: String = buff.name
var function_name: String = "on_%s_%s" % [trigger_name, buff_name]
if has_method(function_name):
var rate: float = buff.duration/buff.duration_max
call(function_name, rate)
var buff_name: String = buff.name
var function_name: String = "on_%s_%s" % [trigger_name, buff_name]
if has_method(function_name):
var rate: float = buff.duration/buff.duration_max
call(function_name, rate)
func has_buff(buff_name: String) -> bool:
return buff_name in buff_map
return buff_name in buff_map
func add_buff(buff_name: String, duration: float, ignore_pause: bool = false):
var buff: BuffInfo
if buff_name in buff_map:
buff = buff_map[buff_name]
else:
buff = BuffInfo.new()
buff.name = buff_name
buff_map[buff_name] = buff
buff.duration_max = duration
buff.duration = 0
buff.ignore_pause = ignore_pause
trigger_buff_effect(buff, "start")
var buff: BuffInfo
if buff_name in buff_map:
buff = buff_map[buff_name]
else:
buff = BuffInfo.new()
buff.name = buff_name
buff_map[buff_name] = buff
buff.duration_max = duration
buff.duration = 0
buff.ignore_pause = ignore_pause
trigger_buff_effect(buff, "start")
func remove_buff(buff_name: String):
if buff_name in buff_map:
var buff = buff_map[buff_name]
trigger_buff_effect(buff, "end")
buff_map.erase(buff_name)
if buff_name in buff_map:
var buff = buff_map[buff_name]
trigger_buff_effect(buff, "end")
buff_map.erase(buff_name)
#==具体实现==
@ -88,20 +88,20 @@ func on_end_rising(rate)->void: status.is_rising = false
func on_start_floating(rate)->void:
status.is_floating = true
add_buff("rising", 0.1)
status.is_floating = true
add_buff("rising", 0.1)
func on_update_floating(rate) -> void:
if not status.is_on_floor or status.is_rising:
return
if has_buff("hit_down"):
character.add_attack(character.id(), status.move_dir, ResourceManager.cfg_attack_rebound)
remove_buff("hit_down")
else:
remove_buff("floating")
add_buff("stagger", 3)
return
if not status.is_on_floor or status.is_rising:
return
if has_buff("hit_down"):
character.add_attack(character.id(), status.move_dir, ResourceManager.cfg_attack_rebound)
remove_buff("hit_down")
else:
remove_buff("floating")
add_buff("stagger", 3)
return
func on_end_floating(rate)->void: status.is_floating = false
@ -109,8 +109,8 @@ func on_end_floating(rate)->void: status.is_floating = false
#战斗状态
func on_start_die(rate)->void:
status.is_dead = true
SignalManager.character_die.emit(status.id)
status.is_dead = true
SignalManager.character_die.emit(status.id)
func on_end_die(rate)->void: add_buff("die2", -1)
@ -120,8 +120,8 @@ func on_update_die2(rate)->void: if status.is_on_floor: remove_buff("die2")
func on_end_die2(rate)->void:
effect.cast_corpse()
Global.character_mgr.destroy_character(status.id)
effect.cast_corpse()
Global.character_mgr.destroy_character(status.id)
func on_start_stagger(rate)->void: status.is_stagger = true
@ -134,62 +134,62 @@ func on_end_shield_recover_cd(rate)->void: add_buff("shield_recover", -1)
func on_update_shield_recover(rate)->void:
var shield_add: float = get_process_delta_time() * status.cfg.shield.recover_speed
shield_add = min(status.shield_max - status.shield, shield_add)
if shield_add == status.shield_max - status.shield:
remove_buff("shield_recover")
character.set_status("shield", status.shield+shield_add)
var shield_add: float = get_process_delta_time() * status.cfg.shield.recover_speed
shield_add = min(status.shield_max - status.shield, shield_add)
if shield_add == status.shield_max - status.shield:
remove_buff("shield_recover")
character.set_status("shield", status.shield+shield_add)
func on_end_mp_recover_cd(rate)->void: add_buff("mp_recover", -1)
func on_update_mp_recover(rate)->void:
var mp_add: float = get_process_delta_time() * status.cfg.mp.recover_speed
if mp_add == 0:
remove_buff("mp_recover")
elif mp_add > 0:
mp_add = min(status.mp_sub_max - status.mp_sub, mp_add)
character.add_mp(mp_add)
elif mp_add < 0:
mp_add = max(-status.mp_sub, mp_add)
if mp_add == 0:
remove_buff("mp_recoveres://config/attack/rebound.tres")
character.set_status("mp_sub", status.mp_sub+mp_add)
var mp_add: float = get_process_delta_time() * status.cfg.mp.recover_speed
if mp_add == 0:
remove_buff("mp_recover")
elif mp_add > 0:
mp_add = min(status.mp_sub_max - status.mp_sub, mp_add)
character.add_mp(mp_add)
elif mp_add < 0:
mp_add = max(-status.mp_sub, mp_add)
if mp_add == 0:
remove_buff("mp_recoveres://config/attack/rebound.tres")
character.set_status("mp_sub", status.mp_sub+mp_add)
func on_end_stun_recover_break_cd(rate)->void: add_buff("stun_recover_break", -1)
func on_update_stun_recover_break(rate)->void:
var stun_sub: float = get_process_delta_time() * status.cfg.stun.recover_break_speed
stun_sub = min(status.stun, stun_sub)
character.set_status("stun", status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover_break")
character.set_status("is_stun", false)
var stun_sub: float = get_process_delta_time() * status.cfg.stun.recover_break_speed
stun_sub = min(status.stun, stun_sub)
character.set_status("stun", status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover_break")
character.set_status("is_stun", false)
func on_end_stun_recover_cd(rate)->void: add_buff("stun_recover", -1)
func on_update_stun_recover(rate)->void:
var stun_sub: float = get_process_delta_time() * status.cfg.stun.recover_speed
stun_sub = min(status.stun, stun_sub)
character.set_status("stun", status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover")
var stun_sub: float = get_process_delta_time() * status.cfg.stun.recover_speed
stun_sub = min(status.stun, stun_sub)
character.set_status("stun", status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover")
func on_update_weapon_index_change(rate)->void: character.set_status("weapon_index_change_rate", rate)
func on_end_weapon_index_change(rate)->void:
var weapon_index: int = status.weapon_index + status.weapon_index_change_dir
var weapon_len: int = len(status.weapon_list)
weapon_index = (weapon_index % weapon_len + weapon_len) % weapon_len
character.set_status("weapon_index", weapon_index)
character.set_status("weapon_index_change_dir", 0)
var weapon_index: int = status.weapon_index + status.weapon_index_change_dir
var weapon_len: int = len(status.weapon_list)
weapon_index = (weapon_index % weapon_len + weapon_len) % weapon_len
character.set_status("weapon_index", weapon_index)
character.set_status("weapon_index_change_dir", 0)
#表现
@ -215,8 +215,8 @@ func on_end_flash_white(rate)->void: status.flash_white_rate = 0
func on_update_shake_x(rate)->void:
var shake_rate: float = 0.5 * status.pause_time
status.shake_offset = Vector3((sin(rate * PI * 5) - 0.5)*shake_rate, 0, 0);
var shake_rate: float = 0.5 * status.pause_time
status.shake_offset = Vector3((sin(rate * PI * 5) - 0.5)*shake_rate, 0, 0);
func on_end_shake_x(rate)->void: status.shake_offset = Vector3.ZERO

@ -65,10 +65,10 @@ func is_on_stair()->bool:
func raycast_stair(dir: Vector3)->bool:
var width: float = Setting.pixel_size * status.cfg.sprite_width
var from = position + Vector3.UP * Setting.pixel_size * 6 + dir * width * 0.4
var to = from + dir * width * 0.2
var up = to + Vector3.UP * Setting.pixel_size * 4
var width: float = Setting.pixel_size * status.cfg.sprite_width
var from: Vector3 = position + (Vector3.UP * Setting.pixel_size * 6) + (dir * width * 0.4)
var to: Vector3 = from + dir * width * 0.2
var up: Vector3 = to + Vector3.UP * Setting.pixel_size * 4
return Util.raycast_wall(from, to) and Util.raycast_wall(up, to)

@ -6,7 +6,7 @@ class_name Hitbox
@onready var character: Character = (get_owner() as Character)
var radius: float
var pushbox_list: Array[Variant] = []
var pushbox_list: Array[Hitbox] = []
func _ready():

@ -10,83 +10,83 @@ var velocity_cache: Vector3
func _process(delta) -> void:
if Global.is_level_loading_contorl: return
if status.is_pause: return
var is_hit_floor: bool = update_on_floor(delta)
update_move(delta)
update_speed_y(delta)
character.move_and_slide()
status.velocity_change = character.velocity.abs() - velocity_cache
velocity_cache = character.velocity.abs()
if character.velocity:
SignalManager.character_pos_changed.emit(character.id(), character.pos())
SignalManager.character_ui_pos_changed.emit(character.id(), character.ui_pos())
SignalManager.character_status_changed.emit(status.id, "pos2d", character.pos2D())
if is_hit_floor:
SignalManager.character_hit_floor.emit(character.id(), character.pos())
update_deformation(delta)
return
if Global.is_level_loading_contorl: return
if status.is_pause: return
var is_hit_floor: bool = update_on_floor(delta)
update_move(delta)
update_speed_y(delta)
character.move_and_slide()
status.velocity_change = character.velocity.abs() - velocity_cache
velocity_cache = character.velocity.abs()
if character.velocity:
SignalManager.character_pos_changed.emit(character.id(), character.pos())
SignalManager.character_ui_pos_changed.emit(character.id(), character.ui_pos())
SignalManager.character_status_changed.emit(status.id, "pos2d", character.pos2D())
if is_hit_floor:
SignalManager.character_hit_floor.emit(character.id(), character.pos())
update_deformation(delta)
return
func update_on_floor(delta) -> bool:
var is_on_floor: bool = character.is_on_floor()
var is_hit: bool = not status.is_on_floor and is_on_floor
status.is_on_floor = is_on_floor
if status.is_on_floor and not status.is_jumping:
status.is_jumped = false
return is_hit
var is_on_floor: bool = character.is_on_floor()
var is_hit: bool = not status.is_on_floor and is_on_floor
status.is_on_floor = is_on_floor
if status.is_on_floor and not status.is_jumping:
status.is_jumped = false
return is_hit
func update_speed_y(delta):
var has_y_speed = status.skill_float_speed != 0 or status.hit_up_speed != 0
var is_on_stair: bool = character.is_on_stair()
if has_y_speed:
character.velocity.y = status.skill_float_speed + status.hit_up_speed
else:
if is_on_stair:
character.velocity.y = status.cfg.move.speed * 0.75
else:
if not status.is_on_floor:
character.velocity.y -= gravity * delta * status.cfg.move.gravity_scale
status.speed_y = character.velocity.y
var has_y_speed: bool = (status.skill_float_speed != 0) or (status.hit_up_speed != 0)
var is_on_stair: bool = character.is_on_stair()
if has_y_speed:
character.velocity.y = status.skill_float_speed + status.hit_up_speed
else:
if is_on_stair:
character.velocity.y = status.cfg.move.speed * 0.75
else:
if not status.is_on_floor:
character.velocity.y -= gravity * delta * status.cfg.move.gravity_scale
status.speed_y = character.velocity.y
func update_move(delta):
var move_velocity: Vector2 = status.move_dir.normalized() * (status.cfg.move.speed * (1 + status.speed_up_rate))
var skill_velocity: Vector2 = status.skill_dir * status.skill_move_speed
var hit_back_velocity: Vector2 = status.hit_back_dir * status.hit_back_speed
move_velocity += skill_velocity + hit_back_velocity
status.speed_dir = Vector2(move_velocity.x, move_velocity.y)
var move_velocity: Vector2 = status.move_dir.normalized() * (status.cfg.move.speed * (1 + status.speed_up_rate))
var skill_velocity: Vector2 = status.skill_dir * status.skill_move_speed if not status.skill_move_stop else Vector2.ZERO
var hit_back_velocity: Vector2 = status.hit_back_dir * status.hit_back_speed
move_velocity += skill_velocity + hit_back_velocity
status.speed_dir = Vector2(move_velocity.x, move_velocity.y)
if status.skill_move_speed >0:
move_velocity *= (1-status.speed_down_push_rate)
if move_velocity.length() == 0:
move_velocity = Vector2(character.velocity.x, character.velocity.z);
if status.is_on_floor:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_ground*delta)
else:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_air*delta)
if skill_velocity.length() >0:
move_velocity *= (1-status.speed_down_push_rate)
if move_velocity.length() == 0:
move_velocity = Vector2(character.velocity.x, character.velocity.z);
if status.is_on_floor:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_ground*delta)
else:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_air*delta)
character.velocity.x = move_velocity.x
character.velocity.z = move_velocity.y
character.velocity.x = move_velocity.x
character.velocity.z = move_velocity.y
status.speed_xz = Vector2(character.velocity.x, character.velocity.z).length()
if status.is_free_turn and status.move_dir.x != 0:
status.is_right = status.move_dir.x > 0
status.speed_xz = Vector2(character.velocity.x, character.velocity.z).length()
if status.is_free_turn and status.move_dir.x != 0:
status.is_right = status.move_dir.x > 0
func update_deformation(delta):
var velocity_change_x: float = status.velocity_change.x
var velocity_change_y: float = status.velocity_change.y + status.velocity_change.z
var dir_x: int = 1 if velocity_change_x > 1 or velocity_change_y < -1 else 0
var dir_y: int = 1 if velocity_change_y > 1 or velocity_change_x < -1 else 0
if dir_x or dir_y:
status.deformation_dir=Vector2(dir_x, dir_y)
character.add_buff("deformation", 0.2)
var velocity_change_x: float = status.velocity_change.x
var velocity_change_y: float = status.velocity_change.y + status.velocity_change.z
var dir_x: int = 1 if (velocity_change_x > 1) or (velocity_change_y < -1) else 0
var dir_y: int = 1 if (velocity_change_y > 1) or (velocity_change_x < -1) else 0
if dir_x or dir_y:
status.deformation_dir=Vector2(dir_x, dir_y)
character.add_buff("deformation", 0.2)
func jump():
character.velocity.y = status.cfg.move.jump_velocity
status.is_jumped = true
status.trigger_jump = true
buff.add_buff("jumping", 0.1)
character.velocity.y = status.cfg.move.jump_velocity
status.is_jumped = true
status.trigger_jump = true
buff.add_buff("jumping", 0.1)

@ -8,153 +8,153 @@ class_name Combo
class InputData:
var action: String
var alive_time: float
var action: String
var alive_time: float
var skill_map: Dictionary = {} #input -> skill[]
var input_list: Array[Variant] = [] #指令缓存
func _ready():
# test
add_weapon(load("res://config/weapon/long.tres") as WeaponCfg)
add_weapon(load("res://config/weapon/short.tres") as WeaponCfg)
add_weapon(load("res://config/weapon/fist.tres") as WeaponCfg)
# test
add_weapon(load("res://config/weapon/long.tres") as WeaponCfg)
add_weapon(load("res://config/weapon/short.tres") as WeaponCfg)
add_weapon(load("res://config/weapon/fist.tres") as WeaponCfg)
func _process(delta):
update_input_alive(delta)
update_break()
update_move()
update_input_alive(delta)
update_break()
update_move()
func update_input_alive(delta):
var input_list_new: Array[Variant] = []
for input in input_list:
input.alive_time -= delta
if input.alive_time > 0:
input_list_new.append(input)
input_list = input_list_new
var input_list_new: Array[Variant] = []
for input in input_list:
input.alive_time -= delta
if input.alive_time > 0:
input_list_new.append(input)
input_list = input_list_new
func update_break():
for break_level_name in Enum.EBreakLevel:
var break_level = Enum.EBreakLevel[break_level_name]
if break_level <= status.break_level:
var is_break: bool = false
match break_level:
Enum.EBreakLevel.None: pass
Enum.EBreakLevel.Cancel: is_break = update_break_cancel()
Enum.EBreakLevel.Jump: is_break = update_break_jump()
Enum.EBreakLevel.Break: is_break = update_break_break()
Enum.EBreakLevel.Walk: is_break = update_break_walk()
if is_break:
break
for break_level_name in Enum.EBreakLevel:
var break_level = Enum.EBreakLevel[break_level_name]
if break_level <= status.break_level:
var is_break: bool = false
match break_level:
Enum.EBreakLevel.None: pass
Enum.EBreakLevel.Cancel: is_break = update_break_cancel()
Enum.EBreakLevel.Jump: is_break = update_break_jump()
Enum.EBreakLevel.Break: is_break = update_break_break()
Enum.EBreakLevel.Walk: is_break = update_break_walk()
if is_break:
break
func update_break_cancel() -> bool:
return update_break_by_level(Enum.EBreakLevel.Cancel)
return update_break_by_level(Enum.EBreakLevel.Cancel)
func update_break_jump() -> bool:
for i in range(0, len(input_list)):
var input = input_list[i]
if input.action == "jump" and not status.is_jumped:
refresh_input(i)
skill.cancel_skill()
move.jump()
return true
return false
for i in range(0, len(input_list)):
var input = input_list[i]
if input.action == "jump" and not status.is_jumped:
refresh_input(i)
skill.cancel_skill()
move.jump()
return true
return false
func update_break_break() -> bool:
return update_break_by_level(Enum.EBreakLevel.Break)
return update_break_by_level(Enum.EBreakLevel.Break)
func update_break_walk() -> bool:
if status.is_skill_running and status.input_dir.length() > 0:
refresh_input(len(input_list))
skill.cancel_skill()
return true
return false
if status.is_skill_running and status.input_dir.length() > 0:
refresh_input(len(input_list))
skill.cancel_skill()
return true
return false
func update_break_by_level(break_level: Enum.EBreakLevel) -> bool:
for i in range(0, len(input_list)):
var input = input_list[i]
if not input.action in skill_map:
continue
for skill_cfg in skill_map[input.action]:
var skill_player_weapon_cfg: SkillPlayerCfg = skill_cfg as SkillPlayerCfg
if skill_player_weapon_cfg.break_level != break_level:
continue
var stance_from: Enum.EStance = skill_player_weapon_cfg.stance_from
if stance_from != status.stance and stance_from != Enum.EStance.Any:
continue
if skill_player_weapon_cfg.weapon:
if skill_player_weapon_cfg.weapon != status.weapon_list[status.weapon_index]:
continue
skill.cast_skill(skill_cfg, status.input_dir)
status.stance = skill_player_weapon_cfg.stance_to
refresh_input(i)
return true
return false
for i in range(0, len(input_list)):
var input = input_list[i]
if not input.action in skill_map:
continue
for skill_cfg in skill_map[input.action]:
var skill_player_weapon_cfg: SkillPlayerCfg = skill_cfg as SkillPlayerCfg
if skill_player_weapon_cfg.break_level != break_level:
continue
var stance_from: Enum.EStance = skill_player_weapon_cfg.stance_from
if stance_from != status.stance and stance_from != Enum.EStance.Any:
continue
if skill_player_weapon_cfg.weapon:
if skill_player_weapon_cfg.weapon != status.weapon_list[status.weapon_index]:
continue
skill.cast_skill(skill_cfg, status.input_dir)
status.stance = skill_player_weapon_cfg.stance_to
refresh_input(i)
return true
return false
func refresh_input(index: int):
if index >= len(input_list)-1:
input_list = []
else:
input_list = input_list.slice(index+1)
if index >= len(input_list)-1:
input_list = []
else:
input_list = input_list.slice(index+1)
func update_move():
status.move_dir = status.input_dir
if status.is_skill_running:
pass
else:
if not status.is_on_floor or status.is_jumping:
status.stance = Enum.EStance.AirIdle
else:
status.stance = Enum.EStance.Idle
status.break_level = Enum.EBreakLevel.Walk
status.move_dir = status.input_dir
if status.is_skill_running:
pass
else:
if not status.is_on_floor or status.is_jumping:
status.stance = Enum.EStance.AirIdle
else:
status.stance = Enum.EStance.Idle
status.break_level = Enum.EBreakLevel.Walk
func add_input_action(action: String):
var new_input = InputData.new()
new_input.action = action
new_input.alive_time = Setting.input_alive_time
input_list.append(new_input)
var new_input = InputData.new()
new_input.action = action
new_input.alive_time = Setting.input_alive_time
input_list.append(new_input)
func add_skill(action: String, skillCfg: SkillPlayerCfg):
if not action in skill_map:
skill_map[action] = []
skill_map[action].append(skillCfg)
if not action in skill_map:
skill_map[action] = []
skill_map[action].append(skillCfg)
func remove_skill(action: String, skillCfg: SkillPlayerCfg) -> void:
if not action in skill_map:
return
skill_map[action].filter(func(cfg): return cfg != skillCfg)
if not action in skill_map:
return
skill_map[action].filter(func(cfg): return cfg != skillCfg)
func add_weapon(weapon: WeaponCfg):
status.weapon_list.append(weapon)
for skill_player_weapon_res: SkillPlayerCfg in Util.get_skill_player_weapon_by_weapon(weapon):
var skill_player_weapon: SkillPlayerCfg = skill_player_weapon_res as SkillPlayerCfg
add_skill(skill_player_weapon.action, skill_player_weapon_res)
status.emit_status("weapon_list")
status.set_status("weapon_index", 0)
status.weapon_list.append(weapon)
for skill_player_weapon_res: SkillPlayerCfg in Util.get_skill_player_weapon_by_weapon(weapon):
var skill_player_weapon: SkillPlayerCfg = skill_player_weapon_res as SkillPlayerCfg
add_skill(skill_player_weapon.action, skill_player_weapon_res)
status.emit_status("weapon_list")
status.set_status("weapon_index", 0)
func weapon_index_change(dir: int) -> void:
if not status.weapon_list:
return
if status.weapon_index_change_dir:
return
if abs(dir) != 1:
return
status.set_status("weapon_index_change_dir", dir)
character.add_buff("weapon_index_change", Setting.weapon_anime_duration)
return
if not status.weapon_list:
return
if status.weapon_index_change_dir:
return
if abs(dir) != 1:
return
status.set_status("weapon_index_change_dir", dir)
character.add_buff("weapon_index_change", Setting.weapon_anime_duration)
return

@ -37,6 +37,8 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2):
status.skill_cfg = cfg
status.skill_dir = cast_dir
status.break_level = Enum.EBreakLevel.None
status.speed_down_push_rate = 0
status.skill_move_stop = false
if cast_dir.x != 0: status.is_right = cast_dir.x > 0
play(animation_name, -1, Setting.animation_speed_scale)
else:
@ -53,6 +55,8 @@ func break_skill():
status.is_skill_running = false
status.skill_cfg = null
status.break_level = Enum.EBreakLevel.Walk
status.speed_down_push_rate = 0
status.skill_move_stop = false
effect.release_effect()

@ -59,6 +59,7 @@ class_name Status
@export var is_skill_running: bool #技能是否正在释放
@export var skill_dir: Vector2 #技能释放方向
@export var skill_move_speed: float #技能位移速度
@export var skill_move_stop: bool #技能位移速度是否停止生效
@export var skill_float_speed: float #技能y位移速度
@export_category("玩家技能状态")
@export var input_dir: Vector2 #指令方向

@ -10,6 +10,7 @@ class_name AttackCfg
@export var is_floating: bool #是否浮空技
@export var is_hit_down: bool #是否击落技
@export var is_rebound: bool #是否地面反弹技能
@export var is_stop_self: bool = true #是否命中时停止自身位移
@export_group("强制位移")
@export var hit_back_speed: float #击退速度
@export var hit_up_speed: float #击飞速度

@ -5,20 +5,20 @@ extends Control
var color_material: ShaderMaterial
@export var duration: float:
set(value):
if color_material: color_material.set_shader_parameter("position", value)
set(value):
if color_material: color_material.set_shader_parameter("position", value)
func _ready():
color_material = $ColorRect.material as ShaderMaterial
SignalManager.level_loading_start.connect(on_level_loading_start)
SignalManager.level_loading_end.connect(on_level_loading_end)
color_material = $ColorRect.material as ShaderMaterial
SignalManager.level_loading_start.connect(on_level_loading_start)
SignalManager.level_loading_end.connect(on_level_loading_end)
func on_level_loading_start():
animation.play("start")
animation.play("start")
func on_level_loading_end():
animation.play("end")
animation.play("end")

Loading…
Cancel
Save