diff --git a/DungeonShooting_Godot/excel/excelFile/ActivityObject.xlsx b/DungeonShooting_Godot/excel/excelFile/ActivityObject.xlsx
index f322a2c..8b0e0b8 100644
--- a/DungeonShooting_Godot/excel/excelFile/ActivityObject.xlsx
+++ b/DungeonShooting_Godot/excel/excelFile/ActivityObject.xlsx
Binary files differ
diff --git a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx
index 8d51f17..603d0e4 100644
--- a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx
+++ b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx
Binary files differ
diff --git a/DungeonShooting_Godot/excel/excelFile/Weapon.xlsx b/DungeonShooting_Godot/excel/excelFile/Weapon.xlsx
index 1dc152e..27f6dfd 100644
--- a/DungeonShooting_Godot/excel/excelFile/Weapon.xlsx
+++ b/DungeonShooting_Godot/excel/excelFile/Weapon.xlsx
Binary files differ
diff --git a/DungeonShooting_Godot/prefab/effect/BulletDisappear.tscn b/DungeonShooting_Godot/prefab/effect/BulletDisappear.tscn
deleted file mode 100644
index 54549a1..0000000
--- a/DungeonShooting_Godot/prefab/effect/BulletDisappear.tscn
+++ /dev/null
@@ -1,145 +0,0 @@
-[gd_scene load_steps=15 format=3]
-
-[ext_resource type="Texture2D" uid="uid://d8ot2wrdoe4j" path="res://resource/sprite/effects/Explosion.png" id="1_qqm6c"]
-[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="1_ybsvf"]
-
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_tscb3"]
-atlas = ExtResource("1_qqm6c")
-region = Rect2(0, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_l2nv6"]
-atlas = ExtResource("1_qqm6c")
-region = Rect2(16, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_5133m"]
-atlas = ExtResource("1_qqm6c")
-region = Rect2(32, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_41eg5"]
-atlas = ExtResource("1_qqm6c")
-region = Rect2(48, 0, 16, 16)
-
-[sub_resource type="SpriteFrames" id="SpriteFrames_ub3cw"]
-animations = [{
-"frames": [{
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_tscb3")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_l2nv6")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_5133m")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_41eg5")
-}],
-"loop": false,
-"name": &"default",
-"speed": 13.0
-}]
-
-[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4bd3q"]
-particles_animation = true
-particles_anim_h_frames = 3
-particles_anim_v_frames = 1
-particles_anim_loop = false
-
-[sub_resource type="Curve" id="Curve_86ye5"]
-_data = [Vector2(0, 0.736364), 0.0, 0.0, 0, 0, Vector2(0.396825, 1), 0.0, 0.0, 0, 0, Vector2(0.990476, 0), 0.0, 0.0, 0, 0]
-point_count = 3
-
-[sub_resource type="CurveTexture" id="CurveTexture_j77i6"]
-curve = SubResource("Curve_86ye5")
-
-[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_r1yeu"]
-lifetime_randomness = 0.3
-particle_flag_disable_z = true
-spread = 180.0
-gravity = Vector3(0, 0, 0)
-initial_velocity_min = 45.0
-initial_velocity_max = 65.0
-orbit_velocity_min = 0.0
-orbit_velocity_max = 0.0
-angle_max = 360.0
-scale_min = 0.3
-scale_max = 0.6
-scale_curve = SubResource("CurveTexture_j77i6")
-color = Color(0.909804, 0.909804, 0.909804, 0.380392)
-anim_offset_max = 1.0
-
-[sub_resource type="Animation" id="Animation_jnfgg"]
-resource_name = "Start"
-length = 0.3
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:emitting")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [true]
-}
-tracks/1/type = "method"
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/path = NodePath("..")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/keys = {
-"times": PackedFloat32Array(0.3),
-"transitions": PackedFloat32Array(1),
-"values": [{
-"args": [],
-"method": &"queue_free"
-}]
-}
-
-[sub_resource type="Animation" id="Animation_yr61b"]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:emitting")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [false]
-}
-
-[sub_resource type="AnimationLibrary" id="AnimationLibrary_1spnw"]
-_data = {
-"RESET": SubResource("Animation_yr61b"),
-"Start": SubResource("Animation_jnfgg")
-}
-
-[node name="BulletDisappear" type="AnimatedSprite2D"]
-modulate = Color(1, 1, 1, 0.784314)
-z_index = -4
-scale = Vector2(0.5, 0.5)
-sprite_frames = SubResource("SpriteFrames_ub3cw")
-autoplay = "default"
-
-[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
-material = SubResource("CanvasItemMaterial_4bd3q")
-emitting = false
-process_material = SubResource("ParticleProcessMaterial_r1yeu")
-texture = ExtResource("1_ybsvf")
-lifetime = 0.3
-one_shot = true
-explosiveness = 0.9
-fixed_fps = 20
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-root_node = NodePath("../GPUParticles2D")
-autoplay = "Start"
-libraries = {
-"": SubResource("AnimationLibrary_1spnw")
-}
diff --git a/DungeonShooting_Godot/prefab/effect/BulletSmoke.tscn b/DungeonShooting_Godot/prefab/effect/BulletSmoke.tscn
deleted file mode 100644
index 247c6b2..0000000
--- a/DungeonShooting_Godot/prefab/effect/BulletSmoke.tscn
+++ /dev/null
@@ -1,145 +0,0 @@
-[gd_scene load_steps=9 format=3 uid="uid://b8ogu2l8pa70y"]
-
-[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="1"]
-[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_8pe88"]
-[ext_resource type="Texture2D" uid="uid://dwa4chrugc6b1" path="res://resource/sprite/effects/Collision.png" id="2"]
-
-[sub_resource type="CanvasItemMaterial" id="1"]
-particles_animation = true
-particles_anim_h_frames = 3
-particles_anim_v_frames = 1
-particles_anim_loop = false
-
-[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gpp81"]
-lifetime_randomness = 0.5
-particle_flag_disable_z = true
-spread = 25.0
-gravity = Vector3(0, 0, 0)
-initial_velocity_max = 90.0
-orbit_velocity_min = 0.0
-orbit_velocity_max = 0.0
-angle_max = 360.0
-scale_curve = ExtResource("1_8pe88")
-color = Color(0.75, 0.75, 0.75, 0.470588)
-anim_offset_max = 1.0
-
-[sub_resource type="Animation" id="5"]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:emitting")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [false]
-}
-tracks/1/type = "value"
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/path = NodePath("Sprite2D:frame")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [0]
-}
-tracks/2/type = "value"
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/path = NodePath("Sprite2D:visible")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [true]
-}
-
-[sub_resource type="Animation" id="6"]
-resource_name = "Smoke"
-step = 0.05
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:emitting")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [true]
-}
-tracks/1/type = "method"
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/path = NodePath(".")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/keys = {
-"times": PackedFloat32Array(1),
-"transitions": PackedFloat32Array(1),
-"values": [{
-"args": [],
-"method": &"queue_free"
-}]
-}
-tracks/2/type = "value"
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/path = NodePath("Sprite2D:frame")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/keys = {
-"times": PackedFloat32Array(0, 0.05, 0.1, 0.15),
-"transitions": PackedFloat32Array(1, 1, 1, 1),
-"update": 1,
-"values": [0, 1, 2, 3]
-}
-tracks/3/type = "value"
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/path = NodePath("Sprite2D:visible")
-tracks/3/interp = 1
-tracks/3/loop_wrap = true
-tracks/3/keys = {
-"times": PackedFloat32Array(0, 0.2),
-"transitions": PackedFloat32Array(1, 1),
-"update": 1,
-"values": [true, false]
-}
-
-[sub_resource type="AnimationLibrary" id="AnimationLibrary_uuiu7"]
-_data = {
-"RESET": SubResource("5"),
-"Smoke": SubResource("6")
-}
-
-[node name="BulletSmoke" type="GPUParticles2D"]
-material = SubResource("1")
-emitting = false
-process_material = SubResource("ParticleProcessMaterial_gpp81")
-texture = ExtResource("1")
-lifetime = 0.4
-one_shot = true
-explosiveness = 0.9
-fixed_fps = 20
-
-[node name="Sprite2D" type="Sprite2D" parent="."]
-modulate = Color(1.6, 1.6, 1.6, 1)
-texture = ExtResource("2")
-offset = Vector2(8, 0)
-hframes = 4
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-autoplay = "Smoke"
-libraries = {
-"": SubResource("AnimationLibrary_uuiu7")
-}
diff --git a/DungeonShooting_Godot/prefab/effect/Effect1.tscn b/DungeonShooting_Godot/prefab/effect/Effect1.tscn
deleted file mode 100644
index 9f4e524..0000000
--- a/DungeonShooting_Godot/prefab/effect/Effect1.tscn
+++ /dev/null
@@ -1,50 +0,0 @@
-[gd_scene load_steps=8 format=3 uid="uid://dbhgioeoksa7"]
-
-[ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_dxavj"]
-[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_s60r7"]
-[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="2_3kyig"]
-[ext_resource type="Texture2D" uid="uid://csud4e6kc3iku" path="res://resource/sprite/effects/Effect1.png" id="3_1mceu"]
-[ext_resource type="Script" path="res://src/game/effects/Effect1.cs" id="3_ax5u4"]
-
-[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ipadv"]
-particles_animation = true
-particles_anim_h_frames = 3
-particles_anim_v_frames = 1
-particles_anim_loop = false
-
-[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_p8jst"]
-particle_flag_align_y = true
-particle_flag_disable_z = true
-spread = 180.0
-gravity = Vector3(0, 0, 0)
-initial_velocity_min = 40.0
-initial_velocity_max = 70.0
-orbit_velocity_min = 0.0
-orbit_velocity_max = 0.0
-scale_min = 0.2
-scale_max = 0.3
-scale_curve = ExtResource("1_s60r7")
-
-[node name="Effect1" type="GPUParticles2D"]
-modulate = Color(0.760784, 0.760784, 0.760784, 0.533333)
-z_index = 5
-material = SubResource("CanvasItemMaterial_ipadv")
-emitting = false
-amount = 10
-process_material = ExtResource("1_dxavj")
-texture = ExtResource("2_3kyig")
-lifetime = 0.7
-one_shot = true
-explosiveness = 1.0
-fixed_fps = 20
-script = ExtResource("3_ax5u4")
-
-[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
-emitting = false
-process_material = SubResource("ParticleProcessMaterial_p8jst")
-texture = ExtResource("3_1mceu")
-lifetime = 0.5
-one_shot = true
-explosiveness = 1.0
-randomness = 0.5
-fixed_fps = 20
diff --git a/DungeonShooting_Godot/prefab/effect/FirePart.tscn b/DungeonShooting_Godot/prefab/effect/FirePart.tscn
deleted file mode 100644
index 629586a..0000000
--- a/DungeonShooting_Godot/prefab/effect/FirePart.tscn
+++ /dev/null
@@ -1,13 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://bh6vo2i6x7lmj"]
-
-[sub_resource type="ParticleProcessMaterial" id="1"]
-spread = 60.0
-gravity = Vector3(0, 0, 0)
-
-[node name="FirePart" type="GPUParticles2D"]
-emitting = false
-amount = 10
-process_material = SubResource("1")
-lifetime = 0.2
-one_shot = true
-explosiveness = 1.0
diff --git a/DungeonShooting_Godot/prefab/effect/ShotFire.tscn b/DungeonShooting_Godot/prefab/effect/ShotFire.tscn
deleted file mode 100644
index 1d05905..0000000
--- a/DungeonShooting_Godot/prefab/effect/ShotFire.tscn
+++ /dev/null
@@ -1,67 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://cglrxe3hmhmg2"]
-
-[ext_resource type="Texture2D" uid="uid://b0jsyrbk4bydt" path="res://resource/sprite/effects/ShotFire.png" id="1"]
-
-[sub_resource type="Animation" id="2"]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [0]
-}
-
-[sub_resource type="Animation" id="1"]
-resource_name = "ShotFire"
-length = 0.2
-step = 0.05
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0, 0.05, 0.1, 0.15),
-"transitions": PackedFloat32Array(1, 1, 1, 1),
-"update": 1,
-"values": [0, 1, 2, 3]
-}
-tracks/1/type = "method"
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/path = NodePath(".")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/keys = {
-"times": PackedFloat32Array(0.2),
-"transitions": PackedFloat32Array(1),
-"values": [{
-"args": [],
-"method": &"queue_free"
-}]
-}
-
-[sub_resource type="AnimationLibrary" id="AnimationLibrary_apwxv"]
-_data = {
-"RESET": SubResource("2"),
-"ShotFire": SubResource("1")
-}
-
-[node name="ShotFire" type="Sprite2D"]
-modulate = Color(1.6, 1.6, 1.6, 1)
-texture = ExtResource("1")
-offset = Vector2(8, 0)
-hframes = 4
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-autoplay = "ShotFire"
-libraries = {
-"": SubResource("AnimationLibrary_apwxv")
-}
diff --git a/DungeonShooting_Godot/prefab/effect/activityObject/Effect0001.tscn b/DungeonShooting_Godot/prefab/effect/activityObject/Effect0001.tscn
deleted file mode 100644
index 83b7a8b..0000000
--- a/DungeonShooting_Godot/prefab/effect/activityObject/Effect0001.tscn
+++ /dev/null
@@ -1,200 +0,0 @@
-[gd_scene load_steps=30 format=3 uid="uid://pr88a1phtxgb"]
-
-[ext_resource type="Script" path="res://src/game/effects/EnemyDebris.cs" id="1_jnsw0"]
-[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_b3d83"]
-[ext_resource type="Texture2D" uid="uid://cn64eauvwx1uj" path="res://resource/sprite/role/enemy0001/Enemy0001_Debris.png" id="3_ntutm"]
-[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="4_egbbr"]
-
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1mj2"]
-resource_local_to_scene = true
-shader = ExtResource("2_b3d83")
-shader_parameter/blend = Color(0, 0, 0, 0.470588)
-shader_parameter/schedule = 1.0
-shader_parameter/modulate = Color(1, 1, 1, 1)
-shader_parameter/show_outline = true
-shader_parameter/outline_color = Color(0, 0, 0, 1)
-shader_parameter/outline_rainbow = false
-
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_08fn3"]
-shader = ExtResource("2_b3d83")
-shader_parameter/blend = Color(1, 1, 1, 1)
-shader_parameter/schedule = 0.0
-shader_parameter/modulate = Color(1, 1, 1, 1)
-shader_parameter/show_outline = false
-shader_parameter/outline_color = Color(0, 0, 0, 1)
-shader_parameter/outline_rainbow = false
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_cldwb"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(0, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_ehtnl"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(16, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_j05gd"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(32, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_7el6f"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(48, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_n7sw3"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(64, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_mumsm"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(80, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_gx41d"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(96, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_r4nx1"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(112, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_s8j4o"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(128, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_2svrb"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(144, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_twd5t"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(160, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_8w5ka"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(176, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_6iumv"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(192, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_lpilf"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(208, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_n1a5a"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(224, 0, 16, 16)
-
-[sub_resource type="AtlasTexture" id="AtlasTexture_q0oeq"]
-atlas = ExtResource("3_ntutm")
-region = Rect2(240, 0, 16, 16)
-
-[sub_resource type="SpriteFrames" id="SpriteFrames_15g84"]
-animations = [{
-"frames": [{
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_cldwb")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_ehtnl")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_j05gd")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_7el6f")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_n7sw3")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_mumsm")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_gx41d")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_r4nx1")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_s8j4o")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_2svrb")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_twd5t")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_8w5ka")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_6iumv")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_lpilf")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_n1a5a")
-}, {
-"duration": 1.0,
-"texture": SubResource("AtlasTexture_q0oeq")
-}],
-"loop": true,
-"name": &"default",
-"speed": 5.0
-}]
-
-[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"]
-particles_animation = true
-particles_anim_h_frames = 3
-particles_anim_v_frames = 1
-particles_anim_loop = false
-
-[sub_resource type="Gradient" id="Gradient_ryemi"]
-colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255)
-
-[sub_resource type="GradientTexture1D" id="GradientTexture1D_orgu0"]
-gradient = SubResource("Gradient_ryemi")
-
-[sub_resource type="Curve" id="Curve_21dxk"]
-_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.177419, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0272727), 0.0, 0.0, 0, 0]
-point_count = 3
-
-[sub_resource type="CurveTexture" id="CurveTexture_rutlp"]
-curve = SubResource("Curve_21dxk")
-
-[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ku1mm"]
-particle_flag_disable_z = true
-gravity = Vector3(0, 0, 0)
-orbit_velocity_min = 0.0
-orbit_velocity_max = 0.0
-angle_max = 360.0
-scale_min = 0.4
-scale_max = 1.5
-scale_curve = SubResource("CurveTexture_rutlp")
-color = Color(0.811765, 0.0980392, 0.0980392, 0.627451)
-color_ramp = SubResource("GradientTexture1D_orgu0")
-anim_offset_max = 1.0
-
-[node name="Effect0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")]
-script = ExtResource("1_jnsw0")
-ShadowSprite = NodePath("ShadowSprite")
-AnimatedSprite = NodePath("AnimatedSprite")
-Collision = NodePath("Collision")
-
-[node name="ShadowSprite" type="Sprite2D" parent="."]
-z_index = -1
-material = SubResource("ShaderMaterial_s1mj2")
-
-[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."]
-material = SubResource("ShaderMaterial_08fn3")
-sprite_frames = SubResource("SpriteFrames_15g84")
-
-[node name="Collision" type="CollisionShape2D" parent="."]
-
-[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
-material = SubResource("CanvasItemMaterial_p3lv8")
-emitting = false
-process_material = SubResource("ParticleProcessMaterial_ku1mm")
-texture = ExtResource("4_egbbr")
-fixed_fps = 20
diff --git a/DungeonShooting_Godot/prefab/effect/activityObject/EnemyBloodEffect.tscn b/DungeonShooting_Godot/prefab/effect/activityObject/EnemyBloodEffect.tscn
deleted file mode 100644
index 20408ca..0000000
--- a/DungeonShooting_Godot/prefab/effect/activityObject/EnemyBloodEffect.tscn
+++ /dev/null
@@ -1,45 +0,0 @@
-[gd_scene load_steps=8 format=3 uid="uid://m0s0k5nw7nbi"]
-
-[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_1bm8t"]
-[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="2_xg444"]
-[ext_resource type="Script" path="res://src/game/effects/AutoDestroyEffect.cs" id="3_lldtd"]
-
-[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_emuda"]
-particles_animation = true
-particles_anim_h_frames = 3
-particles_anim_v_frames = 1
-particles_anim_loop = false
-
-[sub_resource type="Gradient" id="Gradient_ryemi"]
-colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255)
-
-[sub_resource type="GradientTexture1D" id="GradientTexture1D_4mhw0"]
-gradient = SubResource("Gradient_ryemi")
-
-[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_fwcoe"]
-particle_flag_disable_z = true
-spread = 180.0
-gravity = Vector3(0, 0, 0)
-initial_velocity_min = 5.0
-initial_velocity_max = 35.0
-orbit_velocity_min = 0.0
-orbit_velocity_max = 0.0
-scale_min = 0.8
-scale_max = 0.8
-scale_curve = ExtResource("1_1bm8t")
-color = Color(0.811765, 0.0980392, 0.0980392, 0.627451)
-color_ramp = SubResource("GradientTexture1D_4mhw0")
-anim_offset_max = 1.0
-
-[node name="EnemyBloodEffect" type="GPUParticles2D"]
-material = SubResource("CanvasItemMaterial_emuda")
-emitting = false
-amount = 10
-process_material = SubResource("ParticleProcessMaterial_fwcoe")
-texture = ExtResource("2_xg444")
-lifetime = 1.2
-one_shot = true
-explosiveness = 1.0
-fixed_fps = 20
-script = ExtResource("3_lldtd")
-DelayTime = 1.5
diff --git a/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn
new file mode 100644
index 0000000..9f4e524
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn
@@ -0,0 +1,50 @@
+[gd_scene load_steps=8 format=3 uid="uid://dbhgioeoksa7"]
+
+[ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_dxavj"]
+[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_s60r7"]
+[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="2_3kyig"]
+[ext_resource type="Texture2D" uid="uid://csud4e6kc3iku" path="res://resource/sprite/effects/Effect1.png" id="3_1mceu"]
+[ext_resource type="Script" path="res://src/game/effects/Effect1.cs" id="3_ax5u4"]
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ipadv"]
+particles_animation = true
+particles_anim_h_frames = 3
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_p8jst"]
+particle_flag_align_y = true
+particle_flag_disable_z = true
+spread = 180.0
+gravity = Vector3(0, 0, 0)
+initial_velocity_min = 40.0
+initial_velocity_max = 70.0
+orbit_velocity_min = 0.0
+orbit_velocity_max = 0.0
+scale_min = 0.2
+scale_max = 0.3
+scale_curve = ExtResource("1_s60r7")
+
+[node name="Effect1" type="GPUParticles2D"]
+modulate = Color(0.760784, 0.760784, 0.760784, 0.533333)
+z_index = 5
+material = SubResource("CanvasItemMaterial_ipadv")
+emitting = false
+amount = 10
+process_material = ExtResource("1_dxavj")
+texture = ExtResource("2_3kyig")
+lifetime = 0.7
+one_shot = true
+explosiveness = 1.0
+fixed_fps = 20
+script = ExtResource("3_ax5u4")
+
+[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
+emitting = false
+process_material = SubResource("ParticleProcessMaterial_p8jst")
+texture = ExtResource("3_1mceu")
+lifetime = 0.5
+one_shot = true
+explosiveness = 1.0
+randomness = 0.5
+fixed_fps = 20
diff --git a/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn b/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn
new file mode 100644
index 0000000..6b7176e
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn
@@ -0,0 +1,200 @@
+[gd_scene load_steps=30 format=3 uid="uid://pr88a1phtxgb"]
+
+[ext_resource type="Script" path="res://src/game/effects/EnemyDebris.cs" id="1_ttosm"]
+[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_h62s7"]
+[ext_resource type="Texture2D" uid="uid://cn64eauvwx1uj" path="res://resource/sprite/role/enemy0001/enemy0001_Debris.png" id="3_6ewaj"]
+[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="4_wu0t6"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1mj2"]
+resource_local_to_scene = true
+shader = ExtResource("2_h62s7")
+shader_parameter/blend = Color(0, 0, 0, 0.470588)
+shader_parameter/schedule = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
+shader_parameter/show_outline = true
+shader_parameter/outline_color = Color(0, 0, 0, 1)
+shader_parameter/outline_rainbow = false
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_08fn3"]
+shader = ExtResource("2_h62s7")
+shader_parameter/blend = Color(1, 1, 1, 1)
+shader_parameter/schedule = 0.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
+shader_parameter/show_outline = false
+shader_parameter/outline_color = Color(0, 0, 0, 1)
+shader_parameter/outline_rainbow = false
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_cldwb"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(0, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ehtnl"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(16, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_j05gd"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(32, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_7el6f"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(48, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_n7sw3"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(64, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_mumsm"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(80, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_gx41d"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(96, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_r4nx1"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(112, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_s8j4o"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(128, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_2svrb"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(144, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_twd5t"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(160, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_8w5ka"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(176, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_6iumv"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(192, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_lpilf"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(208, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_n1a5a"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(224, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_q0oeq"]
+atlas = ExtResource("3_6ewaj")
+region = Rect2(240, 0, 16, 16)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_15g84"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_cldwb")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_ehtnl")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_j05gd")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_7el6f")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_n7sw3")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_mumsm")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_gx41d")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_r4nx1")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_s8j4o")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_2svrb")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_twd5t")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_8w5ka")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_6iumv")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_lpilf")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_n1a5a")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_q0oeq")
+}],
+"loop": true,
+"name": &"default",
+"speed": 5.0
+}]
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"]
+particles_animation = true
+particles_anim_h_frames = 3
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[sub_resource type="Gradient" id="Gradient_ryemi"]
+colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_orgu0"]
+gradient = SubResource("Gradient_ryemi")
+
+[sub_resource type="Curve" id="Curve_21dxk"]
+_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.177419, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0272727), 0.0, 0.0, 0, 0]
+point_count = 3
+
+[sub_resource type="CurveTexture" id="CurveTexture_rutlp"]
+curve = SubResource("Curve_21dxk")
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ku1mm"]
+particle_flag_disable_z = true
+gravity = Vector3(0, 0, 0)
+orbit_velocity_min = 0.0
+orbit_velocity_max = 0.0
+angle_max = 360.0
+scale_min = 0.4
+scale_max = 1.5
+scale_curve = SubResource("CurveTexture_rutlp")
+color = Color(0.811765, 0.0980392, 0.0980392, 0.627451)
+color_ramp = SubResource("GradientTexture1D_orgu0")
+anim_offset_max = 1.0
+
+[node name="Effect0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")]
+script = ExtResource("1_ttosm")
+ShadowSprite = NodePath("ShadowSprite")
+AnimatedSprite = NodePath("AnimatedSprite")
+Collision = NodePath("Collision")
+
+[node name="ShadowSprite" type="Sprite2D" parent="."]
+z_index = -1
+material = SubResource("ShaderMaterial_s1mj2")
+
+[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."]
+material = SubResource("ShaderMaterial_08fn3")
+sprite_frames = SubResource("SpriteFrames_15g84")
+
+[node name="Collision" type="CollisionShape2D" parent="."]
+
+[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
+material = SubResource("CanvasItemMaterial_p3lv8")
+emitting = false
+process_material = SubResource("ParticleProcessMaterial_ku1mm")
+texture = ExtResource("4_wu0t6")
+fixed_fps = 20
diff --git a/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn b/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn
new file mode 100644
index 0000000..8b4aa0a
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn
@@ -0,0 +1,25 @@
+[gd_scene load_steps=5 format=3 uid="uid://m0s0k5nw7nbi"]
+
+[ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_leomh"]
+[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="2_c2t2e"]
+[ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="3_5cpi6"]
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_emuda"]
+particles_animation = true
+particles_anim_h_frames = 3
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[node name="EnemyBloodEffect" type="GPUParticles2D"]
+modulate = Color(0.811765, 0.0980392, 0.0980392, 0.627451)
+material = SubResource("CanvasItemMaterial_emuda")
+emitting = false
+amount = 10
+process_material = ExtResource("1_leomh")
+texture = ExtResource("2_c2t2e")
+lifetime = 1.2
+one_shot = true
+explosiveness = 1.0
+fixed_fps = 20
+script = ExtResource("3_5cpi6")
+DelayTime = 1.5
diff --git a/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn b/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn
new file mode 100644
index 0000000..54549a1
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn
@@ -0,0 +1,145 @@
+[gd_scene load_steps=15 format=3]
+
+[ext_resource type="Texture2D" uid="uid://d8ot2wrdoe4j" path="res://resource/sprite/effects/Explosion.png" id="1_qqm6c"]
+[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/Smoke.png" id="1_ybsvf"]
+
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_tscb3"]
+atlas = ExtResource("1_qqm6c")
+region = Rect2(0, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_l2nv6"]
+atlas = ExtResource("1_qqm6c")
+region = Rect2(16, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_5133m"]
+atlas = ExtResource("1_qqm6c")
+region = Rect2(32, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_41eg5"]
+atlas = ExtResource("1_qqm6c")
+region = Rect2(48, 0, 16, 16)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_ub3cw"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_tscb3")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_l2nv6")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_5133m")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_41eg5")
+}],
+"loop": false,
+"name": &"default",
+"speed": 13.0
+}]
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4bd3q"]
+particles_animation = true
+particles_anim_h_frames = 3
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[sub_resource type="Curve" id="Curve_86ye5"]
+_data = [Vector2(0, 0.736364), 0.0, 0.0, 0, 0, Vector2(0.396825, 1), 0.0, 0.0, 0, 0, Vector2(0.990476, 0), 0.0, 0.0, 0, 0]
+point_count = 3
+
+[sub_resource type="CurveTexture" id="CurveTexture_j77i6"]
+curve = SubResource("Curve_86ye5")
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_r1yeu"]
+lifetime_randomness = 0.3
+particle_flag_disable_z = true
+spread = 180.0
+gravity = Vector3(0, 0, 0)
+initial_velocity_min = 45.0
+initial_velocity_max = 65.0
+orbit_velocity_min = 0.0
+orbit_velocity_max = 0.0
+angle_max = 360.0
+scale_min = 0.3
+scale_max = 0.6
+scale_curve = SubResource("CurveTexture_j77i6")
+color = Color(0.909804, 0.909804, 0.909804, 0.380392)
+anim_offset_max = 1.0
+
+[sub_resource type="Animation" id="Animation_jnfgg"]
+resource_name = "Start"
+length = 0.3
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:emitting")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [true]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("..")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.3),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+
+[sub_resource type="Animation" id="Animation_yr61b"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:emitting")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [false]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_1spnw"]
+_data = {
+"RESET": SubResource("Animation_yr61b"),
+"Start": SubResource("Animation_jnfgg")
+}
+
+[node name="BulletDisappear" type="AnimatedSprite2D"]
+modulate = Color(1, 1, 1, 0.784314)
+z_index = -4
+scale = Vector2(0.5, 0.5)
+sprite_frames = SubResource("SpriteFrames_ub3cw")
+autoplay = "default"
+
+[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
+material = SubResource("CanvasItemMaterial_4bd3q")
+emitting = false
+process_material = SubResource("ParticleProcessMaterial_r1yeu")
+texture = ExtResource("1_ybsvf")
+lifetime = 0.3
+one_shot = true
+explosiveness = 0.9
+fixed_fps = 20
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+root_node = NodePath("../GPUParticles2D")
+autoplay = "Start"
+libraries = {
+"": SubResource("AnimationLibrary_1spnw")
+}
diff --git a/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn b/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn
new file mode 100644
index 0000000..444e13a
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn
@@ -0,0 +1,146 @@
+[gd_scene load_steps=9 format=3 uid="uid://b8ogu2l8pa70y"]
+
+[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="1"]
+[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_8pe88"]
+[ext_resource type="Texture2D" uid="uid://dwa4chrugc6b1" path="res://resource/sprite/effects/Collision.png" id="2"]
+
+
+[sub_resource type="CanvasItemMaterial" id="1"]
+particles_animation = true
+particles_anim_h_frames = 3
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gpp81"]
+lifetime_randomness = 0.5
+particle_flag_disable_z = true
+spread = 25.0
+gravity = Vector3(0, 0, 0)
+initial_velocity_max = 90.0
+orbit_velocity_min = 0.0
+orbit_velocity_max = 0.0
+angle_max = 360.0
+scale_curve = ExtResource("1_8pe88")
+color = Color(0.75, 0.75, 0.75, 0.470588)
+anim_offset_max = 1.0
+
+[sub_resource type="Animation" id="5"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:emitting")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [false]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Sprite2D:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [0]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Sprite2D:visible")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [true]
+}
+
+[sub_resource type="Animation" id="6"]
+resource_name = "Smoke"
+step = 0.05
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:emitting")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [true]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(1),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Sprite2D:frame")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0, 0.05, 0.1, 0.15),
+"transitions": PackedFloat32Array(1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Sprite2D:visible")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0, 0.2),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [true, false]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_uuiu7"]
+_data = {
+"RESET": SubResource("5"),
+"Smoke": SubResource("6")
+}
+
+[node name="BulletSmoke" type="GPUParticles2D"]
+material = SubResource("1")
+emitting = false
+process_material = SubResource("ParticleProcessMaterial_gpp81")
+texture = ExtResource("1")
+lifetime = 0.4
+one_shot = true
+explosiveness = 0.9
+fixed_fps = 20
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+modulate = Color(1.6, 1.6, 1.6, 1)
+texture = ExtResource("2")
+offset = Vector2(8, 0)
+hframes = 4
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "Smoke"
+libraries = {
+"": SubResource("AnimationLibrary_uuiu7")
+}
diff --git a/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn b/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn
new file mode 100644
index 0000000..629586a
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn
@@ -0,0 +1,13 @@
+[gd_scene load_steps=2 format=3 uid="uid://bh6vo2i6x7lmj"]
+
+[sub_resource type="ParticleProcessMaterial" id="1"]
+spread = 60.0
+gravity = Vector3(0, 0, 0)
+
+[node name="FirePart" type="GPUParticles2D"]
+emitting = false
+amount = 10
+process_material = SubResource("1")
+lifetime = 0.2
+one_shot = true
+explosiveness = 1.0
diff --git a/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn
new file mode 100644
index 0000000..5ba7c89
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn
@@ -0,0 +1,39 @@
+[gd_scene load_steps=7 format=3 uid="uid://cylm455bsio3g"]
+
+[ext_resource type="Texture2D" uid="uid://7jhe2mmctmr1" path="res://resource/sprite/effects/weapon/MeleeAttack1.png" id="1_bjxle"]
+[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_bjagc"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_h5mw5"]
+atlas = ExtResource("1_bjxle")
+region = Rect2(0, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_rjd0g"]
+atlas = ExtResource("1_bjxle")
+region = Rect2(16, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_q06ex"]
+atlas = ExtResource("1_bjxle")
+region = Rect2(32, 0, 16, 32)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_hkcv6"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_h5mw5")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_rjd0g")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_q06ex")
+}],
+"loop": false,
+"name": &"default",
+"speed": 20.0
+}]
+
+[node name="MeleeAttack1" type="AnimatedSprite2D"]
+sprite_frames = SubResource("SpriteFrames_hkcv6")
+autoplay = "default"
+script = ExtResource("2_bjagc")
+DelayTime = 0.15
diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn
new file mode 100644
index 0000000..b0161a5
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn
@@ -0,0 +1,48 @@
+[gd_scene load_steps=8 format=3 uid="uid://433h6huyctl1"]
+
+[ext_resource type="Texture2D" uid="uid://b0jsyrbk4bydt" path="res://resource/sprite/effects/weapon/ShotFire.png" id="1_sencp"]
+[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_lnwju"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_asq5h"]
+atlas = ExtResource("1_sencp")
+region = Rect2(0, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_n77w8"]
+atlas = ExtResource("1_sencp")
+region = Rect2(16, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_10rnx"]
+atlas = ExtResource("1_sencp")
+region = Rect2(32, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_qi1pq"]
+atlas = ExtResource("1_sencp")
+region = Rect2(48, 0, 16, 16)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_73j16"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_asq5h")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_n77w8")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_10rnx")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_qi1pq")
+}],
+"loop": false,
+"name": &"default",
+"speed": 20.0
+}]
+
+[node name="ShotFire" type="AnimatedSprite2D"]
+modulate = Color(1.6, 1.6, 1.6, 1)
+sprite_frames = SubResource("SpriteFrames_73j16")
+autoplay = "default"
+offset = Vector2(8, 0)
+script = ExtResource("2_lnwju")
+DelayTime = 0.2
diff --git a/DungeonShooting_Godot/prefab/role/Enemy0001.tscn b/DungeonShooting_Godot/prefab/role/Enemy0001.tscn
index 5f153c2..6d6eeaf 100644
--- a/DungeonShooting_Godot/prefab/role/Enemy0001.tscn
+++ b/DungeonShooting_Godot/prefab/role/Enemy0001.tscn
@@ -25,14 +25,16 @@
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
-[node name="Enemy0001" node_paths=PackedStringArray("HurtArea", "MountPoint", "BackMountPoint", "InteractiveArea", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_5po38")]
+[node name="Enemy0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "MountPoint", "BackMountPoint", "InteractiveArea", "InteractiveCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_5po38")]
collision_layer = 16
collision_mask = 25
script = ExtResource("2_1plrq")
HurtArea = NodePath("HurtArea")
+HurtCollision = NodePath("HurtArea/HurtCollision")
MountPoint = NodePath("MountPoint")
BackMountPoint = NodePath("BackMountPoint")
InteractiveArea = NodePath("InteractiveArea")
+InteractiveCollision = NodePath("InteractiveArea/InteractiveCollision")
ShadowSprite = NodePath("ShadowSprite")
AnimatedSprite = NodePath("AnimatedSprite")
Collision = NodePath("Collision")
diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn
index 4560a76..b8e436d 100644
--- a/DungeonShooting_Godot/prefab/role/Role0001.tscn
+++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn
@@ -1,7 +1,7 @@
[gd_scene load_steps=7 format=3 uid="uid://cxhrcytrx0kcf"]
[ext_resource type="PackedScene" uid="uid://cyrcv2jdgr8cf" path="res://prefab/role/RoleTemplate.tscn" id="1_10c2n"]
-[ext_resource type="Script" path="res://src/game/activity/role/Player.cs" id="2_i08u4"]
+[ext_resource type="Script" path="res://src/game/activity/role/player/Player.cs" id="2_6xwnt"]
[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_rk4gg"]
[ext_resource type="SpriteFrames" uid="uid://n11thtali6es" path="res://resource/spriteFrames/role/Role0001.tres" id="4_galcc"]
@@ -25,13 +25,15 @@
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
-[node name="Role0001" node_paths=PackedStringArray("HurtArea", "MountPoint", "BackMountPoint", "InteractiveArea", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_10c2n")]
+[node name="Role0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "MountPoint", "BackMountPoint", "InteractiveArea", "InteractiveCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_10c2n")]
collision_layer = 8
-script = ExtResource("2_i08u4")
+script = ExtResource("2_6xwnt")
HurtArea = NodePath("HurtArea")
+HurtCollision = NodePath("HurtArea/HurtCollision")
MountPoint = NodePath("MountPoint")
BackMountPoint = NodePath("BackMountPoint")
InteractiveArea = NodePath("InteractiveArea")
+InteractiveCollision = NodePath("InteractiveArea/InteractiveCollision")
ShadowSprite = NodePath("ShadowSprite")
AnimatedSprite = NodePath("AnimatedSprite")
Collision = NodePath("Collision")
@@ -42,10 +44,3 @@
[node name="AnimatedSprite" parent="." index="2"]
material = SubResource("ShaderMaterial_8hgu2")
sprite_frames = ExtResource("4_galcc")
-frame_progress = 0.0995217
-
-[node name="CollisionShape2D" parent="HurtArea" index="0"]
-position = Vector2(0, -12)
-
-[node name="MountPoint" parent="." index="6"]
-position = Vector2(2, -8)
diff --git a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn b/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn
index fde7ce1..2217fee 100644
--- a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn
+++ b/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn
@@ -8,7 +8,7 @@
shader = ExtResource("1_xk5yk")
shader_parameter/blend = Color(0, 0, 0, 0.470588)
shader_parameter/schedule = 0.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = true
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
@@ -18,7 +18,7 @@
shader = ExtResource("1_xk5yk")
shader_parameter/blend = Color(1, 1, 1, 1)
shader_parameter/schedule = 0.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = true
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
@@ -54,7 +54,7 @@
collision_mask = 0
monitoring = false
-[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtArea"]
+[node name="HurtCollision" type="CollisionShape2D" parent="HurtArea"]
position = Vector2(0, -9)
shape = SubResource("RectangleShape2D_1eja2")
@@ -64,10 +64,10 @@
collision_mask = 4
monitorable = false
-[node name="Collision" type="CollisionShape2D" parent="InteractiveArea"]
+[node name="InteractiveCollision" type="CollisionShape2D" parent="InteractiveArea"]
position = Vector2(0, -5)
shape = SubResource("RectangleShape2D_n68nu")
[node name="MountPoint" type="Marker2D" parent="."]
-position = Vector2(1, -6)
+position = Vector2(2, -8)
script = ExtResource("2_5ddpw")
diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot
index 6dccd9a..ba66a76 100644
--- a/DungeonShooting_Godot/project.godot
+++ b/DungeonShooting_Godot/project.godot
@@ -114,32 +114,32 @@
}
move_left={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":97,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":100,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
move_up={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":119,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
]
}
move_down={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
]
}
exchangeWeapon={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":113,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"echo":false,"script":null)
]
}
throwWeapon={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":103,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"echo":false,"script":null)
]
}
mouse_roll_up={
@@ -154,32 +154,32 @@
}
interactive={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":101,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null)
]
}
reload={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":114,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null)
]
}
meleeAttack={
"deadzone": 0.5,
-"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(34.8, 12.8),"global_position":Vector2(38, 46),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)
]
}
roll={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(75, 15),"global_position":Vector2(79, 56),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
useActiveProp={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":102,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"echo":false,"script":null)
]
}
removeProp={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":120,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"echo":false,"script":null)
]
}
diff --git a/DungeonShooting_Godot/resource/config/ActivityObject.json b/DungeonShooting_Godot/resource/config/ActivityObject.json
index d66af1d..49cb525 100644
--- a/DungeonShooting_Godot/resource/config/ActivityObject.json
+++ b/DungeonShooting_Godot/resource/config/ActivityObject.json
@@ -155,7 +155,7 @@
"Name": "",
"Intro": "\u654C\u4EBA\u6B7B\u4EA1\u788E\u7247",
"Details": "",
- "Prefab": "res://prefab/effect/activityObject/Effect0001.tscn",
+ "Prefab": "res://prefab/effect/enemy/Effect0001.tscn",
"Icon": "",
"ShowInMapEditor": false
},
@@ -165,7 +165,7 @@
"Name": "\u978B\u5B50",
"Intro": "\u63D0\u9AD8\u79FB\u52A8\u901F\u5EA6",
"Details": "",
- "Prefab": "res://prefab/prop/buff/BuffProp0001.tscn",
+ "Prefab": "res://prefab/effect/enemy/Effect0001.tscn",
"Icon": "res://resource/sprite/prop/buff/BuffProp0001.png",
"ShowInMapEditor": true
},
diff --git a/DungeonShooting_Godot/resource/config/Weapon.json b/DungeonShooting_Godot/resource/config/Weapon.json
index 2ee18aa..1bf292c 100644
--- a/DungeonShooting_Godot/resource/config/Weapon.json
+++ b/DungeonShooting_Godot/resource/config/Weapon.json
@@ -20,42 +20,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 480,
"FinalFiringSpeed": 480,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 5,
"FinalScatteringRange": 45,
"ScatteringRangeAddValue": 3,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 2,
- "MaxBacklash": 4,
+ "BacklashRange": [
+ 2,
+ 4
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 10,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 300,
- "BulletMaxDistance": 400,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 350
+ ],
+ "BulletDistanceRange": [
+ 300,
+ 400
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0005",
"__BeginReloadSound": "reloadBegin0004",
"BeginReloadSoundDelayTime": 0.2,
@@ -92,42 +107,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 3,
- "MaxContinuousCount": 3,
+ "ContinuousCountRange": [
+ 3
+ ],
"TriggerInterval": 3,
"StartFiringSpeed": 480,
"FinalFiringSpeed": 480,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 5,
"FinalScatteringRange": 45,
"ScatteringRangeAddValue": 3,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 2,
- "MaxBacklash": 4,
+ "BacklashRange": [
+ 2,
+ 4
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 10,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 300,
- "BulletMaxDistance": 400,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 350
+ ],
+ "BulletDistanceRange": [
+ 300,
+ 400
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0005",
"__BeginReloadSound": "reloadBegin0004",
"BeginReloadSoundDelayTime": 0.2,
@@ -164,42 +194,58 @@
"ManualBeLoaded": true,
"AutoManualBeLoaded": true,
"BeLoadedTime": 0.6,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 120,
"FinalFiringSpeed": 120,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 5,
- "MaxFireBulletCount": 5,
+ "FireBulletCountRange": [
+ 5
+ ],
"DelayedTime": 0,
"StartScatteringRange": 12,
"FinalScatteringRange": 30,
"ScatteringRangeAddValue": 20,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 5,
- "MaxBacklash": 6,
+ "BacklashRange": [
+ 5,
+ 6
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 15,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0002",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": -10,
- "BulletMaxDeviationAngle": 10,
- "BulletMaxSpeed": 280,
- "BulletMinSpeed": 380,
- "BulletMinDistance": 200,
- "BulletMaxDistance": 250,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ -10,
+ 10
+ ],
+ "BulletSpeedRange": [
+ 280,
+ 380
+ ],
+ "BulletDistanceRange": [
+ 200,
+ 250
+ ],
"ShellId": "shell0002",
"ThrowShellDelayTime": 0.2,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0003",
"__BeginReloadSound": "reloadBegin0002",
"BeginReloadSoundDelayTime": 0,
@@ -236,42 +282,58 @@
"ManualBeLoaded": true,
"AutoManualBeLoaded": true,
"BeLoadedTime": 0.6,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 3.5,
"StartFiringSpeed": 120,
"FinalFiringSpeed": 120,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 5,
- "MaxFireBulletCount": 5,
+ "FireBulletCountRange": [
+ 5
+ ],
"DelayedTime": 0,
"StartScatteringRange": 12,
"FinalScatteringRange": 30,
"ScatteringRangeAddValue": 20,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 5,
- "MaxBacklash": 6,
+ "BacklashRange": [
+ 5,
+ 6
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 15,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0002",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": -10,
- "BulletMaxDeviationAngle": 10,
- "BulletMaxSpeed": 280,
- "BulletMinSpeed": 380,
- "BulletMinDistance": 200,
- "BulletMaxDistance": 250,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ -10,
+ 10
+ ],
+ "BulletSpeedRange": [
+ 280,
+ 380
+ ],
+ "BulletDistanceRange": [
+ 200,
+ 250
+ ],
"ShellId": "shell0002",
"ThrowShellDelayTime": 0.2,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0003",
"__BeginReloadSound": "reloadBegin0002",
"BeginReloadSoundDelayTime": 0,
@@ -308,42 +370,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0.05,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 460,
"FinalFiringSpeed": 460,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 5,
"FinalScatteringRange": 25,
"ScatteringRangeAddValue": 4,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 3,
- "MaxBacklash": 5,
+ "BacklashRange": [
+ 3,
+ 5
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 20,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 250,
- "BulletMaxDistance": 300,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 350
+ ],
+ "BulletDistanceRange": [
+ 250,
+ 300
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0004",
"__BeginReloadSound": "reloading0001",
"BeginReloadSoundDelayTime": 0,
@@ -380,42 +457,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0.05,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 2,
"StartFiringSpeed": 300,
"FinalFiringSpeed": 300,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 5,
"FinalScatteringRange": 25,
"ScatteringRangeAddValue": 4,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.5,
- "MinBacklash": 3,
- "MaxBacklash": 5,
+ "BacklashRange": [
+ 3,
+ 5
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 20,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 4,
- "BulletMinHarm": 4,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 250,
- "BulletMaxDistance": 300,
+ "BulletHarmRange": [
+ 4
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 350
+ ],
+ "BulletDistanceRange": [
+ 250,
+ 300
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0004",
"__BeginReloadSound": "reloading0001",
"BeginReloadSoundDelayTime": 0,
@@ -452,42 +544,54 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 180,
"FinalFiringSpeed": 180,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 0,
"FinalScatteringRange": 0,
"ScatteringRangeAddValue": 0,
"ScatteringRangeBackSpeed": 0,
"ScatteringRangeBackDelayTime": 0,
- "MinBacklash": -8,
- "MaxBacklash": -8,
+ "BacklashRange": [
+ -8
+ ],
"BacklashRegressionSpeed": 24,
"UpliftAngle": -95,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 25,
- "BulletMinHarm": 25,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 350,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 35,
- "BulletMaxDistance": 35,
+ "BulletHarmRange": [
+ 25
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 350
+ ],
+ "BulletDistanceRange": [
+ 35
+ ],
"ShellId": "",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "",
"__BeginReloadSound": "",
"BeginReloadSoundDelayTime": 0,
@@ -524,42 +628,54 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 3,
"StartFiringSpeed": 180,
"FinalFiringSpeed": 180,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 0,
"FinalScatteringRange": 0,
"ScatteringRangeAddValue": 0,
"ScatteringRangeBackSpeed": 0,
"ScatteringRangeBackDelayTime": 0,
- "MinBacklash": -8,
- "MaxBacklash": -8,
+ "BacklashRange": [
+ -8
+ ],
"BacklashRegressionSpeed": 24,
"UpliftAngle": -95,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 25,
- "BulletMinHarm": 25,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 350,
- "BulletMinSpeed": 350,
- "BulletMinDistance": 35,
- "BulletMaxDistance": 35,
+ "BulletHarmRange": [
+ 25
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 350
+ ],
+ "BulletDistanceRange": [
+ 35
+ ],
"ShellId": "",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "",
"__BeginReloadSound": "",
"BeginReloadSoundDelayTime": 0,
@@ -596,42 +712,57 @@
"ManualBeLoaded": true,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0.9,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 150,
"FinalFiringSpeed": 150,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 3,
"FinalScatteringRange": 60,
"ScatteringRangeAddValue": 40,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.8,
- "MinBacklash": 5,
- "MaxBacklash": 7,
+ "BacklashRange": [
+ 5,
+ 7
+ ],
"BacklashRegressionSpeed": 20,
"UpliftAngle": 15,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 30,
- "BulletMinHarm": 30,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 600,
- "BulletMinSpeed": 620,
- "BulletMinDistance": 700,
- "BulletMaxDistance": 900,
+ "BulletHarmRange": [
+ 30
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 600,
+ 620
+ ],
+ "BulletDistanceRange": [
+ 700,
+ 900
+ ],
"ShellId": "shell0003",
"ThrowShellDelayTime": 0.2,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0008",
"__BeginReloadSound": "reloadBegin0009",
"BeginReloadSoundDelayTime": 0,
@@ -668,42 +799,57 @@
"ManualBeLoaded": true,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0.9,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 5,
"StartFiringSpeed": 150,
"FinalFiringSpeed": 150,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 3,
"FinalScatteringRange": 60,
"ScatteringRangeAddValue": 40,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.8,
- "MinBacklash": 5,
- "MaxBacklash": 7,
+ "BacklashRange": [
+ 5,
+ 7
+ ],
"BacklashRegressionSpeed": 20,
"UpliftAngle": 15,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0001",
- "BulletMaxHarm": 30,
- "BulletMinHarm": 30,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 600,
- "BulletMinSpeed": 620,
- "BulletMinDistance": 700,
- "BulletMaxDistance": 900,
+ "BulletHarmRange": [
+ 30
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 600,
+ 620
+ ],
+ "BulletDistanceRange": [
+ 700,
+ 900
+ ],
"ShellId": "shell0003",
"ThrowShellDelayTime": 0.2,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0008",
"__BeginReloadSound": "reloadBegin0009",
"BeginReloadSoundDelayTime": 0,
@@ -740,42 +886,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 700,
"FinalFiringSpeed": 700,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 3,
"FinalScatteringRange": 30,
"ScatteringRangeAddValue": 2,
"ScatteringRangeBackSpeed": 40,
"ScatteringRangeBackDelayTime": 0.3,
- "MinBacklash": 1,
- "MaxBacklash": 2,
+ "BacklashRange": [
+ 1,
+ 2
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 5,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0002",
- "BulletMaxHarm": 3,
- "BulletMinHarm": 3,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 340,
- "BulletMinDistance": 300,
- "BulletMaxDistance": 400,
+ "BulletHarmRange": [
+ 3
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 340
+ ],
+ "BulletDistanceRange": [
+ 300,
+ 400
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0002",
"__BeginReloadSound": "reloadBegin0005",
"BeginReloadSoundDelayTime": 0.2,
@@ -812,42 +973,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 5,
- "MaxContinuousCount": 5,
+ "ContinuousCountRange": [
+ 5
+ ],
"TriggerInterval": 3.5,
"StartFiringSpeed": 700,
"FinalFiringSpeed": 700,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 3,
"FinalScatteringRange": 30,
"ScatteringRangeAddValue": 2,
"ScatteringRangeBackSpeed": 30,
"ScatteringRangeBackDelayTime": 0.3,
- "MinBacklash": 1,
- "MaxBacklash": 2,
+ "BacklashRange": [
+ 1,
+ 2
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 5,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0002",
- "BulletMaxHarm": 3,
- "BulletMinHarm": 3,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 320,
- "BulletMinSpeed": 340,
- "BulletMinDistance": 300,
- "BulletMaxDistance": 400,
+ "BulletHarmRange": [
+ 3
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 320,
+ 340
+ ],
+ "BulletDistanceRange": [
+ 300,
+ 400
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0002",
"__BeginReloadSound": "reloadBegin0005",
"BeginReloadSoundDelayTime": 0.2,
@@ -884,42 +1060,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 1,
- "MaxContinuousCount": 1,
+ "ContinuousCountRange": [
+ 1
+ ],
"TriggerInterval": 0,
"StartFiringSpeed": 700,
"FinalFiringSpeed": 700,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 6,
"FinalScatteringRange": 60,
"ScatteringRangeAddValue": 3,
"ScatteringRangeBackSpeed": 50,
"ScatteringRangeBackDelayTime": 0.3,
- "MinBacklash": 1,
- "MaxBacklash": 2,
+ "BacklashRange": [
+ 1,
+ 2
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 5,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0003",
- "BulletMaxHarm": 3,
- "BulletMinHarm": 3,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 300,
- "BulletMinSpeed": 330,
- "BulletMinDistance": 270,
- "BulletMaxDistance": 360,
+ "BulletHarmRange": [
+ 3
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 300,
+ 330
+ ],
+ "BulletDistanceRange": [
+ 270,
+ 360
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0007",
"__BeginReloadSound": "reloadBegin0006",
"BeginReloadSoundDelayTime": 0.2,
@@ -956,42 +1147,57 @@
"ManualBeLoaded": false,
"AutoManualBeLoaded": false,
"BeLoadedTime": 0,
- "MinContinuousCount": 10,
- "MaxContinuousCount": 10,
+ "ContinuousCountRange": [
+ 10
+ ],
"TriggerInterval": 5,
"StartFiringSpeed": 200,
"FinalFiringSpeed": 200,
"FiringSpeedAddSpeed": 0,
"FiringSpeedBackSpeed": 0,
- "MinFireBulletCount": 1,
- "MaxFireBulletCount": 1,
+ "FireBulletCountRange": [
+ 1
+ ],
"DelayedTime": 0,
"StartScatteringRange": 10,
"FinalScatteringRange": 30,
"ScatteringRangeAddValue": 3,
"ScatteringRangeBackSpeed": 50,
"ScatteringRangeBackDelayTime": 0.3,
- "MinBacklash": 1,
- "MaxBacklash": 2,
+ "BacklashRange": [
+ 1,
+ 2
+ ],
"BacklashRegressionSpeed": 35,
"UpliftAngle": 5,
"DefaultAngle": 0,
"UpliftAngleRestore": 1,
"BulletId": "bullet0003",
- "BulletMaxHarm": 3,
- "BulletMinHarm": 3,
- "BulletMinDeviationAngle": 0,
- "BulletMaxDeviationAngle": 0,
- "BulletMaxSpeed": 300,
- "BulletMinSpeed": 330,
- "BulletMinDistance": 270,
- "BulletMaxDistance": 360,
+ "BulletHarmRange": [
+ 3
+ ],
+ "BulletDeviationAngleRange": [
+ 0
+ ],
+ "BulletSpeedRange": [
+ 300,
+ 330
+ ],
+ "BulletDistanceRange": [
+ 270,
+ 360
+ ],
"ShellId": "shell0001",
"ThrowShellDelayTime": 0,
"ThrowCollisionSize": {
"X": 20,
"Y": 15
},
+ "CanMeleeAttack": true,
+ "MeleeAttackHarmRange": [
+ 5,
+ 8
+ ],
"__ShootSound": "shooting0007",
"__BeginReloadSound": "reloadBegin0006",
"BeginReloadSoundDelayTime": 0.2,
diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json
index 131108d..1c55d41 100644
--- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json
+++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json
@@ -1 +1 @@
-[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":10,"Y":22},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":11,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-12,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]}]
\ No newline at end of file
+[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":10,"Y":22},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":11,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-12,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-36,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":56,"Y":-24},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}]
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Collision.png b/DungeonShooting_Godot/resource/sprite/effects/Collision.png
deleted file mode 100644
index f15c822..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Collision.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Collision.png.import b/DungeonShooting_Godot/resource/sprite/effects/Collision.png.import
deleted file mode 100644
index a7cddfb..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Collision.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dwa4chrugc6b1"
-path="res://.godot/imported/Collision.png-c44899b0822a30bd5fe788c9b566e1c7.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/sprite/effects/Collision.png"
-dest_files=["res://.godot/imported/Collision.png-c44899b0822a30bd5fe788c9b566e1c7.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Effect1.png b/DungeonShooting_Godot/resource/sprite/effects/Effect1.png
deleted file mode 100644
index 51ef9a9..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Effect1.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Effect1.png.import b/DungeonShooting_Godot/resource/sprite/effects/Effect1.png.import
deleted file mode 100644
index 73c78cc..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Effect1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://csud4e6kc3iku"
-path="res://.godot/imported/Effect1.png-851e49cafde0258e42b0cba6b7034139.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/sprite/effects/Effect1.png"
-dest_files=["res://.godot/imported/Effect1.png-851e49cafde0258e42b0cba6b7034139.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png b/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png
deleted file mode 100644
index 83465d0..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png.import b/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png.import
deleted file mode 100644
index 1e10427..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/KnifeHit1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dx07ta0asnmuw"
-path="res://.godot/imported/KnifeHit1.png-6ddd3aef14cf0bb7d2f668cd41ac74d0.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/sprite/effects/KnifeHit1.png"
-dest_files=["res://.godot/imported/KnifeHit1.png-6ddd3aef14cf0bb7d2f668cd41ac74d0.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png b/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png
deleted file mode 100644
index 5c6d63a..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png.import b/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png.import
deleted file mode 100644
index 6eda108..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/ShotFire.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b0jsyrbk4bydt"
-path="res://.godot/imported/ShotFire.png-19fbeb61d685dfc2c763d73aa70d548b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/sprite/effects/ShotFire.png"
-dest_files=["res://.godot/imported/ShotFire.png-19fbeb61d685dfc2c763d73aa70d548b.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Smoke.png b/DungeonShooting_Godot/resource/sprite/effects/Smoke.png
deleted file mode 100644
index f358c57..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Smoke.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/Smoke.png.import b/DungeonShooting_Godot/resource/sprite/effects/Smoke.png.import
deleted file mode 100644
index 11eadf7..0000000
--- a/DungeonShooting_Godot/resource/sprite/effects/Smoke.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://h7hkgbwj1li"
-path="res://.godot/imported/Smoke.png-6cf8f8f0055f43a859d02942814cba94.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/sprite/effects/Smoke.png"
-dest_files=["res://.godot/imported/Smoke.png-6cf8f8f0055f43a859d02942814cba94.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png
new file mode 100644
index 0000000..51ef9a9
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import
new file mode 100644
index 0000000..ded10aa
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csud4e6kc3iku"
+path="res://.godot/imported/Effect1.png-b381c54ce9f36be8da8d9d5787e0d539.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/common/Effect1.png"
+dest_files=["res://.godot/imported/Effect1.png-b381c54ce9f36be8da8d9d5787e0d539.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png
new file mode 100644
index 0000000..f358c57
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import
new file mode 100644
index 0000000..d7f7f6e
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://h7hkgbwj1li"
+path="res://.godot/imported/Smoke.png-c890fc56df0c1a3ef083465f2627ab8b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/common/Smoke.png"
+dest_files=["res://.godot/imported/Smoke.png-c890fc56df0c1a3ef083465f2627ab8b.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png
new file mode 100644
index 0000000..f15c822
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import
new file mode 100644
index 0000000..1737a56
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dwa4chrugc6b1"
+path="res://.godot/imported/Collision1.png-21b57f1716aaa61033dc15fa90c3af13.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/weapon/Collision1.png"
+dest_files=["res://.godot/imported/Collision1.png-21b57f1716aaa61033dc15fa90c3af13.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png
new file mode 100644
index 0000000..83465d0
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import
new file mode 100644
index 0000000..890932d
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dx07ta0asnmuw"
+path="res://.godot/imported/KnifeHit1.png-2f433b2240ee3b74ce7f49e4905f3ded.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/weapon/KnifeHit1.png"
+dest_files=["res://.godot/imported/KnifeHit1.png-2f433b2240ee3b74ce7f49e4905f3ded.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png
new file mode 100644
index 0000000..c22890a
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import
new file mode 100644
index 0000000..1faa5b9
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://7jhe2mmctmr1"
+path="res://.godot/imported/MeleeAttack1.png-fcea1547355ce99fe204cf5180b8c02d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/weapon/MeleeAttack1.png"
+dest_files=["res://.godot/imported/MeleeAttack1.png-fcea1547355ce99fe204cf5180b8c02d.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
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png
new file mode 100644
index 0000000..5c6d63a
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import
new file mode 100644
index 0000000..66623d6
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b0jsyrbk4bydt"
+path="res://.godot/imported/ShotFire.png-c837a3bb80e273a615c459f36fadc870.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effects/weapon/ShotFire.png"
+dest_files=["res://.godot/imported/ShotFire.png-c837a3bb80e273a615c459f36fadc870.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
diff --git a/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres b/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres
index a491979..e519ec9 100644
--- a/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres
+++ b/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres
@@ -1,6 +1,6 @@
[gd_resource type="SpriteFrames" load_steps=8 format=3 uid="uid://dj8o7ws03bik4"]
-[ext_resource type="Texture2D" uid="uid://dx07ta0asnmuw" path="res://resource/sprite/effects/KnifeHit1.png" id="1_0yl3h"]
+[ext_resource type="Texture2D" uid="uid://dx07ta0asnmuw" path="res://resource/sprite/effects/weapon/KnifeHit1.png" id="1_0yl3h"]
[sub_resource type="AtlasTexture" id="1"]
atlas = ExtResource("1_0yl3h")
diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres
index e262de5..8205354 100644
--- a/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres
+++ b/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres
@@ -1,4 +1,4 @@
-[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://n11thtali6es"]
+[gd_resource type="SpriteFrames" load_steps=21 format=3 uid="uid://n11thtali6es"]
[ext_resource type="Texture2D" uid="uid://ekas4lqprrml" path="res://resource/sprite/role/role0001/idle/Sprite-0002.png" id="1_le6bk"]
[ext_resource type="Texture2D" uid="uid://b81k08ofpf2oo" path="res://resource/sprite/role/role0001/idle/Sprite-0003.png" id="2_whsc2"]
@@ -14,6 +14,12 @@
[ext_resource type="Texture2D" uid="uid://d32g0f5vk68sj" path="res://resource/sprite/role/role0001/run/Sprite-0004.png" id="12_cbabh"]
[ext_resource type="Texture2D" uid="uid://cw83liyy6gnln" path="res://resource/sprite/role/role0001/run/Sprite-0003.png" id="13_u0cmp"]
[ext_resource type="Texture2D" uid="uid://b1gh481w2xvsl" path="res://resource/sprite/role/role0001/run/Sprite-0002.png" id="14_nlfq5"]
+[ext_resource type="Texture2D" uid="uid://sknj4eflhbvc" path="res://resource/sprite/role/role0001/roll/Sprite-0004.png" id="17_xnddk"]
+[ext_resource type="Texture2D" uid="uid://c8ijooj30lvpw" path="res://resource/sprite/role/role0001/roll/Sprite-0005.png" id="18_1doii"]
+[ext_resource type="Texture2D" uid="uid://blqx76rvx6c34" path="res://resource/sprite/role/role0001/roll/Sprite-0006.png" id="19_ilt25"]
+[ext_resource type="Texture2D" uid="uid://48qebkjqggub" path="res://resource/sprite/role/role0001/roll/Sprite-0007.png" id="20_tp03g"]
+[ext_resource type="Texture2D" uid="uid://dvrxriqd6dk1d" path="res://resource/sprite/role/role0001/roll/Sprite-0008.png" id="21_oocqa"]
+[ext_resource type="Texture2D" uid="uid://ceqi6d4vhbpt" path="res://resource/sprite/role/role0001/roll/Sprite-0009.png" id="22_yc5ek"]
[resource]
animations = [{
@@ -53,9 +59,6 @@
}, {
"frames": [{
"duration": 1.0,
-"texture": ExtResource("8_scwvl")
-}, {
-"duration": 1.0,
"texture": ExtResource("9_yjs5f")
}, {
"duration": 1.0,
@@ -72,6 +75,9 @@
}, {
"duration": 1.0,
"texture": ExtResource("14_nlfq5")
+}, {
+"duration": 1.0,
+"texture": ExtResource("8_scwvl")
}],
"loop": true,
"name": &"reverseRun",
@@ -79,6 +85,29 @@
}, {
"frames": [{
"duration": 1.0,
+"texture": ExtResource("17_xnddk")
+}, {
+"duration": 1.0,
+"texture": ExtResource("18_1doii")
+}, {
+"duration": 1.0,
+"texture": ExtResource("19_ilt25")
+}, {
+"duration": 1.0,
+"texture": ExtResource("20_tp03g")
+}, {
+"duration": 1.0,
+"texture": ExtResource("21_oocqa")
+}, {
+"duration": 1.0,
+"texture": ExtResource("22_yc5ek")
+}],
+"loop": false,
+"name": &"roll",
+"speed": 15.0
+}, {
+"frames": [{
+"duration": 1.0,
"texture": ExtResource("14_nlfq5")
}, {
"duration": 1.0,
diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres
index dd4a35a..600ba06 100644
--- a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres
+++ b/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres
@@ -1,6 +1,6 @@
[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://cnctpyrn02rhd"]
-[ext_resource type="Texture2D" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_xi6qw"]
+[ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_xi6qw"]
[sub_resource type="AtlasTexture" id="AtlasTexture_jttte"]
atlas = ExtResource("1_xi6qw")
diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_Weapon.cs b/DungeonShooting_Godot/src/config/ExcelConfig_Weapon.cs
index 7c87cef..8f2f8ec 100644
--- a/DungeonShooting_Godot/src/config/ExcelConfig_Weapon.cs
+++ b/DungeonShooting_Godot/src/config/ExcelConfig_Weapon.cs
@@ -131,16 +131,11 @@
public float BeLoadedTime;
///
- /// 连续发射最小次数, 仅当 'ContinuousShoot' 为 false 时生效
+ /// 连续发射次数范围, 仅当 'ContinuousShoot' 为 false 时生效
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public int MinContinuousCount;
-
- ///
- /// 连续发射最大次数, 仅当 'ContinuousShoot' 为 false 时生效
- ///
- [JsonInclude]
- public int MaxContinuousCount;
+ public int[] ContinuousCountRange;
///
/// 按下一次扳机后需要多长时间才能再次感应按下
@@ -173,16 +168,11 @@
public float FiringSpeedBackSpeed;
///
- /// 单次开火发射子弹最小数量
+ /// 单次开火发射子弹数量范围
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public int MinFireBulletCount;
-
- ///
- /// 单次开火发射子弹最大数量
- ///
- [JsonInclude]
- public int MaxFireBulletCount;
+ public int[] FireBulletCountRange;
///
/// 从按下扳机到发射第一发子弹的延时时, 如果中途松开扳机, 那么延时时间会重新计算, 必须将 'LooseShoot' 设置为 false
@@ -221,16 +211,11 @@
public float ScatteringRangeBackDelayTime;
///
- /// 最小后坐力 (仅用于开火后武器身抖动)
+ /// 后坐力范围 (仅用于开火后武器身抖动)
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public float MinBacklash;
-
- ///
- /// 最大后坐力 (仅用于开火后武器身抖动)
- ///
- [JsonInclude]
- public float MaxBacklash;
+ public float[] BacklashRange;
///
/// 后坐力偏移回归回归速度
@@ -263,53 +248,33 @@
public string BulletId;
///
- /// 子弹造成的最大伤害
+ /// 子弹造成的伤害范围
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public int BulletMaxHarm;
+ public int[] BulletHarmRange;
///
- /// 子弹造成的最小伤害
+ /// 子弹偏移角度范围
+ /// 用于设置子弹偏移朝向, 该属性和射半径效果类似, 但与其不同的是, 散射半径是用来控制枪口朝向的, 而该属性是控制子弹朝向的, 可用于制作霰弹枪子弹效果
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public int BulletMinHarm;
+ public float[] BulletDeviationAngleRange;
///
- /// 子弹最小偏移角度
- /// 用于设置子弹偏移朝向, 该属性和射半径效果类似, 但与其不同的是, 散射半径是用来控制枪口朝向的, 而该属性是控制子弹朝向的, 可用于制作霰弹枪子弹效果
+ /// 子弹初速度范围
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public float BulletMinDeviationAngle;
+ public float[] BulletSpeedRange;
///
- /// 子弹最大偏移角度
+ /// 子弹飞行距离范围
+ /// 格式为[value]或者[min,max]
///
[JsonInclude]
- public float BulletMaxDeviationAngle;
-
- ///
- /// 子弹最大初速度
- ///
- [JsonInclude]
- public float BulletMaxSpeed;
-
- ///
- /// 子弹最小初速度
- ///
- [JsonInclude]
- public float BulletMinSpeed;
-
- ///
- /// 子弹飞行最小距离
- ///
- [JsonInclude]
- public float BulletMinDistance;
-
- ///
- /// 子弹飞行最大距离
- ///
- [JsonInclude]
- public float BulletMaxDistance;
+ public float[] BulletDistanceRange;
///
/// 默认抛出的弹壳
@@ -331,6 +296,19 @@
public SerializeVector2 ThrowCollisionSize;
///
+ /// 是否可以触发近战攻击
+ ///
+ [JsonInclude]
+ public bool CanMeleeAttack;
+
+ ///
+ /// 近战攻击伤害范围
+ /// 格式为格式为[value]或者[min,max]
+ ///
+ [JsonInclude]
+ public int[] MeleeAttackHarmRange;
+
+ ///
/// 射击音效
///
public Sound ShootSound;
@@ -439,39 +417,34 @@
inst.ManualBeLoaded = ManualBeLoaded;
inst.AutoManualBeLoaded = AutoManualBeLoaded;
inst.BeLoadedTime = BeLoadedTime;
- inst.MinContinuousCount = MinContinuousCount;
- inst.MaxContinuousCount = MaxContinuousCount;
+ inst.ContinuousCountRange = ContinuousCountRange;
inst.TriggerInterval = TriggerInterval;
inst.StartFiringSpeed = StartFiringSpeed;
inst.FinalFiringSpeed = FinalFiringSpeed;
inst.FiringSpeedAddSpeed = FiringSpeedAddSpeed;
inst.FiringSpeedBackSpeed = FiringSpeedBackSpeed;
- inst.MinFireBulletCount = MinFireBulletCount;
- inst.MaxFireBulletCount = MaxFireBulletCount;
+ inst.FireBulletCountRange = FireBulletCountRange;
inst.DelayedTime = DelayedTime;
inst.StartScatteringRange = StartScatteringRange;
inst.FinalScatteringRange = FinalScatteringRange;
inst.ScatteringRangeAddValue = ScatteringRangeAddValue;
inst.ScatteringRangeBackSpeed = ScatteringRangeBackSpeed;
inst.ScatteringRangeBackDelayTime = ScatteringRangeBackDelayTime;
- inst.MinBacklash = MinBacklash;
- inst.MaxBacklash = MaxBacklash;
+ inst.BacklashRange = BacklashRange;
inst.BacklashRegressionSpeed = BacklashRegressionSpeed;
inst.UpliftAngle = UpliftAngle;
inst.DefaultAngle = DefaultAngle;
inst.UpliftAngleRestore = UpliftAngleRestore;
inst.BulletId = BulletId;
- inst.BulletMaxHarm = BulletMaxHarm;
- inst.BulletMinHarm = BulletMinHarm;
- inst.BulletMinDeviationAngle = BulletMinDeviationAngle;
- inst.BulletMaxDeviationAngle = BulletMaxDeviationAngle;
- inst.BulletMaxSpeed = BulletMaxSpeed;
- inst.BulletMinSpeed = BulletMinSpeed;
- inst.BulletMinDistance = BulletMinDistance;
- inst.BulletMaxDistance = BulletMaxDistance;
+ inst.BulletHarmRange = BulletHarmRange;
+ inst.BulletDeviationAngleRange = BulletDeviationAngleRange;
+ inst.BulletSpeedRange = BulletSpeedRange;
+ inst.BulletDistanceRange = BulletDistanceRange;
inst.ShellId = ShellId;
inst.ThrowShellDelayTime = ThrowShellDelayTime;
inst.ThrowCollisionSize = ThrowCollisionSize;
+ inst.CanMeleeAttack = CanMeleeAttack;
+ inst.MeleeAttackHarmRange = MeleeAttackHarmRange;
inst.ShootSound = ShootSound;
inst.BeginReloadSound = BeginReloadSound;
inst.BeginReloadSoundDelayTime = BeginReloadSoundDelayTime;
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
index d5c52fa..fd0bd6d 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
@@ -425,7 +425,7 @@
_prevAnimationFrame = frame;
IsShowShadow = true;
- CalcTransform();
+ CalcShadowTransform();
ShadowSprite.Visible = true;
}
@@ -659,7 +659,7 @@
{
//注意需要延时调用
CallDeferred(nameof(ShowShadowSprite));
- CalcTransform();
+ CalcShadowTransform();
}
}
else
@@ -1008,7 +1008,7 @@
_prevAnimationFrame = frame;
//计算阴影
- CalcTransform();
+ CalcShadowTransform();
}
// Hit 动画
@@ -1136,7 +1136,7 @@
///
/// 重新计算物体阴影的位置和旋转信息, 无论是否显示阴影
///
- public void CalcTransform()
+ public void CalcShadowTransform()
{
//缩放
ShadowSprite.Scale = AnimatedSprite.Scale;
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs
index a94b145..8b3dd8a 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs
@@ -188,8 +188,8 @@
_activityRegisterMap.Add("shell0001", new RegisterActivityData("res://prefab/shell/Shell0001.tscn", ExcelConfig.ActivityObject_Map["shell0001"]));
_activityRegisterMap.Add("shell0002", new RegisterActivityData("res://prefab/shell/Shell0002.tscn", ExcelConfig.ActivityObject_Map["shell0002"]));
_activityRegisterMap.Add("shell0003", new RegisterActivityData("res://prefab/shell/Shell0003.tscn", ExcelConfig.ActivityObject_Map["shell0003"]));
- _activityRegisterMap.Add("effect0001", new RegisterActivityData("res://prefab/effect/activityObject/Effect0001.tscn", ExcelConfig.ActivityObject_Map["effect0001"]));
- _activityRegisterMap.Add("prop0001", new RegisterActivityData("res://prefab/prop/buff/BuffProp0001.tscn", ExcelConfig.ActivityObject_Map["prop0001"]));
+ _activityRegisterMap.Add("effect0001", new RegisterActivityData("res://prefab/effect/enemy/Effect0001.tscn", ExcelConfig.ActivityObject_Map["effect0001"]));
+ _activityRegisterMap.Add("prop0001", new RegisterActivityData("res://prefab/effect/enemy/Effect0001.tscn", ExcelConfig.ActivityObject_Map["prop0001"]));
_activityRegisterMap.Add("prop0002", new RegisterActivityData("res://prefab/prop/buff/BuffProp0002.tscn", ExcelConfig.ActivityObject_Map["prop0002"]));
_activityRegisterMap.Add("prop0003", new RegisterActivityData("res://prefab/prop/buff/BuffProp0003.tscn", ExcelConfig.ActivityObject_Map["prop0003"]));
_activityRegisterMap.Add("prop0004", new RegisterActivityData("res://prefab/prop/buff/BuffProp0004.tscn", ExcelConfig.ActivityObject_Map["prop0004"]));
diff --git a/DungeonShooting_Godot/src/framework/activity/Component.cs b/DungeonShooting_Godot/src/framework/activity/Component.cs
index f96b8dd..ec1897d 100644
--- a/DungeonShooting_Godot/src/framework/activity/Component.cs
+++ b/DungeonShooting_Godot/src/framework/activity/Component.cs
@@ -1,10 +1,11 @@
+using System.Collections;
using Godot;
///
/// 组件基类, 用于挂载到游戏物体上, 相比于原生 Node 更加轻量化, 实例化 Component 不会创建额外的 Node, 可以大量添加组件
///
-public abstract class Component : IProcess, IDestroy
+public abstract class Component : IProcess, IDestroy, ICoroutine
{
///
/// 当前组件所挂载的游戏对象
@@ -212,4 +213,24 @@
ActivityInstance.RemoveComponent(this);
OnDestroy();
}
+
+ public long StartCoroutine(IEnumerator able)
+ {
+ return ActivityInstance.StartCoroutine(able);
+ }
+
+ public void StopCoroutine(long coroutineId)
+ {
+ ActivityInstance.StopCoroutine(coroutineId);
+ }
+
+ public bool IsCoroutineOver(long coroutineId)
+ {
+ return ActivityInstance.IsCoroutineOver(coroutineId);
+ }
+
+ public void StopAllCoroutine()
+ {
+ ActivityInstance.StopAllCoroutine();
+ }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs
index 35da336..6fd42c4 100644
--- a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs
+++ b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs
@@ -78,6 +78,22 @@
}
///
+ /// 根据配置表中配置的范围数据, 随机返回范围内的一个值
+ ///
+ public int RandomConfigRange(int[] range)
+ {
+ return RandomRangeInt(Utils.GetConfigRangeStart(range), Utils.GetConfigRangeEnd(range));
+ }
+
+ ///
+ /// 根据配置表中配置的范围数据, 随机返回范围内的一个值
+ ///
+ public float RandomConfigRange(float[] range)
+ {
+ return RandomRangeFloat(Utils.GetConfigRangeStart(range), Utils.GetConfigRangeEnd(range));
+ }
+
+ ///
/// 随机返回其中一个参数
///
public T RandomChoose(params T[] list)
diff --git a/DungeonShooting_Godot/src/framework/common/Utils.cs b/DungeonShooting_Godot/src/framework/common/Utils.cs
index ea77986..762dad8 100644
--- a/DungeonShooting_Godot/src/framework/common/Utils.cs
+++ b/DungeonShooting_Godot/src/framework/common/Utils.cs
@@ -1,5 +1,3 @@
-using System;
-using System.Collections.Generic;
using Godot;
///
@@ -171,4 +169,46 @@
return pos.X >= rect2.Position.X && pos.X <= rect2.Position.X + rect2.Size.X &&
pos.Y >= rect2.Position.Y && pos.Y <= rect2.Position.Y + rect2.Size.Y;
}
+
+ ///
+ /// 返回区域起始值, 用于获取配置表范围配置数据
+ ///
+ public static int GetConfigRangeStart(int[] range)
+ {
+ return range[0];
+ }
+
+ ///
+ /// 返回区域结束值, 用于获取配置表范围配置数据
+ ///
+ public static int GetConfigRangeEnd(int[] range)
+ {
+ if (range.Length > 1)
+ {
+ return range[1];
+ }
+
+ return range[0];
+ }
+
+ ///
+ /// 返回区域起始值, 用于获取配置表范围配置数据
+ ///
+ public static float GetConfigRangeStart(float[] range)
+ {
+ return range[0];
+ }
+
+ ///
+ /// 返回区域结束值, 用于获取配置表范围配置数据
+ ///
+ public static float GetConfigRangeEnd(float[] range)
+ {
+ if (range.Length > 1)
+ {
+ return range[1];
+ }
+
+ return range[0];
+ }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs
index 9536b85..5aef09a 100644
--- a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs
+++ b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs
@@ -298,7 +298,7 @@
activityObject.StartCoroutine(OnActivityObjectBirth(activityObject));
activityObject.PutDown(GetDefaultLayer(activityMark));
- var effect1 = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_Effect1_tscn);
+ var effect1 = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_common_Effect1_tscn);
effect1.Position = activityObject.Position + new Vector2(0, -activityMark.Altitude);
effect1.AddToActivityRoot(RoomLayerEnum.YSortLayer);
}
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs
index 350cc34..e3f87cd 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs
@@ -100,7 +100,7 @@
if (lastSlideCollision != null)
{
//创建粒子特效
- var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_BulletSmoke_tscn);
+ var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletSmoke_tscn);
var smoke = packedScene.Instantiate();
smoke.GlobalPosition = lastSlideCollision.GetPosition();
smoke.GlobalRotation = lastSlideCollision.GetNormal().Angle();
@@ -113,7 +113,7 @@
CurrFlyDistance += FlySpeed * delta;
if (CurrFlyDistance >= MaxDistance)
{
- var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_BulletDisappear_tscn);
+ var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletDisappear_tscn);
var node = packedScene.Instantiate();
node.GlobalPosition = GlobalPosition;
node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
@@ -127,7 +127,7 @@
var role = other.AsActivityObject();
if (role != null)
{
- var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_BulletDisappear_tscn);
+ var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletDisappear_tscn);
var node = packedScene.Instantiate();
node.GlobalPosition = GlobalPosition;
node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
@@ -138,7 +138,6 @@
{
var d = damage;
damage = Role.RoleState.CallCalcDamageEvent(damage);
- GD.Print($"原伤害: {d}, 计算伤害: {damage}");
}
role.CallDeferred(nameof(Role.Hurt), damage, Rotation);
diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs
index ce037b4..ac660c5 100644
--- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs
+++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs
@@ -33,7 +33,7 @@
private int _count = 1;
///
- /// 道具最大可使用次数
+ /// 道具最大叠加用次数
///
public int MaxCount
{
@@ -238,7 +238,10 @@
player.ThrowActiveProp(player.ActivePropsPack.ActiveIndex);
}
//替换手中的道具
- player.PickUpActiveProp(this);
+ if (player.PickUpActiveProp(this))
+ {
+ Pickup();
+ }
}
else
{
@@ -255,6 +258,7 @@
item.Count += Count;
Count = 0;
}
+ Destroy();
}
}
}
@@ -292,7 +296,6 @@
public override void OnPickUpItem()
{
- Pickup();
}
public override void OnRemoveItem()
diff --git a/DungeonShooting_Godot/src/game/activity/role/Player.cs b/DungeonShooting_Godot/src/game/activity/role/Player.cs
deleted file mode 100644
index a4f3640..0000000
--- a/DungeonShooting_Godot/src/game/activity/role/Player.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using Godot;
-
-
-///
-/// 玩家角色基类, 所有角色都必须继承该类
-///
-[Tool]
-public partial class Player : Role
-{
- ///
- /// 获取当前操作的角色
- ///
- public static Player Current { get; private set; }
-
- ///
- /// 设置当前操作的玩家对象
- ///
- public static void SetCurrentPlayer(Player player)
- {
- Current = player;
- //设置相机和鼠标跟随玩家
- GameCamera.Main.SetFollowTarget(player);
- GameApplication.Instance.Cursor.SetMountRole(player);
- }
-
- public override void OnInit()
- {
- base.OnInit();
-
- AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Prop | PhysicsLayer.Enemy;
- Camp = CampEnum.Camp1;
-
- MaxHp = 6;
- Hp = 6;
- MaxShield = 0;
- Shield = 0;
-
- // debug用
- // RoleState.Acceleration = 3000;
- // RoleState.Friction = 3000;
- // RoleState.MoveSpeed = 500;
- // CollisionLayer = 0;
- // CollisionMask = 0;
- // GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f);
- // //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f);
- }
-
- protected override void Process(float delta)
- {
- if (IsDie)
- {
- return;
- }
- base.Process(delta);
- //脸的朝向
- if (LookTarget == null)
- {
- var gPos = GlobalPosition;
- Vector2 mousePos = InputManager.CursorPosition;
- if (mousePos.X > gPos.X && Face == FaceDirection.Left)
- {
- Face = FaceDirection.Right;
- }
- else if (mousePos.X < gPos.X && Face == FaceDirection.Right)
- {
- Face = FaceDirection.Left;
- }
- //枪口跟随鼠标
- MountPoint.SetLookAt(mousePos);
- }
-
- if (InputManager.ExchangeWeapon) //切换武器
- {
- ExchangeNextWeapon();
- }
- else if (InputManager.ThrowWeapon) //扔掉武器
- {
- ThrowWeapon();
-
- // //测试用的, 所有敌人也扔掉武器
- // if (Affiliation != null)
- // {
- // var enemies = Affiliation.FindIncludeItems(o =>
- // {
- // return o.CollisionWithMask(PhysicsLayer.Enemy);
- // });
- // foreach (var activityObject in enemies)
- // {
- // if (activityObject is Enemy enemy)
- // {
- // enemy.ThrowWeapon();
- // }
- // }
- // }
- }
- else if (InputManager.Interactive) //互动物体
- {
- TriggerInteractive();
- }
- else if (InputManager.Reload) //换弹
- {
- Reload();
- }
-
- if (InputManager.Fire) //开火
- {
- Attack();
- // var weaponArray = AffiliationArea.FindEnterItems(o => o is Weapon);
- // foreach (Weapon activityObject in weaponArray)
- // {
- // activityObject.Trigger(this);
- // }
- }
-
- if (InputManager.UseActiveProp) //使用道具
- {
- UseActiveProp();
- }
- else if (InputManager.RemoveProp) //扔掉道具
- {
- ThrowActiveProp();
- }
-
- if (Input.IsKeyPressed(Key.P))
- {
- //Hurt(1000, 0);
- Hp = 0;
- Hurt(1000, 0);
- }
- }
-
- protected override void PhysicsProcess(float delta)
- {
- if (IsDie)
- {
- return;
- }
-
- base.PhysicsProcess(delta);
- HandleMoveInput(delta);
- //播放动画
- PlayAnim();
- }
-
- protected override void OnPickUpWeapon(Weapon weapon)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerPickUpWeapon, weapon);
- }
-
- protected override void OnThrowWeapon(Weapon weapon)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerRemoveWeapon, weapon);
- }
-
- protected override int OnHandlerHurt(int damage)
- {
- //修改受到的伤害, 每次只受到1点伤害
- return 1;
- }
-
- protected override void OnHit(int damage, bool realHarm)
- {
- //进入无敌状态
- if (realHarm) //真实伤害
- {
- PlayInvincibleFlashing(RoleState.WoundedInvincibleTime);
- }
- else //护盾抵消掉的
- {
- PlayInvincibleFlashing(RoleState.ShieldInvincibleTime);
- }
- }
-
- protected override void OnChangeHp(int hp)
- {
- //GameApplication.Instance.Ui.SetHp(hp);
- EventManager.EmitEvent(EventEnum.OnPlayerHpChange, hp);
- }
-
- protected override void OnChangeMaxHp(int maxHp)
- {
- //GameApplication.Instance.Ui.SetMaxHp(maxHp);
- EventManager.EmitEvent(EventEnum.OnPlayerMaxHpChange, maxHp);
- }
-
- protected override void ChangeInteractiveItem(CheckInteractiveResult prev, CheckInteractiveResult result)
- {
- if (prev != null && prev.Target.ShowOutline)
- {
- prev.Target.OutlineColor = Colors.Black;
- }
- if (result != null && result.Target.ShowOutline)
- {
- result.Target.OutlineColor = Colors.White;
- }
- //派发互动对象改变事件
- EventManager.EmitEvent(EventEnum.OnPlayerChangeInteractiveItem, result);
- }
-
- protected override void OnChangeShield(int shield)
- {
- //GameApplication.Instance.Ui.SetShield(shield);
- EventManager.EmitEvent(EventEnum.OnPlayerShieldChange, shield);
- }
-
- protected override void OnChangeMaxShield(int maxShield)
- {
- //GameApplication.Instance.Ui.SetMaxShield(maxShield);
- EventManager.EmitEvent(EventEnum.OnPlayerMaxShieldChange, maxShield);
- }
-
- protected override void OnDie()
- {
- GameCamera.Main.SetFollowTarget(null);
- BasisVelocity = Vector2.Zero;
- MoveController.ClearForce();
- UiManager.Open_Settlement();
- }
-
- protected override void OnPickUpActiveProp(ActiveProp activeProp)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerPickUpProp, activeProp);
- }
-
- protected override void OnRemoveActiveProp(ActiveProp activeProp)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerRemoveProp, activeProp);
- }
-
- protected override void OnPickUpBuffProp(BuffProp buffProp)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerPickUpProp, buffProp);
- }
-
- protected override void OnRemoveBuffProp(BuffProp buffProp)
- {
- EventManager.EmitEvent(EventEnum.OnPlayerRemoveProp, buffProp);
- }
-
- //处理角色移动的输入
- private void HandleMoveInput(float delta)
- {
- //角色移动
- Vector2 dir = InputManager.MoveAxis;
- // 移动. 如果移动的数值接近0(是用 摇杆可能出现 方向 可能会出现浮点),就friction的值 插值 到 0
- // 如果 有输入 就以当前速度,用acceleration 插值到 对应方向 * 最大速度
- if (Mathf.IsZeroApprox(dir.X))
- {
- BasisVelocity = new Vector2(Mathf.MoveToward(BasisVelocity.X, 0, RoleState.Friction * delta), BasisVelocity.Y);
- }
- else
- {
- BasisVelocity = new Vector2(Mathf.MoveToward(BasisVelocity.X, dir.X * RoleState.MoveSpeed, RoleState.Acceleration * delta),
- BasisVelocity.Y);
- }
-
- if (Mathf.IsZeroApprox(dir.Y))
- {
- BasisVelocity = new Vector2(BasisVelocity.X, Mathf.MoveToward(BasisVelocity.Y, 0, RoleState.Friction * delta));
- }
- else
- {
- BasisVelocity = new Vector2(BasisVelocity.X,
- Mathf.MoveToward(BasisVelocity.Y, dir.Y * RoleState.MoveSpeed, RoleState.Acceleration * delta));
- }
- }
-
- // 播放动画
- private void PlayAnim()
- {
- if (BasisVelocity != Vector2.Zero)
- {
- if ((Face == FaceDirection.Right && BasisVelocity.X >= 0) || Face == FaceDirection.Left && BasisVelocity.X <= 0) //向前走
- {
- AnimatedSprite.Play(AnimatorNames.Run);
- }
- else if ((Face == FaceDirection.Right && BasisVelocity.X < 0) || Face == FaceDirection.Left && BasisVelocity.X > 0) //向后走
- {
- AnimatedSprite.Play(AnimatorNames.ReverseRun);
- }
- }
- else
- {
- AnimatedSprite.Play(AnimatorNames.Idle);
- }
- }
-}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs
index 1221d33..e66a0d7 100644
--- a/DungeonShooting_Godot/src/game/activity/role/Role.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs
@@ -27,6 +27,12 @@
///
[Export, ExportFillNode]
public Area2D HurtArea { get; set; }
+
+ ///
+ /// 伤害区域碰撞器
+ ///
+ [Export, ExportFillNode]
+ public CollisionShape2D HurtCollision { get; set; }
///
/// 所属阵营
@@ -71,6 +77,17 @@
public Area2D InteractiveArea { get; set; }
///
+ /// 互动区域碰撞器
+ ///
+ [Export, ExportFillNode]
+ public CollisionShape2D InteractiveCollision { get; set; }
+
+ ///
+ /// 武器挂载点是否始终指向目标
+ ///
+ public bool MountLookTarget { get; set; } = true;
+
+ ///
/// 脸的朝向
///
public FaceDirection Face { get => _face; set => SetFace(value); }
@@ -210,6 +227,18 @@
///
public ActivityObject InteractiveItem { get; private set; }
+ ///
+ /// 是否可以翻滚
+ ///
+ public bool CanRoll => _rollCoolingTimer <= 0;
+
+ ///
+ /// 是否处于近战攻击中
+ ///
+ public bool IsMeleeAttack { get; private set; }
+
+ //翻滚冷却计时器
+ private float _rollCoolingTimer = 0;
//初始缩放
private Vector2 _startScale;
//所有角色碰撞的物体
@@ -225,6 +254,8 @@
private long _invincibleFlashingId = -1;
//护盾恢复计时器
private float _shieldRecoveryTimer = 0;
+ //近战计时器
+ private float _meleeAttackTimer = 0;
///
/// 当血量改变时调用
@@ -371,6 +402,16 @@
protected override void Process(float delta)
{
+ if (_rollCoolingTimer > 0)
+ {
+ _rollCoolingTimer -= delta;
+ }
+
+ if (_meleeAttackTimer > 0)
+ {
+ _meleeAttackTimer -= delta;
+ }
+
//看向目标
if (LookTarget != null)
{
@@ -385,8 +426,12 @@
{
Face = FaceDirection.Left;
}
- //枪口跟随目标
- MountPoint.SetLookAt(pos);
+
+ if (MountLookTarget)
+ {
+ //枪口跟随目标
+ MountPoint.SetLookAt(pos);
+ }
}
//检查可互动的物体
@@ -558,7 +603,6 @@
/// 使角色看向指定的坐标,
/// 注意, 调用该函数会清空 LookTarget, 因为拥有 LookTarget 时也会每帧更新玩家视野位置
///
- ///
public void LookTargetPosition(Vector2 pos)
{
LookTarget = null;
@@ -572,8 +616,12 @@
{
Face = FaceDirection.Left;
}
- //枪口跟随目标
- MountPoint.SetLookAt(pos);
+
+ if (MountLookTarget)
+ {
+ //枪口跟随目标
+ MountPoint.SetLookAt(pos);
+ }
}
///
@@ -842,13 +890,39 @@
///
public virtual void Attack()
{
- if (WeaponPack.ActiveItem != null)
+ if (!IsMeleeAttack && WeaponPack.ActiveItem != null)
{
WeaponPack.ActiveItem.Trigger(this);
}
}
///
+ /// 触发近战攻击
+ ///
+ public virtual void MeleeAttack()
+ {
+ if (IsMeleeAttack || _meleeAttackTimer > 0)
+ {
+ return;
+ }
+
+ if (WeaponPack.ActiveItem != null && WeaponPack.ActiveItem.Attribute.CanMeleeAttack)
+ {
+ IsMeleeAttack = true;
+ _meleeAttackTimer = RoleState.MeleeAttackTime;
+ MountLookTarget = false;
+
+ WeaponPack.ActiveItem.TriggerMeleeAttack(this);
+ //播放近战动画
+ PlayAnimation_MeleeAttack(() =>
+ {
+ MountLookTarget = true;
+ IsMeleeAttack = false;
+ });
+ }
+ }
+
+ ///
/// 触发使用道具
///
public virtual void UseActiveProp()
@@ -1016,4 +1090,12 @@
ActivePropsPack.Destroy();
WeaponPack.Destroy();
}
+
+ ///
+ /// 翻滚结束
+ ///
+ public void OverRoll()
+ {
+ _rollCoolingTimer = RoleState.RollTime;
+ }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
index 0585f25..d195c75 100644
--- a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
@@ -17,14 +17,24 @@
public float Acceleration = 1500f;
///
- /// 移动摩擦力
+ /// 移动摩擦力, 仅用于人物基础移动
///
public float Friction = 900f;
///
+ /// 翻滚速度
+ ///
+ public float RollSpeed = 180f;
+
+ ///
+ /// 翻滚冷却时间
+ ///
+ public float RollTime = 0.5f;
+
+ ///
/// 单格护盾恢复时间, 单位: 秒
///
- public float ShieldRecoveryTime = 8;
+ public float ShieldRecoveryTime = 18;
///
/// 受伤后的无敌时间, 单位: 秒
@@ -34,7 +44,12 @@
///
/// 护盾被攻击后的无敌时间, 单位: 秒
///
- public float ShieldInvincibleTime = 0.5f;
+ public float ShieldInvincibleTime = 0.4f;
+
+ ///
+ /// 近战攻击间隔时间
+ ///
+ public float MeleeAttackTime = 0.5f;
///
/// 攻击/发射后计算伤害
diff --git a/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs
new file mode 100644
index 0000000..3a09f55
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs
@@ -0,0 +1,65 @@
+
+using System;
+using Godot;
+using Vector2 = Godot.Vector2;
+
+public partial class Role
+{
+ ///
+ /// 播放近战攻击动画
+ ///
+ public virtual void PlayAnimation_MeleeAttack(Action finish)
+ {
+ var r = MountPoint.RotationDegrees;
+ //var gp = MountPoint.GlobalPosition;
+ var p1 = MountPoint.Position;
+ var p2 = p1 + new Vector2(6, 0).Rotated(Mathf.DegToRad(r - 60));
+ var p3 = p1 + new Vector2(6, 0).Rotated(Mathf.DegToRad(r + 60));
+
+ var tween = CreateTween();
+ tween.SetParallel();
+
+ tween.TweenProperty(MountPoint, "rotation_degrees", r - 60, 0.12);
+ tween.TweenProperty(MountPoint, "position", p2, 0.12);
+ tween.TweenProperty(MountPoint, "position", p2, 0.12);
+ tween.Chain();
+
+ tween.TweenCallback(Callable.From(() =>
+ {
+ MountPoint.RotationDegrees = r + 60;
+ MountPoint.Position = p3;
+ //重新计算武器阴影位置
+ var activeItem = WeaponPack.ActiveItem;
+ activeItem.CalcShadowTransform();
+ //创建屏幕抖动
+ if (Face == FaceDirection.Right)
+ {
+ //GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(r - 90)) * 5);
+ GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(r - 180)) * 6);
+ }
+ else
+ {
+ //GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(270 - r)) * 5);
+ GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(-r)) * 6);
+ }
+ //播放特效
+ var sprite = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_weapon_MeleeAttack1_tscn);
+ var localFirePosition = activeItem.GetLocalFirePosition();
+ localFirePosition.X *= 0.85f;
+ sprite.Position = p1 + localFirePosition.Rotated(Mathf.DegToRad(r));
+ sprite.RotationDegrees = r;
+ AddChild(sprite);
+ }));
+ tween.Chain();
+
+ tween.TweenProperty(MountPoint, "rotation_degrees", r, 0.2);
+ tween.TweenProperty(MountPoint, "position", p1, 0.2);
+ tween.Chain();
+
+ tween.TweenCallback(Callable.From(() =>
+ {
+ finish();
+ }));
+ tween.Play();
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
index 3c327dd..c333c8c 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
@@ -119,7 +119,7 @@
var effPos = Position + new Vector2(0, -Altitude);
//血液特效
- var blood = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_activityObject_EnemyBloodEffect_tscn);
+ var blood = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_enemy_EnemyBloodEffect_tscn);
blood.Position = effPos - new Vector2(0, 12);
blood.AddToActivityRoot(RoomLayerEnum.NormalLayer);
@@ -341,7 +341,7 @@
if (WeaponPack.ActiveItem != null)
{
var attribute = WeaponPack.ActiveItem.Attribute;
- return Mathf.Lerp(attribute.BulletMinDistance, attribute.BulletMaxDistance, weight);
+ return Mathf.Lerp(Utils.GetConfigRangeStart(attribute.BulletDistanceRange), Utils.GetConfigRangeEnd(attribute.BulletDistanceRange), weight);
}
return 0;
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs
index 7bf1d93..e0953eb 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs
@@ -106,7 +106,7 @@
Master.EnemyAttack(delta);
//距离够近, 可以切换到环绕模式
- if (Master.GlobalPosition.DistanceSquaredTo(playerPos) <= Mathf.Pow(weapon.Attribute.BulletMinDistance, 2) * 0.7f)
+ if (Master.GlobalPosition.DistanceSquaredTo(playerPos) <= Mathf.Pow(Utils.GetConfigRangeStart(weapon.Attribute.BulletDistanceRange), 2) * 0.7f)
{
ChangeState(AiStateEnum.AiSurround);
}
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs
index e8c0827..1e7f4c4 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs
@@ -161,7 +161,7 @@
private void RunOver(Vector2 targetPos)
{
var weapon = Master.WeaponPack.ActiveItem;
- var distance = (int)(weapon == null ? 150 : (weapon.Attribute.BulletMinDistance * 0.7f));
+ var distance = (int)(weapon == null ? 150 : (Utils.GetConfigRangeStart(weapon.Attribute.BulletDistanceRange) * 0.7f));
_nextPosition = new Vector2(
targetPos.X + Utils.Random.RandomRangeInt(-distance, distance),
targetPos.Y + Utils.Random.RandomRangeInt(-distance, distance)
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
new file mode 100644
index 0000000..4600a54
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
@@ -0,0 +1,306 @@
+using Godot;
+
+
+///
+/// 玩家角色基类, 所有角色都必须继承该类
+///
+[Tool]
+public partial class Player : Role
+{
+ ///
+ /// 获取当前操作的角色
+ ///
+ public static Player Current { get; private set; }
+
+ ///
+ /// 玩家身上的状态机控制器
+ ///
+ public StateController StateController { get; private set; }
+
+ ///
+ /// 是否翻滚中
+ ///
+ public bool IsRolling { get; private set; }
+
+ ///
+ /// 设置当前操作的玩家对象
+ ///
+ public static void SetCurrentPlayer(Player player)
+ {
+ Current = player;
+ //设置相机和鼠标跟随玩家
+ GameCamera.Main.SetFollowTarget(player);
+ GameApplication.Instance.Cursor.SetMountRole(player);
+ }
+
+ public override void OnInit()
+ {
+ base.OnInit();
+
+ IsAi = false;
+ StateController = AddComponent>();
+ AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Prop | PhysicsLayer.Enemy;
+ Camp = CampEnum.Camp1;
+
+ MaxHp = 6;
+ Hp = 6;
+ MaxShield = 0;
+ Shield = 0;
+
+ // debug用
+ // RoleState.Acceleration = 3000;
+ // RoleState.Friction = 3000;
+ // RoleState.MoveSpeed = 500;
+ // CollisionLayer = 0;
+ // CollisionMask = 0;
+ // GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f);
+ // //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f);
+
+ //注册状态机
+ StateController.Register(new PlayerIdleState());
+ StateController.Register(new PlayerMoveState());
+ StateController.Register(new PlayerRollState());
+ //默认状态
+ StateController.ChangeStateInstant(PlayerStateEnum.Idle);
+ }
+
+ protected override void Process(float delta)
+ {
+ if (IsDie)
+ {
+ return;
+ }
+ base.Process(delta);
+ //脸的朝向
+ if (LookTarget == null)
+ {
+ var gPos = GlobalPosition;
+ Vector2 mousePos = InputManager.CursorPosition;
+ if (mousePos.X > gPos.X && Face == FaceDirection.Left)
+ {
+ Face = FaceDirection.Right;
+ }
+ else if (mousePos.X < gPos.X && Face == FaceDirection.Right)
+ {
+ Face = FaceDirection.Left;
+ }
+
+ if (MountLookTarget)
+ {
+ //枪口跟随鼠标
+ MountPoint.SetLookAt(mousePos);
+ }
+ }
+
+ if (InputManager.ExchangeWeapon) //切换武器
+ {
+ ExchangeNextWeapon();
+ }
+ else if (InputManager.ThrowWeapon) //扔掉武器
+ {
+ ThrowWeapon();
+
+ // //测试用的, 所有敌人也扔掉武器
+ // if (Affiliation != null)
+ // {
+ // var enemies = Affiliation.FindIncludeItems(o =>
+ // {
+ // return o.CollisionWithMask(PhysicsLayer.Enemy);
+ // });
+ // foreach (var activityObject in enemies)
+ // {
+ // if (activityObject is Enemy enemy)
+ // {
+ // enemy.ThrowWeapon();
+ // }
+ // }
+ // }
+ }
+ else if (InputManager.Interactive) //互动物体
+ {
+ TriggerInteractive();
+ }
+ else if (InputManager.Reload) //换弹
+ {
+ Reload();
+ }
+
+ var meleeAttackFlag = false;
+ if (InputManager.MeleeAttack) //近战攻击
+ {
+ if (StateController.CurrState != PlayerStateEnum.Roll) //不能是翻滚状态
+ {
+ if (WeaponPack.ActiveItem != null && WeaponPack.ActiveItem.Attribute.CanMeleeAttack)
+ {
+ meleeAttackFlag = true;
+ MeleeAttack();
+ }
+ }
+ }
+ if (!meleeAttackFlag && InputManager.Fire) //正常开火
+ {
+ if (StateController.CurrState != PlayerStateEnum.Roll) //不能是翻滚状态
+ {
+ Attack();
+ // var weaponArray = AffiliationArea.FindEnterItems(o => o is Weapon);
+ // foreach (Weapon activityObject in weaponArray)
+ // {
+ // activityObject.Trigger(this);
+ // }
+ }
+ }
+
+ if (InputManager.UseActiveProp) //使用道具
+ {
+ UseActiveProp();
+ }
+ else if (InputManager.RemoveProp) //扔掉道具
+ {
+ ThrowActiveProp();
+ }
+
+ if (Input.IsKeyPressed(Key.P)) //测试用, 自杀
+ {
+ //Hurt(1000, 0);
+ Hp = 0;
+ Hurt(1000, 0);
+ }
+ }
+
+ // protected override void PhysicsProcess(float delta)
+ // {
+ // if (IsDie)
+ // {
+ // return;
+ // }
+ //
+ // base.PhysicsProcess(delta);
+ // //处理移动
+ // HandleMoveInput(delta);
+ // //播放动画
+ // PlayAnim();
+ // }
+
+ protected override void OnPickUpWeapon(Weapon weapon)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerPickUpWeapon, weapon);
+ }
+
+ protected override void OnThrowWeapon(Weapon weapon)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerRemoveWeapon, weapon);
+ }
+
+ protected override int OnHandlerHurt(int damage)
+ {
+ //修改受到的伤害, 每次只受到1点伤害
+ return 1;
+ }
+
+ protected override void OnHit(int damage, bool realHarm)
+ {
+ //进入无敌状态
+ if (realHarm) //真实伤害
+ {
+ PlayInvincibleFlashing(RoleState.WoundedInvincibleTime);
+ }
+ else //护盾抵消掉的
+ {
+ PlayInvincibleFlashing(RoleState.ShieldInvincibleTime);
+ }
+ }
+
+ protected override void OnChangeHp(int hp)
+ {
+ //GameApplication.Instance.Ui.SetHp(hp);
+ EventManager.EmitEvent(EventEnum.OnPlayerHpChange, hp);
+ }
+
+ protected override void OnChangeMaxHp(int maxHp)
+ {
+ //GameApplication.Instance.Ui.SetMaxHp(maxHp);
+ EventManager.EmitEvent(EventEnum.OnPlayerMaxHpChange, maxHp);
+ }
+
+ protected override void ChangeInteractiveItem(CheckInteractiveResult prev, CheckInteractiveResult result)
+ {
+ if (prev != null && prev.Target.ShowOutline)
+ {
+ prev.Target.OutlineColor = Colors.Black;
+ }
+ if (result != null && result.Target.ShowOutline)
+ {
+ result.Target.OutlineColor = Colors.White;
+ }
+ //派发互动对象改变事件
+ EventManager.EmitEvent(EventEnum.OnPlayerChangeInteractiveItem, result);
+ }
+
+ protected override void OnChangeShield(int shield)
+ {
+ //GameApplication.Instance.Ui.SetShield(shield);
+ EventManager.EmitEvent(EventEnum.OnPlayerShieldChange, shield);
+ }
+
+ protected override void OnChangeMaxShield(int maxShield)
+ {
+ //GameApplication.Instance.Ui.SetMaxShield(maxShield);
+ EventManager.EmitEvent(EventEnum.OnPlayerMaxShieldChange, maxShield);
+ }
+
+ protected override void OnDie()
+ {
+ StateController.Enable = false;
+ GameCamera.Main.SetFollowTarget(null);
+ BasisVelocity = Vector2.Zero;
+ MoveController.ClearForce();
+ UiManager.Open_Settlement();
+ }
+
+ protected override void OnPickUpActiveProp(ActiveProp activeProp)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerPickUpProp, activeProp);
+ }
+
+ protected override void OnRemoveActiveProp(ActiveProp activeProp)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerRemoveProp, activeProp);
+ }
+
+ protected override void OnPickUpBuffProp(BuffProp buffProp)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerPickUpProp, buffProp);
+ }
+
+ protected override void OnRemoveBuffProp(BuffProp buffProp)
+ {
+ EventManager.EmitEvent(EventEnum.OnPlayerRemoveProp, buffProp);
+ }
+
+ ///
+ /// 处理角色移动的输入
+ ///
+ public void HandleMoveInput(float delta)
+ {
+ var dir = InputManager.MoveAxis;
+ // 移动. 如果移动的数值接近0(是用 摇杆可能出现 方向 可能会出现浮点),就friction的值 插值 到 0
+ // 如果 有输入 就以当前速度,用acceleration 插值到 对应方向 * 最大速度
+ if (Mathf.IsZeroApprox(dir.X))
+ {
+ BasisVelocity = new Vector2(Mathf.MoveToward(BasisVelocity.X, 0, RoleState.Friction * delta), BasisVelocity.Y);
+ }
+ else
+ {
+ BasisVelocity = new Vector2(Mathf.MoveToward(BasisVelocity.X, dir.X * RoleState.MoveSpeed, RoleState.Acceleration * delta), BasisVelocity.Y);
+ }
+
+ if (Mathf.IsZeroApprox(dir.Y))
+ {
+ BasisVelocity = new Vector2(BasisVelocity.X, Mathf.MoveToward(BasisVelocity.Y, 0, RoleState.Friction * delta));
+ }
+ else
+ {
+ BasisVelocity = new Vector2(BasisVelocity.X, Mathf.MoveToward(BasisVelocity.Y, dir.Y * RoleState.MoveSpeed, RoleState.Acceleration * delta));
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs
new file mode 100644
index 0000000..be67372
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs
@@ -0,0 +1,38 @@
+
+using Godot;
+
+///
+/// 空闲状态
+///
+public class PlayerIdleState : StateBase
+{
+ public PlayerIdleState() : base(PlayerStateEnum.Idle)
+ {
+ }
+
+ public override void Enter(PlayerStateEnum prev, params object[] args)
+ {
+ Master.HandleMoveInput((float)Master.GetProcessDeltaTime());
+ Master.AnimatedSprite.Play(AnimatorNames.Idle);
+ }
+
+ public override void Process(float delta)
+ {
+ var dir = InputManager.MoveAxis;
+ if (dir != Vector2.Zero)
+ {
+ if (InputManager.Roll && Master.CanRoll) //按下翻滚
+ {
+ ChangeState(PlayerStateEnum.Roll);
+ }
+ else //移动
+ {
+ ChangeState(PlayerStateEnum.Move);
+ }
+ }
+ else
+ {
+ Master.HandleMoveInput(delta);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs
new file mode 100644
index 0000000..b234832
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs
@@ -0,0 +1,51 @@
+
+using Godot;
+
+///
+/// 移动状态
+///
+public class PlayerMoveState : StateBase
+{
+ public PlayerMoveState() : base(PlayerStateEnum.Move)
+ {
+ }
+
+ public override void Enter(PlayerStateEnum prev, params object[] args)
+ {
+ Master.HandleMoveInput((float)Master.GetProcessDeltaTime());
+ PlayAnim();
+ }
+
+ public override void Process(float delta)
+ {
+ if (InputManager.MoveAxis == Vector2.Zero) //停止移动
+ {
+ ChangeState(PlayerStateEnum.Idle);
+ }
+ else
+ {
+ if (InputManager.Roll && Master.CanRoll) //翻滚
+ {
+ ChangeState(PlayerStateEnum.Roll);
+ }
+ else //执行移动
+ {
+ Master.HandleMoveInput(delta);
+ PlayAnim();
+ }
+ }
+ }
+
+ // 播放动画
+ private void PlayAnim()
+ {
+ if ((Master.Face == FaceDirection.Right && Master.BasisVelocity.X >= 0) || Master.Face == FaceDirection.Left && Master.BasisVelocity.X <= 0) //向前走
+ {
+ Master.AnimatedSprite.Play(AnimatorNames.Run);
+ }
+ else if ((Master.Face == FaceDirection.Right && Master.BasisVelocity.X < 0) || Master.Face == FaceDirection.Left && Master.BasisVelocity.X > 0) //向后走
+ {
+ Master.AnimatedSprite.Play(AnimatorNames.ReverseRun);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs
new file mode 100644
index 0000000..229b5df
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs
@@ -0,0 +1,67 @@
+
+using System.Collections;
+using Godot;
+
+///
+/// 翻滚状态
+///
+public class PlayerRollState : StateBase
+{
+ private long _coroutineId = -1;
+ private Vector2 _moveDir;
+
+ public PlayerRollState() : base(PlayerStateEnum.Roll)
+ {
+ }
+
+ public override void Enter(PlayerStateEnum prev, params object[] args)
+ {
+ if (_coroutineId >= 0)
+ {
+ Master.StopCoroutine(_coroutineId);
+ }
+
+ _coroutineId = Master.StartCoroutine(RunRoll());
+ Master.AnimatedSprite.Play(AnimatorNames.Roll);
+
+ //隐藏武器
+ Master.BackMountPoint.Visible = false;
+ Master.MountPoint.Visible = false;
+ //禁用伤害碰撞
+ Master.HurtCollision.Disabled = true;
+
+ //翻滚移动方向
+ _moveDir = InputManager.MoveAxis;
+ Master.BasisVelocity = _moveDir * Master.RoleState.RollSpeed;
+ }
+
+ public override void Exit(PlayerStateEnum next)
+ {
+ //显示武器
+ Master.BackMountPoint.Visible = true;
+ Master.MountPoint.Visible = true;
+ //启用伤害碰撞
+ Master.HurtCollision.Disabled = false;
+ }
+
+ public override void Process(float delta)
+ {
+ Master.BasisVelocity = _moveDir * Master.RoleState.RollSpeed;
+ }
+
+ //翻滚逻辑处理
+ private IEnumerator RunRoll()
+ {
+ yield return Master.AnimatedSprite.ToSignal(Master.AnimatedSprite, AnimatedSprite2D.SignalName.AnimationFinished);
+ _coroutineId = -1;
+ Master.OverRoll();
+ if (InputManager.MoveAxis != Vector2.Zero) //切换到移动状态
+ {
+ ChangeState(PlayerStateEnum.Move);
+ }
+ else //切换空闲状态
+ {
+ ChangeState(PlayerStateEnum.Idle);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerStateEnum.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerStateEnum.cs
new file mode 100644
index 0000000..5bbd421
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerStateEnum.cs
@@ -0,0 +1,16 @@
+
+public enum PlayerStateEnum
+{
+ ///
+ /// 待机状态
+ ///
+ Idle,
+ ///
+ /// 移动状态
+ ///
+ Move,
+ ///
+ /// 翻滚状态
+ ///
+ Roll
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
index f8d877d..ace9948 100644
--- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
+++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
@@ -765,8 +765,7 @@
//连发数量
if (!Attribute.ContinuousShoot)
{
- _continuousCount =
- Utils.Random.RandomRangeInt(Attribute.MinContinuousCount, Attribute.MaxContinuousCount);
+ _continuousCount = Utils.Random.RandomConfigRange(Attribute.ContinuousCountRange);
}
}
@@ -938,7 +937,7 @@
var fireRotation = tempRotation;
//开火发射的子弹数量
- var bulletCount = Utils.Random.RandomRangeInt(Attribute.MaxFireBulletCount, Attribute.MinFireBulletCount);
+ var bulletCount = Utils.Random.RandomConfigRange(Attribute.FireBulletCountRange);
if (Master != null)
{
bulletCount = Master.RoleState.CallCalcBulletCountEvent(this, bulletCount);
@@ -966,9 +965,9 @@
if (Master != null) //是否被拾起
{
//武器身位置
- var max = Mathf.Abs(Mathf.Max(Attribute.MaxBacklash, Attribute.MinBacklash));
+ var max = Mathf.Abs(Mathf.Max(Utils.GetConfigRangeStart(Attribute.BacklashRange), Utils.GetConfigRangeEnd(Attribute.BacklashRange)));
_currBacklashLength = Mathf.Clamp(
- _currBacklashLength - Utils.Random.RandomRangeFloat(Attribute.MinBacklash, Attribute.MaxBacklash),
+ _currBacklashLength - Utils.Random.RandomConfigRange(Attribute.BacklashRange),
-max, max
);
Position = new Vector2(_currBacklashLength, 0).Rotated(Rotation);
@@ -981,6 +980,14 @@
}
///
+ /// 触发武器的近战攻击
+ ///
+ public void TriggerMeleeAttack(Role trigger)
+ {
+
+ }
+
+ ///
/// 获取武器攻击的目标层级
///
///
@@ -1736,6 +1743,22 @@
Master.ThrowWeapon(PackageIndex);
}
+ ///
+ /// 获取相对于武器本地坐标的开火位置
+ ///
+ public Vector2 GetLocalFirePosition()
+ {
+ return AnimatedSprite.Position + FirePoint.Position;
+ }
+
+ ///
+ /// 获取相对于武器本地坐标的抛壳位置
+ ///
+ public Vector2 GetLocalShellPosition()
+ {
+ return AnimatedSprite.Position + ShellPoint.Position;
+ }
+
//-------------------------- ----- 子弹相关 -----------------------------
///
@@ -1781,10 +1804,10 @@
///
protected Bullet ShootBullet(float fireRotation, string bulletId)
{
- var speed = Utils.Random.RandomRangeFloat(Attribute.BulletMinSpeed, Attribute.BulletMaxSpeed);
- var distance = Utils.Random.RandomRangeFloat(Attribute.BulletMinDistance, Attribute.BulletMaxDistance);
+ var speed = Utils.Random.RandomConfigRange(Attribute.BulletSpeedRange);
+ var distance = Utils.Random.RandomConfigRange(Attribute.BulletDistanceRange);
var deviationAngle =
- Utils.Random.RandomRangeFloat(Attribute.BulletMinDeviationAngle, Attribute.BulletMaxDeviationAngle);
+ Utils.Random.RandomConfigRange(Attribute.BulletDeviationAngleRange);
if (Master != null)
{
speed = Master.RoleState.CallCalcBulletSpeedEvent(this, speed);
@@ -1804,8 +1827,8 @@
fireRotation + Mathf.DegToRad(deviationAngle),
attackLayer
);
- bullet.MinHarm = Attribute.BulletMinHarm;
- bullet.MaxHarm = Attribute.BulletMaxHarm;
+ bullet.MinHarm = Utils.GetConfigRangeStart(Attribute.BulletHarmRange);
+ bullet.MaxHarm = Utils.GetConfigRangeEnd(Attribute.BulletHarmRange);
bullet.PutDown(RoomLayerEnum.YSortLayer);
return bullet;
}
diff --git a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs
index fe01cd4..0dfeaeb 100644
--- a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs
+++ b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs
@@ -15,11 +15,13 @@
}
//创建开火特效
- var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_ShotFire_tscn);
- var sprite = packedScene.Instantiate();
- sprite.GlobalPosition = FirePoint.GlobalPosition;
- sprite.GlobalRotation = FirePoint.GlobalRotation;
- sprite.AddToActivityRoot(RoomLayerEnum.YSortLayer);
+ var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_ShotFire_tscn);
+ var sprite = packedScene.Instantiate();
+ // sprite.GlobalPosition = FirePoint.GlobalPosition;
+ // sprite.GlobalRotation = FirePoint.GlobalRotation;
+ // sprite.AddToActivityRoot(RoomLayerEnum.YSortLayer);
+ sprite.Position = GetLocalFirePosition();
+ AddChild(sprite);
}
protected override void OnShoot(float fireRotation)
diff --git a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs
index c754fa0..e9651c8 100644
--- a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs
+++ b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs
@@ -93,7 +93,7 @@
if (activityObject is Role role)
{
role.CallDeferred(nameof(Role.Hurt),
- Utils.Random.RandomRangeInt(Attribute.BulletMinHarm, Attribute.BulletMaxHarm), (role.GetCenterPosition() - GlobalPosition).Angle());
+ Utils.Random.RandomConfigRange(Attribute.BulletHarmRange), (role.GetCenterPosition() - GlobalPosition).Angle());
}
}
}
diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroyEffect.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroyEffect.cs
deleted file mode 100644
index c8e2b97..0000000
--- a/DungeonShooting_Godot/src/game/effects/AutoDestroyEffect.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-
-using Godot;
-
-public partial class AutoDestroyEffect : GpuParticles2D
-{
- ///
- /// 延时销毁时间
- ///
- [Export]
- public float DelayTime = 1f;
-
- public override async void _Ready()
- {
- Emitting = true;
- var sceneTreeTimer = GetTree().CreateTimer(DelayTime);
- await ToSignal(sceneTreeTimer, Timer.SignalName.Timeout);
- QueueFree();
- }
-}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs
new file mode 100644
index 0000000..e7aba73
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs
@@ -0,0 +1,22 @@
+
+using Godot;
+
+///
+/// 到期自动销毁的粒子特效
+///
+public partial class AutoDestroyParticles : GpuParticles2D
+{
+ ///
+ /// 延时销毁时间
+ ///
+ [Export]
+ public float DelayTime { get; set; } = 1f;
+
+ public override async void _Ready()
+ {
+ Emitting = true;
+ var sceneTreeTimer = GetTree().CreateTimer(DelayTime);
+ await ToSignal(sceneTreeTimer, Timer.SignalName.Timeout);
+ QueueFree();
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs
new file mode 100644
index 0000000..857819d
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs
@@ -0,0 +1,20 @@
+using Godot;
+
+///
+/// 到期自动销毁的帧动画
+///
+public partial class AutoDestroySprite : AnimatedSprite2D
+{
+ ///
+ /// 延时销毁时间
+ ///
+ [Export]
+ public float DelayTime { get; set; } = 1f;
+
+ public override async void _Ready()
+ {
+ var sceneTreeTimer = GetTree().CreateTimer(DelayTime);
+ await ToSignal(sceneTreeTimer, Timer.SignalName.Timeout);
+ QueueFree();
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/effects/Effect1.cs b/DungeonShooting_Godot/src/game/effects/Effect1.cs
index 7905f99..485bd80 100644
--- a/DungeonShooting_Godot/src/game/effects/Effect1.cs
+++ b/DungeonShooting_Godot/src/game/effects/Effect1.cs
@@ -1,6 +1,6 @@
using Godot;
-public partial class Effect1 : AutoDestroyEffect
+public partial class Effect1 : AutoDestroyParticles
{
public override void _Ready()
{
diff --git a/DungeonShooting_Godot/src/game/manager/InputManager.cs b/DungeonShooting_Godot/src/game/manager/InputManager.cs
index 9ebf832..6d92161 100644
--- a/DungeonShooting_Godot/src/game/manager/InputManager.cs
+++ b/DungeonShooting_Godot/src/game/manager/InputManager.cs
@@ -7,7 +7,7 @@
public static class InputManager
{
///
- /// 移动方向, 键鼠: 键盘WASD
+ /// 移动方向, 已经归一化, 键鼠: 键盘WASD
///
public static Vector2 MoveAxis { get; private set; }
@@ -62,17 +62,17 @@
public static bool Fire { get; private set; }
///
- /// 是否按钮近战攻击按钮 (使用远程武器发起的近战攻击), 键鼠: 鼠标右键
+ /// 是否按钮近战攻击按钮 (使用远程武器发起的近战攻击), 键鼠: 键盘Space
///
public static bool MeleeAttack { get; private set; }
///
- /// 是否按下翻滚按钮, 键鼠: 键盘Space
+ /// 是否按下翻滚按钮, 键鼠: 鼠标右键
///
public static bool Roll { get; private set; }
///
- /// 是否按下打开地图按钮, 键鼠: 键盘Ctrl
+ /// 是否按下打开地图按钮, 键鼠: 键盘Ctrl
///
public static bool Map { get; private set; }
diff --git a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
index 3796f08..5aaa8f5 100644
--- a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
+++ b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
@@ -14,13 +14,14 @@
public const string prefab_bullet_Bullet0002_tscn = "res://prefab/bullet/Bullet0002.tscn";
public const string prefab_bullet_Bullet0003_tscn = "res://prefab/bullet/Bullet0003.tscn";
public const string prefab_effect_Blood_tscn = "res://prefab/effect/Blood.tscn";
- public const string prefab_effect_BulletDisappear_tscn = "res://prefab/effect/BulletDisappear.tscn";
- public const string prefab_effect_BulletSmoke_tscn = "res://prefab/effect/BulletSmoke.tscn";
- public const string prefab_effect_Effect1_tscn = "res://prefab/effect/Effect1.tscn";
- public const string prefab_effect_FirePart_tscn = "res://prefab/effect/FirePart.tscn";
- public const string prefab_effect_ShotFire_tscn = "res://prefab/effect/ShotFire.tscn";
- public const string prefab_effect_activityObject_Effect0001_tscn = "res://prefab/effect/activityObject/Effect0001.tscn";
- public const string prefab_effect_activityObject_EnemyBloodEffect_tscn = "res://prefab/effect/activityObject/EnemyBloodEffect.tscn";
+ public const string prefab_effect_common_Effect1_tscn = "res://prefab/effect/common/Effect1.tscn";
+ public const string prefab_effect_enemy_Effect0001_tscn = "res://prefab/effect/enemy/Effect0001.tscn";
+ public const string prefab_effect_enemy_EnemyBloodEffect_tscn = "res://prefab/effect/enemy/EnemyBloodEffect.tscn";
+ public const string prefab_effect_weapon_BulletDisappear_tscn = "res://prefab/effect/weapon/BulletDisappear.tscn";
+ public const string prefab_effect_weapon_BulletSmoke_tscn = "res://prefab/effect/weapon/BulletSmoke.tscn";
+ public const string prefab_effect_weapon_FirePart_tscn = "res://prefab/effect/weapon/FirePart.tscn";
+ public const string prefab_effect_weapon_MeleeAttack1_tscn = "res://prefab/effect/weapon/MeleeAttack1.tscn";
+ public const string prefab_effect_weapon_ShotFire_tscn = "res://prefab/effect/weapon/ShotFire.tscn";
public const string prefab_map_RoomDoor_E_tscn = "res://prefab/map/RoomDoor_E.tscn";
public const string prefab_map_RoomDoor_N_tscn = "res://prefab/map/RoomDoor_N.tscn";
public const string prefab_map_RoomDoor_S_tscn = "res://prefab/map/RoomDoor_S.tscn";
@@ -72,7 +73,6 @@
public const string prefab_weapon_Weapon0006_tscn = "res://prefab/weapon/Weapon0006.tscn";
public const string prefab_weapon_Weapon0007_tscn = "res://prefab/weapon/Weapon0007.tscn";
public const string prefab_weapon_WeaponTemplate_tscn = "res://prefab/weapon/WeaponTemplate.tscn";
- public const string resource_Enviromenent_tres = "res://resource/Enviromenent.tres";
public const string resource_config_ActivityObject_json = "res://resource/config/ActivityObject.json";
public const string resource_config_Sound_json = "res://resource/config/Sound.json";
public const string resource_config_Weapon_json = "res://resource/config/Weapon.json";
@@ -136,13 +136,14 @@
public const string resource_sprite_bullet_bullet0003_png = "res://resource/sprite/bullet/bullet0003.png";
public const string resource_sprite_bullet_bullet2_png = "res://resource/sprite/bullet/bullet2.png";
public const string resource_sprite_effects_Circle_png = "res://resource/sprite/effects/Circle.png";
- public const string resource_sprite_effects_Collision_png = "res://resource/sprite/effects/Collision.png";
public const string resource_sprite_effects_debug_arrows_png = "res://resource/sprite/effects/debug_arrows.png";
- public const string resource_sprite_effects_Effect1_png = "res://resource/sprite/effects/Effect1.png";
public const string resource_sprite_effects_Explosion_png = "res://resource/sprite/effects/Explosion.png";
- public const string resource_sprite_effects_KnifeHit1_png = "res://resource/sprite/effects/KnifeHit1.png";
- public const string resource_sprite_effects_ShotFire_png = "res://resource/sprite/effects/ShotFire.png";
- public const string resource_sprite_effects_Smoke_png = "res://resource/sprite/effects/Smoke.png";
+ public const string resource_sprite_effects_common_Effect1_png = "res://resource/sprite/effects/common/Effect1.png";
+ public const string resource_sprite_effects_common_Smoke_png = "res://resource/sprite/effects/common/Smoke.png";
+ public const string resource_sprite_effects_weapon_Collision1_png = "res://resource/sprite/effects/weapon/Collision1.png";
+ public const string resource_sprite_effects_weapon_KnifeHit1_png = "res://resource/sprite/effects/weapon/KnifeHit1.png";
+ public const string resource_sprite_effects_weapon_MeleeAttack1_png = "res://resource/sprite/effects/weapon/MeleeAttack1.png";
+ public const string resource_sprite_effects_weapon_ShotFire_png = "res://resource/sprite/effects/weapon/ShotFire.png";
public const string resource_sprite_map_map1_16x16dungeoniiwallreconfigv04spritesheet_png = "res://resource/sprite/map/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png";
public const string resource_sprite_map_map1_door1_down_png = "res://resource/sprite/map/map1/door1_down.png";
public const string resource_sprite_map_map1_website_txt = "res://resource/sprite/map/map1/website.txt";
@@ -171,6 +172,29 @@
public const string resource_sprite_role_enemy0001_enemy0001_Icon_png = "res://resource/sprite/role/enemy0001/enemy0001_Icon.png";
public const string resource_sprite_role_role0001_Role0001_png = "res://resource/sprite/role/role0001/Role0001.png";
public const string resource_sprite_role_role0001_Role0001_Icon_png = "res://resource/sprite/role/role0001/Role0001_Icon.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0002_png = "res://resource/sprite/role/role0001/idle/Sprite-0002.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0003_png = "res://resource/sprite/role/role0001/idle/Sprite-0003.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0004_png = "res://resource/sprite/role/role0001/idle/Sprite-0004.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0005_png = "res://resource/sprite/role/role0001/idle/Sprite-0005.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0006_png = "res://resource/sprite/role/role0001/idle/Sprite-0006.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0007_png = "res://resource/sprite/role/role0001/idle/Sprite-0007.png";
+ public const string resource_sprite_role_role0001_idle_Sprite0008_png = "res://resource/sprite/role/role0001/idle/Sprite-0008.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0002_png = "res://resource/sprite/role/role0001/roll/Sprite-0002.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0003_png = "res://resource/sprite/role/role0001/roll/Sprite-0003.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0004_png = "res://resource/sprite/role/role0001/roll/Sprite-0004.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0005_png = "res://resource/sprite/role/role0001/roll/Sprite-0005.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0006_png = "res://resource/sprite/role/role0001/roll/Sprite-0006.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0007_png = "res://resource/sprite/role/role0001/roll/Sprite-0007.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0008_png = "res://resource/sprite/role/role0001/roll/Sprite-0008.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0009_png = "res://resource/sprite/role/role0001/roll/Sprite-0009.png";
+ public const string resource_sprite_role_role0001_roll_Sprite0010_png = "res://resource/sprite/role/role0001/roll/Sprite-0010.png";
+ public const string resource_sprite_role_role0001_run_Sprite0002_png = "res://resource/sprite/role/role0001/run/Sprite-0002.png";
+ public const string resource_sprite_role_role0001_run_Sprite0003_png = "res://resource/sprite/role/role0001/run/Sprite-0003.png";
+ public const string resource_sprite_role_role0001_run_Sprite0004_png = "res://resource/sprite/role/role0001/run/Sprite-0004.png";
+ public const string resource_sprite_role_role0001_run_Sprite0005_png = "res://resource/sprite/role/role0001/run/Sprite-0005.png";
+ public const string resource_sprite_role_role0001_run_Sprite0006_png = "res://resource/sprite/role/role0001/run/Sprite-0006.png";
+ public const string resource_sprite_role_role0001_run_Sprite0007_png = "res://resource/sprite/role/role0001/run/Sprite-0007.png";
+ public const string resource_sprite_role_role0001_run_Sprite0008_png = "res://resource/sprite/role/role0001/run/Sprite-0008.png";
public const string resource_sprite_shell_Shell0001_png = "res://resource/sprite/shell/Shell0001.png";
public const string resource_sprite_shell_Shell0002_png = "res://resource/sprite/shell/Shell0002.png";
public const string resource_sprite_shell_Shell0003_png = "res://resource/sprite/shell/Shell0003.png";