diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/Autoload/time_screen_controller.gd b/Autoload/time_screen_controller.gd new file mode 100644 index 0000000..1c39731 --- /dev/null +++ b/Autoload/time_screen_controller.gd @@ -0,0 +1,87 @@ +extends Node +## 用于控制时间速度和屏幕变暗效果的自动加载单例 + +const DEFAULT_TIME_SCALE := 1.0 +const FADE_DURATION := 0.03 # 渐变效果持续时间 +const SLOW_DURATION := 0.05 # 减速效果持续时间(当前未使用,保留) +const MAX_DARKNESS := 0.5 # 最大变暗程度(0.0完全透明,1.0完全黑) + +var _current_time_scale := DEFAULT_TIME_SCALE +var _fade_overlay: ColorRect +var _is_fading := false +var _current_tween: Tween +var _should_maintain_slow := false # 是否保持减速状态 + +func _ready() -> void: + process_mode = Node.PROCESS_MODE_ALWAYS + _setup_fade_overlay() + +func _setup_fade_overlay() -> void: + var canvas_layer := CanvasLayer.new() + canvas_layer.layer = 128 + add_child(canvas_layer) + + _fade_overlay = ColorRect.new() + _fade_overlay.color = Color(0, 0, 0, 0) + _fade_overlay.set_anchors_preset(Control.PRESET_FULL_RECT) + canvas_layer.add_child(_fade_overlay) + +## 主控制函数:同时控制减速和变暗效果 +## @param slow_time_scale: 时间缩放值(1.0为正常速度,小于1.0为减速) +## @param fade: 是否启用变暗效果 +func execute_effects(slow_time_scale: float, fade: bool) -> void: + _kill_current_tween() + + if slow_time_scale != DEFAULT_TIME_SCALE: + _slow_time(slow_time_scale) + else: + _reset_time() + + _fade_to(MAX_DARKNESS if fade else 0.0) + +## 立即恢复所有效果到正常状态 +func reset_all() -> void: + _kill_current_tween() + _reset_time() + + _is_fading = false + _fade_overlay.color.a = 0.0 + +# region 内部工具函数 +func _kill_current_tween() -> void: + if _current_tween and _current_tween.is_valid(): + _current_tween.kill() + +func _set_time_scale(scale: float) -> void: + _current_time_scale = scale + Engine.time_scale = scale + +func _slow_time(scale: float) -> void: + _set_time_scale(scale) + _should_maintain_slow = true + +func _reset_time() -> void: + _set_time_scale(DEFAULT_TIME_SCALE) + _should_maintain_slow = false + +func _fade_to(target_alpha: float) -> void: + if _is_fading: + return + + _is_fading = true + _current_tween = create_tween() + _current_tween.tween_property(_fade_overlay, "color:a", target_alpha, FADE_DURATION) + _current_tween.tween_callback(func(): _is_fading = false) +# endregion + +## 获取当前时间缩放值 +func get_current_time_scale() -> float: + return _current_time_scale + +## 检查是否正在执行渐变 +func is_fading() -> bool: + return _is_fading + +## 检查是否处于减速状态 +func is_time_slowed() -> bool: + return _should_maintain_slow diff --git a/Autoload/time_screen_controller.gd.uid b/Autoload/time_screen_controller.gd.uid new file mode 100644 index 0000000..e0dab57 --- /dev/null +++ b/Autoload/time_screen_controller.gd.uid @@ -0,0 +1 @@ +uid://lapr5splvajf diff --git a/Char/Char_Components/After_Image/aft4F5C.tmp b/Char/Char_Components/After_Image/aft4F5C.tmp new file mode 100644 index 0000000..713df7d --- /dev/null +++ b/Char/Char_Components/After_Image/aft4F5C.tmp @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dd7k3qbsw1bhq"] + +[ext_resource type="Script" path="res://Char/Char_Components/After_Image/after_image_component.gd" id="1_c5t65"] + +[node name="After_Image_Component" type="Node"] +script = ExtResource("1_c5t65") diff --git a/Char/Char_Components/After_Image/after_image.tscn b/Char/Char_Components/After_Image/after_image.tscn new file mode 100644 index 0000000..4d51aef --- /dev/null +++ b/Char/Char_Components/After_Image/after_image.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=4 format=3 uid="uid://ce7d2uw5710fo"] + +[sub_resource type="Animation" id="Animation_i6syn"] +resource_name = "Fading" +length = 0.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:self_modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0.197937, 0.197937, 0.197937, 0.588235), Color(1, 1, 1, 0)] +} +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.1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"queue_free" +}] +} + +[sub_resource type="Animation" id="Animation_28t5o"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:self_modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.197937, 0.197937, 0.197937, 0.588235)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_s12ut"] +_data = { +&"Fading": SubResource("Animation_i6syn"), +&"RESET": SubResource("Animation_28t5o") +} + +[node name="After_Image" type="Node2D" groups=["After_Image"]] +self_modulate = Color(0.196078, 0.196078, 0.196078, 0.588235) + +[node name="Sprite2D" type="Sprite2D" parent="."] +self_modulate = Color(0.197937, 0.197937, 0.197937, 0.588235) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_s12ut") +} +autoplay = "Fading" diff --git a/Char/Char_Components/After_Image/after_image_component.gd b/Char/Char_Components/After_Image/after_image_component.gd new file mode 100644 index 0000000..4d9536c --- /dev/null +++ b/Char/Char_Components/After_Image/after_image_component.gd @@ -0,0 +1,175 @@ +extends Node + +var can_spawn = true +var spawn_frequency = 0.01 +var base_scale = 0.9 +var min_velocity = 5.0 +var is_active = false + +var after_image_material: ShaderMaterial +var after_image_scene = preload("res://Char/Char_Components/After_Image/after_image.tscn") + +@onready var player = get_parent() +@onready var owner_sprite = player.get_node("Body_Animation/Sprite2D") +@onready var owner_anim = player.get_node("Body_Animation/AnimationPlayer") + +func _ready(): + if !after_image_material: + var new_material = ShaderMaterial.new() + new_material.shader = load("res://Char/Char_Components/After_Image/player_dash.gdshader") + after_image_material = new_material + + after_image_material.set_shader_parameter("effect_mixture", 0.0) + after_image_material.set_shader_parameter("alpha_multiplier", 1.0) + after_image_material.set_shader_parameter("color_offset", 0.0) + after_image_material.set_shader_parameter("glow_intensity", 1.2) + + reset_spawn_timer() + +func _physics_process(_delta): + if is_active and can_spawn: + var velocity = owner.velocity if owner.has_method("get_velocity") else Vector2.ZERO + if velocity.length() >= min_velocity: + spawn_after_image() + +func clear_shader(): + after_image_material = null + +func init_shader(shader_path: String, params: Dictionary = {}): + after_image_material = ShaderMaterial.new() + after_image_material.shader = load(shader_path) + + for param_name in params: + after_image_material.set_shader_parameter(param_name, params[param_name]) + +func reset_spawn_timer(): + can_spawn = false + await get_tree().create_timer(spawn_frequency).timeout + can_spawn = true + +func spawn_after_image(): + var level = get_tree().get_first_node_in_group("Level") + if !level: + return + var effect_group = level.get_node("Effect_Group") + if !effect_group: + return + + var after_image = after_image_scene.instantiate() + after_image.position = owner_sprite.global_position + after_image.scale = owner_sprite.scale * base_scale + + var after_image_sprite:Sprite2D = after_image.get_node("Sprite2D") + after_image_sprite.texture = owner_sprite.texture + after_image_sprite.region_enabled = true + after_image_sprite.region_rect = owner_sprite.region_rect + after_image.scale.x *= owner.get_node("Body_Animation").scale.x + + if after_image_material: + var current_material = ShaderMaterial.new() + current_material.shader = after_image_material.shader + current_material.set_shader_parameter("rainbow_width", + after_image_material.get_shader_parameter("rainbow_width")) + current_material.set_shader_parameter("rainbow_speed", + after_image_material.get_shader_parameter("rainbow_speed")) + after_image_sprite.material = current_material + + after_image.z_index = 5 + effect_group.add_child(after_image) + + reset_spawn_timer() + +func start(): + is_active = true + can_spawn = true + +func stop(): + is_active = false + can_spawn = false + clear_shader() + +func set_shader_parameter(param_name: String, value): + if after_image_material: + after_image_material.set_shader_parameter(param_name, value) + +func configure(config: Dictionary): + if config.has("spawn_frequency"): + spawn_frequency = config.spawn_frequency + if config.has("base_scale"): + base_scale = config.base_scale + if config.has("min_velocity"): + min_velocity = config.min_velocity + + clear_shader() + +func spawn_trail_between_points(start_pos: Vector2, end_pos: Vector2, num_images: int = 16, shader:bool = true, after_image_texture: Texture = null, after_image_rect: Rect2 = Rect2()): + var level = get_tree().get_first_node_in_group("Level") + if !level: + return + var effect_group = level.get_node("Effect_Group") + if !effect_group: + return + + var total_distance = start_pos.distance_to(end_pos) + var direction = (end_pos - start_pos).normalized() + + # 定义透明度范围 + var alpha_start = 0.1 # 起始透明度 + var alpha_end = 0.8 # 结束透明度 + + if shader and !after_image_material: + var new_material = ShaderMaterial.new() + new_material.shader = load("res://Char/Char_Components/After_Image/player_dash.gdshader") + after_image_material = new_material + + after_image_material.set_shader_parameter("effect_mixture", 1.0) + after_image_material.set_shader_parameter("alpha_multiplier", 1.0) + after_image_material.set_shader_parameter("color_offset", 0.0) + after_image_material.set_shader_parameter("glow_intensity", 1.2) + + for i in range(num_images): + var progress = float(i) / float(num_images - 1) + var adjusted_progress = 1.0 - pow(1.0 - progress, 1.5) + + var current_pos = start_pos + direction * (total_distance * adjusted_progress) + + var after_image = after_image_scene.instantiate() + var after_image_sprite = after_image.get_node("Sprite2D") + + after_image_sprite.texture = after_image_texture + if after_image_rect != Rect2(): + after_image_sprite.region_enabled = true + after_image_sprite.region_rect = after_image_rect + + if end_pos.x < start_pos.x: + after_image_sprite.set_flip_h(true) + else: + after_image_sprite.set_flip_h(false) + + after_image.position = current_pos + owner_sprite.position + after_image.scale = owner_sprite.scale * base_scale + + # 计算当前的透明度 + var current_alpha = lerp(alpha_start, alpha_end, progress) + + if shader and after_image_material: + var current_material = after_image_material.duplicate() + + current_material.set_shader_parameter("effect_mixture", 1.0) + # 使用统一的透明度计算 + current_material.set_shader_parameter("alpha_multiplier", current_alpha) + current_material.set_shader_parameter("color_offset", 1.0 - progress) + + after_image_sprite.material = current_material + + # 如果需要同时使用modulate和shader效果 + after_image_sprite.modulate = Color(1, 1, 1, current_alpha) + else: + # 非shader情况下的透明度处理 + after_image_sprite.modulate = Color(1, 1, 1, current_alpha) + + after_image.z_index = 5 + effect_group.add_child(after_image) + + if shader: + clear_shader() diff --git a/Char/Char_Components/After_Image/after_image_component.gd.uid b/Char/Char_Components/After_Image/after_image_component.gd.uid new file mode 100644 index 0000000..9e0f0cf --- /dev/null +++ b/Char/Char_Components/After_Image/after_image_component.gd.uid @@ -0,0 +1 @@ +uid://gw5o7qlfk82k diff --git a/Char/Char_Components/After_Image/after_image_component.tscn b/Char/Char_Components/After_Image/after_image_component.tscn new file mode 100644 index 0000000..562ca47 --- /dev/null +++ b/Char/Char_Components/After_Image/after_image_component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dd7k3qbsw1bhq"] + +[ext_resource type="Script" uid="uid://gw5o7qlfk82k" path="res://Char/Char_Components/After_Image/after_image_component.gd" id="1_c5t65"] + +[node name="After_Image_Component" type="Node"] +script = ExtResource("1_c5t65") diff --git a/Char/Char_Components/After_Image/player_dash.gdshader b/Char/Char_Components/After_Image/player_dash.gdshader new file mode 100644 index 0000000..51543a3 --- /dev/null +++ b/Char/Char_Components/After_Image/player_dash.gdshader @@ -0,0 +1,78 @@ +shader_type canvas_item; + +uniform bool time_slowed = false; +uniform float effect_mixture : hint_range(0.0, 1.0) = 0.0; +uniform float alpha_multiplier = 1.0; +uniform float color_offset = 0.0; // 颜色偏移值 + +uniform float glow_intensity = 1.2; +uniform float inner_glow_width = 0.5; +uniform float outer_glow_width = 2.0; +uniform float pulse_speed = 2.0; +uniform float pulse_strength = 0.2; +uniform bool high_quality = true; // 性能开关 + +// HSV转RGB函数 +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void fragment() { + vec4 texture_color = texture(TEXTURE, UV); + + if (texture_color.a > 0.0) { + vec3 blue_base = vec3(0.2, 0.6, 1.5); + float luminance = dot(texture_color.rgb, vec3(0.299, 0.587, 0.114)); + + // 脉冲动画效果 + float pulse = (sin(TIME * pulse_speed) * 0.5 + 0.5) * pulse_strength; + + // 内发光效果 + float inner_glow = pow(luminance, inner_glow_width) * glow_intensity; + + // 外发光效果 + float outer_glow = 0.0; + if (high_quality) { + // 高质量模式 - 完整采样 + vec2 size = 1.0 / TEXTURE_PIXEL_SIZE; + vec2 pixel_size = 1.0 / size; + for(float x = -outer_glow_width; x <= outer_glow_width; x += 1.0) { + for(float y = -outer_glow_width; y <= outer_glow_width; y += 1.0) { + vec2 offset = vec2(x, y) * pixel_size; + float sample_alpha = texture(TEXTURE, UV + offset).a; + float distance = length(vec2(x, y)) / outer_glow_width; + outer_glow += sample_alpha * (1.0 - distance); + } + } + outer_glow = outer_glow / (outer_glow_width * outer_glow_width * 4.0); + } else { + // 性能模式 - 简化采样 + float sample_distance = outer_glow_width * 0.5; + vec2 pixel_size = 1.0 / (1.0 / TEXTURE_PIXEL_SIZE); + for(float i = 0.0; i < 4.0; i++) { + float angle = i * PI * 0.5; + vec2 offset = vec2(cos(angle), sin(angle)) * sample_distance * pixel_size; + outer_glow += texture(TEXTURE, UV + offset).a; + } + outer_glow = outer_glow * 0.25; + } + + float total_glow = inner_glow + outer_glow + pulse; + + // 基于color_offset生成颜色,范围集中在黄色系 + float hue = fract(color_offset) * 0.4 + 0.1; // 0.1-0.5范围,集中在黄色区域 + vec3 rainbow_color = hsv2rgb(vec3(hue, 0.9, 0.95)); // 高饱和度,稍微降低亮度 + + // 混合发光效果 + vec3 final_color = mix(blue_base, rainbow_color, total_glow); + final_color += rainbow_color * total_glow * 0.5; + + // 最终颜色混合 + vec3 mixed_color = mix(texture_color.rgb, final_color, effect_mixture); + COLOR = vec4(mixed_color, texture_color.a * alpha_multiplier); + } else { + COLOR = vec4(texture_color.rgb, texture_color.a * alpha_multiplier); + } +} \ No newline at end of file diff --git a/Char/Char_Components/After_Image/player_dash.gdshader.uid b/Char/Char_Components/After_Image/player_dash.gdshader.uid new file mode 100644 index 0000000..f9bc8cb --- /dev/null +++ b/Char/Char_Components/After_Image/player_dash.gdshader.uid @@ -0,0 +1 @@ +uid://yqf4d8jhe08n diff --git a/Char/Char_Components/Blood/Art/blood_stain_1.png b/Char/Char_Components/Blood/Art/blood_stain_1.png new file mode 100644 index 0000000..3e1e2ce Binary files /dev/null and b/Char/Char_Components/Blood/Art/blood_stain_1.png differ diff --git a/Char/Char_Components/Blood/Art/blood_stain_1.png.import b/Char/Char_Components/Blood/Art/blood_stain_1.png.import new file mode 100644 index 0000000..01efa66 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckeych64pqat5" +path="res://.godot/imported/blood_stain_1.png-fa41647d084c0f93ca6ca680f0f9e558.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/blood_stain_1.png" +dest_files=["res://.godot/imported/blood_stain_1.png-fa41647d084c0f93ca6ca680f0f9e558.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/Char/Char_Components/Blood/Art/blood_stain_1_01.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_01.tscn new file mode 100644 index 0000000..7ed2e29 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_01.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cvo81ftpraiox"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_q1ejx"] + +[node name="blood_stain_1_01" type="Sprite2D"] +self_modulate = Color(0.584314, 0.584314, 0.584314, 0.792157) +texture = ExtResource("1_q1ejx") +region_enabled = true +region_rect = Rect2(6, 12, 18, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_02.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_02.tscn new file mode 100644 index 0000000..abfe3d1 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_02.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://njyayfryqw4t"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_3pwwm"] + +[node name="blood_stain_1_02" type="Sprite2D"] +texture = ExtResource("1_3pwwm") +region_enabled = true +region_rect = Rect2(42, 12, 18, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_03.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_03.tscn new file mode 100644 index 0000000..091b9f3 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_03.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bufiuix6cnf47"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_trp84"] + +[node name="blood_stain_1_03" type="Sprite2D"] +texture = ExtResource("1_trp84") +region_enabled = true +region_rect = Rect2(72, 6, 18, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_04.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_04.tscn new file mode 100644 index 0000000..7eaee5c --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_04.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bseih617jgpn7"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_q5o66"] + +[node name="blood_stain_1_04" type="Sprite2D"] +texture = ExtResource("1_q5o66") +region_enabled = true +region_rect = Rect2(108, 6, 12, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_05.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_05.tscn new file mode 100644 index 0000000..61bebe7 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_05.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dcvfvishu32o"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_l8egl"] + +[node name="blood_stain_1_05" type="Sprite2D"] +texture = ExtResource("1_l8egl") +region_enabled = true +region_rect = Rect2(138, 6, 18, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_06.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_06.tscn new file mode 100644 index 0000000..86de7bd --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_06.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://cf0qk5x0d1aao"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_glts2"] + +[node name="blood_stain_1_06" type="Sprite2D"] +texture = ExtResource("1_glts2") +region_enabled = true +region_rect = Rect2(168, 6, 18, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_1_07.tscn b/Char/Char_Components/Blood/Art/blood_stain_1_07.tscn new file mode 100644 index 0000000..0f6c3c7 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_1_07.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://c7ym7k205dp7g"] + +[ext_resource type="Texture2D" uid="uid://ckeych64pqat5" path="res://Char/Char_Components/Blood/Art/blood_stain_1.png" id="1_odg3f"] + +[node name="blood_stain_1_07" type="Sprite2D"] +texture = ExtResource("1_odg3f") +region_enabled = true +region_rect = Rect2(204, 12, 12, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2.png b/Char/Char_Components/Blood/Art/blood_stain_2.png new file mode 100644 index 0000000..a211cea Binary files /dev/null and b/Char/Char_Components/Blood/Art/blood_stain_2.png differ diff --git a/Char/Char_Components/Blood/Art/blood_stain_2.png.import b/Char/Char_Components/Blood/Art/blood_stain_2.png.import new file mode 100644 index 0000000..1f65edf --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1e5r5c6bsoo" +path="res://.godot/imported/blood_stain_2.png-32689891efbd2668df399cb281736924.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/blood_stain_2.png" +dest_files=["res://.godot/imported/blood_stain_2.png-32689891efbd2668df399cb281736924.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/Char/Char_Components/Blood/Art/blood_stain_2_01.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_01.tscn new file mode 100644 index 0000000..2f064ce --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_01.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dv342saiudbuw"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_xyws2"] + +[node name="blood_stain_2_01" type="Sprite2D"] +texture = ExtResource("1_xyws2") +region_enabled = true +region_rect = Rect2(6, 12, 30, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_02.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_02.tscn new file mode 100644 index 0000000..2e86311 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_02.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://ds30a70uwl4iu"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_krthc"] + +[node name="blood_stain_2_02" type="Sprite2D"] +texture = ExtResource("1_krthc") +region_enabled = true +region_rect = Rect2(48, 12, 30, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_03.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_03.tscn new file mode 100644 index 0000000..65476b3 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_03.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bdryepy5bm282"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_esujp"] + +[node name="blood_stain_2_03" type="Sprite2D"] +texture = ExtResource("1_esujp") +region_enabled = true +region_rect = Rect2(90, 12, 36, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_04.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_04.tscn new file mode 100644 index 0000000..c4b9656 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_04.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dhovjxccg2mqm"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_srjcf"] + +[node name="blood_stain_2_04" type="Sprite2D"] +texture = ExtResource("1_srjcf") +region_enabled = true +region_rect = Rect2(132, 12, 30, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_05.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_05.tscn new file mode 100644 index 0000000..a518ba7 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_05.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bthfgajr33gh7"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_tygqj"] + +[node name="blood_stain_2_05" type="Sprite2D"] +texture = ExtResource("1_tygqj") +region_enabled = true +region_rect = Rect2(6, 42, 30, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_06.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_06.tscn new file mode 100644 index 0000000..ba7beb3 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_06.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://cmbgju0i610ps"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_x3bik"] + +[node name="blood_stain_2_06" type="Sprite2D"] +texture = ExtResource("1_x3bik") +region_enabled = true +region_rect = Rect2(48, 42, 36, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_07.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_07.tscn new file mode 100644 index 0000000..67b7e89 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_07.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://orh0bway7jr2"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_0hg8m"] + +[node name="blood_stain_2_07" type="Sprite2D"] +texture = ExtResource("1_0hg8m") +region_enabled = true +region_rect = Rect2(96, 42, 30, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_08.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_08.tscn new file mode 100644 index 0000000..bd56b41 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_08.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bfn2671b38alp"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_prppv"] + +[node name="blood_stain_2_08" type="Sprite2D"] +texture = ExtResource("1_prppv") +region_enabled = true +region_rect = Rect2(132, 42, 30, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_09.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_09.tscn new file mode 100644 index 0000000..a6e00ad --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_09.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bfhsqlvxufqqj"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_146v3"] + +[node name="blood_stain_2_09" type="Sprite2D"] +texture = ExtResource("1_146v3") +region_enabled = true +region_rect = Rect2(6, 72, 36, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_10.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_10.tscn new file mode 100644 index 0000000..f8129a2 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_10.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dex00007ea3h1"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_vvnj2"] + +[node name="blood_stain_2_10" type="Sprite2D"] +texture = ExtResource("1_vvnj2") +region_enabled = true +region_rect = Rect2(48, 78, 36, 12) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_11.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_11.tscn new file mode 100644 index 0000000..22d8210 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_11.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://di40o3c74hsw6"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_1m0gx"] + +[node name="blood_stain_2_11" type="Sprite2D"] +texture = ExtResource("1_1m0gx") +region_enabled = true +region_rect = Rect2(90, 72, 36, 18) diff --git a/Char/Char_Components/Blood/Art/blood_stain_2_12.tscn b/Char/Char_Components/Blood/Art/blood_stain_2_12.tscn new file mode 100644 index 0000000..adf2fb9 --- /dev/null +++ b/Char/Char_Components/Blood/Art/blood_stain_2_12.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://b573pp1o23j4y"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_0if4e"] + +[node name="blood_stain_2_12" type="Sprite2D"] +texture = ExtResource("1_0if4e") +region_enabled = true +region_rect = Rect2(132, 78, 30, 12) diff --git a/Char/Char_Components/Blood/Art/spr_blood2_0.png b/Char/Char_Components/Blood/Art/spr_blood2_0.png new file mode 100644 index 0000000..d7ff758 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_0.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_0.png.import b/Char/Char_Components/Blood/Art/spr_blood2_0.png.import new file mode 100644 index 0000000..cfa9f41 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://411dga7lbi6i" +path="res://.godot/imported/spr_blood2_0.png-b8c515ae7d2fdc5e8c799f6b03dc93f8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_0.png" +dest_files=["res://.godot/imported/spr_blood2_0.png-b8c515ae7d2fdc5e8c799f6b03dc93f8.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/Char/Char_Components/Blood/Art/spr_blood2_1.png b/Char/Char_Components/Blood/Art/spr_blood2_1.png new file mode 100644 index 0000000..0a6cbaf Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_1.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_1.png.import b/Char/Char_Components/Blood/Art/spr_blood2_1.png.import new file mode 100644 index 0000000..7c36f45 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cywd468wrclbi" +path="res://.godot/imported/spr_blood2_1.png-12727a417ecdfa178b003ef534820aec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_1.png" +dest_files=["res://.godot/imported/spr_blood2_1.png-12727a417ecdfa178b003ef534820aec.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/Char/Char_Components/Blood/Art/spr_blood2_2.png b/Char/Char_Components/Blood/Art/spr_blood2_2.png new file mode 100644 index 0000000..dd64494 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_2.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_2.png.import b/Char/Char_Components/Blood/Art/spr_blood2_2.png.import new file mode 100644 index 0000000..3d631e0 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ylmx7ejlfje" +path="res://.godot/imported/spr_blood2_2.png-274862736b0b23a346364a798321ffaa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_2.png" +dest_files=["res://.godot/imported/spr_blood2_2.png-274862736b0b23a346364a798321ffaa.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/Char/Char_Components/Blood/Art/spr_blood2_3.png b/Char/Char_Components/Blood/Art/spr_blood2_3.png new file mode 100644 index 0000000..f50061b Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_3.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_3.png.import b/Char/Char_Components/Blood/Art/spr_blood2_3.png.import new file mode 100644 index 0000000..3f606e3 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://va4x1qryhleq" +path="res://.godot/imported/spr_blood2_3.png-d73d746830595aff3132d0188eafaf4e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_3.png" +dest_files=["res://.godot/imported/spr_blood2_3.png-d73d746830595aff3132d0188eafaf4e.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/Char/Char_Components/Blood/Art/spr_blood2_4.png b/Char/Char_Components/Blood/Art/spr_blood2_4.png new file mode 100644 index 0000000..4bb4524 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_4.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_4.png.import b/Char/Char_Components/Blood/Art/spr_blood2_4.png.import new file mode 100644 index 0000000..597f398 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://de3nomyhghkvi" +path="res://.godot/imported/spr_blood2_4.png-5c69b4d1ff3d78a2d681ddad82c542c3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_4.png" +dest_files=["res://.godot/imported/spr_blood2_4.png-5c69b4d1ff3d78a2d681ddad82c542c3.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/Char/Char_Components/Blood/Art/spr_blood2_5.png b/Char/Char_Components/Blood/Art/spr_blood2_5.png new file mode 100644 index 0000000..9198e25 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood2_5.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood2_5.png.import b/Char/Char_Components/Blood/Art/spr_blood2_5.png.import new file mode 100644 index 0000000..be04db5 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood2_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cudohua7dtpks" +path="res://.godot/imported/spr_blood2_5.png-d3c33a718bbf819dea1f7569d03b16ca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood2_5.png" +dest_files=["res://.godot/imported/spr_blood2_5.png-d3c33a718bbf819dea1f7569d03b16ca.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/Char/Char_Components/Blood/Art/spr_blood3_0.png b/Char/Char_Components/Blood/Art/spr_blood3_0.png new file mode 100644 index 0000000..5e8a39a Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_0.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_0.png.import b/Char/Char_Components/Blood/Art/spr_blood3_0.png.import new file mode 100644 index 0000000..1edf6df --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqtct1nxe724a" +path="res://.godot/imported/spr_blood3_0.png-0b7491352704b0cf612a755b89012e94.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_0.png" +dest_files=["res://.godot/imported/spr_blood3_0.png-0b7491352704b0cf612a755b89012e94.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/Char/Char_Components/Blood/Art/spr_blood3_1.png b/Char/Char_Components/Blood/Art/spr_blood3_1.png new file mode 100644 index 0000000..c2ca3a4 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_1.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_1.png.import b/Char/Char_Components/Blood/Art/spr_blood3_1.png.import new file mode 100644 index 0000000..b459d70 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbx7xette0hx7" +path="res://.godot/imported/spr_blood3_1.png-dc2ed1d778183c37b39e826d07829e8c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_1.png" +dest_files=["res://.godot/imported/spr_blood3_1.png-dc2ed1d778183c37b39e826d07829e8c.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/Char/Char_Components/Blood/Art/spr_blood3_2.png b/Char/Char_Components/Blood/Art/spr_blood3_2.png new file mode 100644 index 0000000..b8d1045 Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_2.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_2.png.import b/Char/Char_Components/Blood/Art/spr_blood3_2.png.import new file mode 100644 index 0000000..a52992a --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6g0dm5hm7t3" +path="res://.godot/imported/spr_blood3_2.png-6b3b1e9d88f100e4a18dcc1254fbb3db.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_2.png" +dest_files=["res://.godot/imported/spr_blood3_2.png-6b3b1e9d88f100e4a18dcc1254fbb3db.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/Char/Char_Components/Blood/Art/spr_blood3_3.png b/Char/Char_Components/Blood/Art/spr_blood3_3.png new file mode 100644 index 0000000..78ab02e Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_3.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_3.png.import b/Char/Char_Components/Blood/Art/spr_blood3_3.png.import new file mode 100644 index 0000000..a8c05eb --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bi6nm4qdr1at6" +path="res://.godot/imported/spr_blood3_3.png-42efb0c0a85df4110fa91d3e059dd4fa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_3.png" +dest_files=["res://.godot/imported/spr_blood3_3.png-42efb0c0a85df4110fa91d3e059dd4fa.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/Char/Char_Components/Blood/Art/spr_blood3_4.png b/Char/Char_Components/Blood/Art/spr_blood3_4.png new file mode 100644 index 0000000..d0653aa Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_4.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_4.png.import b/Char/Char_Components/Blood/Art/spr_blood3_4.png.import new file mode 100644 index 0000000..c248bb0 --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dosr0uksuoqdf" +path="res://.godot/imported/spr_blood3_4.png-2c985ec843feec3959c998f45398b9a8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_4.png" +dest_files=["res://.godot/imported/spr_blood3_4.png-2c985ec843feec3959c998f45398b9a8.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/Char/Char_Components/Blood/Art/spr_blood3_5.png b/Char/Char_Components/Blood/Art/spr_blood3_5.png new file mode 100644 index 0000000..0b8659b Binary files /dev/null and b/Char/Char_Components/Blood/Art/spr_blood3_5.png differ diff --git a/Char/Char_Components/Blood/Art/spr_blood3_5.png.import b/Char/Char_Components/Blood/Art/spr_blood3_5.png.import new file mode 100644 index 0000000..f3785de --- /dev/null +++ b/Char/Char_Components/Blood/Art/spr_blood3_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cuo001phdjlds" +path="res://.godot/imported/spr_blood3_5.png-81576a7871265b57c0fe2e5e1bea23bf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Blood/Art/spr_blood3_5.png" +dest_files=["res://.godot/imported/spr_blood3_5.png-81576a7871265b57c0fe2e5e1bea23bf.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/Char/Char_Components/Blood/Blood_Component.gd b/Char/Char_Components/Blood/Blood_Component.gd new file mode 100644 index 0000000..9afa2f5 --- /dev/null +++ b/Char/Char_Components/Blood/Blood_Component.gd @@ -0,0 +1,283 @@ +extends Node2D + +@export var min_rays := 5 +@export var max_rays := 12 +@export var min_length := 60.0 +@export var max_length := 160.0 + +var spread_angle := randf_range(20,30) +var _last_sprite_index: int = -1 # 记录上一次使用的精灵索引 + +var blood_part_2_enabled = false + +#func _ready() -> void: + #create_part1_blood(Vector2(1,0)) + +func _physics_process(_delta: float) -> void: + if blood_part_2_enabled and randf() > 0.5: + var pos = global_position + var dir = get_parent().velocity.normalized() + spawn_blood_part_2(pos,dir) + +#region 初始涂墙 +func create_part1_blood(direction): + var current_rays = generate_rays(direction) + for each_ray in current_rays: + create_two_segment_sprite_line(each_ray["start"], each_ray["middle_point"], each_ray["end"], randi_range(10,30),randi_range(1,3)) + +func generate_rays(direction: Vector2) -> Array: + var current_rays: Array = [] + direction = direction.normalized() + var ray_count = randi_range(min_rays, max_rays) + + # 1. 计算角度范围 + var base_angle = direction.angle() + var max_deviation = deg_to_rad(spread_angle) + var section_size = (max_deviation * 2) / (ray_count + 1) + var start_angle = base_angle - max_deviation + + # 2. 创建所有射线 + var raycasts: Array[RayCast2D] = [] + for i in ray_count: + var section_start = start_angle + section_size * i + var section_end = section_start + section_size + var final_angle = randf_range(section_start, section_end) + + var raycast = RayCast2D.new() + add_child(raycast) + raycasts.append(raycast) + + raycast.position = Vector2.ZERO + var ray_direction = Vector2(cos(final_angle), sin(final_angle)) + var ray_length = randf_range(min_length, max_length) + raycast.target_position = ray_direction * ray_length + + raycast.collision_mask = 0 + for layer in [20,22,23,24,25]: + raycast.set_collision_mask_value(layer, true) + + raycast.enabled = true + raycast.force_raycast_update() + + # 3. 处理射线结果 + for i in ray_count: + var raycast = raycasts[i] + var ray_direction = raycast.target_position.normalized() + var intended_length = raycast.target_position.length() + + # 生成60%-80%之间的随机比例 + var middle_ratio = randf_range(0.5, 0.8) + + if raycast.is_colliding(): + var global_collision_point = raycast.get_collision_point() + var distance_to_collision = global_position.distance_to(global_collision_point) + + if distance_to_collision <= intended_length: + # 计算中间点(在实际碰撞点之前) + var middle_point = global_position.lerp(global_collision_point, middle_ratio) + current_rays.append({ + "start": global_position, + "end": global_collision_point, + "middle_point": middle_point, + "collision": true, + "out_of_range_collision": false, + "intended_length": intended_length + }) + else: + var global_clamped_end = global_position + (ray_direction * intended_length) + var middle_point = global_position.lerp(global_clamped_end, middle_ratio) + current_rays.append({ + "start": global_position, + "end": global_clamped_end, + "middle_point": middle_point, + "collision": false, + "out_of_range_collision": true, + "intended_length": intended_length + }) + else: + var global_intended_end = global_position + (ray_direction * intended_length) + var middle_point = global_position.lerp(global_intended_end, middle_ratio) + current_rays.append({ + "start": global_position, + "end": global_intended_end, + "middle_point": middle_point, + "collision": false, + "out_of_range_collision": false, + "intended_length": intended_length + }) + raycast.queue_free() + + return current_rays + +# 主函数:生成三点两段的精灵线 +func create_two_segment_sprite_line( + start_pos: Vector2, + middle_pos: Vector2, + end_pos: Vector2, + first_segment_count: int, + second_segment_count: int, +) -> void: + var sprite_scene_group_1: Array[PackedScene] = [ + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_01.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_02.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_03.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_04.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_05.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_06.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_07.tscn") + ] + var sprite_scene_group_2: Array[PackedScene] = [ + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_01.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_02.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_03.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_04.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_05.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_06.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_07.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_08.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_09.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_10.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_12.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_11.tscn") + ] + + _last_sprite_index = -1 # 重置上一次的索引 + # 生成两段 + create_sprite_line_segment(start_pos, middle_pos, first_segment_count, 1.1, 1.0, sprite_scene_group_1) + _last_sprite_index = -1 # 两段之间重置,让两段独立 + create_sprite_line_segment(middle_pos, end_pos, second_segment_count, 0.8, 0.6, sprite_scene_group_2) + +# 生成单段精灵线 +func create_sprite_line_segment( + start_pos: Vector2, + end_pos: Vector2, + sprite_count: int, + start_scale: float, + end_scale: float, + _sprite_scene_group: Array[PackedScene] +) -> void: + var parent = get_tree().get_first_node_in_group("Effect_Group") + if not parent: + push_warning("未找到Effect_Group组的节点!") + return + + sprite_count = maxi(1, sprite_count) + var direction = end_pos - start_pos + + for i in range(sprite_count): + var progress = float(i) / (sprite_count - 1) if sprite_count > 1 else 0.0 + var _current_pos = start_pos.lerp(end_pos, progress) + var _scale_value = lerp(start_scale, end_scale, progress) + var _rotation = direction.angle() + + # 随机选择一个场景(避免重复) + #var selected_scene = _get_random_sprite_scene(sprite_scene_group) + #_create_single_sprite(current_pos, _rotation, scale_value, parent, selected_scene) + + var blood_impulse_percent = randf() + if blood_impulse_percent > 0.9: + spawn_blood_part_1(start_pos,end_pos) + + blood_part_2_enabled = true + +# 随机选择场景(避免与上次重复) +func _get_random_sprite_scene(sprite_scene_group: Array[PackedScene]) -> PackedScene: + var group_size = sprite_scene_group.size() + if group_size == 1: + return sprite_scene_group[0] + + # 生成可用索引列表(排除上次使用的索引) + var available_indices: Array[int] = [] + for i in range(group_size): + if i != _last_sprite_index: + available_indices.append(i) + + # 随机选择一个新索引 + var random_index = available_indices[randi() % available_indices.size()] + _last_sprite_index = random_index # 更新上次使用的索引 + + return sprite_scene_group[random_index] + +# 创建单个精灵 +func _create_single_sprite(pos: Vector2, _rotation: float, scale_value: float, parent: Node, sprite_scene: PackedScene) -> void: + var sprite = sprite_scene.instantiate() as Sprite2D + if not sprite: + push_warning("场景实例化失败!") + return + + sprite.position = pos + sprite.rotation = _rotation + sprite.scale = Vector2(scale_value, scale_value) + sprite.self_modulate = Color.from_string("959595ca", Color.WHITE) + parent.add_child(sprite) + +#region End + +func spawn_blood_part_1(start_pos: Vector2, end_pos: Vector2) -> void: + var effect_scene = preload("res://Char/Char_Components/Blood/blood_part.tscn") + # 计算方向向量(标准化) + var dir = (end_pos - start_pos).normalized() + + # 随机选择生成位置 + var spawn_pos = start_pos if randi() % 2 == 0 else end_pos + + # 实例化场景 + var effect_instance = effect_scene.instantiate() + + # 设置位置和旋转 + effect_instance.global_position = spawn_pos + effect_instance.rotation = dir.angle() + effect_instance.can_stain = true + effect_instance.z_index = 2 + + # 设置速度 (假设effect_instance继承自CharacterBody2D) + effect_instance.velocity = dir * randf_range(100,200) + + # 添加到效果组的第一个节点下 + var effect_parent = get_tree().get_first_node_in_group("Effect_Group") + if effect_parent: + effect_parent.add_child(effect_instance) + +func spawn_blood_part_2(pos: Vector2, dir: Vector2) -> void: + var PROJECTILE_SPEED = 80.0 + var scene = preload("res://Char/Char_Components/Blood/blood_part.tscn") + + # 确保方向向量有效 + if dir.length_squared() == 0: + dir = Vector2(0,1) + + # 获取特定组的父节点 + var parent = get_tree().get_first_node_in_group("Effect_Group") + if not parent: + push_error("Cannot find Effect_Group node") + return + + # 标准化方向向量 + var normalized_dir = dir.normalized() + + # 实例化场景 + var instance = scene.instantiate() as CharacterBody2D + if not instance: + push_error("Failed to instantiate scene or invalid type") + return + + # 添加到场景树 + parent.add_child(instance) + + # 计算基础角度和随机偏移 + var base_angle = (-normalized_dir).angle() + var random_offset = deg_to_rad(randf_range(-3.0, 3.0)) # 转换度数为弧度 + var final_angle = base_angle + random_offset + + # 设置位置和朝向 + instance.global_position = pos + instance.rotation = final_angle + instance.scale.y *= 1 if randf() < 0.5 else -1 #血液喷出动画左右镜像 + instance.can_stain = true + instance.z_index = 2 + + # 根据最终角度计算速度方向 + var final_dir = Vector2.from_angle(final_angle + PI) # 加PI是因为我们要反方向 + + # 设置初始速度 + instance.velocity = final_dir * PROJECTILE_SPEED diff --git a/Char/Char_Components/Blood/Blood_Component.gd.uid b/Char/Char_Components/Blood/Blood_Component.gd.uid new file mode 100644 index 0000000..79865b2 --- /dev/null +++ b/Char/Char_Components/Blood/Blood_Component.gd.uid @@ -0,0 +1 @@ +uid://5h4w13512vya diff --git a/Char/Char_Components/Blood/Blood_Component.tscn b/Char/Char_Components/Blood/Blood_Component.tscn new file mode 100644 index 0000000..4dc49f2 --- /dev/null +++ b/Char/Char_Components/Blood/Blood_Component.tscn @@ -0,0 +1,136 @@ +[gd_scene load_steps=12 format=3 uid="uid://bj7ycp6aj85je"] + +[ext_resource type="Script" uid="uid://5h4w13512vya" path="res://Char/Char_Components/Blood/Blood_Component.gd" id="1_d6wdq"] +[ext_resource type="Texture2D" uid="uid://bqtct1nxe724a" path="res://Char/Char_Components/Blood/Art/spr_blood3_0.png" id="2_n46qh"] +[ext_resource type="Texture2D" uid="uid://dbx7xette0hx7" path="res://Char/Char_Components/Blood/Art/spr_blood3_1.png" id="3_fyp4q"] +[ext_resource type="Texture2D" uid="uid://bi6nm4qdr1at6" path="res://Char/Char_Components/Blood/Art/spr_blood3_3.png" id="4_3tgul"] +[ext_resource type="Texture2D" uid="uid://dosr0uksuoqdf" path="res://Char/Char_Components/Blood/Art/spr_blood3_4.png" id="5_jpkhl"] +[ext_resource type="Texture2D" uid="uid://cuo001phdjlds" path="res://Char/Char_Components/Blood/Art/spr_blood3_5.png" id="6_g8yvn"] + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_bxxjd"] + +[sub_resource type="Animation" id="Animation_rbj3g"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [SubResource("CompressedTexture2D_bxxjd")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(10, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-0.165806] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:self_modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.92549, 0, 0, 0)] +} + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_0ycfe"] + +[sub_resource type="Animation" id="Animation_xwo6r"] +resource_name = "blood_hurt_begin" +length = 0.6 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("2_n46qh"), ExtResource("3_fyp4q"), SubResource("CompressedTexture2D_0ycfe"), ExtResource("4_3tgul"), ExtResource("5_jpkhl"), ExtResource("6_g8yvn")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2(10, 1), Vector2(10, -1), Vector2(10, -3)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [0.0, -0.165806, -0.296706, -0.986111] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:self_modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.923959, 4.86121e-06, 1.34766e-06, 1), Color(0.923959, 4.86121e-06, 1.34766e-06, 1), Color(0.92549, 0, 0, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_uoogr"] +_data = { +&"RESET": SubResource("Animation_rbj3g"), +&"blood_hurt_begin": SubResource("Animation_xwo6r") +} + +[node name="Blood_Component" type="Node2D"] +script = ExtResource("1_d6wdq") + +[node name="Sprite2D" type="Sprite2D" parent="."] +self_modulate = Color(0.92549, 0, 0, 0) +position = Vector2(10, 1) +rotation = -0.165806 +texture = SubResource("CompressedTexture2D_bxxjd") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_uoogr") +} diff --git a/Char/Char_Components/Blood/blood_mask.gdshader b/Char/Char_Components/Blood/blood_mask.gdshader new file mode 100644 index 0000000..51f5be0 --- /dev/null +++ b/Char/Char_Components/Blood/blood_mask.gdshader @@ -0,0 +1,12 @@ +// mask_shader.gdshader +shader_type canvas_item; + +uniform sampler2D mask_texture; + +void fragment() { + vec4 sprite_color = texture(TEXTURE, UV); + vec4 mask_color = texture(mask_texture, SCREEN_UV); + + COLOR = sprite_color; + COLOR.a *= mask_color.r; +} \ No newline at end of file diff --git a/Char/Char_Components/Blood/blood_mask.gdshader.uid b/Char/Char_Components/Blood/blood_mask.gdshader.uid new file mode 100644 index 0000000..7fc9ea5 --- /dev/null +++ b/Char/Char_Components/Blood/blood_mask.gdshader.uid @@ -0,0 +1 @@ +uid://ft0ftw3xf13d diff --git a/Char/Char_Components/Blood/blood_part.gd b/Char/Char_Components/Blood/blood_part.gd new file mode 100644 index 0000000..a435d23 --- /dev/null +++ b/Char/Char_Components/Blood/blood_part.gd @@ -0,0 +1,113 @@ +extends CharacterBody2D + +var can_stain = false + +# 所有可用的动画名称(方便后续添加新动画) +const AVAILABLE_ANIMATIONS = [ + "impulse_1", + "impulse_2", + # 未来可以直接在这里添加新的动画名称 + # "impulse_3", + # "impulse_4", +] + +func _ready() -> void: + var anim_player = $AnimationPlayer + anim_player.speed_scale = randf_range(0.8,1.2) + + # 确保有可用的动画 + if AVAILABLE_ANIMATIONS.is_empty(): + push_warning("没有可用的动画!") + queue_free() + return + + # 随机选择一个动画名称 + var random_index = randi() % AVAILABLE_ANIMATIONS.size() + var chosen_anim = AVAILABLE_ANIMATIONS[random_index] + + # 验证动画是否存在 + if not anim_player.has_animation(chosen_anim): + push_warning("动画 %s 不存在!" % chosen_anim) + queue_free() + return + + # 播放选中的动画 + anim_player.play(chosen_anim) + +func _physics_process(_delta: float) -> void: + move_and_slide() + +func spawn_random_effect() -> Node2D: + if not can_stain: + return + var pos = global_position + var dir = velocity.normalized() + var group_1: Array[PackedScene] = [ + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_01.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_02.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_03.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_04.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_05.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_06.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_1_07.tscn") + ] + var group_2: Array[PackedScene] = [ + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_01.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_02.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_03.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_04.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_05.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_06.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_07.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_08.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_09.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_10.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_12.tscn"), + preload("res://Char/Char_Components/Blood/Art/blood_stain_2_11.tscn") + ] + # 随机选择使用哪个组(50%概率) + var selected_group: Array[PackedScene] + var is_group_1: bool = randf() < 0.5 + selected_group = group_1 if is_group_1 else group_2 + + # 如果选中的组是空的,使用另一个组 + if selected_group.is_empty(): + selected_group = group_2 if is_group_1 else group_1 + is_group_1 = !is_group_1 + + # 随机选择场景并实例化 + var random_scene: PackedScene = selected_group[randi() % selected_group.size()] + var instance = random_scene.instantiate() as Node2D + if not instance: + push_error("Failed to instantiate scene!") + return null + + # 设置位置 + instance.global_position = pos + instance.self_modulate = Color.from_string("959595ca", Color.WHITE) + instance.z_index = 2 + + # 根据组别应用不同的变换 + if is_group_1: + # 对group_1随机旋转 + instance.rotation = randf_range(0, TAU) # TAU = 2π + #随机缩放 + var random_scale = randf_range(1.1, 1.6) + instance.scale = Vector2(random_scale, random_scale) + else: + # 对group_2设置指定朝向 + instance.transform = Transform2D(dir.angle(), pos) + #随机缩放 + var random_scale = randf_range(0.8, 1) + instance.scale = Vector2(random_scale, random_scale) + + # 添加到效果组 + var effect_group = get_tree().get_first_node_in_group("Effect_Group") + if effect_group: + effect_group.add_child(instance) + else: + push_error("Effect_Group not found!") + instance.queue_free() + return null + + return instance diff --git a/Char/Char_Components/Blood/blood_part.gd.uid b/Char/Char_Components/Blood/blood_part.gd.uid new file mode 100644 index 0000000..6c036be --- /dev/null +++ b/Char/Char_Components/Blood/blood_part.gd.uid @@ -0,0 +1 @@ +uid://bxpdshv4vrg5g diff --git a/Char/Char_Components/Blood/blood_part.tscn b/Char/Char_Components/Blood/blood_part.tscn new file mode 100644 index 0000000..56c1a0b --- /dev/null +++ b/Char/Char_Components/Blood/blood_part.tscn @@ -0,0 +1,194 @@ +[gd_scene load_steps=18 format=3 uid="uid://bqrjt8yb6bl27"] + +[ext_resource type="Script" uid="uid://bxpdshv4vrg5g" path="res://Char/Char_Components/Blood/blood_part.gd" id="1_vga13"] +[ext_resource type="Texture2D" uid="uid://bqtct1nxe724a" path="res://Char/Char_Components/Blood/Art/spr_blood3_0.png" id="2_scf3e"] +[ext_resource type="Texture2D" uid="uid://dbx7xette0hx7" path="res://Char/Char_Components/Blood/Art/spr_blood3_1.png" id="3_5dmvv"] +[ext_resource type="Texture2D" uid="uid://c6g0dm5hm7t3" path="res://Char/Char_Components/Blood/Art/spr_blood3_2.png" id="4_7rq5f"] +[ext_resource type="Texture2D" uid="uid://bi6nm4qdr1at6" path="res://Char/Char_Components/Blood/Art/spr_blood3_3.png" id="5_p06en"] +[ext_resource type="Texture2D" uid="uid://dosr0uksuoqdf" path="res://Char/Char_Components/Blood/Art/spr_blood3_4.png" id="6_hc7gt"] +[ext_resource type="Texture2D" uid="uid://cuo001phdjlds" path="res://Char/Char_Components/Blood/Art/spr_blood3_5.png" id="7_32u30"] +[ext_resource type="Texture2D" uid="uid://411dga7lbi6i" path="res://Char/Char_Components/Blood/Art/spr_blood2_0.png" id="8_nl6dm"] +[ext_resource type="Texture2D" uid="uid://cywd468wrclbi" path="res://Char/Char_Components/Blood/Art/spr_blood2_1.png" id="9_e20gj"] +[ext_resource type="Texture2D" uid="uid://ylmx7ejlfje" path="res://Char/Char_Components/Blood/Art/spr_blood2_2.png" id="10_6jt12"] +[ext_resource type="Texture2D" uid="uid://va4x1qryhleq" path="res://Char/Char_Components/Blood/Art/spr_blood2_3.png" id="11_ntuc6"] +[ext_resource type="Texture2D" uid="uid://de3nomyhghkvi" path="res://Char/Char_Components/Blood/Art/spr_blood2_4.png" id="12_abujt"] +[ext_resource type="Texture2D" uid="uid://cudohua7dtpks" path="res://Char/Char_Components/Blood/Art/spr_blood2_5.png" id="13_bba02"] + +[sub_resource type="Animation" id="Animation_g3m3s"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_scf3e")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(10, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_n86p7"] +resource_name = "impulse_1" +length = 0.45 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.25, 0.35), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("2_scf3e"), ExtResource("3_5dmvv"), ExtResource("4_7rq5f"), ExtResource("5_p06en"), ExtResource("6_hc7gt"), ExtResource("7_32u30")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Vector2(10, 1), Vector2(9, 1), Vector2(8, 1), Vector2(7, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.35, 0.45), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.643137, 0.0392157, 0.0392157, 1), Color(0.643137, 0.0392157, 0.0392157, 1), Color(1, 1, 1, 0)] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath(".") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.2, 0.45), +"transitions": PackedFloat32Array(1, 1), +"values": [{ +"args": [], +"method": &"spawn_random_effect" +}, { +"args": [], +"method": &"queue_free" +}] +} + +[sub_resource type="Animation" id="Animation_ri227"] +resource_name = "impulse_2" +length = 0.45 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.25, 0.35), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("8_nl6dm"), ExtResource("9_e20gj"), ExtResource("10_6jt12"), ExtResource("11_ntuc6"), ExtResource("12_abujt"), ExtResource("13_bba02")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Vector2(11, 1), Vector2(9, 1), Vector2(8, 1), Vector2(7, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.35, 0.45), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.643137, 0.0392157, 0.0392157, 1), Color(0.643137, 0.0392157, 0.0392157, 1), Color(1, 1, 1, 0)] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath(".") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.2, 0.45), +"transitions": PackedFloat32Array(1, 1), +"values": [{ +"args": [], +"method": &"spawn_random_effect" +}, { +"args": [], +"method": &"queue_free" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_64yuh"] +_data = { +&"RESET": SubResource("Animation_g3m3s"), +&"impulse_1": SubResource("Animation_n86p7"), +&"impulse_2": SubResource("Animation_ri227") +} + +[node name="Blood_Part" type="CharacterBody2D"] +z_index = 2 +script = ExtResource("1_vga13") + +[node name="Sprite2D" type="Sprite2D" parent="."] +self_modulate = Color(1, 1, 1, 0) +light_mask = 2 +visibility_layer = 2 +position = Vector2(10, 1) +scale = Vector2(1.8, 1.8) +texture = ExtResource("2_scf3e") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_64yuh") +} diff --git a/Char/Char_Components/Blood/blood_stain.gd b/Char/Char_Components/Blood/blood_stain.gd new file mode 100644 index 0000000..e537a70 --- /dev/null +++ b/Char/Char_Components/Blood/blood_stain.gd @@ -0,0 +1,147 @@ +extends Sprite2D + +@onready var tile_group = get_tree().get_first_node_in_group("Tile_Group") +var mask_viewport: SubViewport +var mask_texture: ViewportTexture +var is_queued_for_update := false +var camera: Camera2D +var last_camera_position := Vector2.ZERO +var last_camera_offset := Vector2.ZERO # 新增:跟踪相机偏移量 + +class MaskRenderer extends Node2D: + var is_queued_for_update := false + + func _draw(): + var tile_group = get_tree().get_first_node_in_group("Tile_Group") + if not tile_group or tile_group.tilemaplayers.is_empty(): + return + + var reference_layer = tile_group.tilemaplayers[0] + + for info in tile_group.mask_tile_info: + var base_pos = reference_layer.map_to_local(info.position) + + for shape in info.shapes: + match shape.type: + "polygon": + var transformed_points = PackedVector2Array() + for point in shape.points: + transformed_points.append(base_pos + point) + draw_colored_polygon(transformed_points, Color.WHITE) + + "rect": + var pos = base_pos - shape.size/2 + var rect = Rect2(pos, shape.size) + draw_rect(rect, Color.WHITE, true) + + func queue_update(): + if not is_queued_for_update: + is_queued_for_update = true + RenderingServer.frame_post_draw.connect(_on_frame_post_draw, CONNECT_ONE_SHOT) + + func _on_frame_post_draw(): + is_queued_for_update = false + queue_redraw() + +func _ready(): + # 设置 SubViewport + _setup_viewport() + # 设置着色器 + _setup_shader() + # 订阅信号 + tile_group.mask_tiles_updated.connect(_on_mask_tiles_updated) + # 寻找并跟踪相机 + _find_and_track_camera() + + await RenderingServer.frame_post_draw + _update_viewport_for_camera() + material.set_shader_parameter("mask_texture", mask_viewport.get_texture()) + +func _setup_viewport(): + mask_viewport = SubViewport.new() + mask_viewport.transparent_bg = true + mask_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS + add_child(mask_viewport) + + var mask_renderer = MaskRenderer.new() + mask_viewport.add_child(mask_renderer) + +func _setup_shader(): + var shader_material = ShaderMaterial.new() + shader_material.shader = preload("res://Char/Char_Components/Blood/blood_mask.gdshader") + material = shader_material + +func _find_and_track_camera(): + # 寻找场景中的相机 + var level = get_tree().get_first_node_in_group("Level") + if level: + camera = level.get_node_or_null("Player/Camera2D") + if camera: + last_camera_position = camera.get_screen_center_position() + +func _process(_delta): + if not camera: + return + + var current_pos = camera.get_screen_center_position() + var current_offset = camera.offset + + # 检查相机位置或偏移量是否发生变化 + if current_pos != last_camera_position or current_offset != last_camera_offset: + last_camera_position = current_pos + last_camera_offset = current_offset + _update_viewport_for_camera() + +func _update_viewport_for_camera(): + if not camera: + return + + # 获取相机的视口大小和缩放 + var viewport_rect = get_viewport_rect() + var zoom = camera.zoom + var screen_size = viewport_rect.size + + # 计算实际需要的视口大小(考虑缩放) + var actual_size = screen_size / zoom + + # 更新 SubViewport 大小 + mask_viewport.size = actual_size + + # 获取相机的全局位置和偏移量 + var camera_global_pos = camera.get_screen_center_position() + var camera_offset = camera.offset + + # 计算实际的相机中心位置(考虑偏移量) + var effective_camera_center = camera_global_pos + camera_offset * zoom + + # 计算视口的左上角位置 + var top_left = effective_camera_center - (actual_size / 2) + + # 更新 MaskRenderer 的位置以对齐相机 + if mask_viewport.get_child(0) is MaskRenderer: + var mask_renderer = mask_viewport.get_child(0) + mask_renderer.position = -top_left + + # 触发一次更新 + _update_mask() + +func _update_mask(): + if mask_viewport and mask_viewport.get_child(0) is MaskRenderer: + var mask_renderer = mask_viewport.get_child(0) as MaskRenderer + mask_renderer.queue_update() + +func _on_mask_tiles_updated(): + if not is_queued_for_update: + is_queued_for_update = true + RenderingServer.frame_post_draw.connect(_update_mask_deferred, CONNECT_ONE_SHOT) + +func _update_mask_deferred(): + is_queued_for_update = false + _update_mask() + +func cleanup(): + if tile_group and tile_group.mask_tiles_updated.is_connected(_on_mask_tiles_updated): + tile_group.mask_tiles_updated.disconnect(_on_mask_tiles_updated) + +func _exit_tree(): + cleanup() diff --git a/Char/Char_Components/Blood/blood_stain.gd.uid b/Char/Char_Components/Blood/blood_stain.gd.uid new file mode 100644 index 0000000..737eafb --- /dev/null +++ b/Char/Char_Components/Blood/blood_stain.gd.uid @@ -0,0 +1 @@ +uid://dxm1qly14lxs8 diff --git a/Char/Char_Components/Blood/blood_stain.tscn b/Char/Char_Components/Blood/blood_stain.tscn new file mode 100644 index 0000000..6cdba39 --- /dev/null +++ b/Char/Char_Components/Blood/blood_stain.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=5 format=3 uid="uid://cqvw1nk6yco4e"] + +[ext_resource type="Texture2D" uid="uid://1e5r5c6bsoo" path="res://Char/Char_Components/Blood/Art/blood_stain_2.png" id="1_ed4nt"] +[ext_resource type="Shader" uid="uid://ft0ftw3xf13d" path="res://Char/Char_Components/Blood/blood_mask.gdshader" id="1_mxfgm"] +[ext_resource type="Script" uid="uid://dxm1qly14lxs8" path="res://Char/Char_Components/Blood/blood_stain.gd" id="2_bsbek"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qkvmt"] +shader = ExtResource("1_mxfgm") + +[node name="Blood_Stain_Trail" type="Sprite2D"] +material = SubResource("ShaderMaterial_qkvmt") +position = Vector2(0, 1) +texture = ExtResource("1_ed4nt") +region_enabled = true +region_rect = Rect2(6, 12, 30, 12) +script = ExtResource("2_bsbek") diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png new file mode 100644 index 0000000..214f618 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png.import new file mode 100644 index 0000000..85752df --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mgg5rhiwrtfv" +path="res://.godot/imported/spr_dustcloud_0.png-cf721bc582f42b0b8e0bca3a856efe6a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png" +dest_files=["res://.godot/imported/spr_dustcloud_0.png-cf721bc582f42b0b8e0bca3a856efe6a.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png new file mode 100644 index 0000000..5dcdeaa Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png.import new file mode 100644 index 0000000..a6495d0 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ldao777f1qy" +path="res://.godot/imported/spr_dustcloud_1.png-f0f610d743fbc2cfbf0c3929609c2a42.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png" +dest_files=["res://.godot/imported/spr_dustcloud_1.png-f0f610d743fbc2cfbf0c3929609c2a42.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png new file mode 100644 index 0000000..4cf670f Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png.import new file mode 100644 index 0000000..64a9c9c --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwdp4kv4d755p" +path="res://.godot/imported/spr_dustcloud_2.png-e04b8801496146bb4a2e2decf55e2ae5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png" +dest_files=["res://.godot/imported/spr_dustcloud_2.png-e04b8801496146bb4a2e2decf55e2ae5.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png new file mode 100644 index 0000000..fb49616 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png.import new file mode 100644 index 0000000..1fc137a --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://biteusit4sfay" +path="res://.godot/imported/spr_dustcloud_3.png-8bc1b91b162b276106bad5efb9712c65.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png" +dest_files=["res://.godot/imported/spr_dustcloud_3.png-8bc1b91b162b276106bad5efb9712c65.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png new file mode 100644 index 0000000..06bbc4a Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png.import new file mode 100644 index 0000000..102eefe --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u18w5owa3bf3" +path="res://.godot/imported/spr_dustcloud_4.png-669cecba10ce98f3d7c8f9b93f9d2a8b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png" +dest_files=["res://.godot/imported/spr_dustcloud_4.png-669cecba10ce98f3d7c8f9b93f9d2a8b.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png new file mode 100644 index 0000000..2127c53 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png.import new file mode 100644 index 0000000..bd8e4b2 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://spc3qs84aqyq" +path="res://.godot/imported/spr_dustcloud_5.png-4995857e45ed75a3c63401d3cb45d441.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png" +dest_files=["res://.godot/imported/spr_dustcloud_5.png-4995857e45ed75a3c63401d3cb45d441.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/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png new file mode 100644 index 0000000..e1b4107 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png.import new file mode 100644 index 0000000..78fa319 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d254kptg1uq2w" +path="res://.godot/imported/spr_dustcloud_6.png-9d0bb8000eea446aef8fb8c90488fafb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png" +dest_files=["res://.godot/imported/spr_dustcloud_6.png-9d0bb8000eea446aef8fb8c90488fafb.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/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png new file mode 100644 index 0000000..8123050 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png.import new file mode 100644 index 0000000..2db78b4 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy02ipw3ha3ru" +path="res://.godot/imported/spr_jumpcloud_0.png-92c1688a67cf151cc937fc82c77657d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png" +dest_files=["res://.godot/imported/spr_jumpcloud_0.png-92c1688a67cf151cc937fc82c77657d9.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/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png new file mode 100644 index 0000000..67467dd Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png.import new file mode 100644 index 0000000..231555a --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c80dr8q21xva0" +path="res://.godot/imported/spr_jumpcloud_1.png-9961f2d78357fc38465ad572d734e6bf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png" +dest_files=["res://.godot/imported/spr_jumpcloud_1.png-9961f2d78357fc38465ad572d734e6bf.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/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png new file mode 100644 index 0000000..afbfa58 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png.import new file mode 100644 index 0000000..e3b1725 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://du12drqa16gwq" +path="res://.godot/imported/spr_jumpcloud_2.png-01e4e3192fef7c8254f57435c46e6e7c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png" +dest_files=["res://.godot/imported/spr_jumpcloud_2.png-01e4e3192fef7c8254f57435c46e6e7c.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/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png new file mode 100644 index 0000000..ef88ca3 Binary files /dev/null and b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png differ diff --git a/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png.import b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png.import new file mode 100644 index 0000000..1f5cc6c --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by1ow45esdky3" +path="res://.godot/imported/spr_jumpcloud_3.png-9e5a9c6f02e97250fbdd84962e5e98dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png" +dest_files=["res://.godot/imported/spr_jumpcloud_3.png-9e5a9c6f02e97250fbdd84962e5e98dd.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/Char/Char_Components/Floor_Wall_FX/floor_dust.tscn b/Char/Char_Components/Floor_Wall_FX/floor_dust.tscn new file mode 100644 index 0000000..78baa71 --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/floor_dust.tscn @@ -0,0 +1,304 @@ +[gd_scene load_steps=11 format=3 uid="uid://ciaxr6undqtgm"] + +[ext_resource type="Texture2D" uid="uid://mgg5rhiwrtfv" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_0.png" id="1_8ruvd"] +[ext_resource type="Texture2D" uid="uid://ldao777f1qy" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_1.png" id="2_cooot"] +[ext_resource type="Texture2D" uid="uid://dwdp4kv4d755p" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_2.png" id="3_60cn2"] +[ext_resource type="Texture2D" uid="uid://biteusit4sfay" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_3.png" id="4_fr2oo"] +[ext_resource type="Texture2D" uid="uid://u18w5owa3bf3" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_4.png" id="5_ia5nt"] +[ext_resource type="Texture2D" uid="uid://spc3qs84aqyq" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_5.png" id="6_d302j"] +[ext_resource type="Texture2D" uid="uid://d254kptg1uq2w" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_dustcloud_6.png" id="7_ma365"] + +[sub_resource type="Animation" id="Animation_uehnd"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_cooot")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:self_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, -1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../AnimationPlayer:speed_scale") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../Sprite2D_2:self_modulate") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("../Sprite2D_2:texture") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_8ruvd")] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("../Sprite2D_2:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, -1)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("../Sprite2D_3:self_modulate") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("../Sprite2D_3:texture") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_cooot")] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("../Sprite2D_3:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, -1)] +} + +[sub_resource type="Animation" id="Animation_jjwqk"] +resource_name = "floor_dust" +length = 0.9 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("1_8ruvd"), ExtResource("2_cooot"), ExtResource("3_60cn2"), ExtResource("4_fr2oo"), ExtResource("5_ia5nt"), ExtResource("6_d302j"), ExtResource("7_ma365")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:self_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.4, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(-33, -2), Vector2(-46, -12), Vector2(-53, -14)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../AnimationPlayer:speed_scale") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [2.0] +} +tracks/4/type = "method" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("..") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0.9), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"queue_free" +}] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("../Sprite2D_2:texture") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("1_8ruvd"), ExtResource("2_cooot"), ExtResource("3_60cn2"), ExtResource("4_fr2oo"), ExtResource("5_ia5nt"), ExtResource("6_d302j"), ExtResource("7_ma365")] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("../Sprite2D_2:self_modulate") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1, 0.4, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("../Sprite2D_2:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.5, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 0), Vector2(5, 2), Vector2(5, -6), Vector2(5, -9)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("../Sprite2D_3:texture") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("1_8ruvd"), ExtResource("2_cooot"), ExtResource("3_60cn2"), ExtResource("4_fr2oo"), ExtResource("5_ia5nt"), ExtResource("6_d302j"), ExtResource("7_ma365")] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("../Sprite2D_3:self_modulate") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.1, 0.6, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("../Sprite2D_3:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.2, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(19, 0), Vector2(22, -2), Vector2(23, -10), Vector2(22, -13)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_5tpx7"] +_data = { +&"RESET": SubResource("Animation_uehnd"), +&"floor_dust": SubResource("Animation_jjwqk") +} + +[node name="floor_dust" type="Node2D" groups=["FX"]] +z_index = 2 + +[node name="Sprite2D_1" type="Sprite2D" parent="."] +self_modulate = Color(1, 1, 1, 0) +position = Vector2(-3, -1) +texture = ExtResource("2_cooot") +offset = Vector2(0, 3) + +[node name="Sprite2D_2" type="Sprite2D" parent="."] +position = Vector2(5, -1) +texture = ExtResource("1_8ruvd") +offset = Vector2(0, 3) + +[node name="Sprite2D_3" type="Sprite2D" parent="."] +self_modulate = Color(1, 1, 1, 0) +position = Vector2(-2, -1) +texture = ExtResource("2_cooot") +offset = Vector2(0, 3) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Sprite2D_1") +libraries = { +"": SubResource("AnimationLibrary_5tpx7") +} +autoplay = "floor_dust" diff --git a/Char/Char_Components/Floor_Wall_FX/wall_jump_dust.tscn b/Char/Char_Components/Floor_Wall_FX/wall_jump_dust.tscn new file mode 100644 index 0000000..fda6b1e --- /dev/null +++ b/Char/Char_Components/Floor_Wall_FX/wall_jump_dust.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=8 format=3 uid="uid://dnm32l0ymread"] + +[ext_resource type="Texture2D" uid="uid://by1ow45esdky3" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_3.png" id="1_bgkyd"] +[ext_resource type="Texture2D" uid="uid://dy02ipw3ha3ru" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_0.png" id="2_um0fq"] +[ext_resource type="Texture2D" uid="uid://c80dr8q21xva0" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_1.png" id="3_vushu"] +[ext_resource type="Texture2D" uid="uid://du12drqa16gwq" path="res://Char/Char_Components/Floor_Wall_FX/Art/spr_jumpcloud_2.png" id="4_mhn4l"] + +[sub_resource type="Animation" id="Animation_io5gk"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("3_vushu")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, 0)] +} + +[sub_resource type="Animation" id="Animation_n5fpk"] +resource_name = "wall_jump_dust" +length = 0.4 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [ExtResource("2_um0fq"), ExtResource("3_vushu"), ExtResource("4_mhn4l"), ExtResource("1_bgkyd")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [2.0] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath(".") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"queue_free" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_clrdw"] +_data = { +&"RESET": SubResource("Animation_io5gk"), +&"wall_jump_dust": SubResource("Animation_n5fpk") +} + +[node name="wall_jump_dust" type="Node2D" groups=["FX"]] +z_index = 2 + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(-3, 0) +rotation = -1.5708 +texture = ExtResource("3_vushu") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_clrdw") +} +autoplay = "wall_jump_dust" +speed_scale = 2.0 diff --git a/Char/Char_Components/Petals_Leaves/Sakura.png b/Char/Char_Components/Petals_Leaves/Sakura.png new file mode 100644 index 0000000..ed1ea7b Binary files /dev/null and b/Char/Char_Components/Petals_Leaves/Sakura.png differ diff --git a/Char/Char_Components/Petals_Leaves/Sakura.png.import b/Char/Char_Components/Petals_Leaves/Sakura.png.import new file mode 100644 index 0000000..ee4a6f6 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/Sakura.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2ncysl2v71nn" +path="res://.godot/imported/Sakura.png-f3726873e9009fc93cd029d0af4dc755.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Char_Components/Petals_Leaves/Sakura.png" +dest_files=["res://.godot/imported/Sakura.png-f3726873e9009fc93cd029d0af4dc755.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/Char/Char_Components/Petals_Leaves/Sakura_Component.tscn b/Char/Char_Components/Petals_Leaves/Sakura_Component.tscn new file mode 100644 index 0000000..a46fb24 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/Sakura_Component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dkgg53dn8lr3k"] + +[ext_resource type="Script" uid="uid://ra8s8ac2gvb0" path="res://Char/Char_Components/Petals_Leaves/sakura_component.gd" id="1_qmr48"] + +[node name="Sakura_Component" type="Node"] +script = ExtResource("1_qmr48") diff --git a/Char/Char_Components/Petals_Leaves/Sakura_Fall.tscn b/Char/Char_Components/Petals_Leaves/Sakura_Fall.tscn new file mode 100644 index 0000000..fc93771 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/Sakura_Fall.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=6 format=3 uid="uid://dkdigqo1emefi"] + +[ext_resource type="Script" uid="uid://bdhb15mqnjfg2" path="res://Char/Char_Components/Petals_Leaves/sakura_fall.gd" id="2_2mj48"] +[ext_resource type="Texture2D" uid="uid://c2ncysl2v71nn" path="res://Char/Char_Components/Petals_Leaves/Sakura.png" id="2_4qm7o"] + +[sub_resource type="Animation" id="Animation_cppck"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:region_rect") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 6, 6)] +} + +[sub_resource type="Animation" id="Animation_630tj"] +resource_name = "move" +length = 0.6 +loop_mode = 2 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:region_rect") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Rect2(0, 0, 6, 6), Rect2(6, 0, 6, 6), Rect2(12, 0, 6, 6), Rect2(18, 0, 6, 6)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_hi3eq"] +_data = { +&"RESET": SubResource("Animation_cppck"), +&"move": SubResource("Animation_630tj") +} + +[node name="Sakura_Fall" type="Node2D"] +z_index = 3 +script = ExtResource("2_2mj48") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_4qm7o") +region_enabled = true +region_rect = Rect2(0, 0, 6, 6) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Sprite2D") +libraries = { +"": SubResource("AnimationLibrary_hi3eq") +} +autoplay = "move" + +[node name="RayCast2D" type="RayCast2D" parent="."] +target_position = Vector2(0, 3) +collision_mask = 23592960 +hit_from_inside = true diff --git a/Char/Char_Components/Petals_Leaves/Sakura_Impulse.tscn b/Char/Char_Components/Petals_Leaves/Sakura_Impulse.tscn new file mode 100644 index 0000000..3d98af7 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/Sakura_Impulse.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://bg1ufqdro4aie"] + +[ext_resource type="Script" uid="uid://bwknlix5qpg3i" path="res://Char/Char_Components/Petals_Leaves/sakura_impulse.gd" id="1_s7d1x"] +[ext_resource type="Texture2D" uid="uid://c2ncysl2v71nn" path="res://Char/Char_Components/Petals_Leaves/Sakura.png" id="1_vlpkf"] + +[node name="Sakura_Impulse" type="Node2D"] +z_index = 3 +script = ExtResource("1_s7d1x") + +[node name="Sprite2D" type="Sprite2D" parent="."] +scale = Vector2(0.6, 0.6) +texture = ExtResource("1_vlpkf") +region_enabled = true +region_rect = Rect2(6, 0, 6, 6) diff --git a/Char/Char_Components/Petals_Leaves/sakura_component.gd b/Char/Char_Components/Petals_Leaves/sakura_component.gd new file mode 100644 index 0000000..c1c1958 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_component.gd @@ -0,0 +1,62 @@ +extends Node + +const sakura_impulse = preload("res://Char/Char_Components/Petals_Leaves/Sakura_Impulse.tscn") +const sakura_fall = preload("res://Char/Char_Components/Petals_Leaves/Sakura_Fall.tscn") + +# 距离线的最大偏移距离 +var max_offset: float = 60.0 + +# 生成一批樱花 +func spawn_sakura_impulse(start_position: Vector2, end_position: Vector2, batch_size: int = 20): + if not sakura_impulse: + return + + for i in batch_size: + var sakura = sakura_impulse.instantiate() + + # 计算线段上的随机点 + var t = randf() + var line_point = start_position.lerp(end_position, t) + + # 计算线段的垂直方向(始终保持向上) + var line_direction = (end_position - start_position).normalized() + var perpendicular = Vector2(-line_direction.y, line_direction.x) + # 确保垂直向量始终指向上方 + if perpendicular.y > 0: + perpendicular = -perpendicular + + # 在垂直方向上随机偏移 + var offset = randf_range(-max_offset, max_offset) + var final_position = line_point + (perpendicular * offset) + + sakura.position = final_position + + var random_dir = Vector2(randf_range(-1,1), randf_range(-1,1)) + var random_speed = randf_range(10,30) + sakura.initialize(random_dir, random_speed) + get_tree().get_first_node_in_group("Effect_Group").add_child(sakura) + +func spawn_sakura_fall(start_position: Vector2, end_position: Vector2, batch_size: int = 20): + if not sakura_fall: + return + + for i in batch_size: + var sakura = sakura_fall.instantiate() + + # 计算线段上的随机点 + var t = randf() + var line_point = start_position.lerp(end_position, t) + + # 计算线段的垂直方向(始终保持向上) + var line_direction = (end_position - start_position).normalized() + var perpendicular = Vector2(-line_direction.y, line_direction.x) + # 确保垂直向量始终指向上方 + if perpendicular.y > 0: + perpendicular = -perpendicular + + # 在垂直方向上随机偏移 + var offset = randf_range(0, max_offset) + var final_position = line_point + (perpendicular * offset) + + sakura.position = final_position + get_tree().get_first_node_in_group("Effect_Group").add_child(sakura) diff --git a/Char/Char_Components/Petals_Leaves/sakura_component.gd.uid b/Char/Char_Components/Petals_Leaves/sakura_component.gd.uid new file mode 100644 index 0000000..08c5141 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_component.gd.uid @@ -0,0 +1 @@ +uid://ra8s8ac2gvb0 diff --git a/Char/Char_Components/Petals_Leaves/sakura_fall.gd b/Char/Char_Components/Petals_Leaves/sakura_fall.gd new file mode 100644 index 0000000..249b022 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_fall.gd @@ -0,0 +1,51 @@ +extends Node2D + +@onready var ray_cast_2d: RayCast2D = $RayCast2D + +var fall_speed: float = randf_range(28,32) # 基础下落速度 +var horizontal_speed: float = randf_range(30,40) # 水平摆动速度 +var rotation_speed: float = randf_range(1.9,2.1) # 旋转速度 +var vertical_wave_amplitude: float = randf_range(5,15) # 垂直摆动幅度 +var horizontal_wave_freq: float = randf_range(1,3) # 水平摆动频率 +var vertical_wave_freq: float = randf_range(2.8,3.2) # 垂直摆动频率 + +var time_passed: float = 0.0 +var initial_x: float = 0.0 +var initial_y: float = 0.0 +var rotate_flag: bool = true +var direction: float = 1.0 # 新增:控制方向的变量 + +func _ready(): + initial_x = position.x + initial_y = position.y + + # 随机设置初始方向(1或-1) + direction = 1.0 if randf() > 0.5 else -1.0 + + # 节点进行随机旋转,冲刺生成樱花专属,因为会对初始位置进行调整,不适合impulse之后生成,会有瞬移感觉。 + if rotate_flag: + time_passed = randf() * PI * 2 + rotation_degrees = randf_range(0, 360) + +func _process(delta): + if ray_cast_2d.is_colliding(): + await get_tree().create_timer(0.3).timeout + queue_free() + + time_passed += delta + + # 基础下落移动 + var base_fall = fall_speed * delta + + # 垂直方向的正弦波动 + var vertical_wave = sin(time_passed * vertical_wave_freq) * vertical_wave_amplitude * delta + + # 水平方向的正弦移动(加入direction变量控制方向) + var horizontal_wave = sin(time_passed * horizontal_wave_freq) * horizontal_speed * direction + + # 应用移动 + position.y += base_fall + vertical_wave + position.x = initial_x + horizontal_wave + + # 旋转(可以也加入正弦变化使旋转更自然) + rotation += rotation_speed * delta * (1 + sin(time_passed) * 0.2) diff --git a/Char/Char_Components/Petals_Leaves/sakura_fall.gd.uid b/Char/Char_Components/Petals_Leaves/sakura_fall.gd.uid new file mode 100644 index 0000000..42f9bdf --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_fall.gd.uid @@ -0,0 +1 @@ +uid://bdhb15mqnjfg2 diff --git a/Char/Char_Components/Petals_Leaves/sakura_impulse.gd b/Char/Char_Components/Petals_Leaves/sakura_impulse.gd new file mode 100644 index 0000000..b5e30f8 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_impulse.gd @@ -0,0 +1,68 @@ +extends Node2D + +const SAKURA_FALL = preload("res://Char/Char_Components/Petals_Leaves/Sakura_Fall.tscn") + +var direction: Vector2 # 移动方向 +var speed: float # 初始速度 +var velocity: Vector2 # 实际速度向量 + +var time_before_slow: float = 0.2 # 时间A:匀速运动的时间 +var slow_duration: float = 0.1 # 时间B:减速持续时间 +var stop_duration: float = 0.1 # 时间C:停留时间 +var elapsed_time: float = 0.0 # 已经过的时间 + +var is_slowing: bool = false # 是否正在减速 +var is_stopped: bool = false # 是否已经停止 +var original_speed: float # 保存初始速度用于计算减速 + +func _ready(): + #initialize(Vector2(10,-10), 500) + # 初始化速度向量 + velocity = direction.normalized() * speed + original_speed = speed + +func _process(delta): + elapsed_time += delta + if elapsed_time >= time_before_slow and !is_slowing: + # 开始减速 + is_slowing = true + elapsed_time = 0 # 重置计时器用于减速阶段 + + if is_slowing and !is_stopped: + # 在减速阶段 + var slow_progress = min(elapsed_time / slow_duration, 1.0) + # 使用ease_out实现平滑的减速效果 + speed = original_speed * (1.0 - ease(slow_progress, -2.0)) + velocity = direction.normalized() * speed + + if slow_progress >= 1.0: + # 完全停止 + velocity = Vector2.ZERO + is_stopped = true + elapsed_time = 0 # 重置计时器用于停留时间 + + # 如果已经停止,等待一段时间后再创建樱花 + elif is_stopped: + if elapsed_time >= stop_duration: + create_sakura_fall() + queue_free() + + # 应用移动 + position += velocity * delta + +# 初始化函数 +func initialize(initial_direction: Vector2 = Vector2(1,1), initial_speed: float = 30) -> void: + direction = get_random_direction(initial_direction, 30.0) + speed = initial_speed + original_speed = initial_speed + +# 使用旋转矩阵(更简洁的方式) +func get_random_direction(base_direction: Vector2, max_angle_offset: float = 30.0) -> Vector2: + return base_direction.rotated(randf_range(-max_angle_offset, max_angle_offset) * PI / 180.0) + +func create_sakura_fall() -> void: + var sakura = SAKURA_FALL.instantiate() + # 设置樱花效果的位置为当前物体的位置 + sakura.rotate_flag = false + sakura.global_position = self.global_position + get_tree().get_first_node_in_group("Effect_Group").add_child(sakura) diff --git a/Char/Char_Components/Petals_Leaves/sakura_impulse.gd.uid b/Char/Char_Components/Petals_Leaves/sakura_impulse.gd.uid new file mode 100644 index 0000000..cb44be1 --- /dev/null +++ b/Char/Char_Components/Petals_Leaves/sakura_impulse.gd.uid @@ -0,0 +1 @@ +uid://bwknlix5qpg3i diff --git a/Char/Char_Components/fx_component.gd b/Char/Char_Components/fx_component.gd new file mode 100644 index 0000000..04d5540 --- /dev/null +++ b/Char/Char_Components/fx_component.gd @@ -0,0 +1,60 @@ +#挂在角色身上,由角色产生的,可以由角色调用产生相应的fx效果 +#包括:地面扬尘、蹬墙跳特效 +extends Node2D + +# 预加载场景 +@export var FLOOR_DUST = preload("res://Char/Char_Components/Floor_Wall_FX/floor_dust.tscn") +@export var WALL_JUMP_DUST = preload("res://Char/Char_Components/Floor_Wall_FX/wall_jump_dust.tscn") + +func create_floor_dust(direction: int): + # 实例化floor_dust场景 + var dust = FLOOR_DUST.instantiate() + + # 获取Level节点 + var level = get_tree().get_first_node_in_group("Level") + if not level: + push_warning("No level node found in group 'Level'") + return + + # 获取或创建Effect_Group节点 + var effect_group = level.get_node_or_null("Effect_Group") + if not effect_group: + effect_group = Node2D.new() + effect_group.name = "Effect_Group" + level.add_child(effect_group) + + # 设置灰尘特效的位置和方向 + dust.global_position = global_position + # 根据传入的direction参数设置特效的朝向 + dust.scale.x = -1 if direction == -1 else 1 + + # 将灰尘特效添加为Effect_Group的子节点 + effect_group.add_child(dust) + +func create_wall_jump_dust(direction: int): + # 实例化wall_jump_dust场景 + var dust = WALL_JUMP_DUST.instantiate() + + # 获取Level节点 + var level = get_tree().get_first_node_in_group("Level") + if not level: + push_warning("No level node found in group 'Level'") + return + + # 获取或创建Effect_Group节点 + var effect_group = level.get_node_or_null("Effect_Group") + if not effect_group: + effect_group = Node2D.new() + effect_group.name = "Effect_Group" + level.add_child(effect_group) + + # 获取wall_jump_dust的生成位置 + var spawn_pos = $pos_wall_jump_dust.global_position + + # 设置灰尘特效的位置和方向 + dust.global_position = spawn_pos + # 根据传入的direction参数设置特效的朝向 + dust.scale.x = -1 if direction == -1 else 1 + + # 将灰尘特效添加为Effect_Group的子节点 + effect_group.add_child(dust) diff --git a/Char/Char_Components/fx_component.gd.uid b/Char/Char_Components/fx_component.gd.uid new file mode 100644 index 0000000..166f6eb --- /dev/null +++ b/Char/Char_Components/fx_component.gd.uid @@ -0,0 +1 @@ +uid://btvbc6o6gwpms diff --git a/Char/Enemy/Art/1.png b/Char/Enemy/Art/1.png new file mode 100644 index 0000000..f746853 Binary files /dev/null and b/Char/Enemy/Art/1.png differ diff --git a/Char/Enemy/Art/1.png.import b/Char/Enemy/Art/1.png.import new file mode 100644 index 0000000..d34deb6 --- /dev/null +++ b/Char/Enemy/Art/1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tox8emeo0w3b" +path="res://.godot/imported/1.png-10debc6d5656f887ddfc0c9576036819.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/1.png" +dest_files=["res://.godot/imported/1.png-10debc6d5656f887ddfc0c9576036819.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/Char/Enemy/Art/2.png b/Char/Enemy/Art/2.png new file mode 100644 index 0000000..a23cd54 Binary files /dev/null and b/Char/Enemy/Art/2.png differ diff --git a/Char/Enemy/Art/2.png.import b/Char/Enemy/Art/2.png.import new file mode 100644 index 0000000..37ec223 --- /dev/null +++ b/Char/Enemy/Art/2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6g33ompg5t8a" +path="res://.godot/imported/2.png-286b68d6a7eb0bfdbb8206bc70615168.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/2.png" +dest_files=["res://.godot/imported/2.png-286b68d6a7eb0bfdbb8206bc70615168.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png new file mode 100644 index 0000000..c05cb1f Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png.import new file mode 100644 index 0000000..55ceb2d --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvf5wbsg34qv0" +path="res://.godot/imported/spr_shotgun_hurtfly_0.png-90d9f7f37b7b7cbae792d7a42083b7c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtfly_0.png-90d9f7f37b7b7cbae792d7a42083b7c6.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png new file mode 100644 index 0000000..3b56e6d Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png.import new file mode 100644 index 0000000..a8afd30 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqewxn6t7xeoj" +path="res://.godot/imported/spr_shotgun_hurtfly_1.png-6bc34ed4312e09e31cd42a0e6d410345.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtfly_1.png-6bc34ed4312e09e31cd42a0e6d410345.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png new file mode 100644 index 0000000..4646925 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png.import new file mode 100644 index 0000000..15257e5 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b86ds5spivgom" +path="res://.godot/imported/spr_shotgun_hurtground_0.png-6358fda8e3fdf87a9f4eb71d4ffd02fb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_0.png-6358fda8e3fdf87a9f4eb71d4ffd02fb.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png new file mode 100644 index 0000000..9e2bedf Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png.import new file mode 100644 index 0000000..bb6c137 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw6antcwfas6h" +path="res://.godot/imported/spr_shotgun_hurtground_1.png-1f83ddf65cc89706dbc19c01297e3fcd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_1.png-1f83ddf65cc89706dbc19c01297e3fcd.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png new file mode 100644 index 0000000..3fef776 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png.import new file mode 100644 index 0000000..6a970e2 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6y4jgwebch8f" +path="res://.godot/imported/spr_shotgun_hurtground_10.png-c5146058d36cca932596050a16e691e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_10.png-c5146058d36cca932596050a16e691e0.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png new file mode 100644 index 0000000..91ff082 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png.import new file mode 100644 index 0000000..e473ebc --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wj8owyvohotx" +path="res://.godot/imported/spr_shotgun_hurtground_11.png-3166b4c43440091ee0c83e2e2cd667d4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_11.png-3166b4c43440091ee0c83e2e2cd667d4.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png new file mode 100644 index 0000000..df56ecb Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png.import new file mode 100644 index 0000000..1d349b2 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bldam5tvknypg" +path="res://.godot/imported/spr_shotgun_hurtground_12.png-a0ef3e24b9d39d34df69fd105b11860a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_12.png-a0ef3e24b9d39d34df69fd105b11860a.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png new file mode 100644 index 0000000..df0f3f0 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png.import new file mode 100644 index 0000000..f9ad8c2 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdgbixku48db4" +path="res://.godot/imported/spr_shotgun_hurtground_13.png-c58b9dc1e5194d898c1951d65b117b56.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_13.png-c58b9dc1e5194d898c1951d65b117b56.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png new file mode 100644 index 0000000..ed9e877 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png.import new file mode 100644 index 0000000..cc1b1e4 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxrxf72pvs7ui" +path="res://.godot/imported/spr_shotgun_hurtground_2.png-34cc60e7dcc210a58f247d4e0e9d4ffb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_2.png-34cc60e7dcc210a58f247d4e0e9d4ffb.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png new file mode 100644 index 0000000..9363174 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png.import new file mode 100644 index 0000000..bfc169a --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb5au3r0rt0xc" +path="res://.godot/imported/spr_shotgun_hurtground_3.png-933b7c2c689a6258578f86431cf362de.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_3.png-933b7c2c689a6258578f86431cf362de.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png new file mode 100644 index 0000000..dfdcc83 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png.import new file mode 100644 index 0000000..0a4d936 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://daj03i8f8pqih" +path="res://.godot/imported/spr_shotgun_hurtground_4.png-1a0bcf2f5347752738da06d604887f9b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_4.png-1a0bcf2f5347752738da06d604887f9b.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png new file mode 100644 index 0000000..35b6f2f Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png.import new file mode 100644 index 0000000..8dc748c --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brkl3ej35ji75" +path="res://.godot/imported/spr_shotgun_hurtground_5.png-cc99e88d881b71248d2358da9f30ddf9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_5.png-cc99e88d881b71248d2358da9f30ddf9.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png new file mode 100644 index 0000000..b406c92 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png.import new file mode 100644 index 0000000..f216243 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cii7i4g7iqyv5" +path="res://.godot/imported/spr_shotgun_hurtground_6.png-0333457d340804a2f16ab39f928e0342.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_6.png-0333457d340804a2f16ab39f928e0342.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png new file mode 100644 index 0000000..37aead4 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png.import new file mode 100644 index 0000000..f50588e --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsgeko15xhw3h" +path="res://.godot/imported/spr_shotgun_hurtground_7.png-1f29f865f0fc993701453e220a9fc397.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_7.png-1f29f865f0fc993701453e220a9fc397.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png new file mode 100644 index 0000000..99b22c6 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png.import new file mode 100644 index 0000000..b7b440d --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://k4gvdi2u3yv0" +path="res://.godot/imported/spr_shotgun_hurtground_8.png-d22a718ca4d0a007d9fb9afe1131e346.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_8.png-d22a718ca4d0a007d9fb9afe1131e346.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/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png new file mode 100644 index 0000000..88abf9e Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png.import new file mode 100644 index 0000000..2062190 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b60swed0ui7mw" +path="res://.godot/imported/spr_shotgun_hurtground_9.png-9367af2cc0392776554d64a8427c640c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png" +dest_files=["res://.godot/imported/spr_shotgun_hurtground_9.png-9367af2cc0392776554d64a8427c640c.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png new file mode 100644 index 0000000..99358ce Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png.import new file mode 100644 index 0000000..3d5b549 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://budv3124bpoer" +path="res://.godot/imported/spr_shotgun_idle_0.png-df2fb4171325f41d553f78a4cb2c735f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_0.png-df2fb4171325f41d553f78a4cb2c735f.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png new file mode 100644 index 0000000..ff06f32 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png.import new file mode 100644 index 0000000..75e9fa6 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b337hx6wl5y0s" +path="res://.godot/imported/spr_shotgun_idle_1.png-66b06c5140297f2f7ff2e08973a5872a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_1.png-66b06c5140297f2f7ff2e08973a5872a.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png new file mode 100644 index 0000000..9bf5ed8 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png.import new file mode 100644 index 0000000..e9cc8f5 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5i1yuvaw7ni8" +path="res://.godot/imported/spr_shotgun_idle_2.png-f348bdde431e0911c43cbbc142132d1a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_2.png-f348bdde431e0911c43cbbc142132d1a.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png new file mode 100644 index 0000000..fb26230 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png.import new file mode 100644 index 0000000..2920f8e --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2tebvlq84p52" +path="res://.godot/imported/spr_shotgun_idle_3.png-4fd13ebf95677c773210588435ad5236.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_3.png-4fd13ebf95677c773210588435ad5236.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png new file mode 100644 index 0000000..c7726b0 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png.import new file mode 100644 index 0000000..c3d4493 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw783kk4sxqej" +path="res://.godot/imported/spr_shotgun_idle_4.png-98ac071e0eda7132d84e3b7ca3f634d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_4.png-98ac071e0eda7132d84e3b7ca3f634d9.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/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png new file mode 100644 index 0000000..4de2dc8 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png.import new file mode 100644 index 0000000..ce9c9b9 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3tqsfyivnxxd" +path="res://.godot/imported/spr_shotgun_idle_5.png-e19016d7664aaeae42380123c3ab5c2e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png" +dest_files=["res://.godot/imported/spr_shotgun_idle_5.png-e19016d7664aaeae42380123c3ab5c2e.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png new file mode 100644 index 0000000..2c71aa7 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png.import new file mode 100644 index 0000000..6ce2052 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbkxu5eh3kga2" +path="res://.godot/imported/spr_shotgun_stairfall_0.png-9cb2886a96117fee53b3246ef4055de0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_0.png-9cb2886a96117fee53b3246ef4055de0.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png new file mode 100644 index 0000000..565fce4 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png.import new file mode 100644 index 0000000..85f3234 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djxcnae36c5bf" +path="res://.godot/imported/spr_shotgun_stairfall_1.png-99579b71717f91e18fdadd75e97f16a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_1.png-99579b71717f91e18fdadd75e97f16a7.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png new file mode 100644 index 0000000..72a4ee8 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png.import new file mode 100644 index 0000000..bb20706 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crvk1djjxtl4" +path="res://.godot/imported/spr_shotgun_stairfall_10.png-752f47a4f6f14428aeb454193a0c06f3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_10.png-752f47a4f6f14428aeb454193a0c06f3.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png new file mode 100644 index 0000000..4247349 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png.import new file mode 100644 index 0000000..3b05ac1 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjdg38w4njpb3" +path="res://.godot/imported/spr_shotgun_stairfall_11.png-6d895af319eac639e95c409fd4f8a319.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_11.png-6d895af319eac639e95c409fd4f8a319.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png new file mode 100644 index 0000000..206380f Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png.import new file mode 100644 index 0000000..d10e415 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfkd53ysmtja0" +path="res://.godot/imported/spr_shotgun_stairfall_2.png-c4e1938e3483dc495d5ef575bcf864a6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_2.png-c4e1938e3483dc495d5ef575bcf864a6.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png new file mode 100644 index 0000000..a0846ea Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png.import new file mode 100644 index 0000000..3ccdf48 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cl2qtq84d8gha" +path="res://.godot/imported/spr_shotgun_stairfall_3.png-431a4e2979e2ca0326c397d9b1a2752d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_3.png-431a4e2979e2ca0326c397d9b1a2752d.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png new file mode 100644 index 0000000..f3d3b21 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png.import new file mode 100644 index 0000000..0326631 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://de1blurkbtkqp" +path="res://.godot/imported/spr_shotgun_stairfall_4.png-7f83923d6067dec2e92e9b191a977f8d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_4.png-7f83923d6067dec2e92e9b191a977f8d.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png new file mode 100644 index 0000000..8623bed Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png.import new file mode 100644 index 0000000..00fb8b4 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3auu05maaiqw" +path="res://.godot/imported/spr_shotgun_stairfall_5.png-c08dfe33a55b9bfdd46a042963a31714.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_5.png-c08dfe33a55b9bfdd46a042963a31714.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png new file mode 100644 index 0000000..351f33a Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png.import new file mode 100644 index 0000000..c88c019 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0prmgrm31ds2" +path="res://.godot/imported/spr_shotgun_stairfall_6.png-90576f743d5b2a9b91619c8ad9736071.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_6.png-90576f743d5b2a9b91619c8ad9736071.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png new file mode 100644 index 0000000..5632aa3 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png.import new file mode 100644 index 0000000..9a10f26 --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnt3i5joy8ju3" +path="res://.godot/imported/spr_shotgun_stairfall_7.png-12c332d174766ba14cccc2588dba1969.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_7.png-12c332d174766ba14cccc2588dba1969.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png new file mode 100644 index 0000000..c7db10f Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png.import new file mode 100644 index 0000000..e7a83ac --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://v6yh2242u4s0" +path="res://.godot/imported/spr_shotgun_stairfall_8.png-16962523c70ee4762730acc895b3afe8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_8.png-16962523c70ee4762730acc895b3afe8.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/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png new file mode 100644 index 0000000..d285bb1 Binary files /dev/null and b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png differ diff --git a/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png.import b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png.import new file mode 100644 index 0000000..51a67af --- /dev/null +++ b/Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0dybeyfay3em" +path="res://.godot/imported/spr_shotgun_stairfall_9.png-8bec5580c20750d63baa34e136f9ca5d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png" +dest_files=["res://.godot/imported/spr_shotgun_stairfall_9.png-8bec5580c20750d63baa34e136f9ca5d.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/Char/Enemy/Enemy_01.tscn b/Char/Enemy/Enemy_01.tscn new file mode 100644 index 0000000..f4bc2d5 --- /dev/null +++ b/Char/Enemy/Enemy_01.tscn @@ -0,0 +1,386 @@ +[gd_scene load_steps=56 format=3 uid="uid://dom46ngh3my6b"] + +[ext_resource type="Script" uid="uid://31cjfbnh8u3h" path="res://Char/Enemy/Enemy_Base.gd" id="1_bhfxq"] +[ext_resource type="Texture2D" uid="uid://budv3124bpoer" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_0.png" id="1_kjlg5"] +[ext_resource type="Script" uid="uid://ccl8rou8xjq7l" path="res://Char/Enemy/States/Enemy_State_Machine.gd" id="1_qlmle"] +[ext_resource type="PackedScene" uid="uid://dd7k3qbsw1bhq" path="res://Char/Char_Components/After_Image/after_image_component.tscn" id="2_r6gbg"] +[ext_resource type="Script" uid="uid://vv1x1fxhvlkb" path="res://Char/Enemy/States/Enemy_Idle.gd" id="2_uy5qn"] +[ext_resource type="Texture2D" uid="uid://b337hx6wl5y0s" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_1.png" id="2_v1dvq"] +[ext_resource type="Texture2D" uid="uid://c5i1yuvaw7ni8" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_2.png" id="3_21668"] +[ext_resource type="PackedScene" uid="uid://bj7ycp6aj85je" path="res://Char/Char_Components/Blood/Blood_Component.tscn" id="3_wrjj3"] +[ext_resource type="Script" uid="uid://c7nqhmg3j1vem" path="res://Char/Enemy/States/Enemy_Hurt_Begin.gd" id="4_1tl15"] +[ext_resource type="Texture2D" uid="uid://d2tebvlq84p52" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_3.png" id="4_tmg76"] +[ext_resource type="Texture2D" uid="uid://cw783kk4sxqej" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_4.png" id="5_ifbbb"] +[ext_resource type="Script" uid="uid://c6go4s15ssa6p" path="res://Char/Enemy/States/Enemy_Hurt_Air.gd" id="5_wxij1"] +[ext_resource type="Script" uid="uid://ce2fxr3ubj24x" path="res://Char/Enemy/States/Enemy_Hurt_Ground.gd" id="6_emq2d"] +[ext_resource type="Texture2D" uid="uid://c3tqsfyivnxxd" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_idle_5.png" id="6_k8n5e"] +[ext_resource type="Script" uid="uid://dhr5agjs0pp1k" path="res://Char/Enemy/States/Enemy_Death.gd" id="7_anrfy"] +[ext_resource type="Texture2D" uid="uid://cvf5wbsg34qv0" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png" id="7_tk36w"] +[ext_resource type="Texture2D" uid="uid://cqewxn6t7xeoj" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_1.png" id="8_06rgb"] +[ext_resource type="Script" uid="uid://dv30qyfgqt8lx" path="res://Char/Enemy/States/Enemy_Slope_Fall.gd" id="8_ccfup"] +[ext_resource type="Texture2D" uid="uid://b86ds5spivgom" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_0.png" id="9_xvq7u"] +[ext_resource type="Texture2D" uid="uid://cw6antcwfas6h" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_1.png" id="10_03n1p"] +[ext_resource type="Texture2D" uid="uid://cxrxf72pvs7ui" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_2.png" id="11_tmtn5"] +[ext_resource type="Texture2D" uid="uid://cb5au3r0rt0xc" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_3.png" id="12_qdvcq"] +[ext_resource type="Texture2D" uid="uid://daj03i8f8pqih" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_4.png" id="13_pqinb"] +[ext_resource type="Texture2D" uid="uid://brkl3ej35ji75" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_5.png" id="14_gaime"] +[ext_resource type="Texture2D" uid="uid://cii7i4g7iqyv5" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_6.png" id="15_stii5"] +[ext_resource type="Texture2D" uid="uid://dsgeko15xhw3h" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_7.png" id="16_a5626"] +[ext_resource type="Texture2D" uid="uid://k4gvdi2u3yv0" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_8.png" id="17_y4e0y"] +[ext_resource type="Texture2D" uid="uid://b60swed0ui7mw" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_9.png" id="18_5ebam"] +[ext_resource type="Texture2D" uid="uid://6y4jgwebch8f" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_10.png" id="19_uds5x"] +[ext_resource type="Texture2D" uid="uid://wj8owyvohotx" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_11.png" id="20_kstx0"] +[ext_resource type="Texture2D" uid="uid://bldam5tvknypg" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_12.png" id="21_cy1cp"] +[ext_resource type="Texture2D" uid="uid://bdgbixku48db4" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtground_13.png" id="22_i0bs7"] +[ext_resource type="Texture2D" uid="uid://cbkxu5eh3kga2" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_0.png" id="31_pop2r"] +[ext_resource type="Texture2D" uid="uid://djxcnae36c5bf" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_1.png" id="32_h871j"] +[ext_resource type="Texture2D" uid="uid://cfkd53ysmtja0" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_2.png" id="33_oqvw2"] +[ext_resource type="Texture2D" uid="uid://cl2qtq84d8gha" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_3.png" id="34_4rfcp"] +[ext_resource type="Texture2D" uid="uid://de1blurkbtkqp" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_4.png" id="35_jk8bd"] +[ext_resource type="Texture2D" uid="uid://3auu05maaiqw" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_5.png" id="36_ouems"] +[ext_resource type="Texture2D" uid="uid://c0prmgrm31ds2" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_6.png" id="37_cresk"] +[ext_resource type="Texture2D" uid="uid://dnt3i5joy8ju3" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_7.png" id="38_kfwgs"] +[ext_resource type="Texture2D" uid="uid://v6yh2242u4s0" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_8.png" id="39_keo1v"] +[ext_resource type="Texture2D" uid="uid://b0dybeyfay3em" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_9.png" id="40_db4yh"] +[ext_resource type="Texture2D" uid="uid://crvk1djjxtl4" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_10.png" id="41_6ivs7"] +[ext_resource type="Texture2D" uid="uid://cjdg38w4njpb3" path="res://Char/Enemy/Art/Enemy_01/spr_shotgun_stairfall_11.png" id="42_kh4oa"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_smhfi"] +radius = 20.0 +height = 64.0 + +[sub_resource type="Animation" id="Animation_ok3xg"] +resource_name = "Death_1" +length = 0.05 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [ExtResource("14_gaime"), ExtResource("15_stii5")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -31)] +} + +[sub_resource type="Animation" id="Animation_itd00"] +resource_name = "Death_2" +length = 0.4 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.19, 0.22, 0.25, 0.28, 0.31, 0.34, 0.37, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("14_gaime"), ExtResource("15_stii5"), ExtResource("16_a5626"), ExtResource("17_y4e0y"), ExtResource("18_5ebam"), ExtResource("19_uds5x"), ExtResource("20_kstx0"), ExtResource("21_cy1cp"), ExtResource("22_i0bs7")] +} + +[sub_resource type="Animation" id="Animation_mote0"] +resource_name = "Hurt_Air" +length = 0.6 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("7_tk36w"), ExtResource("8_06rgb"), ExtResource("9_xvq7u")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [Vector2(-3, -32), Vector2(1, -31)] +} + +[sub_resource type="Animation" id="Animation_fttej"] +resource_name = "Hurt_Begin" +length = 0.01 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("7_tk36w")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, -32)] +} + +[sub_resource type="Animation" id="Animation_ph48t"] +resource_name = "Hurt_Ground" +length = 0.25 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.02, 0.04, 0.06, 0.2, 0.25), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("9_xvq7u"), ExtResource("10_03n1p"), ExtResource("11_tmtn5"), ExtResource("12_qdvcq"), ExtResource("13_pqinb"), ExtResource("14_gaime")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.02), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, -31)] +} + +[sub_resource type="Animation" id="Animation_18rkb"] +resource_name = "Idle" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("1_kjlg5"), ExtResource("2_v1dvq"), ExtResource("3_21668"), ExtResource("4_tmg76"), ExtResource("5_ifbbb"), ExtResource("6_k8n5e")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -45)] +} + +[sub_resource type="Animation" id="Animation_2tmes"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_kjlg5")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -45)] +} + +[sub_resource type="Animation" id="Animation_0g5b4"] +resource_name = "Slope_Fall" +length = 0.55 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("31_pop2r"), ExtResource("32_h871j"), ExtResource("33_oqvw2"), ExtResource("34_4rfcp"), ExtResource("35_jk8bd"), ExtResource("36_ouems"), ExtResource("37_cresk"), ExtResource("38_kfwgs"), ExtResource("39_keo1v"), ExtResource("40_db4yh"), ExtResource("41_6ivs7"), ExtResource("42_kh4oa")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.15, 0.3, 0.35, 0.45, 0.5, 0.55), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(0, -36), Vector2(-4, -36), Vector2(0, -36), Vector2(-3, -36), Vector2(-7, -36), Vector2(-10, -36), Vector2(-6, -36)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_jljuo"] +_data = { +&"Death_1": SubResource("Animation_ok3xg"), +&"Death_2": SubResource("Animation_itd00"), +&"Hurt_Air": SubResource("Animation_mote0"), +&"Hurt_Begin": SubResource("Animation_fttej"), +&"Hurt_Ground": SubResource("Animation_ph48t"), +&"Idle": SubResource("Animation_18rkb"), +&"RESET": SubResource("Animation_2tmes"), +&"Slope_Fall": SubResource("Animation_0g5b4") +} + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_y0s26"] +radius = 17.0 +height = 64.0 + +[node name="Enemy_01_1" type="CharacterBody2D" groups=["Enemy"]] +z_index = 4 +collision_layer = 32 +collision_mask = 33030144 +floor_constant_speed = true +floor_max_angle = 1.0472 +floor_snap_length = 10.0 +script = ExtResource("1_bhfxq") + +[node name="After_Image_Component" parent="." instance=ExtResource("2_r6gbg")] + +[node name="Blood_Component" parent="." instance=ExtResource("3_wrjj3")] +position = Vector2(0, -32) + +[node name="Enemy_State_Machine" type="Node" parent="."] +script = ExtResource("1_qlmle") + +[node name="Idle" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("2_uy5qn") + +[node name="Hurt_Begin" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("4_1tl15") + +[node name="Hurt_Air" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("5_wxij1") + +[node name="Hurt_Ground" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("6_emq2d") + +[node name="Slope_Fall" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("8_ccfup") + +[node name="Death" type="Node" parent="Enemy_State_Machine"] +script = ExtResource("7_anrfy") + +[node name="Body_Physics" type="CollisionShape2D" parent="."] +visible = false +position = Vector2(0, -32) +shape = SubResource("CapsuleShape2D_smhfi") + +[node name="Body_Animation" type="Node2D" parent="."] +metadata/_edit_lock_ = true + +[node name="Sprite2D" type="Sprite2D" parent="Body_Animation"] +position = Vector2(0, -45) +scale = Vector2(1.8, 1.8) +texture = ExtResource("1_kjlg5") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Body_Animation"] +libraries = { +&"": SubResource("AnimationLibrary_jljuo") +} + +[node name="Detector" type="Node2D" parent="."] + +[node name="Floor" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 8) +collision_mask = 524288 + +[node name="Rope" type="RayCast2D" parent="Detector"] +enabled = false +target_position = Vector2(0, 8) +collision_mask = 33554432 + +[node name="Floor_L" type="RayCast2D" parent="Detector"] +target_position = Vector2(-8, 8) +collision_mask = 524288 + +[node name="Floor_R" type="RayCast2D" parent="Detector"] +target_position = Vector2(8, 8) +collision_mask = 524288 + +[node name="Slope_L" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(-22, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="Slope_R" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(22, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="One_Way_Floor" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 8) +collision_mask = 1048576 + +[node name="Hurt" type="Area2D" parent="."] +position = Vector2(0, -32) +collision_layer = 128 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurt"] +shape = SubResource("CapsuleShape2D_y0s26") +debug_color = Color(0.952755, 0.165165, 0.367487, 0.42) + +[node name="RayCast2D" type="RayCast2D" parent="Hurt"] +collision_mask = 15204352 diff --git a/Char/Enemy/Enemy_Base.gd b/Char/Enemy/Enemy_Base.gd new file mode 100644 index 0000000..d142309 --- /dev/null +++ b/Char/Enemy/Enemy_Base.gd @@ -0,0 +1,44 @@ +# 挂在角色owner节点上的 +extends CharacterBody2D + +@onready var state_machine = get_node("Enemy_State_Machine") +@onready var floor_raycast = self.get_node("Detector/Floor") +@onready var floor_l_raycast = self.get_node("Detector/Floor_L") +@onready var floor_r_raycast = self.get_node("Detector/Floor_R") +@onready var slope_l_raycast = self.get_node("Detector/Slope_L") +@onready var slope_r_raycast = self.get_node("Detector/Slope_R") + +var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") + +var hurt = false +var hurt_data: Array = [] +var health = 1 +var death = false +var freeze : bool = false + +func set_floor_raycasts_enabled(enabled: bool) -> void: + floor_raycast.enabled = enabled + floor_l_raycast.enabled = enabled + floor_r_raycast.enabled = enabled + slope_l_raycast.enabled = enabled + slope_r_raycast.enabled = enabled + +func is_on_slope() -> String: + if floor_raycast.is_colliding() and floor_l_raycast.is_colliding() and floor_r_raycast.is_colliding(): + return "" + if slope_l_raycast.is_colliding(): + return "L" + if slope_r_raycast.is_colliding(): + return "R" + return "" + +func is_on_ground(): + if self.is_on_floor() and floor_raycast.is_colliding() or floor_l_raycast.is_colliding() or floor_r_raycast.is_colliding(): + return true + else: + return false + +func start_hurt(): + if !hurt: + state_machine.change_state("hurt_begin") + hurt = true diff --git a/Char/Enemy/Enemy_Base.gd.uid b/Char/Enemy/Enemy_Base.gd.uid new file mode 100644 index 0000000..ef9c539 --- /dev/null +++ b/Char/Enemy/Enemy_Base.gd.uid @@ -0,0 +1 @@ +uid://31cjfbnh8u3h diff --git a/Char/Enemy/States/Enemy_Death.gd b/Char/Enemy/States/Enemy_Death.gd new file mode 100644 index 0000000..8d3a6dc --- /dev/null +++ b/Char/Enemy/States/Enemy_Death.gd @@ -0,0 +1,31 @@ +extends Enemy_State + +func enter() -> void: + # 定义动画及其权重(概率) + var death_animations = { + "Death_1": 0.15, # 50%的概率 + "Death_2": 0.85, # 30%的概率 + } + + # 生成随机数 + var rand = randf() + var cumulative = 0.0 + var selected_anim = "Death_2" # 默认动画 + + # 根据权重选择动画 + for anim_name in death_animations: + cumulative += death_animations[anim_name] + if rand <= cumulative: + if animation_player.has_animation(anim_name): + selected_anim = anim_name + break + + # 播放选中的动画 + animation_player.play(selected_anim) + await animation_player.animation_finished + + blood_component.blood_part_2_enabled = false + + enemy.death = true + owner.set_physics_process(false) + owner.set_process(false) diff --git a/Char/Enemy/States/Enemy_Death.gd.uid b/Char/Enemy/States/Enemy_Death.gd.uid new file mode 100644 index 0000000..ab83db1 --- /dev/null +++ b/Char/Enemy/States/Enemy_Death.gd.uid @@ -0,0 +1 @@ +uid://dhr5agjs0pp1k diff --git a/Char/Enemy/States/Enemy_Hurt_Air.gd b/Char/Enemy/States/Enemy_Hurt_Air.gd new file mode 100644 index 0000000..9efcd67 --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Air.gd @@ -0,0 +1,33 @@ +extends Enemy_State + +func enter() -> void: + #受击状态下,斜坡往下滑 + enemy.set_floor_stop_on_slope_enabled(false) + #禁用one way ground碰撞 + enemy.set_collision_mask_value(21, false) + + # 播放动画 + animation_player.play("Hurt_Air") + + #after_image_component.start() + +func physics_update(delta: float) -> void: + await get_tree().process_frame + # 只在冻帧结束后才检查着地状态 + if enemy.is_on_slope() != "": + state_machine.change_state("slope_fall") + return + + if enemy.is_on_ground(): + apply_base_movement(delta) #会有空中和地面阻力 + if abs(enemy.velocity.x) < 200: + state_machine.change_state("hurt_ground") + else: + enemy.velocity.y += ProjectSettings.get_setting("physics/2d/default_gravity") * delta + + # 应用转向 + update_facing_by_velocity() + enemy.move_and_slide() + +func exit() -> void: + pass diff --git a/Char/Enemy/States/Enemy_Hurt_Air.gd.uid b/Char/Enemy/States/Enemy_Hurt_Air.gd.uid new file mode 100644 index 0000000..861b8f9 --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Air.gd.uid @@ -0,0 +1 @@ +uid://c6go4s15ssa6p diff --git a/Char/Enemy/States/Enemy_Hurt_Begin.gd b/Char/Enemy/States/Enemy_Hurt_Begin.gd new file mode 100644 index 0000000..2e81b2e --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Begin.gd @@ -0,0 +1,83 @@ +#hurt_begin.gd +extends Enemy_State + +var damage: int +var direction: Vector2 +var hit_force: int +var hit_type: String +var player_hit_stop_component: Node +var slash_player: AnimationPlayer + +func enter() -> void: + player_hit_stop_component = player.get_node("Hit/Hit_Stop_Component") + slash_player = player.get_node("Hit/Player_Attack_Component/Hit_Enemy_Effect/AnimationPlayer") + # 进入受伤状态时,禁用伤害碰撞盒 + hurt_box.get_node('CollisionShape2D').set_deferred("disabled", true) + hurt_box.set_deferred("monitoring", false) + hurt_box.set_deferred("monitorable", false) + + enemy.get_node("Body_Animation/Sprite2D").texture = load("res://Char/Enemy/Art/Enemy_01/spr_shotgun_hurtfly_0.png") + animation_player.play("Hurt_Begin") + + # 从enemy.hurt_data中获取伤害相关数据 + # hurt_data是一个数组,包含了伤害值、方向、击退力度和攻击者的hitstop组件 + damage = enemy.hurt_data[1] + direction = enemy.hurt_data[2] + hit_force = enemy.hurt_data[3] + hit_type = enemy.hurt_data[4] + + var blood_dir = direction + + enemy.health -= damage + + # 当敌人在地面上时,防止向下击退导致穿过地面 + # 通过将y方向设为0来实现 + if enemy.is_on_ground() and direction.y > 0 : + direction.y = 0 + + # 设置射线检测,用于判断击退距离是否会与墙体发生碰撞 + # 120为最大击退距离 + var hurt_ray = hurt_box.get_node("RayCast2D") + hurt_ray.target_position = direction * 120 + + # 这样可以确保所有状态都已正确设置 + process_hurt() + + blood_component.create_part1_blood(blood_dir) + +func process_hurt() -> void: + # 更新射线检测状态,确保获取最新的碰撞信息 + var hurt_ray = hurt_box.get_node("RayCast2D") + hurt_ray.force_raycast_update() + + var start_pos = enemy.global_position + var target_position: Vector2 + + # 如果射线检测到碰撞,则将目标位置设为碰撞点 + # 否则使用最大击退距离作为目标位置 + if hurt_ray.is_colliding(): + target_position = hurt_ray.get_collision_point() + else: + target_position = enemy.global_position + hurt_ray.target_position + + # 根据敌人是否在地面上来调整最终位置 + # 在空中时额外添加一个向下的偏移,使击退效果更自然 + if enemy.is_on_floor(): + enemy.global_position = target_position + else: + enemy.global_position = target_position + Vector2(0,30) + + if hit_type == 'attack': + var after_image_texture = get_first_frame_texture("Hurt_Begin") + after_image_component.spawn_trail_between_points(start_pos, enemy.global_position,8,false,after_image_texture,Rect2()) + player_hit_stop_component.freeze() + enemy.freeze = true + + # 转换到空中受伤状态,准备执行击退效果 + if not enemy.freeze: + state_machine.change_state("hurt_air") + +func exit() -> void: + enemy.velocity = direction * hit_force + enemy.freeze = false + pass diff --git a/Char/Enemy/States/Enemy_Hurt_Begin.gd.uid b/Char/Enemy/States/Enemy_Hurt_Begin.gd.uid new file mode 100644 index 0000000..aeb382a --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Begin.gd.uid @@ -0,0 +1 @@ +uid://c7nqhmg3j1vem diff --git a/Char/Enemy/States/Enemy_Hurt_Ground.gd b/Char/Enemy/States/Enemy_Hurt_Ground.gd new file mode 100644 index 0000000..44373d6 --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Ground.gd @@ -0,0 +1,48 @@ +# Enemy_Hurt_Ground.gd +extends Enemy_State + +var has_animation_finished := false + +func enter() -> void: + enemy.set_floor_stop_on_slope_enabled(false) + enemy.set_collision_mask_value(21, false) + + if not animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.connect(_on_animation_finished) + + animation_player.play("Hurt_Ground") + has_animation_finished = false + +func _on_animation_finished(_anim_name: String) -> void: + has_animation_finished = true + check_state() + +func check_state() -> void: + if enemy.is_on_slope(): + state_machine.change_state("slope_fall") + elif enemy.is_on_ground(): + if enemy.health <= 0: + state_machine.change_state("death") + else: + _prepare_for_idle() # 改用下划线前缀表示这是一个私有方法 + +func physics_update(delta: float) -> void: + apply_base_movement(delta) + update_facing_by_velocity() + enemy.move_and_slide() + + if enemy.is_on_slope(): + state_machine.change_state("slope_fall") + +# 添加到Hurt_Ground状态中 +func _prepare_for_idle() -> void: + hurt_box.get_node('CollisionShape2D').set_deferred("disabled", false) + hurt_box.set_deferred("monitoring", true) + hurt_box.set_deferred("monitorable", true) + state_machine.change_state("idle") + +func exit() -> void: + # 断开动画信号连接 + if animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.disconnect(_on_animation_finished) + has_animation_finished = false diff --git a/Char/Enemy/States/Enemy_Hurt_Ground.gd.uid b/Char/Enemy/States/Enemy_Hurt_Ground.gd.uid new file mode 100644 index 0000000..26d5008 --- /dev/null +++ b/Char/Enemy/States/Enemy_Hurt_Ground.gd.uid @@ -0,0 +1 @@ +uid://ce2fxr3ubj24x diff --git a/Char/Enemy/States/Enemy_Idle.gd b/Char/Enemy/States/Enemy_Idle.gd new file mode 100644 index 0000000..de1816c --- /dev/null +++ b/Char/Enemy/States/Enemy_Idle.gd @@ -0,0 +1,21 @@ +# Idle_Battle.gd +extends Enemy_State + +func enter() -> void: + play_animation("Idle") + #after_image_component.stop() + +func physics_update(delta: float) -> void: + + # 应用重力 + enemy.velocity.y += enemy.gravity * delta + + # Idle状态下逐渐停止水平移动 + enemy.velocity.x = move_toward(enemy.velocity.x, 0, 100.0) + + enemy.move_and_slide() + + # 移动后再检查地面状态 + #if not enemy.is_on_floor(): + #state_machine.change_state("fall") + #return diff --git a/Char/Enemy/States/Enemy_Idle.gd.uid b/Char/Enemy/States/Enemy_Idle.gd.uid new file mode 100644 index 0000000..4d847d5 --- /dev/null +++ b/Char/Enemy/States/Enemy_Idle.gd.uid @@ -0,0 +1 @@ +uid://vv1x1fxhvlkb diff --git a/Char/Enemy/States/Enemy_Slope_Fall.gd b/Char/Enemy/States/Enemy_Slope_Fall.gd new file mode 100644 index 0000000..021b6bf --- /dev/null +++ b/Char/Enemy/States/Enemy_Slope_Fall.gd @@ -0,0 +1,63 @@ +# Enemy_Slope_Fall.gd +extends Enemy_State + +var ROLL_SPEED := randf_range(200,300) + +func enter() -> void: + enemy.velocity = Vector2.ZERO + enemy.set_floor_stop_on_slope_enabled(false) + enemy.set_collision_mask_value(21, false) + + ensure_animation_looping() + + if enemy.get_slide_collision_count() > 0: + var collision = enemy.get_slide_collision(0) + var slope_normal = collision.get_normal() + + if enemy.is_on_slope() == "L": + enemy.velocity = Vector2(abs(slope_normal.y), abs(slope_normal.x)) * ROLL_SPEED + elif enemy.is_on_slope() == "R": + enemy.velocity = Vector2(-abs(slope_normal.y), abs(slope_normal.x)) * ROLL_SPEED + +func ensure_animation_looping() -> void: + if animation_player.has_animation("Slope_Fall"): + var anim = animation_player.get_animation("Slope_Fall") + anim.loop_mode = Animation.LOOP_LINEAR + + animation_player.stop() + animation_player.play("Slope_Fall") + +func _on_animation_finished(_anim_name: String) -> void: + if _anim_name == "Slope_Fall": + animation_player.play("Slope_Fall") + +func physics_update(delta: float) -> void: + apply_gravity(delta) + + if not animation_player.is_playing(): + animation_player.play("Slope_Fall") + + if enemy.is_on_slope(): + var slope_direction = enemy.is_on_slope() + if enemy.get_slide_collision_count() > 0: + var collision = enemy.get_slide_collision(0) + var slope_normal = collision.get_normal() + + if slope_direction == "L" and enemy.velocity.length() < ROLL_SPEED: + enemy.velocity = Vector2(abs(slope_normal.y), abs(slope_normal.x)) * ROLL_SPEED + elif slope_direction == "R" and enemy.velocity.length() < ROLL_SPEED: + enemy.velocity = Vector2(-abs(slope_normal.y), abs(slope_normal.x)) * ROLL_SPEED + + if not enemy.is_on_slope() and enemy.is_on_ground(): + enemy.velocity.x = randf_range(400,450) if enemy.velocity.x > 0 else randf_range(-400,-450) + state_machine.change_state("hurt_ground") + + if not enemy.is_on_slope() and not enemy.is_on_ground(): + state_machine.change_state("hurt_air") + + update_facing_by_velocity() + enemy.move_and_slide() + +func exit() -> void: + if animation_player.has_animation("Slope_Fall"): + animation_player.get_animation("Slope_Fall").loop_mode = Animation.LOOP_NONE diff --git a/Char/Enemy/States/Enemy_Slope_Fall.gd.uid b/Char/Enemy/States/Enemy_Slope_Fall.gd.uid new file mode 100644 index 0000000..7b888a3 --- /dev/null +++ b/Char/Enemy/States/Enemy_Slope_Fall.gd.uid @@ -0,0 +1 @@ +uid://dv30qyfgqt8lx diff --git a/Char/Enemy/States/Enemy_State.gd b/Char/Enemy/States/Enemy_State.gd new file mode 100644 index 0000000..79e5340 --- /dev/null +++ b/Char/Enemy/States/Enemy_State.gd @@ -0,0 +1,108 @@ +# Enemy_State.gd +class_name Enemy_State +extends Node + +# 阻力和加速度相关常量 +var GROUND_DECELERATION := randf_range(1200,2600) +const AIR_DECELERATION := 10.0 +#const AIR_REVERSE_ACCELERATION := 1200.0 # 空中反向加速度 +#const AIR_SPEED := 400.0 # 空中移动速度 +#const VELOCITY_THRESHOLD := 5.0 # 速度阈值常量, 主要是用于run_to_idle + +var enemy: CharacterBody2D +var player: CharacterBody2D +var animation_player: AnimationPlayer +var state_machine: Node +var after_image_component: Node +var fx_component: Node +var hurt_box: Area2D +var blood_component: Node2D + +func _ready() -> void: + player = get_tree().get_first_node_in_group("Player") + enemy = owner + if enemy: + animation_player = enemy.get_node("Body_Animation/AnimationPlayer") + after_image_component = enemy.get_node("After_Image_Component") + blood_component = enemy.get_node("Blood_Component") + #fx_component = enemy.get_node("FX_Component") + hurt_box = enemy.get_node("Hurt") + state_machine = get_parent() + if not animation_player: + push_error("Animation Player not found for state: " + name) + else: + push_error("Player node not found for state: " + name) + +func enter() -> void: + pass + +func exit() -> void: + pass + +func physics_update(_delta: float) -> void: + pass + +# 应用重力 +func apply_gravity(delta: float) -> void: + enemy.velocity.y += ProjectSettings.get_setting("physics/2d/default_gravity") * delta + +func apply_base_movement(delta: float) -> void: + apply_gravity(delta) + # 应用地面和空中阻力 + var deceleration = GROUND_DECELERATION if enemy.is_on_ground() else AIR_DECELERATION + if enemy.velocity.x != 0: + var friction = deceleration * delta + if abs(enemy.velocity.x) <= friction: + enemy.velocity.x = 0 + else: + enemy.velocity.x -= friction * sign(enemy.velocity.x) + +# 应用阻力 +func apply_deceleration(delta: float, is_on_ground: bool) -> void: + var deceleration = GROUND_DECELERATION if is_on_ground else AIR_DECELERATION + enemy.velocity.x = move_toward(enemy.velocity.x, 0, deceleration * delta) + +func play_animation(anim_name: String) -> void: + if animation_player and animation_player.has_animation(anim_name): + animation_player.play(anim_name) + else: + push_warning("Animation " + anim_name + " not found for state: " + name) + +func update_facing_direction(direction: float) -> void: + if direction == 0: + return + enemy.get_node("Body_Animation").scale.x = -1 if direction < 0 else 1 + #enemy.get_node("Detector/Wall").scale.x = -1 if direction < 0 else 1 + +# 用于根据速度更新朝向的函数 +func update_facing_by_velocity() -> void: + if enemy.velocity.x != 0: + update_facing_direction(enemy.velocity.x) + +#获取指定动画的第一帧texture +func get_first_frame_texture(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制texture的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "texture" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null + +#获取指定动画的第一帧region_rect +func get_first_frame_region_rect(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制region_rect的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "region_rect" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null diff --git a/Char/Enemy/States/Enemy_State.gd.uid b/Char/Enemy/States/Enemy_State.gd.uid new file mode 100644 index 0000000..ee07c11 --- /dev/null +++ b/Char/Enemy/States/Enemy_State.gd.uid @@ -0,0 +1 @@ +uid://bj1tl0qvu7ssq diff --git a/Char/Enemy/States/Enemy_State_Machine.gd b/Char/Enemy/States/Enemy_State_Machine.gd new file mode 100644 index 0000000..bc7e96a --- /dev/null +++ b/Char/Enemy/States/Enemy_State_Machine.gd @@ -0,0 +1,53 @@ +# Enemy_State_Machine.gd +extends Node + +var states = {} +var current_state: Enemy_State = null +@onready var enemy = owner +@onready var player = get_tree().get_first_node_in_group("Player") + +var is_state_locked := false # 新增:状态锁定标志 +var pending_state_name := "" # 可选:用于存储待切换的状态 + +func _ready(): + await get_tree().process_frame + + for child in get_children(): + if child is Enemy_State: + var state_name = child.name.to_lower() + states[state_name] = child + + if states.has("idle"): + change_state("idle") + else: + push_error("Could not find idle state!") + +func _physics_process(delta): + if current_state: + current_state.physics_update(delta) + +func change_state(new_state: String) -> void: + # 检查状态是否被锁定 + if is_state_locked: + # 可选:存储待切换的状态 + pending_state_name = new_state + return + + if current_state: + current_state.exit() + + current_state = states[new_state] + current_state.enter() + +# 新增:锁定状态切换的方法 +func lock_state() -> void: + is_state_locked = true + +# 新增:解锁状态切换的方法 +func unlock_state() -> void: + is_state_locked = false + # 可选:如果有待切换的状态,立即切换 + if pending_state_name != "": + var temp_state = pending_state_name + pending_state_name = "" + change_state(temp_state) diff --git a/Char/Enemy/States/Enemy_State_Machine.gd.uid b/Char/Enemy/States/Enemy_State_Machine.gd.uid new file mode 100644 index 0000000..19dd979 --- /dev/null +++ b/Char/Enemy/States/Enemy_State_Machine.gd.uid @@ -0,0 +1 @@ +uid://ccl8rou8xjq7l diff --git a/Char/Enemy/outline.gdshader b/Char/Enemy/outline.gdshader new file mode 100644 index 0000000..a9c7021 --- /dev/null +++ b/Char/Enemy/outline.gdshader @@ -0,0 +1,33 @@ +shader_type canvas_item; + +uniform int width:hint_range(0, 5, 1); +uniform vec4 outline_color:source_color; +uniform float flickering_speed:hint_range(0.0, 50.0, 1.); +uniform float minimal_flickering_alpha:hint_range(0.0, 0.9, 0.1); + +void fragment() { + float pixel_size_x = 1.0/float(textureSize(TEXTURE,0).x); + float pixel_size_y = 1.0/float(textureSize(TEXTURE,0).y); + vec2 pixel_size = vec2(pixel_size_x, pixel_size_y); + if (texture(TEXTURE, UV).a == 0.) + { + for(int x = -width; x <= width; x++) + { + for(int y = -width; y <= width; y++) + { + vec2 pixel_offset = vec2(float(x),float(y)); + if( texture(TEXTURE, UV+(pixel_offset*pixel_size)).a > 0.) + { + vec4 resulting_color = outline_color; + float alpha_norm = (sin(TIME*flickering_speed) +1.2) *0.5; + alpha_norm = (1.- minimal_flickering_alpha) * alpha_norm + minimal_flickering_alpha; + resulting_color.a = alpha_norm; + COLOR = resulting_color; + } + } + } + }else + { + COLOR = texture(TEXTURE, UV); + } +} \ No newline at end of file diff --git a/Char/Enemy/outline.gdshader.uid b/Char/Enemy/outline.gdshader.uid new file mode 100644 index 0000000..50e2f97 --- /dev/null +++ b/Char/Enemy/outline.gdshader.uid @@ -0,0 +1 @@ +uid://djwmx2kmd6oir diff --git a/Char/Player/Dragon/Art/spr_dragon_attack_0.png b/Char/Player/Dragon/Art/spr_dragon_attack_0.png new file mode 100644 index 0000000..b7c5271 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_attack_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_attack_0.png.import b/Char/Player/Dragon/Art/spr_dragon_attack_0.png.import new file mode 100644 index 0000000..a17044c --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_attack_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co7hggu2mljlb" +path="res://.godot/imported/spr_dragon_attack_0.png-54e6d6e624f41870e810842063a97a8f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_attack_0.png" +dest_files=["res://.godot/imported/spr_dragon_attack_0.png-54e6d6e624f41870e810842063a97a8f.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/Char/Player/Dragon/Art/spr_dragon_attack_1.png b/Char/Player/Dragon/Art/spr_dragon_attack_1.png new file mode 100644 index 0000000..1f8dbc1 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_attack_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_attack_1.png.import b/Char/Player/Dragon/Art/spr_dragon_attack_1.png.import new file mode 100644 index 0000000..4510236 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_attack_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bged4gw2kxak4" +path="res://.godot/imported/spr_dragon_attack_1.png-c0aae50579a764d653bd3d903ffaf3bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_attack_1.png" +dest_files=["res://.godot/imported/spr_dragon_attack_1.png-c0aae50579a764d653bd3d903ffaf3bb.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/Char/Player/Dragon/Art/spr_dragon_attack_2.png b/Char/Player/Dragon/Art/spr_dragon_attack_2.png new file mode 100644 index 0000000..483827f Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_attack_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_attack_2.png.import b/Char/Player/Dragon/Art/spr_dragon_attack_2.png.import new file mode 100644 index 0000000..3d15769 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_attack_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bt716lbnswoul" +path="res://.godot/imported/spr_dragon_attack_2.png-5d160b40f0ab5d1a915c1d00c04156f6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_attack_2.png" +dest_files=["res://.godot/imported/spr_dragon_attack_2.png-5d160b40f0ab5d1a915c1d00c04156f6.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/Char/Player/Dragon/Art/spr_dragon_attack_3.png b/Char/Player/Dragon/Art/spr_dragon_attack_3.png new file mode 100644 index 0000000..57eff98 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_attack_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_attack_3.png.import b/Char/Player/Dragon/Art/spr_dragon_attack_3.png.import new file mode 100644 index 0000000..86bc846 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_attack_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm5xsifd3rwyq" +path="res://.godot/imported/spr_dragon_attack_3.png-3e7369cb9319f495db9833bf5c2686ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_attack_3.png" +dest_files=["res://.godot/imported/spr_dragon_attack_3.png-3e7369cb9319f495db9833bf5c2686ed.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/Char/Player/Dragon/Art/spr_dragon_fall_0.png b/Char/Player/Dragon/Art/spr_dragon_fall_0.png new file mode 100644 index 0000000..d19bcb9 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_fall_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_fall_0.png.import b/Char/Player/Dragon/Art/spr_dragon_fall_0.png.import new file mode 100644 index 0000000..3857fd6 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_fall_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2li0t3u8avs2" +path="res://.godot/imported/spr_dragon_fall_0.png-5ed654451467be4c7f0c49995a8e1850.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_fall_0.png" +dest_files=["res://.godot/imported/spr_dragon_fall_0.png-5ed654451467be4c7f0c49995a8e1850.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/Char/Player/Dragon/Art/spr_dragon_fall_1.png b/Char/Player/Dragon/Art/spr_dragon_fall_1.png new file mode 100644 index 0000000..56b24c9 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_fall_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_fall_1.png.import b/Char/Player/Dragon/Art/spr_dragon_fall_1.png.import new file mode 100644 index 0000000..1ad05c0 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_fall_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hxtrbv7dja3q" +path="res://.godot/imported/spr_dragon_fall_1.png-138a55dadb888849da25ecae4e0ab3c1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_fall_1.png" +dest_files=["res://.godot/imported/spr_dragon_fall_1.png-138a55dadb888849da25ecae4e0ab3c1.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/Char/Player/Dragon/Art/spr_dragon_fall_2.png b/Char/Player/Dragon/Art/spr_dragon_fall_2.png new file mode 100644 index 0000000..1bb7a8b Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_fall_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_fall_2.png.import b/Char/Player/Dragon/Art/spr_dragon_fall_2.png.import new file mode 100644 index 0000000..e6f87d6 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_fall_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do7u8vca3odr7" +path="res://.godot/imported/spr_dragon_fall_2.png-3836e7c27181c331781e05d992c10fc3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_fall_2.png" +dest_files=["res://.godot/imported/spr_dragon_fall_2.png-3836e7c27181c331781e05d992c10fc3.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/Char/Player/Dragon/Art/spr_dragon_fall_3.png b/Char/Player/Dragon/Art/spr_dragon_fall_3.png new file mode 100644 index 0000000..f691582 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_fall_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_fall_3.png.import b/Char/Player/Dragon/Art/spr_dragon_fall_3.png.import new file mode 100644 index 0000000..7158cfb --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_fall_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d26oms1mntndf" +path="res://.godot/imported/spr_dragon_fall_3.png-5ed2ac5255038aa818de4d5cf28d8b7a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_fall_3.png" +dest_files=["res://.godot/imported/spr_dragon_fall_3.png-5ed2ac5255038aa818de4d5cf28d8b7a.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/Char/Player/Dragon/Art/spr_dragon_flip_0.png b/Char/Player/Dragon/Art/spr_dragon_flip_0.png new file mode 100644 index 0000000..1101b4a Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_0.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_0.png.import new file mode 100644 index 0000000..e620542 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fembvua8hmck" +path="res://.godot/imported/spr_dragon_flip_0.png-ed6e6c677b647fc38325d4dd17bb94fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_0.png" +dest_files=["res://.godot/imported/spr_dragon_flip_0.png-ed6e6c677b647fc38325d4dd17bb94fe.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/Char/Player/Dragon/Art/spr_dragon_flip_1.png b/Char/Player/Dragon/Art/spr_dragon_flip_1.png new file mode 100644 index 0000000..9eef518 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_1.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_1.png.import new file mode 100644 index 0000000..b1284c1 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csv603gh8fgym" +path="res://.godot/imported/spr_dragon_flip_1.png-09de5907c46abf95673541ce20e69533.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_1.png" +dest_files=["res://.godot/imported/spr_dragon_flip_1.png-09de5907c46abf95673541ce20e69533.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/Char/Player/Dragon/Art/spr_dragon_flip_2.png b/Char/Player/Dragon/Art/spr_dragon_flip_2.png new file mode 100644 index 0000000..7481254 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_2.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_2.png.import new file mode 100644 index 0000000..ef235bd --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1x7i1v7w5iy7" +path="res://.godot/imported/spr_dragon_flip_2.png-49480579be52cafc3fead6f7f37bcc3a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_2.png" +dest_files=["res://.godot/imported/spr_dragon_flip_2.png-49480579be52cafc3fead6f7f37bcc3a.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/Char/Player/Dragon/Art/spr_dragon_flip_3.png b/Char/Player/Dragon/Art/spr_dragon_flip_3.png new file mode 100644 index 0000000..8dfc441 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_3.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_3.png.import new file mode 100644 index 0000000..bf93c8b --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5tio16pvphtj" +path="res://.godot/imported/spr_dragon_flip_3.png-545d98adc61e05370a50c05c29945663.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_3.png" +dest_files=["res://.godot/imported/spr_dragon_flip_3.png-545d98adc61e05370a50c05c29945663.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/Char/Player/Dragon/Art/spr_dragon_flip_4.png b/Char/Player/Dragon/Art/spr_dragon_flip_4.png new file mode 100644 index 0000000..ce66e78 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_4.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_4.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_4.png.import new file mode 100644 index 0000000..be4b1bd --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://be68o2eopvqal" +path="res://.godot/imported/spr_dragon_flip_4.png-4a3c7b4d50df6b180b9e6ece652448d3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_4.png" +dest_files=["res://.godot/imported/spr_dragon_flip_4.png-4a3c7b4d50df6b180b9e6ece652448d3.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/Char/Player/Dragon/Art/spr_dragon_flip_5.png b/Char/Player/Dragon/Art/spr_dragon_flip_5.png new file mode 100644 index 0000000..f04cafa Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_5.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_5.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_5.png.import new file mode 100644 index 0000000..6d4efe7 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://o63kxaeu8x4h" +path="res://.godot/imported/spr_dragon_flip_5.png-63737ce4ebef6f852f671182ccd9aa76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_5.png" +dest_files=["res://.godot/imported/spr_dragon_flip_5.png-63737ce4ebef6f852f671182ccd9aa76.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/Char/Player/Dragon/Art/spr_dragon_flip_6.png b/Char/Player/Dragon/Art/spr_dragon_flip_6.png new file mode 100644 index 0000000..3f743ab Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_6.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_6.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_6.png.import new file mode 100644 index 0000000..3f80257 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5c60a68pry6" +path="res://.godot/imported/spr_dragon_flip_6.png-571e1aefc9968d8e1dc2dc47e4be6cfb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_6.png" +dest_files=["res://.godot/imported/spr_dragon_flip_6.png-571e1aefc9968d8e1dc2dc47e4be6cfb.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/Char/Player/Dragon/Art/spr_dragon_flip_7.png b/Char/Player/Dragon/Art/spr_dragon_flip_7.png new file mode 100644 index 0000000..3d425e7 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_7.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_7.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_7.png.import new file mode 100644 index 0000000..d894f23 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bo0k3qe5flftb" +path="res://.godot/imported/spr_dragon_flip_7.png-c404fd6c70f39ae028cf3f6f8a77b7a0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_7.png" +dest_files=["res://.godot/imported/spr_dragon_flip_7.png-c404fd6c70f39ae028cf3f6f8a77b7a0.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/Char/Player/Dragon/Art/spr_dragon_flip_8.png b/Char/Player/Dragon/Art/spr_dragon_flip_8.png new file mode 100644 index 0000000..e8b655c Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_8.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_8.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_8.png.import new file mode 100644 index 0000000..b90db42 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4w13s5b1cjup" +path="res://.godot/imported/spr_dragon_flip_8.png-03a48ccdfc4c79ec1d23ee72f7db49e2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_8.png" +dest_files=["res://.godot/imported/spr_dragon_flip_8.png-03a48ccdfc4c79ec1d23ee72f7db49e2.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/Char/Player/Dragon/Art/spr_dragon_flip_9.png b/Char/Player/Dragon/Art/spr_dragon_flip_9.png new file mode 100644 index 0000000..d87b54e Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_flip_9.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_flip_9.png.import b/Char/Player/Dragon/Art/spr_dragon_flip_9.png.import new file mode 100644 index 0000000..4a85f4d --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_flip_9.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ldl8wqe7v1qa" +path="res://.godot/imported/spr_dragon_flip_9.png-775c79a6210c88f99e43d5091b775105.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_flip_9.png" +dest_files=["res://.godot/imported/spr_dragon_flip_9.png-775c79a6210c88f99e43d5091b775105.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/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png new file mode 100644 index 0000000..3f30465 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png.import new file mode 100644 index 0000000..ae1bd12 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ousnf1wu7s6g" +path="res://.godot/imported/spr_dragon_idle_0.normal.png-7ba7783f1ff5f352012392d43dabbf85.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_0.normal.png-7ba7783f1ff5f352012392d43dabbf85.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/Char/Player/Dragon/Art/spr_dragon_idle_0.png b/Char/Player/Dragon/Art/spr_dragon_idle_0.png new file mode 100644 index 0000000..69836ac Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_0.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_0.png.import new file mode 100644 index 0000000..3766250 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqemid4qkvhpx" +path="res://.godot/imported/spr_dragon_idle_0.png-fb5541cdf0cc78057e86fd28fe507614.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" +dest_files=["res://.godot/imported/spr_dragon_idle_0.png-fb5541cdf0cc78057e86fd28fe507614.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/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png new file mode 100644 index 0000000..5e738e8 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png.import new file mode 100644 index 0000000..70ff21e --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1hju2xsy7wse" +path="res://.godot/imported/spr_dragon_idle_1.normal.png-f30f54ae770c6d90193a17988667663f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_1.normal.png-f30f54ae770c6d90193a17988667663f.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/Char/Player/Dragon/Art/spr_dragon_idle_1.png b/Char/Player/Dragon/Art/spr_dragon_idle_1.png new file mode 100644 index 0000000..e9af2fd Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_1.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_1.png.import new file mode 100644 index 0000000..36a9149 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mnyld8ya3sdv" +path="res://.godot/imported/spr_dragon_idle_1.png-6883cd50e0f8f4ba4a0de8f4abe33c4f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_1.png" +dest_files=["res://.godot/imported/spr_dragon_idle_1.png-6883cd50e0f8f4ba4a0de8f4abe33c4f.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/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png new file mode 100644 index 0000000..dbe5d41 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png.import new file mode 100644 index 0000000..6bb5a35 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cd05kvgj742vp" +path="res://.godot/imported/spr_dragon_idle_10.normal.png-297034da97efe58da2b9d096d398fc33.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_10.normal.png-297034da97efe58da2b9d096d398fc33.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/Char/Player/Dragon/Art/spr_dragon_idle_10.png b/Char/Player/Dragon/Art/spr_dragon_idle_10.png new file mode 100644 index 0000000..c191930 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_10.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_10.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_10.png.import new file mode 100644 index 0000000..f108d09 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpkeoyownslnv" +path="res://.godot/imported/spr_dragon_idle_10.png-c524f4c974d98864db5261a8cec52e85.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_10.png" +dest_files=["res://.godot/imported/spr_dragon_idle_10.png-c524f4c974d98864db5261a8cec52e85.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/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png new file mode 100644 index 0000000..9e5081c Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png.import new file mode 100644 index 0000000..ce5eda3 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ke5cferl1gva" +path="res://.godot/imported/spr_dragon_idle_11.normal.png-6a2ef28cd624df17e9144c26aeafe339.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_11.normal.png-6a2ef28cd624df17e9144c26aeafe339.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/Char/Player/Dragon/Art/spr_dragon_idle_11.png b/Char/Player/Dragon/Art/spr_dragon_idle_11.png new file mode 100644 index 0000000..90ba9a4 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_11.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_11.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_11.png.import new file mode 100644 index 0000000..e1f1bb6 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_11.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2l6y0fogf06u" +path="res://.godot/imported/spr_dragon_idle_11.png-b94db2211e3c7ca44496599d6189c616.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_11.png" +dest_files=["res://.godot/imported/spr_dragon_idle_11.png-b94db2211e3c7ca44496599d6189c616.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/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png new file mode 100644 index 0000000..a4b4be7 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png.import new file mode 100644 index 0000000..6998c1e --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bygcnuu027o7q" +path="res://.godot/imported/spr_dragon_idle_2.normal.png-b015bc19de422ddbb1b05e408972e4d6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_2.normal.png-b015bc19de422ddbb1b05e408972e4d6.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/Char/Player/Dragon/Art/spr_dragon_idle_2.png b/Char/Player/Dragon/Art/spr_dragon_idle_2.png new file mode 100644 index 0000000..3cdae34 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_2.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_2.png.import new file mode 100644 index 0000000..eea1c00 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cejmhawjklaph" +path="res://.godot/imported/spr_dragon_idle_2.png-f2bd4071369e9918dfba191da5d5d207.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_2.png" +dest_files=["res://.godot/imported/spr_dragon_idle_2.png-f2bd4071369e9918dfba191da5d5d207.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/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png new file mode 100644 index 0000000..5141b25 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png.import new file mode 100644 index 0000000..af2ec2b --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckhi0g1svhqbm" +path="res://.godot/imported/spr_dragon_idle_3.normal.png-f0cb9821f12c5104971ac0252821318a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_3.normal.png-f0cb9821f12c5104971ac0252821318a.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/Char/Player/Dragon/Art/spr_dragon_idle_3.png b/Char/Player/Dragon/Art/spr_dragon_idle_3.png new file mode 100644 index 0000000..a60c009 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_3.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_3.png.import new file mode 100644 index 0000000..506634d --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7gd4jcucrkc2" +path="res://.godot/imported/spr_dragon_idle_3.png-716c09547254d99bca732ede40ac412c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_3.png" +dest_files=["res://.godot/imported/spr_dragon_idle_3.png-716c09547254d99bca732ede40ac412c.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/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png new file mode 100644 index 0000000..ce8cdde Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png.import new file mode 100644 index 0000000..7bfb9e3 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b80a5ex07ox6f" +path="res://.godot/imported/spr_dragon_idle_4.normal.png-eb0d51214a242143dabbca9bf703cc51.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_4.normal.png-eb0d51214a242143dabbca9bf703cc51.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/Char/Player/Dragon/Art/spr_dragon_idle_4.png b/Char/Player/Dragon/Art/spr_dragon_idle_4.png new file mode 100644 index 0000000..7b865df Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_4.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_4.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_4.png.import new file mode 100644 index 0000000..80173c8 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://isdcb3pm0ywa" +path="res://.godot/imported/spr_dragon_idle_4.png-e52c07ecd1bd2b8de73223fb9783d0a8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_4.png" +dest_files=["res://.godot/imported/spr_dragon_idle_4.png-e52c07ecd1bd2b8de73223fb9783d0a8.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/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png new file mode 100644 index 0000000..df7269e Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png.import new file mode 100644 index 0000000..202b016 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1ew41fr3yuyl" +path="res://.godot/imported/spr_dragon_idle_5.normal.png-04f22e99fbe73ee57afcbb42809f8895.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_5.normal.png-04f22e99fbe73ee57afcbb42809f8895.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/Char/Player/Dragon/Art/spr_dragon_idle_5.png b/Char/Player/Dragon/Art/spr_dragon_idle_5.png new file mode 100644 index 0000000..1b06755 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_5.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_5.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_5.png.import new file mode 100644 index 0000000..2475374 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c61m0s1fgshu0" +path="res://.godot/imported/spr_dragon_idle_5.png-775f1bdc5c7cc29abc92e24ff21f44eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_5.png" +dest_files=["res://.godot/imported/spr_dragon_idle_5.png-775f1bdc5c7cc29abc92e24ff21f44eb.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/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png new file mode 100644 index 0000000..f03ae0e Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png.import new file mode 100644 index 0000000..735b49e --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwn82n8e816nf" +path="res://.godot/imported/spr_dragon_idle_6.normal.png-362f568b303bf60d5c9c5bf0b91c131d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_6.normal.png-362f568b303bf60d5c9c5bf0b91c131d.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/Char/Player/Dragon/Art/spr_dragon_idle_6.png b/Char/Player/Dragon/Art/spr_dragon_idle_6.png new file mode 100644 index 0000000..3ce71b6 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_6.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_6.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_6.png.import new file mode 100644 index 0000000..91d3aee --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://f4xpiox0di6d" +path="res://.godot/imported/spr_dragon_idle_6.png-58c71f907717fbd6df08a324da0313b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_6.png" +dest_files=["res://.godot/imported/spr_dragon_idle_6.png-58c71f907717fbd6df08a324da0313b7.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/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png new file mode 100644 index 0000000..18c5e45 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png.import new file mode 100644 index 0000000..6638674 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnacqpkfdimnm" +path="res://.godot/imported/spr_dragon_idle_7.normal.png-7e942892d1da18f7108ea0ad6f8c13ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_7.normal.png-7e942892d1da18f7108ea0ad6f8c13ea.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/Char/Player/Dragon/Art/spr_dragon_idle_7.png b/Char/Player/Dragon/Art/spr_dragon_idle_7.png new file mode 100644 index 0000000..770ce1b Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_7.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_7.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_7.png.import new file mode 100644 index 0000000..ac57cd3 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djw2htl7v0nam" +path="res://.godot/imported/spr_dragon_idle_7.png-01576e322d5fe554585609e9df87a83c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_7.png" +dest_files=["res://.godot/imported/spr_dragon_idle_7.png-01576e322d5fe554585609e9df87a83c.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/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png new file mode 100644 index 0000000..f22b2de Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png.import new file mode 100644 index 0000000..8013a72 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cywb8qjtv5gb0" +path="res://.godot/imported/spr_dragon_idle_8.normal.png-4c9e16a2b94a3b736261c1ee583f51a2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_8.normal.png-4c9e16a2b94a3b736261c1ee583f51a2.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/Char/Player/Dragon/Art/spr_dragon_idle_8.png b/Char/Player/Dragon/Art/spr_dragon_idle_8.png new file mode 100644 index 0000000..7d9f9ef Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_8.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_8.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_8.png.import new file mode 100644 index 0000000..50185c0 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do5oa1ajdlxc6" +path="res://.godot/imported/spr_dragon_idle_8.png-d27004aeaed904e5e5c721ad27ced5c1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_8.png" +dest_files=["res://.godot/imported/spr_dragon_idle_8.png-d27004aeaed904e5e5c721ad27ced5c1.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/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png b/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png new file mode 100644 index 0000000..a50693c Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png.import new file mode 100644 index 0000000..f2011aa --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddf0ni01bcimo" +path="res://.godot/imported/spr_dragon_idle_9.normal.png-08843611a55467fbe79ef6360a811fe5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png" +dest_files=["res://.godot/imported/spr_dragon_idle_9.normal.png-08843611a55467fbe79ef6360a811fe5.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/Char/Player/Dragon/Art/spr_dragon_idle_9.png b/Char/Player/Dragon/Art/spr_dragon_idle_9.png new file mode 100644 index 0000000..8892f09 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_idle_9.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_idle_9.png.import b/Char/Player/Dragon/Art/spr_dragon_idle_9.png.import new file mode 100644 index 0000000..054ba85 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_idle_9.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwmxlkrcl7sot" +path="res://.godot/imported/spr_dragon_idle_9.png-c84a802978bb17135054b3caeed7b9ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_idle_9.png" +dest_files=["res://.godot/imported/spr_dragon_idle_9.png-c84a802978bb17135054b3caeed7b9ba.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/Char/Player/Dragon/Art/spr_dragon_jump_0.png b/Char/Player/Dragon/Art/spr_dragon_jump_0.png new file mode 100644 index 0000000..daa81dc Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_jump_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_jump_0.png.import b/Char/Player/Dragon/Art/spr_dragon_jump_0.png.import new file mode 100644 index 0000000..0776416 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_jump_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0kl0n0ojf355" +path="res://.godot/imported/spr_dragon_jump_0.png-a73a440ebe8e588ba6821bcd5980c4c8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_jump_0.png" +dest_files=["res://.godot/imported/spr_dragon_jump_0.png-a73a440ebe8e588ba6821bcd5980c4c8.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/Char/Player/Dragon/Art/spr_dragon_jump_1.png b/Char/Player/Dragon/Art/spr_dragon_jump_1.png new file mode 100644 index 0000000..85a480f Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_jump_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_jump_1.png.import b/Char/Player/Dragon/Art/spr_dragon_jump_1.png.import new file mode 100644 index 0000000..a5ddf3d --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_jump_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq5m06b3afmon" +path="res://.godot/imported/spr_dragon_jump_1.png-616bd4f09bc01c4ed0be91e9540a9366.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_jump_1.png" +dest_files=["res://.godot/imported/spr_dragon_jump_1.png-616bd4f09bc01c4ed0be91e9540a9366.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/Char/Player/Dragon/Art/spr_dragon_jump_2.png b/Char/Player/Dragon/Art/spr_dragon_jump_2.png new file mode 100644 index 0000000..02f7057 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_jump_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_jump_2.png.import b/Char/Player/Dragon/Art/spr_dragon_jump_2.png.import new file mode 100644 index 0000000..e6639f5 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_jump_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3ih5pu5no7qm" +path="res://.godot/imported/spr_dragon_jump_2.png-0f78811bb70c9fa46075dbf5a5fc6641.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_jump_2.png" +dest_files=["res://.godot/imported/spr_dragon_jump_2.png-0f78811bb70c9fa46075dbf5a5fc6641.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/Char/Player/Dragon/Art/spr_dragon_jump_3.png b/Char/Player/Dragon/Art/spr_dragon_jump_3.png new file mode 100644 index 0000000..e35f449 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_jump_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_jump_3.png.import b/Char/Player/Dragon/Art/spr_dragon_jump_3.png.import new file mode 100644 index 0000000..a8c3195 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_jump_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ceo17ioghqbuj" +path="res://.godot/imported/spr_dragon_jump_3.png-c433f3ad0ed89a86ec565b3786601a80.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_jump_3.png" +dest_files=["res://.godot/imported/spr_dragon_jump_3.png-c433f3ad0ed89a86ec565b3786601a80.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/Char/Player/Dragon/Art/spr_dragon_roll_0.png b/Char/Player/Dragon/Art/spr_dragon_roll_0.png new file mode 100644 index 0000000..235569a Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_0.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_0.png.import new file mode 100644 index 0000000..33f23fa --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cuym4qxnae6k8" +path="res://.godot/imported/spr_dragon_roll_0.png-1f4fc7483e87bac1a8616e0a24a48952.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_0.png" +dest_files=["res://.godot/imported/spr_dragon_roll_0.png-1f4fc7483e87bac1a8616e0a24a48952.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/Char/Player/Dragon/Art/spr_dragon_roll_1.png b/Char/Player/Dragon/Art/spr_dragon_roll_1.png new file mode 100644 index 0000000..b27966d Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_1.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_1.png.import new file mode 100644 index 0000000..3b770cd --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hl51s1vfb4uu" +path="res://.godot/imported/spr_dragon_roll_1.png-7b260f2b2f9f6835e2955bd17217ca55.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_1.png" +dest_files=["res://.godot/imported/spr_dragon_roll_1.png-7b260f2b2f9f6835e2955bd17217ca55.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/Char/Player/Dragon/Art/spr_dragon_roll_2.png b/Char/Player/Dragon/Art/spr_dragon_roll_2.png new file mode 100644 index 0000000..16effac Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_2.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_2.png.import new file mode 100644 index 0000000..4654f0b --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://codslssttoexv" +path="res://.godot/imported/spr_dragon_roll_2.png-3c65a8890221b44e029aef626f073d06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_2.png" +dest_files=["res://.godot/imported/spr_dragon_roll_2.png-3c65a8890221b44e029aef626f073d06.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/Char/Player/Dragon/Art/spr_dragon_roll_3.png b/Char/Player/Dragon/Art/spr_dragon_roll_3.png new file mode 100644 index 0000000..755b6d1 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_3.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_3.png.import new file mode 100644 index 0000000..91edf26 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dysoofxx0stl2" +path="res://.godot/imported/spr_dragon_roll_3.png-26a18cc732812524d1a0d42c184a51f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_3.png" +dest_files=["res://.godot/imported/spr_dragon_roll_3.png-26a18cc732812524d1a0d42c184a51f5.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/Char/Player/Dragon/Art/spr_dragon_roll_4.png b/Char/Player/Dragon/Art/spr_dragon_roll_4.png new file mode 100644 index 0000000..8623989 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_4.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_4.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_4.png.import new file mode 100644 index 0000000..184b8c9 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ogbn85vmy3qx" +path="res://.godot/imported/spr_dragon_roll_4.png-fe808a1eddc50c60485fa163f6f2d477.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_4.png" +dest_files=["res://.godot/imported/spr_dragon_roll_4.png-fe808a1eddc50c60485fa163f6f2d477.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/Char/Player/Dragon/Art/spr_dragon_roll_5.png b/Char/Player/Dragon/Art/spr_dragon_roll_5.png new file mode 100644 index 0000000..dcf1dce Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_5.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_5.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_5.png.import new file mode 100644 index 0000000..45820ec --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfyq8ugh4n2hg" +path="res://.godot/imported/spr_dragon_roll_5.png-5c394dfeec3f4db6c13faafcba338e11.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_5.png" +dest_files=["res://.godot/imported/spr_dragon_roll_5.png-5c394dfeec3f4db6c13faafcba338e11.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/Char/Player/Dragon/Art/spr_dragon_roll_6.png b/Char/Player/Dragon/Art/spr_dragon_roll_6.png new file mode 100644 index 0000000..54774b1 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_roll_6.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_roll_6.png.import b/Char/Player/Dragon/Art/spr_dragon_roll_6.png.import new file mode 100644 index 0000000..f7dc8c9 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_roll_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fyquwjiilukk" +path="res://.godot/imported/spr_dragon_roll_6.png-1b20af05009ea05e1cb24b05360b7f1e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_roll_6.png" +dest_files=["res://.godot/imported/spr_dragon_roll_6.png-1b20af05009ea05e1cb24b05360b7f1e.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/Char/Player/Dragon/Art/spr_dragon_run_0.png b/Char/Player/Dragon/Art/spr_dragon_run_0.png new file mode 100644 index 0000000..4423089 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_0.png.import b/Char/Player/Dragon/Art/spr_dragon_run_0.png.import new file mode 100644 index 0000000..e4b993c --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://di7esul13rycx" +path="res://.godot/imported/spr_dragon_run_0.png-dafc9fd3534d9d4b67303cd93e642105.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_0.png" +dest_files=["res://.godot/imported/spr_dragon_run_0.png-dafc9fd3534d9d4b67303cd93e642105.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/Char/Player/Dragon/Art/spr_dragon_run_1.png b/Char/Player/Dragon/Art/spr_dragon_run_1.png new file mode 100644 index 0000000..19af551 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_1.png.import b/Char/Player/Dragon/Art/spr_dragon_run_1.png.import new file mode 100644 index 0000000..3b77a4a --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://irp68nxuo5ky" +path="res://.godot/imported/spr_dragon_run_1.png-b74ea94ffc3d6578210916b8e590dfa1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_1.png" +dest_files=["res://.godot/imported/spr_dragon_run_1.png-b74ea94ffc3d6578210916b8e590dfa1.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/Char/Player/Dragon/Art/spr_dragon_run_2.png b/Char/Player/Dragon/Art/spr_dragon_run_2.png new file mode 100644 index 0000000..ccb592c Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_2.png.import b/Char/Player/Dragon/Art/spr_dragon_run_2.png.import new file mode 100644 index 0000000..518ef4f --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bydv5fssoxi8q" +path="res://.godot/imported/spr_dragon_run_2.png-bc51bca0b2f2d5bece99d950b27732f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_2.png" +dest_files=["res://.godot/imported/spr_dragon_run_2.png-bc51bca0b2f2d5bece99d950b27732f5.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/Char/Player/Dragon/Art/spr_dragon_run_3.png b/Char/Player/Dragon/Art/spr_dragon_run_3.png new file mode 100644 index 0000000..4d213b5 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_3.png.import b/Char/Player/Dragon/Art/spr_dragon_run_3.png.import new file mode 100644 index 0000000..f06fb2f --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kjjjdso8fvqs" +path="res://.godot/imported/spr_dragon_run_3.png-67657fe3cd463bbb975648fce68d7efc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_3.png" +dest_files=["res://.godot/imported/spr_dragon_run_3.png-67657fe3cd463bbb975648fce68d7efc.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/Char/Player/Dragon/Art/spr_dragon_run_4.png b/Char/Player/Dragon/Art/spr_dragon_run_4.png new file mode 100644 index 0000000..91441c1 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_4.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_4.png.import b/Char/Player/Dragon/Art/spr_dragon_run_4.png.import new file mode 100644 index 0000000..88013c8 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ciwxrimunkf0e" +path="res://.godot/imported/spr_dragon_run_4.png-836330d4debba3fdc051e1609608d148.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_4.png" +dest_files=["res://.godot/imported/spr_dragon_run_4.png-836330d4debba3fdc051e1609608d148.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/Char/Player/Dragon/Art/spr_dragon_run_5.png b/Char/Player/Dragon/Art/spr_dragon_run_5.png new file mode 100644 index 0000000..91d5daa Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_5.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_5.png.import b/Char/Player/Dragon/Art/spr_dragon_run_5.png.import new file mode 100644 index 0000000..8754f46 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c00suiuifsvva" +path="res://.godot/imported/spr_dragon_run_5.png-4b179b9c59e766f8a8fb8122038b2dc3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_5.png" +dest_files=["res://.godot/imported/spr_dragon_run_5.png-4b179b9c59e766f8a8fb8122038b2dc3.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/Char/Player/Dragon/Art/spr_dragon_run_6.png b/Char/Player/Dragon/Art/spr_dragon_run_6.png new file mode 100644 index 0000000..5f440a7 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_6.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_6.png.import b/Char/Player/Dragon/Art/spr_dragon_run_6.png.import new file mode 100644 index 0000000..fd1eb16 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d14o0etoh3hnt" +path="res://.godot/imported/spr_dragon_run_6.png-a8ad986efc6d8a668b134c5e271c610a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_6.png" +dest_files=["res://.godot/imported/spr_dragon_run_6.png-a8ad986efc6d8a668b134c5e271c610a.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/Char/Player/Dragon/Art/spr_dragon_run_7.png b/Char/Player/Dragon/Art/spr_dragon_run_7.png new file mode 100644 index 0000000..4a41dd2 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_7.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_7.png.import b/Char/Player/Dragon/Art/spr_dragon_run_7.png.import new file mode 100644 index 0000000..6185c40 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs01te1vyt5xi" +path="res://.godot/imported/spr_dragon_run_7.png-bc80ae1b5a25a3814fe266b4d18c0da8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_7.png" +dest_files=["res://.godot/imported/spr_dragon_run_7.png-bc80ae1b5a25a3814fe266b4d18c0da8.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/Char/Player/Dragon/Art/spr_dragon_run_8.png b/Char/Player/Dragon/Art/spr_dragon_run_8.png new file mode 100644 index 0000000..d995790 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_8.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_8.png.import b/Char/Player/Dragon/Art/spr_dragon_run_8.png.import new file mode 100644 index 0000000..ba82f08 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://be4c7rrspvvbh" +path="res://.godot/imported/spr_dragon_run_8.png-8f1f5a348e88c7776765bc6f4db33112.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_8.png" +dest_files=["res://.godot/imported/spr_dragon_run_8.png-8f1f5a348e88c7776765bc6f4db33112.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/Char/Player/Dragon/Art/spr_dragon_run_9.png b/Char/Player/Dragon/Art/spr_dragon_run_9.png new file mode 100644 index 0000000..f033fcc Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_9.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_9.png.import b/Char/Player/Dragon/Art/spr_dragon_run_9.png.import new file mode 100644 index 0000000..1a77d51 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_9.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4nq0omsnuvyu" +path="res://.godot/imported/spr_dragon_run_9.png-7bdf7861f84ffad75c84feade39582f2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_9.png" +dest_files=["res://.godot/imported/spr_dragon_run_9.png-7bdf7861f84ffad75c84feade39582f2.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/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png new file mode 100644 index 0000000..7708a1c Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png.import b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png.import new file mode 100644 index 0000000..fbba79c --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dah1r7p2uilp1" +path="res://.godot/imported/spr_dragon_run_to_idle_0.png-21528c9a4608d0ada77071fd0efdbb4f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png" +dest_files=["res://.godot/imported/spr_dragon_run_to_idle_0.png-21528c9a4608d0ada77071fd0efdbb4f.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/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png new file mode 100644 index 0000000..5120537 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png.import b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png.import new file mode 100644 index 0000000..3da98eb --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6udltq40yhll" +path="res://.godot/imported/spr_dragon_run_to_idle_1.png-f5fb7727c58674fb55e844a970704cd5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png" +dest_files=["res://.godot/imported/spr_dragon_run_to_idle_1.png-f5fb7727c58674fb55e844a970704cd5.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/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png new file mode 100644 index 0000000..92dfe20 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png.import b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png.import new file mode 100644 index 0000000..002eecb --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dh2ta4te4ojph" +path="res://.godot/imported/spr_dragon_run_to_idle_2.png-7b692e3a418e88840e1e6cbc4c9c97f7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png" +dest_files=["res://.godot/imported/spr_dragon_run_to_idle_2.png-7b692e3a418e88840e1e6cbc4c9c97f7.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/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png new file mode 100644 index 0000000..353d258 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png.import b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png.import new file mode 100644 index 0000000..c8f734e --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cffe3xkw64qfj" +path="res://.godot/imported/spr_dragon_run_to_idle_3.png-a152997907af8b8b97895942a15522ae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png" +dest_files=["res://.godot/imported/spr_dragon_run_to_idle_3.png-a152997907af8b8b97895942a15522ae.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/Char/Player/Dragon/Art/spr_dragon_squat_0.png b/Char/Player/Dragon/Art/spr_dragon_squat_0.png new file mode 100644 index 0000000..c46af49 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_squat_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_squat_0.png.import b/Char/Player/Dragon/Art/spr_dragon_squat_0.png.import new file mode 100644 index 0000000..b17a444 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_squat_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdrjq0ahsfccf" +path="res://.godot/imported/spr_dragon_squat_0.png-c6ba6c4ba185db28e9a665900ef1c16a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_squat_0.png" +dest_files=["res://.godot/imported/spr_dragon_squat_0.png-c6ba6c4ba185db28e9a665900ef1c16a.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/Char/Player/Dragon/Art/spr_dragon_squat_1.png b/Char/Player/Dragon/Art/spr_dragon_squat_1.png new file mode 100644 index 0000000..f86d520 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_squat_1.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_squat_1.png.import b/Char/Player/Dragon/Art/spr_dragon_squat_1.png.import new file mode 100644 index 0000000..d73c4c7 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_squat_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnc8xxkxguito" +path="res://.godot/imported/spr_dragon_squat_1.png-5ff4ac706174fc29bbadd6a6ef7dabf1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_squat_1.png" +dest_files=["res://.godot/imported/spr_dragon_squat_1.png-5ff4ac706174fc29bbadd6a6ef7dabf1.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/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png b/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png new file mode 100644 index 0000000..1b15d33 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png.import b/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png.import new file mode 100644 index 0000000..51181e1 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqsouxi8vi2o6" +path="res://.godot/imported/spr_dragon_wallgrab_0.png-fb2dd1ea832b6c5611212e74e15be248.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png" +dest_files=["res://.godot/imported/spr_dragon_wallgrab_0.png-fb2dd1ea832b6c5611212e74e15be248.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/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png b/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png new file mode 100644 index 0000000..23bbeb9 Binary files /dev/null and b/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png differ diff --git a/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png.import b/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png.import new file mode 100644 index 0000000..2f45fb3 --- /dev/null +++ b/Char/Player/Dragon/Art/spr_dragon_wallslide_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyqpmfmfuxbrh" +path="res://.godot/imported/spr_dragon_wallslide_0.png-dc8fd25a2837202b035ddc9b06b0b5ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Dragon/Art/spr_dragon_wallslide_0.png" +dest_files=["res://.godot/imported/spr_dragon_wallslide_0.png-dc8fd25a2837202b035ddc9b06b0b5ed.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/Char/Player/Dragon/Dragon.tscn b/Char/Player/Dragon/Dragon.tscn new file mode 100644 index 0000000..dc77aef --- /dev/null +++ b/Char/Player/Dragon/Dragon.tscn @@ -0,0 +1,786 @@ +[gd_scene load_steps=95 format=3 uid="uid://clbhclvndl73s"] + +[ext_resource type="Script" uid="uid://cy77v0f8ysxdn" path="res://Char/Player/States/Player_State_Machine.gd" id="1_8b1ok"] +[ext_resource type="Script" uid="uid://ly032d3bnh3n" path="res://Char/Player/Dragon/Player_Base.gd" id="1_8x8nf"] +[ext_resource type="PackedScene" uid="uid://dd7k3qbsw1bhq" path="res://Char/Char_Components/After_Image/after_image_component.tscn" id="2_decx5"] +[ext_resource type="Script" uid="uid://c3evnbnu55wyg" path="res://Char/Player/States/Player_Idle_Battle.gd" id="3_pu8qh"] +[ext_resource type="PackedScene" uid="uid://dkgg53dn8lr3k" path="res://Char/Char_Components/Petals_Leaves/Sakura_Component.tscn" id="3_q3boy"] +[ext_resource type="Texture2D" uid="uid://dpjxum07dbwf7" path="res://Char/Player/Dragon/Art/spr_dragon_idle_2.png" id="3_shf63"] +[ext_resource type="Script" uid="uid://ivsb676j6ymo" path="res://Char/Player/States/Player_Run.gd" id="4_8gmn7"] +[ext_resource type="Script" uid="uid://usn2b841v0e" path="res://Char/Player/States/Player_Run_To_Idle.gd" id="5_o8lre"] +[ext_resource type="Script" uid="uid://b3qdqr4f88tel" path="res://Char/Player/States/Player_Jump.gd" id="6_pj6pc"] +[ext_resource type="Script" uid="uid://lip17xk6ycgj" path="res://Char/Player/States/Player_Squat.gd" id="6_rk7vx"] +[ext_resource type="Script" uid="uid://blmxhheiqno3m" path="res://Char/Player/States/Player_Roll.gd" id="7_f3k8f"] +[ext_resource type="Script" uid="uid://dx7idxrq88pha" path="res://Char/Player/States/Player_Fall.gd" id="7_l6ktk"] +[ext_resource type="Script" uid="uid://b3ovdc2fiasfo" path="res://Char/Player/States/Player_Wall_Slide.gd" id="8_0jioi"] +[ext_resource type="Script" uid="uid://b71px30wip3gu" path="res://Char/Player/States/Player_Wall_Jump.gd" id="9_omn5s"] +[ext_resource type="Script" uid="uid://be7lbkwkjnli7" path="res://Char/Player/States/Player_Attack.gd" id="12_qfaga"] +[ext_resource type="Texture2D" uid="uid://npefyqisbjoa" path="res://Char/Player/Dragon/Art/spr_dragon_run_0.png" id="13_0wbuo"] +[ext_resource type="Texture2D" uid="uid://cninf8m61m206" path="res://Char/Player/Dragon/Art/spr_dragon_run_1.png" id="14_jer7q"] +[ext_resource type="Texture2D" uid="uid://buj81c5rfxrdq" path="res://Char/Player/Dragon/Art/spr_dragon_run_2.png" id="15_lptbu"] +[ext_resource type="Texture2D" uid="uid://f6umjxbcjm8m" path="res://Char/Player/Dragon/Art/spr_dragon_run_3.png" id="16_0tuwh"] +[ext_resource type="Texture2D" uid="uid://u0qiufvfp7dv" path="res://Char/Player/Dragon/Art/spr_dragon_run_4.png" id="17_kyfki"] +[ext_resource type="Texture2D" uid="uid://m6nysr4cdl7s" path="res://Char/Player/Dragon/Art/spr_dragon_run_5.png" id="18_jj3qc"] +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="18_wykc6"] +[ext_resource type="Texture2D" uid="uid://e5q7xv1s2yk7" path="res://Char/Player/Dragon/Art/spr_dragon_run_6.png" id="19_fuyqw"] +[ext_resource type="Texture2D" uid="uid://cyrddnhdejex2" path="res://Char/Player/Dragon/Art/spr_dragon_idle_1.png" id="19_tlqjx"] +[ext_resource type="Texture2D" uid="uid://bevpl7xngboh5" path="res://Char/Player/Dragon/Art/spr_dragon_run_7.png" id="20_8skjp"] +[ext_resource type="Texture2D" uid="uid://brgwp0glr18xq" path="res://Char/Player/Dragon/Art/spr_dragon_idle_3.png" id="20_lgiem"] +[ext_resource type="Texture2D" uid="uid://c2gg2hm7rdt0t" path="res://Char/Player/Dragon/Art/spr_dragon_idle_4.png" id="21_avpxs"] +[ext_resource type="Texture2D" uid="uid://bv3acm24r4k3w" path="res://Char/Player/Dragon/Art/spr_dragon_run_8.png" id="21_o4ru4"] +[ext_resource type="Texture2D" uid="uid://qlvxsg5iax8c" path="res://Char/Player/Dragon/Art/spr_dragon_idle_5.png" id="22_8yys0"] +[ext_resource type="Texture2D" uid="uid://cn0tdgaabqirl" path="res://Char/Player/Dragon/Art/spr_dragon_run_9.png" id="22_47m00"] +[ext_resource type="Texture2D" uid="uid://cnxu51medgdpe" path="res://Char/Player/Dragon/Art/spr_dragon_idle_6.png" id="23_dp7xy"] +[ext_resource type="Texture2D" uid="uid://esmd7omd5b2y" path="res://Char/Player/Dragon/Art/spr_dragon_jump_0.png" id="23_o4nm6"] +[ext_resource type="Texture2D" uid="uid://bt77wxum4koix" path="res://Char/Player/Dragon/Art/spr_dragon_idle_7.png" id="24_fsprh"] +[ext_resource type="Texture2D" uid="uid://um1fll4rdsog" path="res://Char/Player/Dragon/Art/spr_dragon_jump_1.png" id="24_g6xq5"] +[ext_resource type="Texture2D" uid="uid://b8cs32aff7vah" path="res://Char/Player/Dragon/Art/spr_dragon_idle_8.png" id="25_74tuj"] +[ext_resource type="Texture2D" uid="uid://blpk6010mvkfa" path="res://Char/Player/Dragon/Art/spr_dragon_jump_2.png" id="25_kewkt"] +[ext_resource type="Texture2D" uid="uid://bd537mp4lvwib" path="res://Char/Player/Dragon/Art/spr_dragon_idle_9.png" id="26_48fq6"] +[ext_resource type="Texture2D" uid="uid://qbqyuffl0dsb" path="res://Char/Player/Dragon/Art/spr_dragon_jump_3.png" id="26_hwbf7"] +[ext_resource type="Texture2D" uid="uid://docua10e7sugj" path="res://Char/Player/Dragon/Art/spr_dragon_idle_10.png" id="27_2sthe"] +[ext_resource type="Texture2D" uid="uid://3j8dum5ilm5v" path="res://Char/Player/Dragon/Art/spr_dragon_fall_0.png" id="27_5lstw"] +[ext_resource type="Texture2D" uid="uid://d2ibsjy2r2d1r" path="res://Char/Player/Dragon/Art/spr_dragon_idle_11.png" id="28_g1nrd"] +[ext_resource type="Texture2D" uid="uid://ua7qswi5vcvy" path="res://Char/Player/Dragon/Art/spr_dragon_fall_1.png" id="28_p33vv"] +[ext_resource type="Texture2D" uid="uid://caogd2twl7gv" path="res://Char/Player/Dragon/Art/spr_dragon_fall_2.png" id="29_idvuh"] +[ext_resource type="Texture2D" uid="uid://b6v5yssyrupav" path="res://Char/Player/Dragon/Art/spr_dragon_fall_3.png" id="30_a2wcb"] +[ext_resource type="Texture2D" uid="uid://dybwowxk2pbwp" path="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_0.png" id="37_h4ki6"] +[ext_resource type="Texture2D" uid="uid://bx2bm62lv4ejw" path="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_1.png" id="38_qv625"] +[ext_resource type="Texture2D" uid="uid://dw2ia1ckp88bm" path="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_2.png" id="39_0mny5"] +[ext_resource type="Texture2D" uid="uid://ujhm5qv7qs7x" path="res://Char/Player/Dragon/Art/spr_dragon_run_to_idle_3.png" id="40_3lg7x"] +[ext_resource type="Texture2D" uid="uid://cmdb2shk4v3fd" path="res://Char/Player/Dragon/Art/spr_dragon_wallgrab_0.png" id="42_by0sa"] +[ext_resource type="Texture2D" uid="uid://bhkdagiro5wv" path="res://Char/Player/Dragon/Art/spr_dragon_wallslide_0.png" id="43_7dq01"] +[ext_resource type="Texture2D" uid="uid://ccuvf5fp55ehk" path="res://Char/Player/Dragon/Art/spr_dragon_flip_0.png" id="46_nm5et"] +[ext_resource type="Texture2D" uid="uid://clbq0gnv4lgmy" path="res://Char/Player/Dragon/Art/spr_dragon_flip_1.png" id="47_2mdav"] +[ext_resource type="Texture2D" uid="uid://ce1eu4xeoov7c" path="res://Char/Player/Dragon/Art/spr_dragon_flip_2.png" id="48_jflmg"] +[ext_resource type="Texture2D" uid="uid://ctovc2rw5c34n" path="res://Char/Player/Dragon/Art/spr_dragon_flip_3.png" id="49_bke4t"] +[ext_resource type="Texture2D" uid="uid://c7gue6dsvy8kw" path="res://Char/Player/Dragon/Art/spr_dragon_flip_4.png" id="50_n3ffw"] +[ext_resource type="Texture2D" uid="uid://bohheg0uo1f1y" path="res://Char/Player/Dragon/Art/spr_dragon_flip_5.png" id="51_65kfe"] +[ext_resource type="Texture2D" uid="uid://dovf170ymw8x6" path="res://Char/Player/Dragon/Art/spr_dragon_flip_6.png" id="52_a6q1p"] +[ext_resource type="Texture2D" uid="uid://dcj4yru2xx1t2" path="res://Char/Player/Dragon/Art/spr_dragon_flip_7.png" id="53_raf4l"] +[ext_resource type="Texture2D" uid="uid://cf1qrbmcy6hju" path="res://Char/Player/Dragon/Art/spr_dragon_flip_8.png" id="54_dujc8"] +[ext_resource type="Texture2D" uid="uid://b75i8a73orffo" path="res://Char/Player/Dragon/Art/spr_dragon_flip_9.png" id="55_yhu0e"] +[ext_resource type="Texture2D" uid="uid://dtx0cosra1whw" path="res://Char/Player/Dragon/Art/spr_dragon_roll_0.png" id="56_ec61u"] +[ext_resource type="Texture2D" uid="uid://debnkk3xrb2aj" path="res://Char/Player/Dragon/Art/spr_dragon_roll_1.png" id="57_a1juv"] +[ext_resource type="Texture2D" uid="uid://bnt13pba1a1fr" path="res://Char/Player/Dragon/Art/spr_dragon_roll_2.png" id="58_y58dp"] +[ext_resource type="Texture2D" uid="uid://voctn5qm1pi2" path="res://Char/Player/Dragon/Art/spr_dragon_roll_3.png" id="59_ases0"] +[ext_resource type="Texture2D" uid="uid://bk8cr8q4qkigj" path="res://Char/Player/Dragon/Art/spr_dragon_roll_4.png" id="60_mp24o"] +[ext_resource type="Texture2D" uid="uid://c2seob4ri365x" path="res://Char/Player/Dragon/Art/spr_dragon_roll_5.png" id="61_37shp"] +[ext_resource type="Texture2D" uid="uid://uwyasi78it04" path="res://Char/Player/Dragon/Art/spr_dragon_roll_6.png" id="62_p6lss"] +[ext_resource type="Texture2D" uid="uid://dsavi8xyqclt3" path="res://Char/Player/Dragon/Art/spr_dragon_squat_0.png" id="63_1m5y8"] +[ext_resource type="Texture2D" uid="uid://bes1ltj266aim" path="res://Char/Player/Dragon/Art/spr_dragon_squat_1.png" id="64_562uw"] +[ext_resource type="Texture2D" uid="uid://cy05vwjwnyk5y" path="res://Char/Player/Dragon/Art/spr_dragon_attack_0.png" id="67_r4cet"] +[ext_resource type="Texture2D" uid="uid://c5yuv16qo164" path="res://Char/Player/Dragon/Art/spr_dragon_attack_1.png" id="68_yibrd"] +[ext_resource type="Texture2D" uid="uid://bme4d2aaciqcs" path="res://Char/Player/Dragon/Art/spr_dragon_attack_2.png" id="69_pwmak"] +[ext_resource type="Texture2D" uid="uid://c6g44ugtbdhx8" path="res://Char/Player/Dragon/Art/spr_dragon_attack_3.png" id="70_j2jvq"] +[ext_resource type="PackedScene" uid="uid://c4ighm8k5x65y" path="res://Char/Player/Player_Components/player_attack_component.tscn" id="72_m8ad3"] +[ext_resource type="PackedScene" uid="uid://dnlln6iv8ksy2" path="res://Char/Player/Player_Components/hit_stop_component.tscn" id="74_nx5vo"] +[ext_resource type="Script" uid="uid://btvbc6o6gwpms" path="res://Char/Char_Components/fx_component.gd" id="74_x0fc2"] +[ext_resource type="PackedScene" uid="uid://mhcxla3f3vac" path="res://Char/Player/Player_Components/hit_queue_processor.tscn" id="75_cx437"] +[ext_resource type="PackedScene" uid="uid://b6sngy5ab6s24" path="res://Char/Player/Player_Components/player_dash_component.tscn" id="75_r8ire"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_g868p"] +radius = 22.0 +height = 60.0 + +[sub_resource type="Animation" id="Animation_otybg"] +resource_name = "Attack" +length = 0.3 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.09, 0.13), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [ExtResource("68_yibrd"), ExtResource("69_pwmak"), ExtResource("70_j2jvq"), ExtResource("67_r4cet")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.09, 0.13), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2(5.96046e-08, -30), Vector2(3, -30), Vector2(13, -30)] +} + +[sub_resource type="Animation" id="Animation_sem5a"] +resource_name = "Dash_1" +length = 0.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("68_yibrd")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.78814e-06, -30)] +} + +[sub_resource type="Animation" id="Animation_mcrul"] +resource_name = "Dash_2" +length = 0.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("67_r4cet")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(13, -30)] +} + +[sub_resource type="Animation" id="Animation_caa4o"] +resource_name = "Fall" +length = 0.2 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +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": [ExtResource("27_5lstw"), ExtResource("28_p33vv"), ExtResource("29_idvuh"), ExtResource("30_a2wcb")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2(-2, -36)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} + +[sub_resource type="Animation" id="Animation_wspq3"] +resource_name = "Idle_Battle" +length = 1.2 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -32)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimationPlayer:speed_scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:texture") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("18_wykc6"), ExtResource("19_tlqjx"), ExtResource("3_shf63"), ExtResource("20_lgiem"), ExtResource("21_avpxs"), ExtResource("22_8yys0"), ExtResource("23_dp7xy"), ExtResource("24_fsprh"), ExtResource("25_74tuj"), ExtResource("26_48fq6"), ExtResource("27_2sthe"), ExtResource("28_g1nrd")] +} + +[sub_resource type="Animation" id="Animation_rtm6k"] +resource_name = "Jump" +length = 0.2 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +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": [ExtResource("23_o4nm6"), ExtResource("24_g6xq5"), ExtResource("25_kewkt"), ExtResource("26_hwbf7")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -35.2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} + +[sub_resource type="Animation" id="Animation_sy4nv"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("18_wykc6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -32)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Hurt/CollisionShape2D:disabled") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_hwf1e"] +resource_name = "Roll" +length = 0.3 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("56_ec61u"), ExtResource("57_a1juv"), ExtResource("58_y58dp"), ExtResource("59_ases0"), ExtResource("60_mp24o"), ExtResource("61_37shp"), ExtResource("62_p6lss")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -27)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Hurt/CollisionShape2D:disabled") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="Animation" id="Animation_arpr5"] +resource_name = "Run" +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("13_0wbuo"), ExtResource("14_jer7q"), ExtResource("15_lptbu"), ExtResource("16_0tuwh"), ExtResource("17_kyfki"), ExtResource("18_jj3qc"), ExtResource("19_fuyqw"), ExtResource("20_8skjp"), ExtResource("21_o4ru4"), ExtResource("22_47m00")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -30.4)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.5] +} + +[sub_resource type="Animation" id="Animation_jv5y0"] +resource_name = "Run_To_Idle" +length = 0.4 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [ExtResource("37_h4ki6"), ExtResource("38_qv625"), ExtResource("39_0mny5"), ExtResource("40_3lg7x")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-3, -30.4), Vector2(2, -30.4), Vector2(1, -30.4), Vector2(2, -30.4)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Player_State_Machine/Run_To_Idle") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.05), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"_floor_dust" +}] +} + +[sub_resource type="Animation" id="Animation_fdmlk"] +resource_name = "Squat" +length = 0.1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [ExtResource("63_1m5y8"), ExtResource("64_562uw")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2(-1, -30)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} + +[sub_resource type="Animation" id="Animation_sybvl"] +resource_name = "Wall_Jump" +length = 0.65 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("46_nm5et"), ExtResource("47_2mdav"), ExtResource("48_jflmg"), ExtResource("49_bke4t"), ExtResource("50_n3ffw"), ExtResource("51_65kfe"), ExtResource("52_a6q1p"), ExtResource("49_bke4t"), ExtResource("50_n3ffw"), ExtResource("51_65kfe"), ExtResource("52_a6q1p"), ExtResource("53_raf4l"), ExtResource("54_dujc8"), ExtResource("55_yhu0e")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.65), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -27), Vector2(1, -33)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [2.5] +} + +[sub_resource type="Animation" id="Animation_fiuvk"] +resource_name = "Wall_Slide" +length = 0.6 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.0606061), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [ExtResource("42_by0sa"), ExtResource("43_7dq01")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.0606061), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -32), Vector2(2, -34)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_irhps"] +_data = { +&"Attack": SubResource("Animation_otybg"), +&"Dash_1": SubResource("Animation_sem5a"), +&"Dash_2": SubResource("Animation_mcrul"), +&"Fall": SubResource("Animation_caa4o"), +&"Idle_Battle": SubResource("Animation_wspq3"), +&"Jump": SubResource("Animation_rtm6k"), +&"RESET": SubResource("Animation_sy4nv"), +&"Roll": SubResource("Animation_hwf1e"), +&"Run": SubResource("Animation_arpr5"), +&"Run_To_Idle": SubResource("Animation_jv5y0"), +&"Squat": SubResource("Animation_fdmlk"), +&"Wall_Jump": SubResource("Animation_sybvl"), +&"Wall_Slide": SubResource("Animation_fiuvk") +} + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_dcd6n"] +radius = 13.0 +height = 60.0 + +[node name="Player" type="CharacterBody2D" groups=["Player"]] +z_index = 6 +collision_mask = 66584576 +floor_constant_speed = true +floor_max_angle = 1.0472 +floor_snap_length = 10.0 +platform_on_leave = 2 +platform_floor_layers = 18350080 +platform_wall_layers = 2097152 +script = ExtResource("1_8x8nf") + +[node name="After_Image_Component" parent="." instance=ExtResource("2_decx5")] + +[node name="Sakura_Component" parent="." instance=ExtResource("3_q3boy")] + +[node name="Player_State_Machine" type="Node" parent="."] +script = ExtResource("1_8b1ok") + +[node name="Idle_Battle" type="Node" parent="Player_State_Machine"] +script = ExtResource("3_pu8qh") + +[node name="Run" type="Node" parent="Player_State_Machine"] +script = ExtResource("4_8gmn7") + +[node name="Run_To_Idle" type="Node" parent="Player_State_Machine"] +script = ExtResource("5_o8lre") + +[node name="Squat" type="Node" parent="Player_State_Machine"] +script = ExtResource("6_rk7vx") + +[node name="Roll" type="Node" parent="Player_State_Machine"] +script = ExtResource("7_f3k8f") + +[node name="Jump" type="Node" parent="Player_State_Machine"] +script = ExtResource("6_pj6pc") + +[node name="Fall" type="Node" parent="Player_State_Machine"] +script = ExtResource("7_l6ktk") + +[node name="Wall_Slide" type="Node" parent="Player_State_Machine"] +script = ExtResource("8_0jioi") + +[node name="Wall_Jump" type="Node" parent="Player_State_Machine"] +script = ExtResource("9_omn5s") + +[node name="Attack" type="Node" parent="Player_State_Machine"] +script = ExtResource("12_qfaga") + +[node name="Body_Physics" type="CollisionShape2D" parent="."] +position = Vector2(0, -30) +shape = SubResource("CapsuleShape2D_g868p") + +[node name="Body_Animation" type="Node2D" parent="."] +metadata/_edit_lock_ = true + +[node name="Sprite2D" type="Sprite2D" parent="Body_Animation"] +position = Vector2(2, -32) +scale = Vector2(1.6, 1.6) +texture = ExtResource("18_wykc6") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Body_Animation"] +libraries = { +"": SubResource("AnimationLibrary_irhps") +} + +[node name="Detector" type="Node2D" parent="."] + +[node name="Wall" type="Node2D" parent="Detector"] + +[node name="Wall" type="RayCast2D" parent="Detector/Wall"] +position = Vector2(0, -34) +target_position = Vector2(26, 0) +collision_mask = 2097152 + +[node name="Floor" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 8) +collision_mask = 35127296 + +[node name="Floor_L" type="RayCast2D" parent="Detector"] +target_position = Vector2(-8, 8) +collision_mask = 18350080 + +[node name="Floor_R" type="RayCast2D" parent="Detector"] +target_position = Vector2(8, 8) +collision_mask = 18350080 + +[node name="Rope" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 15) +collision_mask = 33554432 + +[node name="Rope_L" type="RayCast2D" parent="Detector"] +target_position = Vector2(-9, 15) +collision_mask = 33554432 + +[node name="Rope_R" type="RayCast2D" parent="Detector"] +target_position = Vector2(10, 15) +collision_mask = 33554432 + +[node name="Slope_L" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(-15, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="Slope_R" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(15, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="One_Way_Floor" type="RayCast2D" parent="Detector"] +visible = false +target_position = Vector2(0, 10) +collision_mask = 1048576 + +[node name="Hit" type="Node2D" parent="."] + +[node name="Player_Attack_Component" parent="Hit" instance=ExtResource("72_m8ad3")] +position = Vector2(0, -25) + +[node name="Player_Dash_Component" parent="Hit" instance=ExtResource("75_r8ire")] +position = Vector2(0, -28) + +[node name="Hit_Queue_Processor" parent="Hit" instance=ExtResource("75_cx437")] + +[node name="Hit_Stop_Component" parent="Hit" instance=ExtResource("74_nx5vo")] + +[node name="Hurt" type="Area2D" parent="."] +visible = false +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurt"] +position = Vector2(0, -30) +shape = SubResource("CapsuleShape2D_dcd6n") +debug_color = Color(0.913161, 0.221281, 0.489025, 0.42) + +[node name="Cameras" type="Node2D" parent="."] +visible = false + +[node name="Camera" type="Camera2D" parent="Cameras"] +zoom = Vector2(1.3, 1.3) +limit_left = -16 +limit_top = 0 +limit_right = 1726 +limit_bottom = 435 +position_smoothing_enabled = true + +[node name="Camera_Shake" type="Camera2D" parent="Cameras"] +enabled = false +zoom = Vector2(1.3, 1.3) + +[node name="FX_Component" type="Node2D" parent="."] +script = ExtResource("74_x0fc2") + +[node name="pos_wall_jump_dust" type="Marker2D" parent="FX_Component"] +position = Vector2(0, -23) diff --git a/Char/Player/Dragon/Player_Base.gd b/Char/Player/Dragon/Player_Base.gd new file mode 100644 index 0000000..cb9b812 --- /dev/null +++ b/Char/Player/Dragon/Player_Base.gd @@ -0,0 +1,102 @@ +extends CharacterBody2D + +var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") +@onready var floor_raycast = self.get_node("Detector/Floor") +@onready var floor_l_raycast = self.get_node("Detector/Floor_L") +@onready var floor_r_raycast = self.get_node("Detector/Floor_R") +@onready var slope_l_raycast = self.get_node("Detector/Slope_L") +@onready var slope_r_raycast = self.get_node("Detector/Slope_R") +@onready var one_way_floor_raycast = self.get_node("Detector/One_Way_Floor") +@onready var rope_raycast = self.get_node("Detector/Rope") +@onready var rope_raycast_l = self.get_node("Detector/Rope_L") +@onready var rope_raycast_r = self.get_node("Detector/Rope_R") +@onready var wall_raycast = self.get_node("Detector/Wall/Wall") + +var can_attack = true +var can_dash = true +var add_attack_up_velocity = true +var can_gameplay_input = true + +# 绳索 +var _last_rope_contact := false +var rope : Node2D = null + +func _physics_process(_delta): + rope_check() + +func set_floor_raycasts_enabled(enabled: bool) -> void: + floor_raycast.enabled = enabled + floor_l_raycast.enabled = enabled + floor_r_raycast.enabled = enabled + slope_l_raycast.enabled = enabled + slope_r_raycast.enabled = enabled + +func set_can_gameplay_input(value: bool) -> void: + if can_gameplay_input != value: + can_gameplay_input = value + +func set_one_way_mask_value(mask_name: String, value: bool)-> void: + if mask_name == 'on_way_floor': + self.set_collision_mask_value(21,value) + elif mask_name == 'rope': + self.set_collision_mask_value(26,value) + elif mask_name == 'all': + self.set_collision_mask_value(26,value) + self.set_collision_mask_value(21,value) + +func is_on_slope() -> String: + if floor_raycast.is_colliding() and floor_l_raycast.is_colliding() and floor_r_raycast.is_colliding(): + return "" + if slope_l_raycast.is_colliding(): + return "L" + if slope_r_raycast.is_colliding(): + return "R" + return "" + +func is_on_ground(): + if self.is_on_floor() and (floor_raycast.is_colliding() or slope_l_raycast.is_colliding() or slope_r_raycast.is_colliding() or floor_l_raycast.is_colliding() or floor_r_raycast.is_colliding() or is_on_rope()): + return true + else: + return false + +func is_on_one_way_ground(): + return one_way_floor_raycast.is_colliding() + +func face_wall(): + return wall_raycast.is_colliding() + +func is_on_rope(): + return rope_raycast.is_colliding() or rope_raycast_l.is_colliding() or rope_raycast_r.is_colliding() + +func rope_check() -> void: + # 创建射线数组以便统一处理 + var raycasts = [rope_raycast, rope_raycast_l, rope_raycast_r] + var has_rope_contact = false + var current_rope = null + var current_collider = null + + # 遍历所有射线 + for raycast in raycasts: + if raycast.is_colliding(): + var collider = raycast.get_collider() + + # 如果碰撞到的是绳索部件 + if collider: + has_rope_contact = true + current_collider = collider + current_rope = collider.get_parent().get_parent() + break # 找到第一个有效的绳索碰撞就退出循环 + + # 处理绳索接触逻辑 + if has_rope_contact: + if !_last_rope_contact: # 首次接触绳索 + _last_rope_contact = true + rope = current_rope + # 每帧都更新绳索接触点 + if rope.has_method("handle_player_rope_contact"): + rope.handle_player_rope_contact(current_collider) + elif _last_rope_contact: # 失去接触 + _last_rope_contact = false + if rope.has_method("handle_player_rope_exit"): + rope.handle_player_rope_exit() + rope = null diff --git a/Char/Player/Dragon/Player_Base.gd.uid b/Char/Player/Dragon/Player_Base.gd.uid new file mode 100644 index 0000000..517a112 --- /dev/null +++ b/Char/Player/Dragon/Player_Base.gd.uid @@ -0,0 +1 @@ +uid://ly032d3bnh3n diff --git a/Char/Player/Dragon/Tres/fall_0.tres b/Char/Player/Dragon/Tres/fall_0.tres new file mode 100644 index 0000000..2f711ad --- /dev/null +++ b/Char/Player/Dragon/Tres/fall_0.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://cvvonlws7ekre"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_tacr7"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_xned4"] + +[resource] +diffuse_texture = ExtResource("1_tacr7") +normal_texture = ExtResource("2_xned4") diff --git a/Char/Player/Dragon/Tres/fall_1.tres b/Char/Player/Dragon/Tres/fall_1.tres new file mode 100644 index 0000000..a9c5278 --- /dev/null +++ b/Char/Player/Dragon/Tres/fall_1.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bxmiek382rxlh"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_mrvit"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_me50u"] + +[resource] +diffuse_texture = ExtResource("1_mrvit") +normal_texture = ExtResource("2_me50u") diff --git a/Char/Player/Dragon/Tres/fall_2.tres b/Char/Player/Dragon/Tres/fall_2.tres new file mode 100644 index 0000000..e25dcaa --- /dev/null +++ b/Char/Player/Dragon/Tres/fall_2.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://c10gmbpp4vs6b"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_eekxp"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_71ito"] + +[resource] +diffuse_texture = ExtResource("1_eekxp") +normal_texture = ExtResource("2_71ito") diff --git a/Char/Player/Dragon/Tres/fall_3.tres b/Char/Player/Dragon/Tres/fall_3.tres new file mode 100644 index 0000000..10cf43b --- /dev/null +++ b/Char/Player/Dragon/Tres/fall_3.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://byvo5gusdpsc2"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_xm7ol"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_fff7r"] + +[resource] +diffuse_texture = ExtResource("1_xm7ol") +normal_texture = ExtResource("2_fff7r") diff --git a/Char/Player/Dragon/Tres/idle_0.tres b/Char/Player/Dragon/Tres/idle_0.tres new file mode 100644 index 0000000..3255952 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_0.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dixrqik2osxgv"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_e2hk0"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_r0w35"] + +[resource] +diffuse_texture = ExtResource("1_e2hk0") +normal_texture = ExtResource("2_r0w35") diff --git a/Char/Player/Dragon/Tres/idle_1.tres b/Char/Player/Dragon/Tres/idle_1.tres new file mode 100644 index 0000000..c67904c --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_1.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bsdmqi5o51kne"] + +[ext_resource type="Texture2D" uid="uid://cyrddnhdejex2" path="res://Char/Player/Dragon/Art/spr_dragon_idle_1.png" id="1_8jg5v"] +[ext_resource type="Texture2D" uid="uid://bmkjjq2g8yb7a" path="res://Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png" id="2_j8jjv"] + +[resource] +diffuse_texture = ExtResource("1_8jg5v") +normal_texture = ExtResource("2_j8jjv") diff --git a/Char/Player/Dragon/Tres/idle_10.tres b/Char/Player/Dragon/Tres/idle_10.tres new file mode 100644 index 0000000..8039eb5 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_10.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dl12ugckudcf8"] + +[ext_resource type="Texture2D" uid="uid://docua10e7sugj" path="res://Char/Player/Dragon/Art/spr_dragon_idle_10.png" id="1_7006c"] +[ext_resource type="Texture2D" uid="uid://b12asxwmq6k0g" path="res://Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png" id="2_rtlmv"] + +[resource] +diffuse_texture = ExtResource("1_7006c") +normal_texture = ExtResource("2_rtlmv") diff --git a/Char/Player/Dragon/Tres/idle_11.tres b/Char/Player/Dragon/Tres/idle_11.tres new file mode 100644 index 0000000..c62b74c --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_11.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://daiyb2afxug4x"] + +[ext_resource type="Texture2D" uid="uid://d2ibsjy2r2d1r" path="res://Char/Player/Dragon/Art/spr_dragon_idle_11.png" id="1_w53xr"] +[ext_resource type="Texture2D" uid="uid://js8qlguk4jow" path="res://Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png" id="2_xoet7"] + +[resource] +diffuse_texture = ExtResource("1_w53xr") +normal_texture = ExtResource("2_xoet7") diff --git a/Char/Player/Dragon/Tres/idle_2.tres b/Char/Player/Dragon/Tres/idle_2.tres new file mode 100644 index 0000000..21fbd22 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_2.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://drbbua8t6sdeb"] + +[ext_resource type="Texture2D" uid="uid://dpjxum07dbwf7" path="res://Char/Player/Dragon/Art/spr_dragon_idle_2.png" id="1_scvon"] +[ext_resource type="Texture2D" uid="uid://sts53xjilk7f" path="res://Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png" id="2_q5a7j"] + +[resource] +diffuse_texture = ExtResource("1_scvon") +normal_texture = ExtResource("2_q5a7j") diff --git a/Char/Player/Dragon/Tres/idle_3.tres b/Char/Player/Dragon/Tres/idle_3.tres new file mode 100644 index 0000000..5e00fc4 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_3.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://lw2xfg6cvgox"] + +[ext_resource type="Texture2D" uid="uid://brgwp0glr18xq" path="res://Char/Player/Dragon/Art/spr_dragon_idle_3.png" id="1_kbu0h"] +[ext_resource type="Texture2D" uid="uid://bh778kjsncdv8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png" id="2_2x3cc"] + +[resource] +diffuse_texture = ExtResource("1_kbu0h") +normal_texture = ExtResource("2_2x3cc") diff --git a/Char/Player/Dragon/Tres/idle_4.tres b/Char/Player/Dragon/Tres/idle_4.tres new file mode 100644 index 0000000..934a0fd --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_4.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bmer14ei54g3"] + +[ext_resource type="Texture2D" uid="uid://c2gg2hm7rdt0t" path="res://Char/Player/Dragon/Art/spr_dragon_idle_4.png" id="1_lidrm"] +[ext_resource type="Texture2D" uid="uid://b0al80h3n7bxt" path="res://Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png" id="2_anmpp"] + +[resource] +diffuse_texture = ExtResource("1_lidrm") +normal_texture = ExtResource("2_anmpp") diff --git a/Char/Player/Dragon/Tres/idle_5.tres b/Char/Player/Dragon/Tres/idle_5.tres new file mode 100644 index 0000000..ff4ad01 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_5.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bbvoouy3cf1jt"] + +[ext_resource type="Texture2D" uid="uid://qlvxsg5iax8c" path="res://Char/Player/Dragon/Art/spr_dragon_idle_5.png" id="1_rj25j"] +[ext_resource type="Texture2D" uid="uid://dgobekecpv8kv" path="res://Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png" id="2_l0ift"] + +[resource] +diffuse_texture = ExtResource("1_rj25j") +normal_texture = ExtResource("2_l0ift") diff --git a/Char/Player/Dragon/Tres/idle_6.tres b/Char/Player/Dragon/Tres/idle_6.tres new file mode 100644 index 0000000..45d81ea --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_6.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dxcmvc8y5m3bt"] + +[ext_resource type="Texture2D" uid="uid://cnxu51medgdpe" path="res://Char/Player/Dragon/Art/spr_dragon_idle_6.png" id="1_8d17g"] +[ext_resource type="Texture2D" uid="uid://do7wf0i2upqjp" path="res://Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png" id="2_mk7iu"] + +[resource] +diffuse_texture = ExtResource("1_8d17g") +normal_texture = ExtResource("2_mk7iu") diff --git a/Char/Player/Dragon/Tres/idle_7.tres b/Char/Player/Dragon/Tres/idle_7.tres new file mode 100644 index 0000000..43d3ee7 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_7.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://b7nw17p8kkg6b"] + +[ext_resource type="Texture2D" uid="uid://bt77wxum4koix" path="res://Char/Player/Dragon/Art/spr_dragon_idle_7.png" id="1_degof"] +[ext_resource type="Texture2D" uid="uid://btiheicliiqf8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png" id="2_ckvrn"] + +[resource] +diffuse_texture = ExtResource("1_degof") +normal_texture = ExtResource("2_ckvrn") diff --git a/Char/Player/Dragon/Tres/idle_8.tres b/Char/Player/Dragon/Tres/idle_8.tres new file mode 100644 index 0000000..3f8cb36 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_8.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bayb1agp3jcis"] + +[ext_resource type="Texture2D" uid="uid://b8cs32aff7vah" path="res://Char/Player/Dragon/Art/spr_dragon_idle_8.png" id="1_pxjlp"] +[ext_resource type="Texture2D" uid="uid://lu15sul1g373" path="res://Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png" id="2_2y8pf"] + +[resource] +diffuse_texture = ExtResource("1_pxjlp") +normal_texture = ExtResource("2_2y8pf") diff --git a/Char/Player/Dragon/Tres/idle_9.tres b/Char/Player/Dragon/Tres/idle_9.tres new file mode 100644 index 0000000..50a82f7 --- /dev/null +++ b/Char/Player/Dragon/Tres/idle_9.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bm2fh2ats20mm"] + +[ext_resource type="Texture2D" uid="uid://bd537mp4lvwib" path="res://Char/Player/Dragon/Art/spr_dragon_idle_9.png" id="1_u523k"] +[ext_resource type="Texture2D" uid="uid://bnn8arkjtbwqm" path="res://Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png" id="2_v3lwd"] + +[resource] +diffuse_texture = ExtResource("1_u523k") +normal_texture = ExtResource("2_v3lwd") diff --git a/Char/Player/Player_Components/Art/ATK_slash_1.png b/Char/Player/Player_Components/Art/ATK_slash_1.png new file mode 100644 index 0000000..560bd6b Binary files /dev/null and b/Char/Player/Player_Components/Art/ATK_slash_1.png differ diff --git a/Char/Player/Player_Components/Art/ATK_slash_1.png.import b/Char/Player/Player_Components/Art/ATK_slash_1.png.import new file mode 100644 index 0000000..8dbd36c --- /dev/null +++ b/Char/Player/Player_Components/Art/ATK_slash_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c37du1hq6b4f6" +path="res://.godot/imported/ATK_slash_1.png-f422d7ff51c62a552fc0b67081f56f21.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/ATK_slash_1.png" +dest_files=["res://.godot/imported/ATK_slash_1.png-f422d7ff51c62a552fc0b67081f56f21.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/Char/Player/Player_Components/Art/Dash_arrow.png b/Char/Player/Player_Components/Art/Dash_arrow.png new file mode 100644 index 0000000..66406a4 Binary files /dev/null and b/Char/Player/Player_Components/Art/Dash_arrow.png differ diff --git a/Char/Player/Player_Components/Art/Dash_arrow.png.import b/Char/Player/Player_Components/Art/Dash_arrow.png.import new file mode 100644 index 0000000..1eac167 --- /dev/null +++ b/Char/Player/Player_Components/Art/Dash_arrow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjh8c02v7ilde" +path="res://.godot/imported/Dash_arrow.png-0940d9b064a097347bf0d38e1cff6277.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/Dash_arrow.png" +dest_files=["res://.godot/imported/Dash_arrow.png-0940d9b064a097347bf0d38e1cff6277.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/Char/Player/Player_Components/Art/Dash_range.png b/Char/Player/Player_Components/Art/Dash_range.png new file mode 100644 index 0000000..47f1d5e Binary files /dev/null and b/Char/Player/Player_Components/Art/Dash_range.png differ diff --git a/Char/Player/Player_Components/Art/Dash_range.png.import b/Char/Player/Player_Components/Art/Dash_range.png.import new file mode 100644 index 0000000..0e589d0 --- /dev/null +++ b/Char/Player/Player_Components/Art/Dash_range.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmvnl5ql7i8h4" +path="res://.godot/imported/Dash_range.png-71e9c5292759780fc66a4cf19cf2af87.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/Dash_range.png" +dest_files=["res://.godot/imported/Dash_range.png-71e9c5292759780fc66a4cf19cf2af87.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/Char/Player/Player_Components/Art/spr_color_slash_0.png b/Char/Player/Player_Components/Art/spr_color_slash_0.png new file mode 100644 index 0000000..6682547 Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_0.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_0.png.import b/Char/Player/Player_Components/Art/spr_color_slash_0.png.import new file mode 100644 index 0000000..7a686b8 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmwbrvmvfiwih" +path="res://.godot/imported/spr_color_slash_0.png-b741b9bf5415acaac2119376a2338dc9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_0.png" +dest_files=["res://.godot/imported/spr_color_slash_0.png-b741b9bf5415acaac2119376a2338dc9.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/Char/Player/Player_Components/Art/spr_color_slash_1.png b/Char/Player/Player_Components/Art/spr_color_slash_1.png new file mode 100644 index 0000000..b46b70c Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_1.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_1.png.import b/Char/Player/Player_Components/Art/spr_color_slash_1.png.import new file mode 100644 index 0000000..ad17824 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btwjewj5islmg" +path="res://.godot/imported/spr_color_slash_1.png-10cacc9228d9730ee7a50eb3e46c007f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_1.png" +dest_files=["res://.godot/imported/spr_color_slash_1.png-10cacc9228d9730ee7a50eb3e46c007f.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/Char/Player/Player_Components/Art/spr_color_slash_2.png b/Char/Player/Player_Components/Art/spr_color_slash_2.png new file mode 100644 index 0000000..47e576e Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_2.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_2.png.import b/Char/Player/Player_Components/Art/spr_color_slash_2.png.import new file mode 100644 index 0000000..b28f669 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv45xmopas3ay" +path="res://.godot/imported/spr_color_slash_2.png-2a2318c8c9c69625c2d218e50bc47d5f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_2.png" +dest_files=["res://.godot/imported/spr_color_slash_2.png-2a2318c8c9c69625c2d218e50bc47d5f.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/Char/Player/Player_Components/Art/spr_color_slash_3.png b/Char/Player/Player_Components/Art/spr_color_slash_3.png new file mode 100644 index 0000000..34fe199 Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_3.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_3.png.import b/Char/Player/Player_Components/Art/spr_color_slash_3.png.import new file mode 100644 index 0000000..8b53b57 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ntvs1d4toiau" +path="res://.godot/imported/spr_color_slash_3.png-d004f2523b2936c47e2113af05c85a51.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_3.png" +dest_files=["res://.godot/imported/spr_color_slash_3.png-d004f2523b2936c47e2113af05c85a51.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/Char/Player/Player_Components/Art/spr_color_slash_4.png b/Char/Player/Player_Components/Art/spr_color_slash_4.png new file mode 100644 index 0000000..a06ee40 Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_4.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_4.png.import b/Char/Player/Player_Components/Art/spr_color_slash_4.png.import new file mode 100644 index 0000000..1391493 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://714r1eiywgmy" +path="res://.godot/imported/spr_color_slash_4.png-572b4c1897d692f9958905abcbb0544c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_4.png" +dest_files=["res://.godot/imported/spr_color_slash_4.png-572b4c1897d692f9958905abcbb0544c.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/Char/Player/Player_Components/Art/spr_color_slash_5.png b/Char/Player/Player_Components/Art/spr_color_slash_5.png new file mode 100644 index 0000000..66ef0f6 Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_5.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_5.png.import b/Char/Player/Player_Components/Art/spr_color_slash_5.png.import new file mode 100644 index 0000000..c6d7089 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tnvoebkk22nk" +path="res://.godot/imported/spr_color_slash_5.png-4adf70fd2938c0b39ad8db0f50a1090a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_5.png" +dest_files=["res://.godot/imported/spr_color_slash_5.png-4adf70fd2938c0b39ad8db0f50a1090a.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/Char/Player/Player_Components/Art/spr_color_slash_6.png b/Char/Player/Player_Components/Art/spr_color_slash_6.png new file mode 100644 index 0000000..012e5db Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_color_slash_6.png differ diff --git a/Char/Player/Player_Components/Art/spr_color_slash_6.png.import b/Char/Player/Player_Components/Art/spr_color_slash_6.png.import new file mode 100644 index 0000000..815cb66 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_color_slash_6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhgn426eulul5" +path="res://.godot/imported/spr_color_slash_6.png-52fbf8b6e888c373679d52d15eaf4b1b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_color_slash_6.png" +dest_files=["res://.godot/imported/spr_color_slash_6.png-52fbf8b6e888c373679d52d15eaf4b1b.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/Char/Player/Player_Components/Art/spr_master_slash_0.png b/Char/Player/Player_Components/Art/spr_master_slash_0.png new file mode 100644 index 0000000..bad438e Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_master_slash_0.png differ diff --git a/Char/Player/Player_Components/Art/spr_master_slash_0.png.import b/Char/Player/Player_Components/Art/spr_master_slash_0.png.import new file mode 100644 index 0000000..80835ff --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_master_slash_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnulu3rrowdut" +path="res://.godot/imported/spr_master_slash_0.png-a9f2e2f4c283b1480ee36159317e6928.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_master_slash_0.png" +dest_files=["res://.godot/imported/spr_master_slash_0.png-a9f2e2f4c283b1480ee36159317e6928.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/Char/Player/Player_Components/Art/spr_master_slash_1.png b/Char/Player/Player_Components/Art/spr_master_slash_1.png new file mode 100644 index 0000000..cdd444f Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_master_slash_1.png differ diff --git a/Char/Player/Player_Components/Art/spr_master_slash_1.png.import b/Char/Player/Player_Components/Art/spr_master_slash_1.png.import new file mode 100644 index 0000000..8099c51 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_master_slash_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb4dyy44jlhue" +path="res://.godot/imported/spr_master_slash_1.png-5b6d5fbc1dc58c4904ee7b0f780ec3c2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_master_slash_1.png" +dest_files=["res://.godot/imported/spr_master_slash_1.png-5b6d5fbc1dc58c4904ee7b0f780ec3c2.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/Char/Player/Player_Components/Art/spr_master_slash_2.png b/Char/Player/Player_Components/Art/spr_master_slash_2.png new file mode 100644 index 0000000..6a2995c Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_master_slash_2.png differ diff --git a/Char/Player/Player_Components/Art/spr_master_slash_2.png.import b/Char/Player/Player_Components/Art/spr_master_slash_2.png.import new file mode 100644 index 0000000..64bcec1 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_master_slash_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm8o8djx1ckua" +path="res://.godot/imported/spr_master_slash_2.png-c93873c1134e0d313e949b9241c94e44.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_master_slash_2.png" +dest_files=["res://.godot/imported/spr_master_slash_2.png-c93873c1134e0d313e949b9241c94e44.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/Char/Player/Player_Components/Art/spr_master_slash_3.png b/Char/Player/Player_Components/Art/spr_master_slash_3.png new file mode 100644 index 0000000..0b34810 Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_master_slash_3.png differ diff --git a/Char/Player/Player_Components/Art/spr_master_slash_3.png.import b/Char/Player/Player_Components/Art/spr_master_slash_3.png.import new file mode 100644 index 0000000..03a6d35 --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_master_slash_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3vxksto2j673" +path="res://.godot/imported/spr_master_slash_3.png-f3483b971f3c2d19ce2581e85502fd3b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_master_slash_3.png" +dest_files=["res://.godot/imported/spr_master_slash_3.png-f3483b971f3c2d19ce2581e85502fd3b.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/Char/Player/Player_Components/Art/spr_master_slash_4.png b/Char/Player/Player_Components/Art/spr_master_slash_4.png new file mode 100644 index 0000000..a89c6cd Binary files /dev/null and b/Char/Player/Player_Components/Art/spr_master_slash_4.png differ diff --git a/Char/Player/Player_Components/Art/spr_master_slash_4.png.import b/Char/Player/Player_Components/Art/spr_master_slash_4.png.import new file mode 100644 index 0000000..b799aeb --- /dev/null +++ b/Char/Player/Player_Components/Art/spr_master_slash_4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bi22tpqxju30w" +path="res://.godot/imported/spr_master_slash_4.png-3773046a1c3ad1dc2053b14a4b2ced15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Player_Components/Art/spr_master_slash_4.png" +dest_files=["res://.godot/imported/spr_master_slash_4.png-3773046a1c3ad1dc2053b14a4b2ced15.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/Char/Player/Player_Components/hit_queue_processor.gd b/Char/Player/Player_Components/hit_queue_processor.gd new file mode 100644 index 0000000..531ad93 --- /dev/null +++ b/Char/Player/Player_Components/hit_queue_processor.gd @@ -0,0 +1,121 @@ +extends Node + +@onready var hit_stop = get_parent().get_node("Hit_Stop_Component") +@onready var slash_player = get_parent().get_node("Player_Attack_Component/Hit_Enemy_Effect/AnimationPlayer") + +# 用于存储待处理的目标队列 +var hit_queue: Array = [] +var hit_queue_1: Array = [] +var hit_queue_2: Array = [] +#var _animation_time: float = 0.0 # 用于手动控制动画时间 + +var is_handling : bool = false +var current_target : CharacterBody2D + +# 信号定义 +signal target_hit_done + +func _ready() -> void: + slash_player.animation_finished.connect(_on_attack_animation_finished) + pass + +# 添加目标到队列中 +func add_target_to_queue(hit_info: Array, is_batch: bool = false) -> void: + if hit_info == []: + return + + # 检查是否为二维数组 + if hit_info[0] is Array: + # 遍历处理每个子数组,将is_batch设为true表示正在批量处理 + for i in range(hit_info.size()): + var is_last = (i == hit_info.size() - 1) # 是否是最后一个元素 + # 只在处理最后一个元素时将is_batch设为false + add_target_to_queue(hit_info[i], not is_last) + return + + # 以下是处理单个hit_info的逻辑 + var target = hit_info[0] # 目标敌人 + + # 检查目标是否已在队列中 + for existing_info in hit_queue: + if existing_info[0] == target: + return + + # 添加到对应队列 + if hit_info[4] == 'attack': + hit_queue.append(hit_info) + hit_queue_1.append(hit_info) + elif hit_info[4] == 'dash': + hit_queue.append(hit_info) + hit_queue_2.append(hit_info) + + # 只有在不是批量处理或者是批量处理的最后一个时才执行处理 + if not is_batch and not is_handling: + _handle_target_hit() + +# 处理击中目标 +func _handle_target_hit() -> void: + if is_handling: + return + if !hit_queue_2.is_empty(): + _handle_hit_queue_2() + return + if !hit_queue_1.is_empty(): + _handle_hit_queue_1() + return + +func _handle_hit_queue_1() -> void: + #print("hit_queue_1: ",hit_queue_1) + is_handling = true + var current_target_info = hit_queue_1[0] + hit_queue_1.pop_front() + slash_player.stop() + slash_player.play("Slash") + current_target = current_target_info[0] + current_target.hurt_data = current_target_info + current_target.start_hurt() + +func _handle_hit_queue_2() -> void: + #print("hit_queue_2: ",hit_queue_2) + #_handle_hit_queue_2是一次性批量处理 + var queue_length = hit_queue_2.size() + is_handling = true + + for single_target_info in hit_queue_2: + if single_target_info[4] == "attack": + single_target_info[4] = 'dash' #避免当attack击中瞬间,执行dash,导致从hit_queue_1转移过来的列表数据,进入到hurt_begin后,又会定帧。 + var target = single_target_info[0] + target.hurt_data = single_target_info + target.start_hurt() + target.freeze = true + queue_length -= 1 + + # 所有目标处理完毕后播放动画 + if queue_length == 0: + hit_queue_2.clear() + slash_player.play("No_Slash") + hit_stop.freeze() + +# 转移队列 +func queue_trans() -> void: + hit_queue_2.append_array(hit_queue_1) + hit_queue_1.clear() + +func get_hit_enemies() -> Array: + return hit_queue + +func clear_queue() -> void: + hit_queue_1.clear() + hit_queue_2.clear() + +func _on_attack_animation_finished(anim_name: String) -> void: + hit_stop.unfreeze() + is_handling = false + if anim_name == "Slash": + await get_tree().create_timer(0.1).timeout #两个受击敌人的定帧间隔 + _handle_target_hit() # 持续执行_handle_target_hit,直到列表为空; + +func stop_animation() -> void: + hit_stop.unfreeze() + is_handling = false + _handle_target_hit() diff --git a/Char/Player/Player_Components/hit_queue_processor.gd.uid b/Char/Player/Player_Components/hit_queue_processor.gd.uid new file mode 100644 index 0000000..d9248b4 --- /dev/null +++ b/Char/Player/Player_Components/hit_queue_processor.gd.uid @@ -0,0 +1 @@ +uid://d1k113ofbei13 diff --git a/Char/Player/Player_Components/hit_queue_processor.tscn b/Char/Player/Player_Components/hit_queue_processor.tscn new file mode 100644 index 0000000..aab7e33 --- /dev/null +++ b/Char/Player/Player_Components/hit_queue_processor.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://mhcxla3f3vac"] + +[ext_resource type="Script" uid="uid://d1k113ofbei13" path="res://Char/Player/Player_Components/hit_queue_processor.gd" id="1_bili1"] + +[node name="Hit_Queue_Processor" type="Node"] +script = ExtResource("1_bili1") diff --git a/Char/Player/Player_Components/hit_stop_component.gd b/Char/Player/Player_Components/hit_stop_component.gd new file mode 100644 index 0000000..c2ba365 --- /dev/null +++ b/Char/Player/Player_Components/hit_stop_component.gd @@ -0,0 +1,274 @@ +extends Node + +var enemy_list : Array +var player : CharacterBody2D +var after_image_list : Array + +# 存储动画状态 +var stored_animations := {} + +# 震屏相关变量 +var main_camera: Camera2D +var shake_camera: Camera2D +var shake_strength := 10.0 +var shake_timer: Timer +var shake_duration_timer: Timer # 新增:震屏持续时间计时器 + +var is_frozen := false + +func _ready() -> void: + update_freeze_list() + + # 获取相机引用 + player = get_tree().get_first_node_in_group("Player") + if player: + main_camera = player.get_node("Cameras/Camera") + shake_camera = player.get_node("Cameras/Camera_Shake") + + # 确保两个相机的缩放一致 + if main_camera and shake_camera: + shake_camera.zoom = main_camera.zoom + # 确保震屏相机初始状态是禁用的 + shake_camera.enabled = false + main_camera.enabled = true + + # 设置震屏效果计时器 + shake_timer = Timer.new() + add_child(shake_timer) + shake_timer.wait_time = 0.01 # 确保频率够快 + shake_timer.connect("timeout", _on_shake_timer_timeout) + + # 设置持续时间计时器 + shake_duration_timer = Timer.new() + add_child(shake_duration_timer) + shake_duration_timer.one_shot = true + shake_duration_timer.connect("timeout", stop_screen_shake) + +func update_freeze_list() -> void: + enemy_list = get_tree().get_nodes_in_group("Enemy") + player = get_tree().get_first_node_in_group("Player") + after_image_list = get_tree().get_nodes_in_group("After_Image") + +func freeze() -> void: + is_frozen = true + update_freeze_list() + if player: + freeze_player() + for enemy in enemy_list: + if is_instance_valid(enemy) and not enemy.death: + freeze_enemy(enemy) + for after_image in after_image_list: + if is_instance_valid(after_image): + freeze_after_image(after_image) + start_screen_shake() + +func unfreeze() -> void: + is_frozen = false + stop_screen_shake() + if player: + unfreeze_player() + for enemy in enemy_list: + #print(enemy) + if is_instance_valid(enemy) and not enemy.death: + unfreeze_enemy(enemy) + for after_image in after_image_list: + if is_instance_valid(after_image): + unfreeze_after_image(after_image) + +## 存储动画状态 +# 存储动画的关键信息以便后续恢复 +# @param animation_player - 要存储状态的动画播放器 +# @param key - 用于标识该动画状态的唯一键值 +func store_animation_state(animation_player: AnimationPlayer, key: String) -> void: + # 存储四个关键属性: + # - current_animation: 当前播放的动画名称 + # - position: 动画播放到的具体位置,用于精确恢复 + # - speed_scale: 动画播放速度,某些情况下可能被修改 + # - is_playing: 动画是否在播放,用于区分播放/暂停状态 + stored_animations[key] = { + "animation": animation_player.current_animation, + "position": animation_player.current_animation_position, + "speed_scale": animation_player.speed_scale, + "is_playing": animation_player.is_playing() + } + +## 恢复动画状态 +func restore_animation_state(animation_player: AnimationPlayer, key: String) -> void: + if stored_animations.has(key): + var state = stored_animations[key] + if state.animation != "": + animation_player.play(state.animation) + animation_player.seek(state.position, true) # 添加true参数确保更新 + animation_player.set_speed_scale(state.speed_scale) + + # 如果原来是暂停状态,恢复后也应该暂停 + if not state.is_playing: + animation_player.pause() + + stored_animations.erase(key) + +## 冻结enemy +# 暂停敌人的物理处理和动画播放 +# 重要:使用pause而不是stop来暂停动画,因为stop会重置动画状态 +# @param enemy - 要冻结的敌人节点 +func freeze_enemy(enemy: CharacterBody2D) -> void: + if not is_instance_valid(enemy): + return + + var state_machine = enemy.get_node_or_null("Enemy_State_Machine") + var body_animation = enemy.get_node_or_null("Body_Animation/AnimationPlayer") + + # 暂停状态机的物理处理,防止状态切换和位置更新 + if state_machine: + state_machine.set_physics_process(false) + + if body_animation: + var key = "enemy_" + str(enemy.get_instance_id()) # 使用实例ID确保键值唯一性 + store_animation_state(body_animation, key) + body_animation.pause() # 使用pause保持动画状态 + +## 冻结Player +# 暂停玩家的输入处理、物理处理和动画播放 +# 重要:需要同时处理玩家的身体动画和攻击动画 +# @param player - 玩家节点 +func freeze_player() -> void: + if not is_instance_valid(player): + return + + # 禁用玩家的核心功能 + player.can_attack = false + #player.can_dash = false + player.set_can_gameplay_input(false) + + var state_machine = player.get_node_or_null("Player_State_Machine") + var body_animation = player.get_node_or_null("Body_Animation/AnimationPlayer") + var attack_animation = player.get_node_or_null("Hit/Player_Attack_Component/AnimationPlayer") + + # 暂停状态机更新 + if state_machine: + state_machine.set_physics_process(false) + + # 分别存储和暂停身体动画和攻击动画 + if body_animation: + store_animation_state(body_animation, "player_body") + body_animation.pause() + + if attack_animation: + store_animation_state(attack_animation, "player_attack") + attack_animation.pause() + +## 冻结after_image +func freeze_after_image(after_image: Node2D) -> void: + if not is_instance_valid(after_image): + return + #AfterImageFreezer.freeze_after_image(after_image) + var animation = after_image.get_node_or_null("AnimationPlayer") + + if animation: + var key = "enemy_" + str(after_image.get_instance_id()) # 使用实例ID确保键值唯一性 + store_animation_state(animation, key) + animation.pause() # 使用pause保持动画状态 + + +## 解冻enemy +# 恢复敌人的物理处理和动画播放 +# 特殊处理:如果敌人在Hurt_Begin状态被冻结,直接切换到Hurt_Air状态 +# @param enemy - 要解冻的敌人节点 +func unfreeze_enemy(enemy: CharacterBody2D) -> void: + if not is_instance_valid(enemy): + return + + var state_machine = enemy.get_node_or_null("Enemy_State_Machine") + var body_animation = enemy.get_node_or_null("Body_Animation/AnimationPlayer") + + if body_animation: + var key = "enemy_" + str(enemy.get_instance_id()) + # 特殊状态处理:Hurt_Begin是过渡状态,需要直接切换到Hurt_Air + if stored_animations.has(key): + var stored_state = stored_animations[key] + if stored_state.animation == "Hurt_Begin" or enemy.freeze: + restore_animation_state(body_animation, key) + if state_machine: + state_machine.set_physics_process(true) + state_machine.change_state("hurt_air") + return + + restore_animation_state(body_animation, key) + if state_machine: + state_machine.set_physics_process(true) + +## 解冻Player +# 恢复玩家的所有功能和动画状态 +# @param player - 玩家节点 +func unfreeze_player() -> void: + if not is_instance_valid(player): + return + + # 重新启用玩家的核心功能 + player.can_attack = true + player.can_dash = true + player.set_can_gameplay_input(true) + + var state_machine = player.get_node_or_null("Player_State_Machine") + var body_animation = player.get_node_or_null("Body_Animation/AnimationPlayer") + var attack_animation = player.get_node_or_null("Hit/Player_Attack_Component/AnimationPlayer") + + # 恢复状态机更新 + if state_machine: + state_machine.set_physics_process(true) + + # 分别恢复身体动画和攻击动画 + if body_animation: + restore_animation_state(body_animation, "player_body") + + if attack_animation: + restore_animation_state(attack_animation, "player_attack") + +## 解冻After_image +func unfreeze_after_image(after_image: Node2D) -> void: + if not is_instance_valid(after_image): + return + #AfterImageFreezer.unfreeze_after_image(after_image) + var animation = after_image.get_node_or_null("AnimationPlayer") + + if animation: + var key = "enemy_" + str(after_image.get_instance_id()) + # 特殊状态处理:Hurt_Begin是过渡状态,需要直接切换到Hurt_Air + if stored_animations.has(key): + restore_animation_state(animation, key) + + +func start_screen_shake(strength: float = 10.0) -> void: + if main_camera and shake_camera: + shake_strength = strength + var camera_center = main_camera.get_screen_center_position() + main_camera.enabled = false + shake_camera.enabled = true + shake_camera.global_position = camera_center + shake_camera.offset = Vector2.ZERO + shake_timer.start() + +func start_screen_shake_with_duration(duration: float, strength: float = 10.0) -> void: + start_screen_shake(strength) + shake_duration_timer.wait_time = duration + shake_duration_timer.start() + +func stop_screen_shake() -> void: + if main_camera and shake_camera: + shake_timer.stop() + shake_duration_timer.stop() + shake_camera.offset = Vector2.ZERO + shake_camera.enabled = false + main_camera.enabled = true + +# 震屏效果实现 +func _on_shake_timer_timeout() -> void: + if shake_camera and shake_camera.enabled: + # 使用较大的随机范围 + var rand_x = randf_range(-shake_strength, shake_strength) + var rand_y = randf_range(-shake_strength, shake_strength) + shake_camera.offset = Vector2(rand_x, rand_y) + +# 判断是否正在震屏 +func is_shaking() -> bool: + return shake_camera != null and shake_camera.enabled diff --git a/Char/Player/Player_Components/hit_stop_component.gd.uid b/Char/Player/Player_Components/hit_stop_component.gd.uid new file mode 100644 index 0000000..c530360 --- /dev/null +++ b/Char/Player/Player_Components/hit_stop_component.gd.uid @@ -0,0 +1 @@ +uid://b8801iraarw7b diff --git a/Char/Player/Player_Components/hit_stop_component.tscn b/Char/Player/Player_Components/hit_stop_component.tscn new file mode 100644 index 0000000..e9ea7c4 --- /dev/null +++ b/Char/Player/Player_Components/hit_stop_component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dnlln6iv8ksy2"] + +[ext_resource type="Script" uid="uid://b8801iraarw7b" path="res://Char/Player/Player_Components/hit_stop_component.gd" id="1_jedqg"] + +[node name="Hit_Stop_Component" type="Node"] +script = ExtResource("1_jedqg") diff --git a/Char/Player/Player_Components/player_attack_component.gd b/Char/Player/Player_Components/player_attack_component.gd new file mode 100644 index 0000000..21baf13 --- /dev/null +++ b/Char/Player/Player_Components/player_attack_component.gd @@ -0,0 +1,165 @@ +# Player_Attack_Component.gd +extends Node2D + +# 节点引用 +@onready var animation_player: AnimationPlayer = $AnimationPlayer +@onready var ray_cast_2d_1: RayCast2D = $RayCast2D_1 +@onready var ray_cast_2d_2: RayCast2D = $RayCast2D_2 +@onready var ray_cast_2d_3: RayCast2D = $RayCast2D_3 +@onready var hit_queue_processor = owner.get_node("Hit/Hit_Queue_Processor") + +# 导出变量 +var attack_cooldown: float = 0.1 + +# 成员变量 +var attack_timer: float = 0.0 +var direction: Vector2 +var hit_force: float = 630 +var damage: float = 1 +var checked_objects = [] +var is_attack_active := false +var raycasts: Array[RayCast2D] = [] + +#region 生命周期方法 +func _ready() -> void: + _setup_connections() + _initialize_raycasts() + +func _physics_process(delta: float) -> void: + if attack_timer > 0: + attack_timer = max(0, attack_timer - delta) + if animation_player.is_playing(): + validate_and_hit_target() + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("Attack") and owner.can_attack and attack_timer <= 0: + var mouse_pos = get_global_mouse_position() + direction = (mouse_pos - self.global_position).normalized() + execute_knife_attack() + owner.add_attack_up_velocity = false + +func _exit_tree() -> void: + is_attack_active = false + manage_raycasts_state(false) + hit_queue_processor.clear_queue() +#endregion + +#region 核心攻击逻辑 +func execute_knife_attack(force: bool = false) -> void: + if force: + force_reset_attack_state() + + is_attack_active = true + owner.can_attack = false + + _apply_attack_movement() + _update_attack_visuals() + + # 在动画开始前启用射线 + manage_raycasts_state(true) + animation_player.play("Swing_Knife") + owner.get_node("Player_State_Machine").change_state("attack") + +func _apply_attack_movement() -> void: + if owner.is_on_rope() and direction.y > 0: + owner.set_one_way_mask_value("rope",false) + #print("set false") + + var current_state_name = owner.get_node("Player_State_Machine").current_state.name.to_lower() + + if current_state_name not in ["roll","run_to_idle"] and sign(owner.velocity.x) == sign(direction.x) and owner.velocity.x != 0: + owner.velocity.x += direction.x * 50 + else: + owner.velocity.x = direction.x * 400 + + owner.velocity.y = direction.y * 500 if owner.add_attack_up_velocity else direction.y * 80 + +func _update_attack_visuals() -> void: + var angle = direction.angle() + self.rotation = angle + self.scale.y = -1 if direction.x < 0 else 1 +#endregion + +#region 射线检测管理 +func _initialize_raycasts() -> void: + raycasts = [ray_cast_2d_1, ray_cast_2d_2, ray_cast_2d_3] + store_raycast_initial_states() + manage_raycasts_state(false) + +# 统一管理射线状态 +func manage_raycasts_state(enabled: bool) -> void: + if not is_attack_active and enabled: + return + + for ray in raycasts: + ray.enabled = enabled + +func store_raycast_initial_states(): + var rays = [ray_cast_2d_1, ray_cast_2d_2, ray_cast_2d_3] + for ray in rays: + ray.set_meta("default_values", { + "target_position": ray.target_position, + "rotation": ray.rotation, + "position": ray.position, + "enabled": ray.enabled + }) +#endregion + +#region 状态管理 +func force_reset_attack_state() -> void: + if animation_player.is_playing(): + animation_player.stop() + + is_attack_active = false + manage_raycasts_state(false) + owner.can_attack = true + attack_timer = 0 + checked_objects.clear() + +#endregion + +#region 信号连接设置 +func _setup_connections() -> void: + animation_player.animation_finished.connect(_on_attack_animation_finished) +#endregion + +#region 信号回调 +func _on_attack_animation_finished(anim_name: String) -> void: + if anim_name == "Swing_Knife": + is_attack_active = false + manage_raycasts_state(false) + attack_timer = attack_cooldown + owner.can_attack = true +#endregion + +#region 命中检测 +func validate_and_hit_target() -> void: + if not is_attack_active: + return + + var temp_exceptions = [] + + for ray in raycasts: + if ray.is_colliding(): + var collider = ray.get_collider() + if collider.owner in checked_objects: + continue + + if collider.owner.is_in_group("Enemy"): + checked_objects.append(collider.owner) + var hit_info = [collider.owner, damage, direction, hit_force + randf_range(0, 150), 'attack'] + hit_queue_processor.add_target_to_queue(hit_info) + + # 记录临时例外 + temp_exceptions.append(collider) + for r in raycasts: + r.add_exception(collider) + r.force_raycast_update() + + # 清理所有临时例外 + for exception in temp_exceptions: + for ray in raycasts: + ray.remove_exception(exception) + ray.force_raycast_update() + + checked_objects.clear() diff --git a/Char/Player/Player_Components/player_attack_component.gd.uid b/Char/Player/Player_Components/player_attack_component.gd.uid new file mode 100644 index 0000000..7b042c5 --- /dev/null +++ b/Char/Player/Player_Components/player_attack_component.gd.uid @@ -0,0 +1 @@ +uid://bgrghyry1tuct diff --git a/Char/Player/Player_Components/player_attack_component.tscn b/Char/Player/Player_Components/player_attack_component.tscn new file mode 100644 index 0000000..5318df6 --- /dev/null +++ b/Char/Player/Player_Components/player_attack_component.tscn @@ -0,0 +1,225 @@ +[gd_scene load_steps=15 format=3 uid="uid://c4ighm8k5x65y"] + +[ext_resource type="Script" uid="uid://bgrghyry1tuct" path="res://Char/Player/Player_Components/player_attack_component.gd" id="1_col3l"] +[ext_resource type="Texture2D" uid="uid://dnulu3rrowdut" path="res://Char/Player/Player_Components/Art/spr_master_slash_0.png" id="2_bvv8w"] +[ext_resource type="Texture2D" uid="uid://cb4dyy44jlhue" path="res://Char/Player/Player_Components/Art/spr_master_slash_1.png" id="3_rqtbh"] +[ext_resource type="Texture2D" uid="uid://bm8o8djx1ckua" path="res://Char/Player/Player_Components/Art/spr_master_slash_2.png" id="4_5peu1"] +[ext_resource type="Texture2D" uid="uid://b3vxksto2j673" path="res://Char/Player/Player_Components/Art/spr_master_slash_3.png" id="5_p2s04"] +[ext_resource type="Texture2D" uid="uid://bi22tpqxju30w" path="res://Char/Player/Player_Components/Art/spr_master_slash_4.png" id="6_f6fdd"] +[ext_resource type="Texture2D" uid="uid://c37du1hq6b4f6" path="res://Char/Player/Player_Components/Art/ATK_slash_1.png" id="7_eo8bc"] + +[sub_resource type="Animation" id="Animation_v123o"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [null] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:self_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(19, -8)] +} + +[sub_resource type="Animation" id="Animation_6otjy"] +resource_name = "Swing_Knife" +length = 0.22 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.01, 0.04, 0.14, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [ExtResource("2_bvv8w"), ExtResource("3_rqtbh"), ExtResource("4_5peu1"), ExtResource("5_p2s04"), ExtResource("6_f6fdd")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2(26, -2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.01, 0.08, 0.22), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0.784314), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_b5tao"] +_data = { +&"RESET": SubResource("Animation_v123o"), +&"Swing_Knife": SubResource("Animation_6otjy") +} + +[sub_resource type="Animation" id="Animation_0pojb"] +resource_name = "No_Slash" +length = 0.5 +step = 0.02 + +[sub_resource type="Animation" id="Animation_ptb0m"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:self_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_jov6j"] +resource_name = "Slash" +length = 0.2 +step = 0.02 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("7_eo8bc")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-800, 0), Vector2(0, 0), Vector2(800, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.16, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(0, 0.694118, 0.694118, 0), Color(0.213405, 0.838908, 0.916265, 1), Color(0.984314, 0.396078, 0.901961, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ruoal"] +_data = { +&"No_Slash": SubResource("Animation_0pojb"), +&"RESET": SubResource("Animation_ptb0m"), +&"Slash": SubResource("Animation_jov6j") +} + +[node name="Player_Attack_Component" type="Node2D" groups=["FX"]] +script = ExtResource("1_col3l") + +[node name="Sprite2D" type="Sprite2D" parent="."] +self_modulate = Color(1, 1, 1, 0) +position = Vector2(19, -8) +scale = Vector2(1.3, 1.6) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Sprite2D") +libraries = { +&"": SubResource("AnimationLibrary_b5tao") +} + +[node name="RayCast2D_1" type="RayCast2D" parent="."] +visible = false +position = Vector2(-14, -24) +target_position = Vector2(109, 0) +collision_mask = 31981696 +hit_from_inside = true +collide_with_areas = true + +[node name="RayCast2D_2" type="RayCast2D" parent="."] +visible = false +position = Vector2(-14, 0) +target_position = Vector2(109, 0) +collision_mask = 31981696 +hit_from_inside = true +collide_with_areas = true + +[node name="RayCast2D_3" type="RayCast2D" parent="."] +visible = false +position = Vector2(-14, 24) +target_position = Vector2(109, 0) +collision_mask = 31981696 +hit_from_inside = true +collide_with_areas = true + +[node name="Hit_Enemy_Effect" type="Node2D" parent="."] + +[node name="Sprite2D" type="Sprite2D" parent="Hit_Enemy_Effect"] +self_modulate = Color(1, 1, 1, 0) +z_index = 1 +texture = ExtResource("7_eo8bc") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Hit_Enemy_Effect"] +libraries = { +&"": SubResource("AnimationLibrary_ruoal") +} diff --git a/Char/Player/Player_Components/player_dash_clock.gd b/Char/Player/Player_Components/player_dash_clock.gd new file mode 100644 index 0000000..cd0cd2c --- /dev/null +++ b/Char/Player/Player_Components/player_dash_clock.gd @@ -0,0 +1,14 @@ +class_name ClockProgress +extends Node2D + +var progress: float = 1.0 # 0.0 到 1.0 +var radius: float = 8.0 # 时钟半径 +var thickness: float = 4.0 # 边框粗细 +var color := Color(1, 1, 1, 0.8) + +func _draw() -> void: + # 绘制背景圆 + draw_arc(Vector2.ZERO, radius, 0, TAU, 32, Color(0.2, 0.2, 0.2, 0.5), thickness) + # 绘制进度 + if progress > 0: + draw_arc(Vector2.ZERO, radius, -PI/2, -PI/2 + TAU * progress, 32, color, thickness) diff --git a/Char/Player/Player_Components/player_dash_clock.gd.uid b/Char/Player/Player_Components/player_dash_clock.gd.uid new file mode 100644 index 0000000..6f86d80 --- /dev/null +++ b/Char/Player/Player_Components/player_dash_clock.gd.uid @@ -0,0 +1 @@ +uid://drfptmhyxsru8 diff --git a/Char/Player/Player_Components/player_dash_clock.tscn b/Char/Player/Player_Components/player_dash_clock.tscn new file mode 100644 index 0000000..4f9fc9d --- /dev/null +++ b/Char/Player/Player_Components/player_dash_clock.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bob6s3frdj7j8"] + +[ext_resource type="Script" uid="uid://drfptmhyxsru8" path="res://Char/Player/Player_Components/player_dash_clock.gd" id="1_ms8x2"] + +[node name="Dash_Clock" type="Node2D"] +script = ExtResource("1_ms8x2") diff --git a/Char/Player/Player_Components/player_dash_component.gd b/Char/Player/Player_Components/player_dash_component.gd new file mode 100644 index 0000000..223a418 --- /dev/null +++ b/Char/Player/Player_Components/player_dash_component.gd @@ -0,0 +1,469 @@ +# player_dash_component.gd +extends Node2D + +signal dash_target_calculated(_target_position: Vector2) + +@onready var dash_aim_raycast: RayCast2D = $Dash_Aim_RayCast2D +@onready var dash_hit_raycast_1: RayCast2D = $Dash_Hit_RayCast_1 +@onready var dash_hit_raycast_2: RayCast2D = $Dash_Hit_RayCast_2 +@onready var dash_hit_raycast_3: RayCast2D = $Dash_Hit_RayCast_3 +@onready var dash_arrow: Sprite2D = $DashArrow +@onready var dash_range: Sprite2D = $DashRange +@onready var player = owner as CharacterBody2D +@onready var after_image_component = player.get_node("After_Image_Component") +@onready var sakura_component = player.get_node("Sakura_Component") +@onready var attack_component = player.get_node("Hit/Player_Attack_Component") +@onready var animation_player = player.get_node("Body_Animation/AnimationPlayer") +@onready var hit_queue_processor = owner.get_node("Hit/Hit_Queue_Processor") +@onready var hit_stop = owner.get_node("Hit/Hit_Stop_Component") +@onready var slash_player = owner.get_node("Hit/Player_Attack_Component/Hit_Enemy_Effect/AnimationPlayer") +@onready var camera = player.get_node("Cameras/Camera") + +@onready var aim_timer: Timer +@onready var clock_progress: ClockProgress = $Dash_Clock +const MAX_AIM_TIME := 0.02 + +const CAMERA_OFFSET_DISTANCE := 80.0 # 固定的相机偏移距离 +const CAMERA_MOVE_SPEED := 0.08 # 相机移动速度 +var original_camera_offset := Vector2.ZERO + +const MAX_DASH_DISTANCE := 330.0 +# 目标位置检测需要的碰撞层常量 +const COLLISION_LAYER_20 = 1 << 19 +const COLLISION_LAYER_22 = 1 << 21 +const COLLISION_LAYER_23 = 1 << 22 +const COLLISION_LAYER_24 = 1 << 23 +const COLLISION_LAYER_25 = 1 << 24 +# 组合所有需要的层 +const TERRAIN_LAYERS = COLLISION_LAYER_20 | COLLISION_LAYER_22 | COLLISION_LAYER_23 | COLLISION_LAYER_24 | COLLISION_LAYER_25 + +var is_aiming := false +var dash_direction: Vector2 = Vector2.ZERO +var dash_force: float = 630 +var damage: float = 1 +var dash_shader: Shader + +var camera_default_offset := Vector2.ZERO # 相机的默认偏移值 +var camera_aim_offset := Vector2.ZERO # 瞄准时的偏移值 + +func _ready() -> void: + dash_arrow.visible = false + dash_range.visible = false + dash_hit_raycast_1.enabled = false + dash_hit_raycast_2.enabled = false + dash_hit_raycast_3.enabled = false + # 加载shader资源 + dash_shader = load("res://Char/Char_Components/After_Image/player_dash.gdshader") + + camera_default_offset = camera.offset # 记录相机的初始偏移值 + + # 添加进度条初始化 + setup_clock_progress() + + # 添加计时器 + aim_timer = Timer.new() + aim_timer.one_shot = true + aim_timer.timeout.connect(_on_aim_timer_timeout) + add_child(aim_timer) + +func setup_clock_progress() -> void: + clock_progress.visible = false + +func _process(_delta: float) -> void: + if Input.is_action_just_pressed("Dash") and player.can_dash: + after_image_component.start() + start_aiming() + elif Input.is_action_just_released("Dash"): + after_image_component.stop() + end_aiming() + + if is_aiming: + update_raycast() + hit_queue_processor.queue_trans() + + if hit_stop.is_frozen: + hit_queue_processor.stop_animation() + + if slash_player.current_animation == "Slash": + slash_player.stop() + + # 更新时钟进度 + var progress = aim_timer.time_left / MAX_AIM_TIME + clock_progress.progress = progress + # 更新时钟颜色 + if progress < 0.3: # 低于30%时变红 + clock_progress.color = Color(1.0, 0.0, 0.0, 0.8) + elif progress < 0.6: # 低于60%时变黄 + clock_progress.color = Color(1.0, 1.0, 0.0, 0.8) + else: + clock_progress.color = Color(0.0, 1.0, 0.0, 0.8) + + clock_progress.queue_redraw() + +# 更新射线的方向和长度 +func update_raycast() -> void: + var mouse_pos = get_global_mouse_position() + dash_direction = (mouse_pos - global_position).normalized() + var distance = global_position.distance_to(mouse_pos) + + # 相机偏移处理 + if distance > MAX_DASH_DISTANCE: + # 计算目标偏移值 + camera_aim_offset = dash_direction * CAMERA_OFFSET_DISTANCE + # 确保不超出限制 + camera_aim_offset = get_safe_camera_offset(camera_aim_offset) + + var tween = create_tween() + tween.tween_property(camera, "offset", + camera_default_offset + camera_aim_offset, CAMERA_MOVE_SPEED)\ + .set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) + else: + var tween = create_tween() + tween.tween_property(camera, "offset", + camera_default_offset, CAMERA_MOVE_SPEED)\ + .set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) + + # 计算目标距离 + var target_distance = min(distance, MAX_DASH_DISTANCE) + + # 更新瞄准射线 + dash_aim_raycast.target_position = dash_direction * target_distance + dash_aim_raycast.force_raycast_update() + + # 计算射线距离 + var collision_distance = target_distance + if dash_aim_raycast.is_colliding(): + var collision_point = dash_aim_raycast.get_collision_point() + collision_distance = global_position.distance_to(collision_point) + + # 更新中间射线 + dash_hit_raycast_1.target_position = dash_direction * collision_distance + + # 更新上方射线(向上旋转30度) + var up_direction = dash_direction.rotated(-PI/36) # -5度 + dash_hit_raycast_2.target_position = up_direction * collision_distance + + # 更新下方射线(向下旋转30度) + var down_direction = dash_direction.rotated(PI/36) # +5度 + dash_hit_raycast_3.target_position = down_direction * collision_distance + + # 强制更新所有射线 + dash_hit_raycast_1.force_raycast_update() + dash_hit_raycast_2.force_raycast_update() + dash_hit_raycast_3.force_raycast_update() + + # 更新箭头显示 + var arrow_target_pos: Vector2 + if dash_aim_raycast.is_colliding(): + arrow_target_pos = dash_aim_raycast.get_collision_point() + else: + arrow_target_pos = global_position + dash_direction * target_distance + + var arrow_direction = arrow_target_pos - global_position + var arrow_distance = arrow_direction.length() + update_arrow(arrow_direction, arrow_distance) + +# 确保相机偏移不会超出limit +func get_safe_camera_offset(desired_offset: Vector2) -> Vector2: + var _camera_center = player.global_position + camera.offset + var new_center = player.global_position + desired_offset + var safe_offset = desired_offset + + # 检查并调整水平方向 + if new_center.x < camera.limit_left: + safe_offset.x = camera.limit_left - player.global_position.x + elif new_center.x > camera.limit_right: + safe_offset.x = camera.limit_right - player.global_position.x + + # 检查并调整垂直方向 + if new_center.y < camera.limit_top: + safe_offset.y = camera.limit_top - player.global_position.y + elif new_center.y > camera.limit_bottom: + safe_offset.y = camera.limit_bottom - player.global_position.y + + return safe_offset + +func update_arrow(direction: Vector2, distance: float) -> void: + dash_arrow.rotation = direction.normalized().angle() + dash_arrow.scale.x = distance / 30.0 + dash_arrow.scale.y = 1.0 + + +func start_aiming() -> void: + if not is_aiming: + aim_timer.stop() + is_aiming = true + player.set_can_gameplay_input(false) + player.can_attack = false + dash_hit_raycast_1.enabled = true + dash_hit_raycast_2.enabled = true + dash_hit_raycast_3.enabled = true + + # 显示进度条 + clock_progress.visible = true + clock_progress.progress = 1.0 + + # 记录相机原始位置 + original_camera_offset = camera.offset + + # 显示视觉效果 + dash_arrow.visible = true + dash_range.visible = true + + # 创建范围显示动画 + var tween = create_tween() + tween.tween_property(dash_range, "modulate:a", 1.0, 0.1)\ + .set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + + # 设置初始位置 + dash_range.global_position = global_position + dash_arrow.global_position = global_position + + slash_player.stop() + + #美术效果 + var sprite = player.get_node("Body_Animation/Sprite2D") # 根据实际节点路径调整 + var shader_material = ShaderMaterial.new() + shader_material.shader = dash_shader + sprite.material = shader_material + # 设置初始shader参数 + sprite.material.set_shader_parameter("time_slowed", true) + sprite.material.set_shader_parameter("effect_mixture", 1.0) + + #减速黑屏 + TimeScreenController.reset_all() + TimeScreenController.execute_effects(0.02, true) + + # 添加计时器和标签相关代码 + aim_timer.start(MAX_AIM_TIME) + +func end_aiming() -> void: + if is_aiming: + is_aiming = false + dash_arrow.visible = false + dash_range.visible = false + clock_progress.visible = false + + # 恢复相机位置 + var camera_tween = create_tween() + camera_tween.tween_property(camera, "offset", + camera_default_offset, 0.2)\ + .set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + + # 淡出范围指示器 + var range_tween = create_tween() + range_tween.tween_property(dash_range, "modulate", + Color(1, 1, 1, 0), 0.1) + + # 恢复玩家控制 + player.set_can_gameplay_input(true) + player.can_attack = true + + # 计算并执行冲刺 + var target = calculate_dash_target_pos() + _process_dash(target) + +func _process_dash(target_pos: Vector2) -> void: + var start_pos = player.global_position + # 确保射线有时间更新 + await get_tree().physics_frame + + # 获取所有碰撞目标 + get_dash_hit_target() + # 禁用所有射线 + dash_hit_raycast_1.enabled = false + dash_hit_raycast_2.enabled = false + dash_hit_raycast_3.enabled = false + + # 更新位置 + player.global_position = target_pos + player.velocity = Vector2.ZERO + + TimeScreenController.reset_all() + emit_signal("dash_target_calculated", target_pos) + + var after_image_texture = get_first_frame_texture("Attack") + var after_image_rect = get_first_frame_region_rect("Attack") + after_image_component.spawn_trail_between_points(start_pos, target_pos,30,true,after_image_texture,after_image_rect) + sakura_component.spawn_sakura_fall(start_pos, target_pos, 20) + + if attack_component: + player.can_attack = true + attack_component.direction = dash_direction + attack_component.execute_knife_attack(true) + +func cancel_dash() -> void: + # 重置各种状态 + is_aiming = false + dash_arrow.visible = false + dash_range.visible = false + clock_progress.visible = false + + # 关闭射线检测 + dash_hit_raycast_1.enabled = false + dash_hit_raycast_2.enabled = false + dash_hit_raycast_3.enabled = false + + # 恢复相机位置 + var camera_tween = create_tween() + camera_tween.tween_property(camera, "offset", + camera_default_offset, 0.2)\ + .set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + + # 恢复玩家控制和状态 + player.set_can_gameplay_input(true) + player.can_attack = true + + # 清除shader效果 + var sprite = player.get_node("Body_Animation/Sprite2D") + sprite.material = null + + # 停止残影效果 + after_image_component.stop() + + # 恢复时间速度 + TimeScreenController.reset_all() + +func get_dash_hit_target() -> void: + var excluded_objects = [] + var targets = [] + var hit_info_group = [] + + # 处理所有射线 + var raycasts = [dash_hit_raycast_1, dash_hit_raycast_2, dash_hit_raycast_3] + + for raycast in raycasts: + # 清理之前的排除列表 + for obj in excluded_objects: + raycast.remove_exception(obj) + + # 检测当前射线的所有碰撞 + while raycast.is_colliding(): + var collider = raycast.get_collider() + if collider == null: + break + + if collider.owner.is_in_group("Enemy"): + # 避免重复添加同一目标 + if not collider.owner in targets: + targets.append(collider.owner) + + excluded_objects.append(collider) + raycast.add_exception(collider) + raycast.force_raycast_update() + + # 清理所有射线的排除列表 + for raycast in raycasts: + for obj in excluded_objects: + raycast.remove_exception(obj) + + # 等待一帧确保所有射线检测都完成 + await get_tree().physics_frame + + # 统一处理所有目标 + for target in targets: + var hit_info = [target, damage, dash_direction, dash_force,'dash'] + hit_info_group.append(hit_info) + + hit_queue_processor.add_target_to_queue(hit_info_group, true) + +# 计算目标位置 +func calculate_dash_target_pos() -> Vector2: + var mouse_pos = get_global_mouse_position() + var direction = (mouse_pos - global_position).normalized() + var distance = global_position.distance_to(mouse_pos) + var target_distance = min(distance, MAX_DASH_DISTANCE) + + # 创建四个方向的射线检测 + var space_state = get_world_2d().direct_space_state + var check_distance = 50 + + # 获取冲刺目标点位置 + var dash_target = global_position + direction * target_distance + var check_origin = dash_target + + # 上下左右四个方向的射线检测 + var up_check = PhysicsRayQueryParameters2D.create( + check_origin, + check_origin + Vector2(0, -check_distance), + TERRAIN_LAYERS + ) + var down_check = PhysicsRayQueryParameters2D.create( + check_origin, + check_origin + Vector2(0, check_distance), + TERRAIN_LAYERS + ) + var left_check = PhysicsRayQueryParameters2D.create( + check_origin, + check_origin + Vector2(-check_distance, 0), + TERRAIN_LAYERS + ) + var right_check = PhysicsRayQueryParameters2D.create( + check_origin, + check_origin + Vector2(check_distance, 0), + TERRAIN_LAYERS + ) + + var _up_result = space_state.intersect_ray(up_check) + var down_result = space_state.intersect_ray(down_check) + var _left_result = space_state.intersect_ray(left_check) + var _right_result = space_state.intersect_ray(right_check) + + if dash_aim_raycast.is_colliding(): + var collision_point = dash_aim_raycast.get_collision_point() + var collision_normal = dash_aim_raycast.get_collision_normal() + + # 检测斜坡类型 + var is_slope = abs(collision_normal.x) > 0.5 && abs(collision_normal.y) > 0.5 + var is_right_up_slope = is_slope && collision_normal.x < 0 + var _is_left_up_slope = is_slope && collision_normal.x > 0 + var is_ceiling = collision_point.y < global_position.y && direction.y < 0 + + # 返回值处理 + if is_slope: + if is_right_up_slope: + return collision_point + collision_normal * 20 + else: # left-up slope + return collision_point + collision_normal * 20 + elif is_ceiling: + return Vector2(collision_point.x, collision_point.y + 40) + else: + return collision_point + collision_normal * 10 + + # 非碰撞情况的默认处理 + var target_pos = global_position + direction * target_distance + if down_result.is_empty(): + target_pos.y += 40 + return target_pos + +#获取指定动画的第一帧texture +func get_first_frame_texture(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制texture的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "texture" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null + +#获取指定动画的第一帧region_rect +func get_first_frame_region_rect(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制region_rect的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "region_rect" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null + +func _on_aim_timer_timeout() -> void: + if is_aiming: + cancel_dash() diff --git a/Char/Player/Player_Components/player_dash_component.gd.uid b/Char/Player/Player_Components/player_dash_component.gd.uid new file mode 100644 index 0000000..f15e430 --- /dev/null +++ b/Char/Player/Player_Components/player_dash_component.gd.uid @@ -0,0 +1 @@ +uid://ck400w6y8evl0 diff --git a/Char/Player/Player_Components/player_dash_component.tscn b/Char/Player/Player_Components/player_dash_component.tscn new file mode 100644 index 0000000..86faac0 --- /dev/null +++ b/Char/Player/Player_Components/player_dash_component.tscn @@ -0,0 +1,46 @@ +[gd_scene load_steps=5 format=3 uid="uid://b6sngy5ab6s24"] + +[ext_resource type="Script" uid="uid://ck400w6y8evl0" path="res://Char/Player/Player_Components/player_dash_component.gd" id="1_4k6pq"] +[ext_resource type="Texture2D" uid="uid://bjh8c02v7ilde" path="res://Char/Player/Player_Components/Art/Dash_arrow.png" id="2_0r5c1"] +[ext_resource type="Texture2D" uid="uid://dmvnl5ql7i8h4" path="res://Char/Player/Player_Components/Art/Dash_range.png" id="3_4n8a7"] +[ext_resource type="PackedScene" uid="uid://bob6s3frdj7j8" path="res://Char/Player/Player_Components/player_dash_clock.tscn" id="4_k2gph"] + +[node name="Player_Dash_Component" type="Node2D"] +script = ExtResource("1_4k6pq") + +[node name="Dash_Aim_RayCast2D" type="RayCast2D" parent="."] +collision_mask = 31981568 + +[node name="Dash_Hit_RayCast_1" type="RayCast2D" parent="."] +visible = false +collision_mask = 128 +hit_from_inside = true +collide_with_areas = true +collide_with_bodies = false + +[node name="Dash_Hit_RayCast_2" type="RayCast2D" parent="."] +visible = false +collision_mask = 128 +hit_from_inside = true +collide_with_areas = true +collide_with_bodies = false + +[node name="Dash_Hit_RayCast_3" type="RayCast2D" parent="."] +visible = false +collision_mask = 128 +hit_from_inside = true +collide_with_areas = true +collide_with_bodies = false + +[node name="DashArrow" type="Sprite2D" parent="."] +visible = false +texture = ExtResource("2_0r5c1") +offset = Vector2(15, 0) + +[node name="DashRange" type="Sprite2D" parent="."] +visible = false +modulate = Color(1, 1, 1, 0) +texture = ExtResource("3_4n8a7") + +[node name="Dash_Clock" parent="." instance=ExtResource("4_k2gph")] +position = Vector2(0, -50) diff --git a/Char/Player/Shadow/Art/attack.png b/Char/Player/Shadow/Art/attack.png new file mode 100644 index 0000000..cdce097 Binary files /dev/null and b/Char/Player/Shadow/Art/attack.png differ diff --git a/Char/Player/Shadow/Art/attack.png.import b/Char/Player/Shadow/Art/attack.png.import new file mode 100644 index 0000000..ef8c91c --- /dev/null +++ b/Char/Player/Shadow/Art/attack.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lrtnjluxb6yv" +path="res://.godot/imported/attack.png-b8e164af49bff0881cfef4bf55c21f1a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/attack.png" +dest_files=["res://.godot/imported/attack.png-b8e164af49bff0881cfef4bf55c21f1a.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/Char/Player/Shadow/Art/idle_battle.png b/Char/Player/Shadow/Art/idle_battle.png new file mode 100644 index 0000000..eb7eb22 Binary files /dev/null and b/Char/Player/Shadow/Art/idle_battle.png differ diff --git a/Char/Player/Shadow/Art/idle_battle.png.import b/Char/Player/Shadow/Art/idle_battle.png.import new file mode 100644 index 0000000..5510aa7 --- /dev/null +++ b/Char/Player/Shadow/Art/idle_battle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://demy7blir6oe3" +path="res://.godot/imported/idle_battle.png-aa26e0688ac3712b08e906be0f98d577.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/idle_battle.png" +dest_files=["res://.godot/imported/idle_battle.png-aa26e0688ac3712b08e906be0f98d577.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/Char/Player/Shadow/Art/jump.png b/Char/Player/Shadow/Art/jump.png new file mode 100644 index 0000000..51a40b8 Binary files /dev/null and b/Char/Player/Shadow/Art/jump.png differ diff --git a/Char/Player/Shadow/Art/jump.png.import b/Char/Player/Shadow/Art/jump.png.import new file mode 100644 index 0000000..141eef9 --- /dev/null +++ b/Char/Player/Shadow/Art/jump.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e4kcxlgaihk3" +path="res://.godot/imported/jump.png-24029a3ef990a9418fef687d58743275.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/jump.png" +dest_files=["res://.godot/imported/jump.png-24029a3ef990a9418fef687d58743275.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/Char/Player/Shadow/Art/roll.png b/Char/Player/Shadow/Art/roll.png new file mode 100644 index 0000000..6a1ddff Binary files /dev/null and b/Char/Player/Shadow/Art/roll.png differ diff --git a/Char/Player/Shadow/Art/roll.png.import b/Char/Player/Shadow/Art/roll.png.import new file mode 100644 index 0000000..11d7478 --- /dev/null +++ b/Char/Player/Shadow/Art/roll.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csiepgsoqspfg" +path="res://.godot/imported/roll.png-72d07e6382d1e915b6f61aa7d9aaad66.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/roll.png" +dest_files=["res://.godot/imported/roll.png-72d07e6382d1e915b6f61aa7d9aaad66.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/Char/Player/Shadow/Art/run.png b/Char/Player/Shadow/Art/run.png new file mode 100644 index 0000000..1e3bdc2 Binary files /dev/null and b/Char/Player/Shadow/Art/run.png differ diff --git a/Char/Player/Shadow/Art/run.png.import b/Char/Player/Shadow/Art/run.png.import new file mode 100644 index 0000000..6a7f776 --- /dev/null +++ b/Char/Player/Shadow/Art/run.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcd7fyuacobpj" +path="res://.godot/imported/run.png-808bf6dcc47f4e1d207035a3f699e4a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/run.png" +dest_files=["res://.godot/imported/run.png-808bf6dcc47f4e1d207035a3f699e4a9.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/Char/Player/Shadow/Art/run_to_idle.png b/Char/Player/Shadow/Art/run_to_idle.png new file mode 100644 index 0000000..05030ca Binary files /dev/null and b/Char/Player/Shadow/Art/run_to_idle.png differ diff --git a/Char/Player/Shadow/Art/run_to_idle.png.import b/Char/Player/Shadow/Art/run_to_idle.png.import new file mode 100644 index 0000000..d08b01b --- /dev/null +++ b/Char/Player/Shadow/Art/run_to_idle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2ug3srik26lk" +path="res://.godot/imported/run_to_idle.png-c30f1bf8c68f1fb9cd86fe8ca5ecdf4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/run_to_idle.png" +dest_files=["res://.godot/imported/run_to_idle.png-c30f1bf8c68f1fb9cd86fe8ca5ecdf4c.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/Char/Player/Shadow/Art/squat.png b/Char/Player/Shadow/Art/squat.png new file mode 100644 index 0000000..52caf41 Binary files /dev/null and b/Char/Player/Shadow/Art/squat.png differ diff --git a/Char/Player/Shadow/Art/squat.png.import b/Char/Player/Shadow/Art/squat.png.import new file mode 100644 index 0000000..093ed69 --- /dev/null +++ b/Char/Player/Shadow/Art/squat.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cd0vubrirnt5c" +path="res://.godot/imported/squat.png-062561509465a6fd9474f6a4ede57b9a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/squat.png" +dest_files=["res://.godot/imported/squat.png-062561509465a6fd9474f6a4ede57b9a.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/Char/Player/Shadow/Art/wall_jump.png b/Char/Player/Shadow/Art/wall_jump.png new file mode 100644 index 0000000..4a1f6a9 Binary files /dev/null and b/Char/Player/Shadow/Art/wall_jump.png differ diff --git a/Char/Player/Shadow/Art/wall_jump.png.import b/Char/Player/Shadow/Art/wall_jump.png.import new file mode 100644 index 0000000..28167e1 --- /dev/null +++ b/Char/Player/Shadow/Art/wall_jump.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdm13dsiyl6v2" +path="res://.godot/imported/wall_jump.png-098df550fc76b4929e3c62ab089f0606.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/wall_jump.png" +dest_files=["res://.godot/imported/wall_jump.png-098df550fc76b4929e3c62ab089f0606.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/Char/Player/Shadow/Art/wall_slide.png b/Char/Player/Shadow/Art/wall_slide.png new file mode 100644 index 0000000..2b6e163 Binary files /dev/null and b/Char/Player/Shadow/Art/wall_slide.png differ diff --git a/Char/Player/Shadow/Art/wall_slide.png.import b/Char/Player/Shadow/Art/wall_slide.png.import new file mode 100644 index 0000000..3cc161f --- /dev/null +++ b/Char/Player/Shadow/Art/wall_slide.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1072sap5bgkb" +path="res://.godot/imported/wall_slide.png-acf95ccf9bbf539a0833620c254c6ded.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Char/Player/Shadow/Art/wall_slide.png" +dest_files=["res://.godot/imported/wall_slide.png-acf95ccf9bbf539a0833620c254c6ded.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/Char/Player/Shadow/Player_Base.gd b/Char/Player/Shadow/Player_Base.gd new file mode 100644 index 0000000..b7fa70d --- /dev/null +++ b/Char/Player/Shadow/Player_Base.gd @@ -0,0 +1,103 @@ +extends CharacterBody2D + +var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") +@onready var floor_raycast = self.get_node("Detector/Floor") +@onready var floor_l_raycast = self.get_node("Detector/Floor_L") +@onready var floor_r_raycast = self.get_node("Detector/Floor_R") +@onready var slope_l_raycast = self.get_node("Detector/Slope_L") +@onready var slope_r_raycast = self.get_node("Detector/Slope_R") +@onready var one_way_floor_raycast = self.get_node("Detector/One_Way_Floor") +@onready var rope_raycast = self.get_node("Detector/Rope") +@onready var rope_raycast_l = self.get_node("Detector/Rope_L") +@onready var rope_raycast_r = self.get_node("Detector/Rope_R") +@onready var wall_raycast = self.get_node("Detector/Wall/Wall") + +var can_attack = true +var can_dash = true +var add_attack_up_velocity = true +var can_gameplay_input = true + +# 绳索 +var _last_rope_contact := false +var rope : Node2D = null + +func _physics_process(_delta): + rope_check() + +func set_floor_raycasts_enabled(enabled: bool) -> void: + floor_raycast.enabled = enabled + floor_l_raycast.enabled = enabled + floor_r_raycast.enabled = enabled + slope_l_raycast.enabled = enabled + slope_r_raycast.enabled = enabled + +func set_can_gameplay_input(value: bool) -> void: + if can_gameplay_input != value: + can_gameplay_input = value + +func set_one_way_mask_value(mask_name: String, value: bool)-> void: + if mask_name == 'on_way_floor': + self.set_collision_mask_value(21,value) + elif mask_name == 'rope': + self.set_collision_mask_value(26,value) + elif mask_name == 'all': + self.set_collision_mask_value(26,value) + self.set_collision_mask_value(21,value) + +func is_on_slope() -> String: + if floor_raycast.is_colliding() and floor_l_raycast.is_colliding() and floor_r_raycast.is_colliding(): + return "" + if slope_l_raycast.is_colliding(): + return "L" + if slope_r_raycast.is_colliding(): + return "R" + return "" + +func is_on_ground(): + #if self.is_on_floor() and floor_raycast.is_colliding() or slope_l_raycast.is_colliding() or slope_r_raycast.is_colliding(): + if self.is_on_floor() and (floor_raycast.is_colliding() or slope_l_raycast.is_colliding() or slope_r_raycast.is_colliding() or floor_l_raycast.is_colliding() or floor_r_raycast.is_colliding() or is_on_rope()): + return true + else: + return false + +func is_on_one_way_ground(): + return one_way_floor_raycast.is_colliding() + +func face_wall(): + return wall_raycast.is_colliding() + +func is_on_rope(): + return rope_raycast.is_colliding() or rope_raycast_l.is_colliding() or rope_raycast_r.is_colliding() + +func rope_check() -> void: + # 创建射线数组以便统一处理 + var raycasts = [rope_raycast, rope_raycast_l, rope_raycast_r] + var has_rope_contact = false + var current_rope = null + var current_collider = null + + # 遍历所有射线 + for raycast in raycasts: + if raycast.is_colliding(): + var collider = raycast.get_collider() + + # 如果碰撞到的是绳索部件 + if collider: + has_rope_contact = true + current_collider = collider + current_rope = collider.get_parent().get_parent() + break # 找到第一个有效的绳索碰撞就退出循环 + + # 处理绳索接触逻辑 + if has_rope_contact: + if !_last_rope_contact: # 首次接触绳索 + _last_rope_contact = true + rope = current_rope + # 每帧都更新绳索接触点 + if rope.has_method("handle_player_rope_contact"): + rope.handle_player_rope_contact(current_collider) + elif _last_rope_contact: # 失去接触 + _last_rope_contact = false + if rope.has_method("handle_player_rope_exit"): + rope.handle_player_rope_exit() + rope = null diff --git a/Char/Player/Shadow/Player_Base.gd.uid b/Char/Player/Shadow/Player_Base.gd.uid new file mode 100644 index 0000000..6f78e25 --- /dev/null +++ b/Char/Player/Shadow/Player_Base.gd.uid @@ -0,0 +1 @@ +uid://hc5g8caqvo8c diff --git a/Char/Player/Shadow/Shadow.tscn b/Char/Player/Shadow/Shadow.tscn new file mode 100644 index 0000000..a100742 --- /dev/null +++ b/Char/Player/Shadow/Shadow.tscn @@ -0,0 +1,1036 @@ +[gd_scene load_steps=47 format=3 uid="uid://clbhclvndl73s"] + +[ext_resource type="Script" uid="uid://cy77v0f8ysxdn" path="res://Char/Player/States/Player_State_Machine.gd" id="1_8b1ok"] +[ext_resource type="PackedScene" uid="uid://dd7k3qbsw1bhq" path="res://Char/Char_Components/After_Image/after_image_component.tscn" id="2_decx5"] +[ext_resource type="Script" uid="uid://c3evnbnu55wyg" path="res://Char/Player/States/Player_Idle_Battle.gd" id="3_pu8qh"] +[ext_resource type="PackedScene" uid="uid://dkgg53dn8lr3k" path="res://Char/Char_Components/Petals_Leaves/Sakura_Component.tscn" id="3_q3boy"] +[ext_resource type="Script" uid="uid://ivsb676j6ymo" path="res://Char/Player/States/Player_Run.gd" id="4_8gmn7"] +[ext_resource type="Script" uid="uid://usn2b841v0e" path="res://Char/Player/States/Player_Run_To_Idle.gd" id="5_o8lre"] +[ext_resource type="Script" uid="uid://b3qdqr4f88tel" path="res://Char/Player/States/Player_Jump.gd" id="6_pj6pc"] +[ext_resource type="Script" uid="uid://lip17xk6ycgj" path="res://Char/Player/States/Player_Squat.gd" id="6_rk7vx"] +[ext_resource type="Script" uid="uid://blmxhheiqno3m" path="res://Char/Player/States/Player_Roll.gd" id="7_f3k8f"] +[ext_resource type="Script" uid="uid://dx7idxrq88pha" path="res://Char/Player/States/Player_Fall.gd" id="7_l6ktk"] +[ext_resource type="Script" uid="uid://b3ovdc2fiasfo" path="res://Char/Player/States/Player_Wall_Slide.gd" id="8_0jioi"] +[ext_resource type="Script" uid="uid://b71px30wip3gu" path="res://Char/Player/States/Player_Wall_Jump.gd" id="9_omn5s"] +[ext_resource type="Script" uid="uid://be7lbkwkjnli7" path="res://Char/Player/States/Player_Attack.gd" id="12_qfaga"] +[ext_resource type="Texture2D" uid="uid://lrtnjluxb6yv" path="res://Char/Player/Shadow/Art/attack.png" id="15_ej1a7"] +[ext_resource type="Texture2D" uid="uid://e4kcxlgaihk3" path="res://Char/Player/Shadow/Art/jump.png" id="18_uw7wr"] +[ext_resource type="Texture2D" uid="uid://csiepgsoqspfg" path="res://Char/Player/Shadow/Art/roll.png" id="19_wrj2y"] +[ext_resource type="Texture2D" uid="uid://cdm13dsiyl6v2" path="res://Char/Player/Shadow/Art/wall_jump.png" id="23_d7rnr"] +[ext_resource type="Texture2D" uid="uid://demy7blir6oe3" path="res://Char/Player/Shadow/Art/idle_battle.png" id="23_ghobu"] +[ext_resource type="Texture2D" uid="uid://cd0vubrirnt5c" path="res://Char/Player/Shadow/Art/squat.png" id="28_0cch5"] +[ext_resource type="Texture2D" uid="uid://b1072sap5bgkb" path="res://Char/Player/Shadow/Art/wall_slide.png" id="33_gn6av"] +[ext_resource type="Texture2D" uid="uid://c2ug3srik26lk" path="res://Char/Player/Shadow/Art/run_to_idle.png" id="35_hn0oh"] +[ext_resource type="Texture2D" uid="uid://bcd7fyuacobpj" path="res://Char/Player/Shadow/Art/run.png" id="35_neogm"] +[ext_resource type="Texture2D" uid="uid://co7hggu2mljlb" path="res://Char/Player/Dragon/Art/spr_dragon_attack_0.png" id="67_r4cet"] +[ext_resource type="Texture2D" uid="uid://bged4gw2kxak4" path="res://Char/Player/Dragon/Art/spr_dragon_attack_1.png" id="68_yibrd"] +[ext_resource type="PackedScene" uid="uid://c4ighm8k5x65y" path="res://Char/Player/Player_Components/player_attack_component.tscn" id="72_m8ad3"] +[ext_resource type="PackedScene" uid="uid://dnlln6iv8ksy2" path="res://Char/Player/Player_Components/hit_stop_component.tscn" id="74_nx5vo"] +[ext_resource type="Script" uid="uid://btvbc6o6gwpms" path="res://Char/Char_Components/fx_component.gd" id="74_x0fc2"] +[ext_resource type="PackedScene" uid="uid://mhcxla3f3vac" path="res://Char/Player/Player_Components/hit_queue_processor.tscn" id="75_cx437"] +[ext_resource type="PackedScene" uid="uid://b6sngy5ab6s24" path="res://Char/Player/Player_Components/player_dash_component.tscn" id="75_r8ire"] + +[sub_resource type="GDScript" id="GDScript_8meo2"] +script/source = "extends CharacterBody2D + +var gravity = ProjectSettings.get_setting(\"physics/2d/default_gravity\") +@onready var floor_raycast = self.get_node(\"Detector/Floor\") +@onready var floor_l_raycast = self.get_node(\"Detector/Floor_L\") +@onready var floor_r_raycast = self.get_node(\"Detector/Floor_R\") +@onready var slope_l_raycast = self.get_node(\"Detector/Slope_L\") +@onready var slope_r_raycast = self.get_node(\"Detector/Slope_R\") +@onready var one_way_floor_raycast = self.get_node(\"Detector/One_Way_Floor\") +@onready var rope_raycast = self.get_node(\"Detector/Rope\") +@onready var rope_raycast_l = self.get_node(\"Detector/Rope_L\") +@onready var rope_raycast_r = self.get_node(\"Detector/Rope_R\") +@onready var wall_raycast = self.get_node(\"Detector/Wall/Wall\") + +var can_attack = true +var can_dash = true +var add_attack_up_velocity = true +var can_gameplay_input = true + +# 绳索 +var _last_rope_contact := false +var rope : Node2D = null + +func _physics_process(_delta): + rope_check() + +func set_floor_raycasts_enabled(enabled: bool) -> void: + floor_raycast.enabled = enabled + floor_l_raycast.enabled = enabled + floor_r_raycast.enabled = enabled + slope_l_raycast.enabled = enabled + slope_r_raycast.enabled = enabled + +func set_can_gameplay_input(value: bool) -> void: + if can_gameplay_input != value: + can_gameplay_input = value + +func set_one_way_mask_value(mask_name: String, value: bool)-> void: + if mask_name == 'on_way_floor': + self.set_collision_mask_value(21,value) + elif mask_name == 'rope': + self.set_collision_mask_value(26,value) + elif mask_name == 'all': + self.set_collision_mask_value(26,value) + self.set_collision_mask_value(21,value) + +func is_on_slope() -> String: + if floor_raycast.is_colliding() and floor_l_raycast.is_colliding() and floor_r_raycast.is_colliding(): + return \"\" + if slope_l_raycast.is_colliding(): + return \"L\" + if slope_r_raycast.is_colliding(): + return \"R\" + return \"\" + +func is_on_ground(): + #if self.is_on_floor() and floor_raycast.is_colliding() or slope_l_raycast.is_colliding() or slope_r_raycast.is_colliding(): + if self.is_on_floor() and (floor_raycast.is_colliding() or slope_l_raycast.is_colliding() or slope_r_raycast.is_colliding() or floor_l_raycast.is_colliding() or floor_r_raycast.is_colliding() or is_on_rope()): + return true + else: + return false + +func is_on_one_way_ground(): + return one_way_floor_raycast.is_colliding() + +func face_wall(): + return wall_raycast.is_colliding() + +func is_on_rope(): + return rope_raycast.is_colliding() or rope_raycast_l.is_colliding() or rope_raycast_r.is_colliding() + +func rope_check() -> void: + # 创建射线数组以便统一处理 + var raycasts = [rope_raycast, rope_raycast_l, rope_raycast_r] + var has_rope_contact = false + var current_rope = null + var current_collider = null + + # 遍历所有射线 + for raycast in raycasts: + if raycast.is_colliding(): + var collider = raycast.get_collider() + + # 如果碰撞到的是绳索部件 + if collider: + has_rope_contact = true + current_collider = collider + current_rope = collider.get_parent().get_parent() + break # 找到第一个有效的绳索碰撞就退出循环 + + # 处理绳索接触逻辑 + if has_rope_contact: + if !_last_rope_contact: # 首次接触绳索 + _last_rope_contact = true + rope = current_rope + # 每帧都更新绳索接触点 + if rope.has_method(\"handle_player_rope_contact\"): + rope.handle_player_rope_contact(current_collider) + elif _last_rope_contact: # 失去接触 + _last_rope_contact = false + if rope.has_method(\"handle_player_rope_exit\"): + rope.handle_player_rope_exit() + rope = null +" + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_g868p"] +radius = 22.0 +height = 60.0 + +[sub_resource type="Animation" id="Animation_otybg"] +resource_name = "Attack" +length = 0.3 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("15_ej1a7")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.02, 0.22, 0.23, 0.24, 0.25, 0.26), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(-13, -29), Vector2(-20, -27), Vector2(-18, -32), Vector2(-14, -32), Vector2(7, -34), Vector2(8, -33), Vector2(0, -34)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:region_rect") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.02, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(488, 26, 61, 57), Rect2(12, 130, 77, 54), Rect2(328, 121, 79, 63), Rect2(15, 217, 71, 70), Rect2(199, 217, 65, 67), Rect2(360, 219, 62, 65), Rect2(518, 216, 45, 68), Rect2(38, 316, 44, 68)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.02), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [0.305433, 0.0] +} + +[sub_resource type="Animation" id="Animation_sem5a"] +resource_name = "Dash_1" +length = 0.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("68_yibrd")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.78814e-06, -30)] +} + +[sub_resource type="Animation" id="Animation_mcrul"] +resource_name = "Dash_2" +length = 0.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("67_r4cet")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(13, -30)] +} + +[sub_resource type="Animation" id="Animation_caa4o"] +resource_name = "Fall" +length = 0.2 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("18_uw7wr")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2(4, -31), Vector2(1, -39), Vector2(4, -42)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Rect2(35, 231, 59, 61), Rect2(150, 215, 64, 77), Rect2(273, 209, 62, 83)] +} + +[sub_resource type="Animation" id="Animation_wspq3"] +resource_name = "Idle_Battle" +length = 0.8 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(4, -34), Vector2(4, -33), Vector2(4, -34), Vector2(3, -34), Vector2(2, -33), Vector2(3, -34)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimationPlayer:speed_scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:texture") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("23_ghobu")] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(25, 17, 51, 67), Rect2(125, 17, 51, 67), Rect2(225, 18, 50, 66), Rect2(325, 17, 51, 67), Rect2(25, 117, 51, 67), Rect2(125, 117, 49, 67), Rect2(225, 118, 46, 66), Rect2(325, 117, 48, 67)] +} + +[sub_resource type="Animation" id="Animation_rtm6k"] +resource_name = "Jump" +length = 0.2 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("18_uw7wr")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Vector2(2, -35.2), Vector2(2, -39), Vector2(5, -37), Vector2(7, -35)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Rect2(41, 121, 38, 71), Rect2(159, 115, 46, 77), Rect2(279, 118, 51, 74), Rect2(399, 123, 54, 69)] +} + +[sub_resource type="Animation" id="Animation_sy4nv"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("23_ghobu")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4, -34)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Hurt/CollisionShape2D:disabled") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:region_rect") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(25, 17, 51, 67)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Sprite2D:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_hwf1e"] +resource_name = "Roll" +length = 0.28 +step = 0.02 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("19_wrj2y")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.16, 0.24), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [Vector2(2, -41), Vector2(2, -37), Vector2(2, -25), Vector2(2, -29)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.28), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.5, 1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Hurt/CollisionShape2D:disabled") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:region_rect") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24, 0.26), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(0, 0, 96, 88), Rect2(104, 0, 96, 88), Rect2(200, 0, 96, 88), Rect2(304, 0, 96, 88), Rect2(0, 104, 96, 88), Rect2(96, 104, 96, 88), Rect2(200, 104, 96, 88), Rect2(304, 104, 96, 88), Rect2(0, 216, 96, 88), Rect2(104, 216, 96, 88), Rect2(208, 216, 88, 88), Rect2(304, 216, 88, 88), Rect2(8, 320, 88, 72), Rect2(104, 320, 88, 72)] +} + +[sub_resource type="Animation" id="Animation_arpr5"] +resource_name = "Run" +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("35_neogm")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(-1, -33), Vector2(-2, -31), Vector2(-2, -30), Vector2(-2, -31.5), Vector2(-2, -32.5), Vector2(-2, -31.5), Vector2(-2, -31), Vector2(-2, -30), Vector2(-2, -31.5)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.3] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(29, 17, 61, 66), Rect2(147, 21, 61, 62), Rect2(266, 21, 61, 62), Rect2(386, 20, 63, 60), Rect2(27, 119, 65, 62), Rect2(148, 117, 63, 66), Rect2(268, 120, 60, 63), Rect2(388, 121, 61, 62), Rect2(30, 220, 61, 60), Rect2(149, 220, 63, 61)] +} + +[sub_resource type="Animation" id="Animation_jv5y0"] +resource_name = "Run_To_Idle" +length = 0.35 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("35_hn0oh")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(-12, -31), Vector2(-6, -31), Vector2(-4, -32), Vector2(-2, -32.5), Vector2(0, -33), Vector2(1, -33), Vector2(4, -34)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Player_State_Machine/Run_To_Idle") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.05), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"_floor_dust" +}] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:region_rect") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(0, 22, 67, 62), Rect2(116, 22, 58, 62), Rect2(228, 21, 49, 63), Rect2(329, 21, 49, 63), Rect2(35, 119, 43, 65), Rect2(140, 119, 39, 65), Rect2(239, 117, 51, 67)] +} + +[sub_resource type="Animation" id="Animation_fdmlk"] +resource_name = "Squat" +length = 0.16 +step = 0.02 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("28_0cch5")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2(-3, -34)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.16), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [0.5, 1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(0, 0, 80, 80), Rect2(80, 0, 80, 80), Rect2(160, 0, 80, 80), Rect2(240, 0, 80, 80), Rect2(0, 80, 80, 80), Rect2(80, 80, 80, 80), Rect2(160, 80, 80, 80), Rect2(240, 80, 80, 80)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_sybvl"] +resource_name = "Wall_Jump" +length = 0.65 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("23_d7rnr")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2(2, -27)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationPlayer:speed_scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [2.5] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:region_rect") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(88, 8, 64, 88), Rect2(168, 8, 64, 88), Rect2(248, 8, 72, 88), Rect2(328, 8, 72, 88), Rect2(408, 8, 72, 88), Rect2(8, 104, 72, 96), Rect2(88, 104, 72, 96), Rect2(168, 104, 72, 96), Rect2(248, 104, 72, 96)] +} + +[sub_resource type="Animation" id="Animation_fiuvk"] +resource_name = "Wall_Slide" +length = 0.6 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("33_gn6av")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:region_rect") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Rect2(16, 104, 48, 96), Rect2(96, 104, 48, 96), Rect2(176, 104, 48, 96), Rect2(256, 104, 48, 96), Rect2(16, 104, 48, 96), Rect2(96, 104, 48, 96), Rect2(176, 104, 48, 96), Rect2(256, 104, 48, 96), Rect2(16, 104, 48, 96), Rect2(96, 104, 48, 96), Rect2(176, 104, 48, 96), Rect2(256, 104, 48, 96)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -30)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("AnimationPlayer:speed_scale") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.5] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_irhps"] +_data = { +&"Attack": SubResource("Animation_otybg"), +&"Dash_1": SubResource("Animation_sem5a"), +&"Dash_2": SubResource("Animation_mcrul"), +&"Fall": SubResource("Animation_caa4o"), +&"Idle_Battle": SubResource("Animation_wspq3"), +&"Jump": SubResource("Animation_rtm6k"), +&"RESET": SubResource("Animation_sy4nv"), +&"Roll": SubResource("Animation_hwf1e"), +&"Run": SubResource("Animation_arpr5"), +&"Run_To_Idle": SubResource("Animation_jv5y0"), +&"Squat": SubResource("Animation_fdmlk"), +&"Wall_Jump": SubResource("Animation_sybvl"), +&"Wall_Slide": SubResource("Animation_fiuvk") +} + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_dcd6n"] +radius = 13.0 +height = 60.0 + +[node name="Player" type="CharacterBody2D" groups=["Player"]] +z_index = 6 +collision_mask = 66584576 +floor_constant_speed = true +floor_max_angle = 1.0472 +floor_snap_length = 10.0 +platform_on_leave = 2 +platform_floor_layers = 18350080 +platform_wall_layers = 2097152 +script = SubResource("GDScript_8meo2") + +[node name="After_Image_Component" parent="." instance=ExtResource("2_decx5")] + +[node name="Sakura_Component" parent="." instance=ExtResource("3_q3boy")] + +[node name="Player_State_Machine" type="Node" parent="."] +script = ExtResource("1_8b1ok") + +[node name="Idle_Battle" type="Node" parent="Player_State_Machine"] +script = ExtResource("3_pu8qh") + +[node name="Run" type="Node" parent="Player_State_Machine"] +script = ExtResource("4_8gmn7") + +[node name="Run_To_Idle" type="Node" parent="Player_State_Machine"] +script = ExtResource("5_o8lre") + +[node name="Squat" type="Node" parent="Player_State_Machine"] +script = ExtResource("6_rk7vx") + +[node name="Roll" type="Node" parent="Player_State_Machine"] +script = ExtResource("7_f3k8f") + +[node name="Jump" type="Node" parent="Player_State_Machine"] +script = ExtResource("6_pj6pc") + +[node name="Fall" type="Node" parent="Player_State_Machine"] +script = ExtResource("7_l6ktk") + +[node name="Wall_Slide" type="Node" parent="Player_State_Machine"] +script = ExtResource("8_0jioi") + +[node name="Wall_Jump" type="Node" parent="Player_State_Machine"] +script = ExtResource("9_omn5s") + +[node name="Attack" type="Node" parent="Player_State_Machine"] +script = ExtResource("12_qfaga") + +[node name="Body_Physics" type="CollisionShape2D" parent="."] +visible = false +position = Vector2(0, -30) +shape = SubResource("CapsuleShape2D_g868p") + +[node name="Body_Animation" type="Node2D" parent="."] +metadata/_edit_lock_ = true + +[node name="Sprite2D" type="Sprite2D" parent="Body_Animation"] +position = Vector2(4, -34) +texture = ExtResource("23_ghobu") +region_enabled = true +region_rect = Rect2(25, 17, 51, 67) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Body_Animation"] +libraries = { +&"": SubResource("AnimationLibrary_irhps") +} + +[node name="Detector" type="Node2D" parent="."] + +[node name="Wall" type="Node2D" parent="Detector"] + +[node name="Wall" type="RayCast2D" parent="Detector/Wall"] +position = Vector2(0, -34) +target_position = Vector2(26, 0) +collision_mask = 2097152 + +[node name="Floor" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 8) +collision_mask = 35127296 + +[node name="Floor_L" type="RayCast2D" parent="Detector"] +target_position = Vector2(-8, 8) +collision_mask = 18350080 + +[node name="Floor_R" type="RayCast2D" parent="Detector"] +target_position = Vector2(8, 8) +collision_mask = 18350080 + +[node name="Rope" type="RayCast2D" parent="Detector"] +target_position = Vector2(0, 15) +collision_mask = 33554432 + +[node name="Rope_L" type="RayCast2D" parent="Detector"] +target_position = Vector2(-9, 15) +collision_mask = 33554432 + +[node name="Rope_R" type="RayCast2D" parent="Detector"] +target_position = Vector2(10, 15) +collision_mask = 33554432 + +[node name="Slope_L" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(-15, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="Slope_R" type="RayCast2D" parent="Detector"] +position = Vector2(0, -3) +target_position = Vector2(15, 0) +collision_mask = 16777216 +hit_from_inside = true + +[node name="One_Way_Floor" type="RayCast2D" parent="Detector"] +visible = false +target_position = Vector2(0, 10) +collision_mask = 1048576 + +[node name="Hit" type="Node2D" parent="."] + +[node name="Player_Attack_Component" parent="Hit" instance=ExtResource("72_m8ad3")] +position = Vector2(0, -25) + +[node name="Player_Dash_Component" parent="Hit" instance=ExtResource("75_r8ire")] +position = Vector2(0, -28) + +[node name="Hit_Queue_Processor" parent="Hit" instance=ExtResource("75_cx437")] + +[node name="Hit_Stop_Component" parent="Hit" instance=ExtResource("74_nx5vo")] + +[node name="Hurt" type="Area2D" parent="."] +visible = false +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurt"] +position = Vector2(0, -30) +shape = SubResource("CapsuleShape2D_dcd6n") +debug_color = Color(0.913161, 0.221281, 0.489025, 0.42) + +[node name="Cameras" type="Node2D" parent="."] +visible = false + +[node name="Camera" type="Camera2D" parent="Cameras"] +zoom = Vector2(1.3, 1.3) +limit_left = -16 +limit_top = 0 +limit_right = 1726 +limit_bottom = 435 +position_smoothing_enabled = true + +[node name="Camera_Shake" type="Camera2D" parent="Cameras"] +enabled = false +zoom = Vector2(1.3, 1.3) + +[node name="FX_Component" type="Node2D" parent="."] +script = ExtResource("74_x0fc2") + +[node name="pos_wall_jump_dust" type="Marker2D" parent="FX_Component"] +position = Vector2(0, -23) diff --git a/Char/Player/Shadow/Tres/fall_0.tres b/Char/Player/Shadow/Tres/fall_0.tres new file mode 100644 index 0000000..2f711ad --- /dev/null +++ b/Char/Player/Shadow/Tres/fall_0.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://cvvonlws7ekre"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_tacr7"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_xned4"] + +[resource] +diffuse_texture = ExtResource("1_tacr7") +normal_texture = ExtResource("2_xned4") diff --git a/Char/Player/Shadow/Tres/fall_1.tres b/Char/Player/Shadow/Tres/fall_1.tres new file mode 100644 index 0000000..a9c5278 --- /dev/null +++ b/Char/Player/Shadow/Tres/fall_1.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bxmiek382rxlh"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_mrvit"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_me50u"] + +[resource] +diffuse_texture = ExtResource("1_mrvit") +normal_texture = ExtResource("2_me50u") diff --git a/Char/Player/Shadow/Tres/fall_2.tres b/Char/Player/Shadow/Tres/fall_2.tres new file mode 100644 index 0000000..e25dcaa --- /dev/null +++ b/Char/Player/Shadow/Tres/fall_2.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://c10gmbpp4vs6b"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_eekxp"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_71ito"] + +[resource] +diffuse_texture = ExtResource("1_eekxp") +normal_texture = ExtResource("2_71ito") diff --git a/Char/Player/Shadow/Tres/fall_3.tres b/Char/Player/Shadow/Tres/fall_3.tres new file mode 100644 index 0000000..10cf43b --- /dev/null +++ b/Char/Player/Shadow/Tres/fall_3.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://byvo5gusdpsc2"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_xm7ol"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_fff7r"] + +[resource] +diffuse_texture = ExtResource("1_xm7ol") +normal_texture = ExtResource("2_fff7r") diff --git a/Char/Player/Shadow/Tres/idle_0.tres b/Char/Player/Shadow/Tres/idle_0.tres new file mode 100644 index 0000000..3255952 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_0.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dixrqik2osxgv"] + +[ext_resource type="Texture2D" uid="uid://dlxfait3256b8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.png" id="1_e2hk0"] +[ext_resource type="Texture2D" uid="uid://ds0hcvo0ctxie" path="res://Char/Player/Dragon/Art/spr_dragon_idle_0.normal.png" id="2_r0w35"] + +[resource] +diffuse_texture = ExtResource("1_e2hk0") +normal_texture = ExtResource("2_r0w35") diff --git a/Char/Player/Shadow/Tres/idle_1.tres b/Char/Player/Shadow/Tres/idle_1.tres new file mode 100644 index 0000000..c67904c --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_1.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bsdmqi5o51kne"] + +[ext_resource type="Texture2D" uid="uid://cyrddnhdejex2" path="res://Char/Player/Dragon/Art/spr_dragon_idle_1.png" id="1_8jg5v"] +[ext_resource type="Texture2D" uid="uid://bmkjjq2g8yb7a" path="res://Char/Player/Dragon/Art/spr_dragon_idle_1.normal.png" id="2_j8jjv"] + +[resource] +diffuse_texture = ExtResource("1_8jg5v") +normal_texture = ExtResource("2_j8jjv") diff --git a/Char/Player/Shadow/Tres/idle_10.tres b/Char/Player/Shadow/Tres/idle_10.tres new file mode 100644 index 0000000..8039eb5 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_10.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dl12ugckudcf8"] + +[ext_resource type="Texture2D" uid="uid://docua10e7sugj" path="res://Char/Player/Dragon/Art/spr_dragon_idle_10.png" id="1_7006c"] +[ext_resource type="Texture2D" uid="uid://b12asxwmq6k0g" path="res://Char/Player/Dragon/Art/spr_dragon_idle_10.normal.png" id="2_rtlmv"] + +[resource] +diffuse_texture = ExtResource("1_7006c") +normal_texture = ExtResource("2_rtlmv") diff --git a/Char/Player/Shadow/Tres/idle_11.tres b/Char/Player/Shadow/Tres/idle_11.tres new file mode 100644 index 0000000..c62b74c --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_11.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://daiyb2afxug4x"] + +[ext_resource type="Texture2D" uid="uid://d2ibsjy2r2d1r" path="res://Char/Player/Dragon/Art/spr_dragon_idle_11.png" id="1_w53xr"] +[ext_resource type="Texture2D" uid="uid://js8qlguk4jow" path="res://Char/Player/Dragon/Art/spr_dragon_idle_11.normal.png" id="2_xoet7"] + +[resource] +diffuse_texture = ExtResource("1_w53xr") +normal_texture = ExtResource("2_xoet7") diff --git a/Char/Player/Shadow/Tres/idle_2.tres b/Char/Player/Shadow/Tres/idle_2.tres new file mode 100644 index 0000000..21fbd22 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_2.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://drbbua8t6sdeb"] + +[ext_resource type="Texture2D" uid="uid://dpjxum07dbwf7" path="res://Char/Player/Dragon/Art/spr_dragon_idle_2.png" id="1_scvon"] +[ext_resource type="Texture2D" uid="uid://sts53xjilk7f" path="res://Char/Player/Dragon/Art/spr_dragon_idle_2.normal.png" id="2_q5a7j"] + +[resource] +diffuse_texture = ExtResource("1_scvon") +normal_texture = ExtResource("2_q5a7j") diff --git a/Char/Player/Shadow/Tres/idle_3.tres b/Char/Player/Shadow/Tres/idle_3.tres new file mode 100644 index 0000000..5e00fc4 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_3.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://lw2xfg6cvgox"] + +[ext_resource type="Texture2D" uid="uid://brgwp0glr18xq" path="res://Char/Player/Dragon/Art/spr_dragon_idle_3.png" id="1_kbu0h"] +[ext_resource type="Texture2D" uid="uid://bh778kjsncdv8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_3.normal.png" id="2_2x3cc"] + +[resource] +diffuse_texture = ExtResource("1_kbu0h") +normal_texture = ExtResource("2_2x3cc") diff --git a/Char/Player/Shadow/Tres/idle_4.tres b/Char/Player/Shadow/Tres/idle_4.tres new file mode 100644 index 0000000..934a0fd --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_4.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bmer14ei54g3"] + +[ext_resource type="Texture2D" uid="uid://c2gg2hm7rdt0t" path="res://Char/Player/Dragon/Art/spr_dragon_idle_4.png" id="1_lidrm"] +[ext_resource type="Texture2D" uid="uid://b0al80h3n7bxt" path="res://Char/Player/Dragon/Art/spr_dragon_idle_4.normal.png" id="2_anmpp"] + +[resource] +diffuse_texture = ExtResource("1_lidrm") +normal_texture = ExtResource("2_anmpp") diff --git a/Char/Player/Shadow/Tres/idle_5.tres b/Char/Player/Shadow/Tres/idle_5.tres new file mode 100644 index 0000000..ff4ad01 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_5.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bbvoouy3cf1jt"] + +[ext_resource type="Texture2D" uid="uid://qlvxsg5iax8c" path="res://Char/Player/Dragon/Art/spr_dragon_idle_5.png" id="1_rj25j"] +[ext_resource type="Texture2D" uid="uid://dgobekecpv8kv" path="res://Char/Player/Dragon/Art/spr_dragon_idle_5.normal.png" id="2_l0ift"] + +[resource] +diffuse_texture = ExtResource("1_rj25j") +normal_texture = ExtResource("2_l0ift") diff --git a/Char/Player/Shadow/Tres/idle_6.tres b/Char/Player/Shadow/Tres/idle_6.tres new file mode 100644 index 0000000..45d81ea --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_6.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://dxcmvc8y5m3bt"] + +[ext_resource type="Texture2D" uid="uid://cnxu51medgdpe" path="res://Char/Player/Dragon/Art/spr_dragon_idle_6.png" id="1_8d17g"] +[ext_resource type="Texture2D" uid="uid://do7wf0i2upqjp" path="res://Char/Player/Dragon/Art/spr_dragon_idle_6.normal.png" id="2_mk7iu"] + +[resource] +diffuse_texture = ExtResource("1_8d17g") +normal_texture = ExtResource("2_mk7iu") diff --git a/Char/Player/Shadow/Tres/idle_7.tres b/Char/Player/Shadow/Tres/idle_7.tres new file mode 100644 index 0000000..43d3ee7 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_7.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://b7nw17p8kkg6b"] + +[ext_resource type="Texture2D" uid="uid://bt77wxum4koix" path="res://Char/Player/Dragon/Art/spr_dragon_idle_7.png" id="1_degof"] +[ext_resource type="Texture2D" uid="uid://btiheicliiqf8" path="res://Char/Player/Dragon/Art/spr_dragon_idle_7.normal.png" id="2_ckvrn"] + +[resource] +diffuse_texture = ExtResource("1_degof") +normal_texture = ExtResource("2_ckvrn") diff --git a/Char/Player/Shadow/Tres/idle_8.tres b/Char/Player/Shadow/Tres/idle_8.tres new file mode 100644 index 0000000..3f8cb36 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_8.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bayb1agp3jcis"] + +[ext_resource type="Texture2D" uid="uid://b8cs32aff7vah" path="res://Char/Player/Dragon/Art/spr_dragon_idle_8.png" id="1_pxjlp"] +[ext_resource type="Texture2D" uid="uid://lu15sul1g373" path="res://Char/Player/Dragon/Art/spr_dragon_idle_8.normal.png" id="2_2y8pf"] + +[resource] +diffuse_texture = ExtResource("1_pxjlp") +normal_texture = ExtResource("2_2y8pf") diff --git a/Char/Player/Shadow/Tres/idle_9.tres b/Char/Player/Shadow/Tres/idle_9.tres new file mode 100644 index 0000000..50a82f7 --- /dev/null +++ b/Char/Player/Shadow/Tres/idle_9.tres @@ -0,0 +1,8 @@ +[gd_resource type="CanvasTexture" load_steps=3 format=3 uid="uid://bm2fh2ats20mm"] + +[ext_resource type="Texture2D" uid="uid://bd537mp4lvwib" path="res://Char/Player/Dragon/Art/spr_dragon_idle_9.png" id="1_u523k"] +[ext_resource type="Texture2D" uid="uid://bnn8arkjtbwqm" path="res://Char/Player/Dragon/Art/spr_dragon_idle_9.normal.png" id="2_v3lwd"] + +[resource] +diffuse_texture = ExtResource("1_u523k") +normal_texture = ExtResource("2_v3lwd") diff --git a/Char/Player/States/Player_Attack.gd b/Char/Player/States/Player_Attack.gd new file mode 100644 index 0000000..bd4f4e3 --- /dev/null +++ b/Char/Player/States/Player_Attack.gd @@ -0,0 +1,58 @@ +# Player_Attack.gd +extends State + +func enter() -> void: + # 更新朝向 + update_facing_by_velocity() + animation_player.play("Attack") + + after_image_component.start() + +func physics_update(delta: float) -> void: + # 应用重力 + player.velocity.y += player.gravity * delta + + # 移动角色 + player.move_and_slide() + + # 只有在攻击动画播放完毕且不在冻结状态时才允许状态转换 + if not animation_player.is_playing(): + # 检查各种输入并转换状态 + var direction = check_gameplay_input_axis("ui_left", "ui_right") + + if check_gameplay_input_just_pressed("ui_down") and direction != 0: + state_machine.change_state("roll") + return + + if check_gameplay_input_pressed("ui_down"): + state_machine.change_state("squat") + return + + if not player.is_on_ground(): + state_machine.change_state("fall") + return + + if check_gameplay_input_just_pressed("ui_up"): + player.floor_raycast.enabled = false + player.slope_l_raycast.enabled = false + player.slope_r_raycast.enabled = false + state_machine.change_state("jump") + return + + # 有方向输入时转换到run状态 + if direction != 0: + state_machine.change_state("run") + return + + # 如果有速度但没有方向输入,转换到run_to_idle状态 + if abs(player.velocity.x) > VELOCITY_THRESHOLD: + state_machine.change_state("run_to_idle") + return + + # 如果没有其他条件满足,返回到战斗待机状态 + state_machine.change_state("idle_battle") + +func exit() -> void: + fade_out_shader_effect() + after_image_component.stop() + pass diff --git a/Char/Player/States/Player_Attack.gd.uid b/Char/Player/States/Player_Attack.gd.uid new file mode 100644 index 0000000..99a546b --- /dev/null +++ b/Char/Player/States/Player_Attack.gd.uid @@ -0,0 +1 @@ +uid://be7lbkwkjnli7 diff --git a/Char/Player/States/Player_Fall.gd b/Char/Player/States/Player_Fall.gd new file mode 100644 index 0000000..9f4c3d8 --- /dev/null +++ b/Char/Player/States/Player_Fall.gd @@ -0,0 +1,64 @@ +# Fall.gd +extends State + +func enter() -> void: + #如果向下有速度,斜坡往下滑 + player.set_floor_stop_on_slope_enabled(false) + animation_player.play("Fall") + +func physics_update(delta: float) -> void: + var direction = check_gameplay_input_axis("ui_left", "ui_right") + #var wall_raycast = player.get_node("Detector/Wall/Wall") + + # 检查滑墙条件 + if player.face_wall(): + var wall_normal = player.wall_raycast.get_collision_normal().x + var facing_direction = player.get_node("Body_Animation").scale.x + if facing_direction == -sign(wall_normal): + state_machine.change_state("wall_slide") + return + + # 处理水平移动 + if direction: + var current_direction = sign(player.velocity.x) + if current_direction != 0 and current_direction != direction: + # 反向加速,使用基类常量 + var target_velocity = direction * AIR_SPEED + player.velocity.x = move_toward( + player.velocity.x, + target_velocity, + AIR_REVERSE_ACCELERATION * delta + ) + else: + # 正常加速 + player.velocity.x = move_toward( + player.velocity.x, + direction * AIR_SPEED, + AIR_REVERSE_ACCELERATION * delta + ) + # 更新朝向 + update_facing_direction(direction) + else: + # 没有按方向键时,应用空中阻力 + apply_deceleration(delta, false) + + if check_gameplay_input_pressed("ui_down"): + player.velocity.y = 800 + else: + # 应用重力 + player.velocity.y += player.gravity * delta + player.move_and_slide() + + # 状态转换检查 + if player.is_on_ground(): + if player.velocity.x == 0: + state_machine.change_state("idle_battle") + else: + state_machine.change_state("run_to_idle") + return + + if player.is_on_floor() and player.velocity.y >= 0 and player.velocity.y < 0.1 and not player.is_on_rope(): + player.set_one_way_mask_value("rope",false) + +func exit() -> void: + player.set_floor_stop_on_slope_enabled(true) diff --git a/Char/Player/States/Player_Fall.gd.uid b/Char/Player/States/Player_Fall.gd.uid new file mode 100644 index 0000000..32ebeb5 --- /dev/null +++ b/Char/Player/States/Player_Fall.gd.uid @@ -0,0 +1 @@ +uid://dx7idxrq88pha diff --git a/Char/Player/States/Player_Idle_Battle.gd b/Char/Player/States/Player_Idle_Battle.gd new file mode 100644 index 0000000..e3ecd8d --- /dev/null +++ b/Char/Player/States/Player_Idle_Battle.gd @@ -0,0 +1,47 @@ +# Idle_Battle.gd +extends State + +func enter() -> void: + player.set_one_way_mask_value("all",true) + player.add_attack_up_velocity = true + play_animation("Idle_Battle") + after_image_component.stop() + +func physics_update(delta: float) -> void: + # 获取水平输入方向 + var direction = check_gameplay_input_axis("ui_left", "ui_right") + + # 应用重力 + player.velocity.y += player.gravity * delta + + # Idle状态下逐渐停止水平移动 + player.velocity.x = move_toward(player.velocity.x, 0, 100.0) + + player.move_and_slide() + + # 移动后再检查地面状态 + if not player.is_on_ground(): + state_machine.change_state("fall") + return + + # 按下方向键 + if check_gameplay_input_just_pressed("ui_down"): + if player.is_on_rope() and not player.face_wall(): + player.set_one_way_mask_value("rope",false) + state_machine.change_state("fall") + return + if direction != 0: + state_machine.change_state("roll") + return + state_machine.change_state("squat") + return + + # 检查跳跃输入 + if check_gameplay_input_just_pressed("ui_up"): + state_machine.change_state("jump") + return + + # 检查移动输入 + if direction != 0: + state_machine.change_state("run") + return diff --git a/Char/Player/States/Player_Idle_Battle.gd.uid b/Char/Player/States/Player_Idle_Battle.gd.uid new file mode 100644 index 0000000..b4b12e0 --- /dev/null +++ b/Char/Player/States/Player_Idle_Battle.gd.uid @@ -0,0 +1 @@ +uid://c3evnbnu55wyg diff --git a/Char/Player/States/Player_Jump.gd b/Char/Player/States/Player_Jump.gd new file mode 100644 index 0000000..ae331e1 --- /dev/null +++ b/Char/Player/States/Player_Jump.gd @@ -0,0 +1,87 @@ +# Jump.gd +extends State + +var JUMP_VELOCITY = -500.0 +var INITIAL_X_VELOCITY = AIR_SPEED # 使用基类定义的速度 +#跳跃缓冲,主要为了解决斜坡向上跳的问题 +var jump_buffer_time := 0.1 +var current_jump_buffer := 0.0 + +func enter() -> void: + current_jump_buffer = jump_buffer_time + animation_player.play("Jump") + + if player.is_on_slope() != "": + JUMP_VELOCITY = -600.0 + INITIAL_X_VELOCITY = AIR_SPEED * 0.7 + else: + JUMP_VELOCITY = -500.0 + INITIAL_X_VELOCITY = AIR_SPEED + + # 进入跳跃状态时暂时禁用射线 + player.set_floor_raycasts_enabled(false) + + # 设置方向速度 + var direction = check_gameplay_input_axis("ui_left", "ui_right") + player.velocity.y = JUMP_VELOCITY + player.velocity.x = direction * INITIAL_X_VELOCITY + update_facing_direction(direction) + +func physics_update(delta: float) -> void: + # 更新跳跃缓冲时间 + if current_jump_buffer > 0: + current_jump_buffer -= delta + else: + player.set_floor_raycasts_enabled(true) + + var direction = check_gameplay_input_axis("ui_left", "ui_right") + # 检查滑墙条件 + if player.face_wall(): + var wall_normal = player.wall_raycast.get_collision_normal().x + var facing_direction = player.get_node("Body_Animation").scale.x + if facing_direction == -sign(wall_normal): + state_machine.change_state("wall_slide") + return + + # 处理水平移动 + if direction: + var current_direction = sign(player.velocity.x) + if current_direction != 0 and current_direction != direction: + # 反向加速,使用基类常量 + var target_velocity = direction * AIR_SPEED + player.velocity.x = move_toward( + player.velocity.x, + target_velocity, + AIR_REVERSE_ACCELERATION * delta + ) + elif current_direction == 0: + # 从静止开始移动 + player.velocity.x = direction * AIR_SPEED * delta + + # 更新朝向 + update_facing_direction(direction) + else: + # 没有按方向键时,应用空中阻力 + apply_deceleration(delta, false) + + if check_gameplay_input_pressed("ui_down"): + player.velocity.y = 800 + else: + # 应用重力 + player.velocity.y += player.gravity * delta + player.move_and_slide() + + # 状态转换检查 + if player.velocity.y > 0: + state_machine.change_state("fall") + return + + if player.is_on_ground(): + if abs(player.velocity.x) > 0: + state_machine.change_state("run_to_idle") + else: + state_machine.change_state("idle_battle") + return + +func exit() -> void: + player.set_floor_raycasts_enabled(true) diff --git a/Char/Player/States/Player_Jump.gd.uid b/Char/Player/States/Player_Jump.gd.uid new file mode 100644 index 0000000..4a8a378 --- /dev/null +++ b/Char/Player/States/Player_Jump.gd.uid @@ -0,0 +1 @@ +uid://b3qdqr4f88tel diff --git a/Char/Player/States/Player_Roll.gd b/Char/Player/States/Player_Roll.gd new file mode 100644 index 0000000..95b6bab --- /dev/null +++ b/Char/Player/States/Player_Roll.gd @@ -0,0 +1,85 @@ +# Roll.gd +extends State + +const ROLL_SPEED := 600.0 # 翻滚的固定速度 + +var roll_direction := 1.0 # 翻滚方向 + +func enter() -> void: + player.set_one_way_mask_value("all",true) + player.add_attack_up_velocity = true + # 获取输入方向并设置为翻滚方向 + roll_direction = check_gameplay_input_axis("ui_left", "ui_right") + + # 设置动画朝向 + update_facing_direction(roll_direction) + + play_animation("Roll") + + after_image_component.start() + + # 设置翻滚速度 + set_rool_velocity(1) + +func physics_update(delta: float) -> void: + # 应用重力 + if not player.is_on_ground(): + player.velocity.y += player.gravity * delta + else: + player.velocity.y = 0 + + # 设置翻滚速度 + set_rool_velocity(1) + + player.move_and_slide() + + # 检查动画是否播放完成 + if not animation_player.is_playing(): + if abs(player.velocity.x) > 5.0: + state_machine.change_state("run_to_idle") + set_rool_velocity(0.5) #避免不合理的过长滑步 + else: + state_machine.change_state("idle_battle") + return + + # 如果离开地面,切换到fall状态 + if not player.is_on_ground() and player.is_on_slope() == "": + state_machine.change_state("fall") + return + +func exit() -> void: + #set_rool_velocity(0.5) + hurt_box.disabled = false + +func set_rool_velocity(adjust): + # 设置固定的翻滚速度 + if player.is_on_slope() == "L": + if roll_direction < 0: #左坡上 + var adjust_roll_direction = Vector2(-1,-1).normalized() + player.velocity.x = ROLL_SPEED * adjust_roll_direction.x * adjust + player.velocity.y = ROLL_SPEED * adjust_roll_direction.y * adjust + return + + if player.is_on_slope() == "L": + if roll_direction > 0: #左坡下 + var adjust_roll_direction = Vector2(1,1).normalized() + player.velocity.x = ROLL_SPEED * adjust_roll_direction.x * adjust + player.velocity.y = ROLL_SPEED * adjust_roll_direction.y * adjust + return + + if player.is_on_slope() == "R": + if roll_direction < 0: #右坡下 + var adjust_roll_direction = Vector2(-1,1).normalized() + player.velocity.x = ROLL_SPEED * adjust_roll_direction.x * adjust + player.velocity.y = ROLL_SPEED * adjust_roll_direction.y * adjust + return + + if player.is_on_slope() == "R": + if roll_direction > 0: #右坡上 + var adjust_roll_direction = Vector2(1,-1).normalized() + player.velocity.x = ROLL_SPEED * adjust_roll_direction.x * adjust + player.velocity.y = ROLL_SPEED * adjust_roll_direction.y * adjust + return + + #平地 + player.velocity.x = ROLL_SPEED * roll_direction * adjust diff --git a/Char/Player/States/Player_Roll.gd.uid b/Char/Player/States/Player_Roll.gd.uid new file mode 100644 index 0000000..75ec607 --- /dev/null +++ b/Char/Player/States/Player_Roll.gd.uid @@ -0,0 +1 @@ +uid://blmxhheiqno3m diff --git a/Char/Player/States/Player_Run.gd b/Char/Player/States/Player_Run.gd new file mode 100644 index 0000000..2e42893 --- /dev/null +++ b/Char/Player/States/Player_Run.gd @@ -0,0 +1,51 @@ +# Run.gd +extends State + +const SPEED = 500.0 +const ACCELERATION = 3000.0 + +func enter() -> void: + player.set_one_way_mask_value("all",true) + player.add_attack_up_velocity = true + play_animation("Run") + +func physics_update(delta: float) -> void: + var direction = check_gameplay_input_axis("ui_left", "ui_right") + + # 按下方向键 + if check_gameplay_input_just_pressed("ui_down"): + if player.is_on_rope() and not player.face_wall(): + player.set_one_way_mask_value("rope",false) + state_machine.change_state("fall") + return + if direction != 0: + state_machine.change_state("roll") + return + state_machine.change_state("squat") + return + + if direction: + player.velocity.x = move_toward( + player.velocity.x, + direction * SPEED, + ACCELERATION * delta + ) + update_facing_direction(direction) + + else: + state_machine.change_state("run_to_idle") + return + + player.velocity.y += player.gravity * delta + player.move_and_slide() + + if not player.is_on_ground(): + state_machine.change_state("fall") + return + + if check_gameplay_input_just_pressed("ui_up"): + state_machine.change_state("jump") + return + +func exit() -> void: + pass diff --git a/Char/Player/States/Player_Run.gd.uid b/Char/Player/States/Player_Run.gd.uid new file mode 100644 index 0000000..db688bc --- /dev/null +++ b/Char/Player/States/Player_Run.gd.uid @@ -0,0 +1 @@ +uid://ivsb676j6ymo diff --git a/Char/Player/States/Player_Run_To_Idle.gd b/Char/Player/States/Player_Run_To_Idle.gd new file mode 100644 index 0000000..bae15e6 --- /dev/null +++ b/Char/Player/States/Player_Run_To_Idle.gd @@ -0,0 +1,63 @@ +# Run_to_idle.gd +extends State + +func enter() -> void: + player.set_one_way_mask_value("all",true) + player.add_attack_up_velocity = true + play_animation("Run_To_Idle") + +func physics_update(delta: float) -> void: + # 获取水平输入方向 + var direction = check_gameplay_input_axis("ui_left", "ui_right") + + # 按下方向键 + if check_gameplay_input_just_pressed("ui_down"): + if player.is_on_rope(): + player.set_one_way_mask_value("rope",false) + state_machine.change_state("fall") + return + if direction != 0: + state_machine.change_state("roll") + return + state_machine.change_state("squat") + return + + # 检查移动输入 + if direction: + state_machine.change_state("run") + return + + # 应用重力 + if not player.is_on_ground(): + player.velocity.y += player.gravity * delta + else: + player.velocity.y = 0 + + # 应用减速 + apply_deceleration(delta, true) + + player.move_and_slide() + + # 检查是否在地面上 + if not player.is_on_ground(): + state_machine.change_state("fall") + return + + # 检查跳跃输入 + if check_gameplay_input_just_pressed("ui_up"): + state_machine.change_state("jump") + return + + # 当速度接近0时,切换到idle状态 + if abs(player.velocity.x) < VELOCITY_THRESHOLD: + state_machine.change_state("idle_battle") + return + +func _floor_dust() -> void: + # 生成地面扬尘 + var direction = 1 if player.velocity.x < 0 else -1 + fx_component.create_floor_dust(direction) + +func exit() -> void: + after_image_component.stop() + pass diff --git a/Char/Player/States/Player_Run_To_Idle.gd.uid b/Char/Player/States/Player_Run_To_Idle.gd.uid new file mode 100644 index 0000000..6686425 --- /dev/null +++ b/Char/Player/States/Player_Run_To_Idle.gd.uid @@ -0,0 +1 @@ +uid://usn2b841v0e diff --git a/Char/Player/States/Player_Squat.gd b/Char/Player/States/Player_Squat.gd new file mode 100644 index 0000000..9abf728 --- /dev/null +++ b/Char/Player/States/Player_Squat.gd @@ -0,0 +1,42 @@ +# Squat.gd +extends State + +func enter() -> void: + player.add_attack_up_velocity = true + play_animation("Squat") + # 确保进入下蹲状态时不会有向下的速度 + if player.is_on_ground(): + player.velocity.y = 0 + +func physics_update(delta: float) -> void: + # 在地面上时,不应用额外的重力 + if not player.is_on_ground(): + player.velocity.y += player.gravity * delta + else: + # 确保在地面上时垂直速度为0 + player.velocity.y = 0 + + # 滑行减速,使用父类中定义的 GROUND_DECELERATION + player.velocity.x = move_toward(player.velocity.x, 0, GROUND_DECELERATION * delta) + + player.move_and_slide() + + # 检查是否刚刚按下方向键 + if check_gameplay_input_just_pressed("ui_left") or check_gameplay_input_just_pressed("ui_right"): + state_machine.change_state("roll") + return + + # 检查是否在地面上 + if not player.is_on_ground(): + state_machine.change_state("fall") + return + + # 如果松开下蹲键,返回到idle状态 + if not check_gameplay_input_pressed("ui_down"): + state_machine.change_state("idle_battle") + return + + # 检查跳跃输入 + if check_gameplay_input_just_pressed("ui_up"): + state_machine.change_state("jump") + return diff --git a/Char/Player/States/Player_Squat.gd.uid b/Char/Player/States/Player_Squat.gd.uid new file mode 100644 index 0000000..25d61e6 --- /dev/null +++ b/Char/Player/States/Player_Squat.gd.uid @@ -0,0 +1 @@ +uid://lip17xk6ycgj diff --git a/Char/Player/States/Player_State.gd b/Char/Player/States/Player_State.gd new file mode 100644 index 0000000..a703b1f --- /dev/null +++ b/Char/Player/States/Player_State.gd @@ -0,0 +1,131 @@ +# State.gd +class_name State +extends Node + +# 阻力和加速度相关常量 +const GROUND_DECELERATION := 2500.0 +const AIR_DECELERATION := 100.0 +const AIR_REVERSE_ACCELERATION := 1200.0 # 空中反向加速度 +const AIR_SPEED := 400.0 # 空中移动速度 +const VELOCITY_THRESHOLD := 5.0 # 速度阈值常量, 主要是用于run_to_idle + +var player: CharacterBody2D +var animation_player: AnimationPlayer +var state_machine: Node +var after_image_component: Node +var attack_component: Node2D +var fx_component: Node +var hit_stop_component:Node +var wall_raycast: RayCast2D +var hurt_box: CollisionShape2D + +func _ready() -> void: + player = owner as CharacterBody2D + if player: + animation_player = player.get_node("Body_Animation/AnimationPlayer") + after_image_component = player.get_node("After_Image_Component") + attack_component = player.get_node("Hit/Player_Attack_Component") + hit_stop_component = player.get_node("Hit/Hit_Stop_Component") + fx_component = player.get_node("FX_Component") + hurt_box = player.get_node("Hurt/CollisionShape2D") + state_machine = get_parent() + if not animation_player: + push_error("Animation Player not found for state: " + name) + else: + push_error("Player node not found for state: " + name) + +func enter() -> void: + pass + +func exit() -> void: + pass + +func physics_update(_delta: float) -> void: + pass + +# 应用阻力 +func apply_deceleration(delta: float, is_on_ground: bool) -> void: + var deceleration = GROUND_DECELERATION if is_on_ground else AIR_DECELERATION + player.velocity.x = move_toward(player.velocity.x, 0, deceleration * delta) + +func play_animation(anim_name: String) -> void: + if animation_player and animation_player.has_animation(anim_name): + animation_player.play(anim_name) + else: + push_warning("Animation " + anim_name + " not found for state: " + name) + +func check_gameplay_input_axis(negative_action: String, positive_action: String) -> float: + if player.can_gameplay_input: + return Input.get_axis(negative_action, positive_action) + else: + return 0 + +func check_gameplay_input_just_pressed(action: String) -> bool: + if player.can_gameplay_input: + return Input.is_action_just_pressed(action) + else: + return false + +func check_gameplay_input_pressed(action: String) -> bool: + if player.can_gameplay_input: + return Input.is_action_pressed(action) + else: + return false + +func update_facing_direction(direction: float) -> void: + if direction == 0: + return + player.get_node("Body_Animation").scale.x = -1 if direction < 0 else 1 + player.get_node("Detector/Wall").scale.x = -1 if direction < 0 else 1 + +# 用于根据速度更新朝向的函数 +func update_facing_by_velocity() -> void: + if player.velocity.x != 0: + update_facing_direction(player.velocity.x) + +#获取指定动画的第一帧texture +func get_first_frame_texture(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制texture的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "texture" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null + +#获取指定动画的第一帧region_rect +func get_first_frame_region_rect(animation_name): + var animation = animation_player.get_animation(animation_name) + + # 找到控制region_rect的轨道 + for track_idx in animation.get_track_count(): + if animation.track_get_type(track_idx) == Animation.TYPE_VALUE: + var path = animation.track_get_path(track_idx) + if "region_rect" in str(path): + var first_key_value = animation.track_get_key_value(track_idx, 0) + return first_key_value + + return null + +func fade_out_shader_effect(): + var sprite = player.get_node("Body_Animation/Sprite2D") + if not sprite or not sprite.material: + return + + # 确保之前的tween被清理 + var tween = create_tween().set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + if not tween: + return + + # 检查material是否存在且是ShaderMaterial + if sprite.material is ShaderMaterial: + tween.tween_property(sprite.material, "shader_parameter/effect_mixture", 0.0, 0.3) + # 动画完成后的回调 + tween.finished.connect(func(): + sprite.material = null + tween.kill() # 确保tween被正确清理 + ) diff --git a/Char/Player/States/Player_State.gd.uid b/Char/Player/States/Player_State.gd.uid new file mode 100644 index 0000000..1e4e7b4 --- /dev/null +++ b/Char/Player/States/Player_State.gd.uid @@ -0,0 +1 @@ +uid://bt1la3i7kgrmt diff --git a/Char/Player/States/Player_State_Machine.gd b/Char/Player/States/Player_State_Machine.gd new file mode 100644 index 0000000..dee74ea --- /dev/null +++ b/Char/Player/States/Player_State_Machine.gd @@ -0,0 +1,40 @@ +# Player_State_Machine.gd +extends Node + +var states = {} +var current_state: State = null +@onready var player = get_parent() + +func _ready(): + await get_tree().process_frame + + for child in get_children(): + if child is State: + var state_name = child.name.to_lower() + states[state_name] = child + + if states.has("idle_battle"): + change_state("idle_battle") + else: + push_error("Could not find idle_battle state!") + +func _physics_process(delta): + if current_state: + # 不再尝试获取返回值 + current_state.physics_update(delta) + +func change_state(new_state_name: String) -> void: + if new_state_name.is_empty(): + return + + var lower_state_name = new_state_name.to_lower() + + if not states.has(lower_state_name): + push_error("State not found: " + lower_state_name) + return + + if current_state: + current_state.exit() + + current_state = states[lower_state_name] + current_state.enter() diff --git a/Char/Player/States/Player_State_Machine.gd.uid b/Char/Player/States/Player_State_Machine.gd.uid new file mode 100644 index 0000000..b0feed9 --- /dev/null +++ b/Char/Player/States/Player_State_Machine.gd.uid @@ -0,0 +1 @@ +uid://cy77v0f8ysxdn diff --git a/Char/Player/States/Player_Wall_Jump.gd b/Char/Player/States/Player_Wall_Jump.gd new file mode 100644 index 0000000..bde9ae6 --- /dev/null +++ b/Char/Player/States/Player_Wall_Jump.gd @@ -0,0 +1,90 @@ +# Wall_Jump.gd +class_name WallJump +extends State + +const WALL_JUMP_HORIZONTAL_FORCE = 500 +const WALL_JUMP_VERTICAL_FORCE = -400.0 + +var animation_locked := true + +func enter() -> void: + animation_locked = true + animation_player.play("Wall_Jump") + # 连接动画结束信号 + if not animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.connect(_on_animation_finished) + + #var wall_raycast = player.get_node("Detector/Wall/Wall") + var wall_normal = player.wall_raycast.get_collision_normal() + + # 设置初始速度 + player.velocity.x = wall_normal.x * WALL_JUMP_HORIZONTAL_FORCE + player.velocity.y = WALL_JUMP_VERTICAL_FORCE + + # 更新朝向与速度方向一致 + player.get_node("Body_Animation").scale.x = sign(player.velocity.x) + player.get_node("Detector/Wall").scale.x = sign(player.velocity.x) + + var direction = 1 if player.velocity.x < 0 else -1 + fx_component.create_wall_jump_dust(direction) + + after_image_component.start() + +func exit() -> void: + after_image_component.stop() + # 断开动画结束信号 + if animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.disconnect(_on_animation_finished) + animation_locked = true + +func _on_animation_finished(anim_name: String) -> void: + if anim_name == "Wall_Jump": + animation_locked = false + +func physics_update(delta: float) -> void: + #var wall_raycast = player.get_node("Detector/Wall/Wall") + + # 检查滑墙条件 + if player.face_wall(): + var wall_normal = player.wall_raycast.get_collision_normal().x + var facing_direction = player.get_node("Body_Animation").scale.x + if facing_direction == -sign(wall_normal): + state_machine.change_state("wall_slide") + return + + # 只在动画结束后处理输入 + if not animation_locked: + var direction = check_gameplay_input_axis("ui_left", "ui_right") + + if direction: + var current_direction = sign(player.velocity.x) + if current_direction != 0 and current_direction != direction: + # 反向加速 + var target_velocity = direction * AIR_SPEED + player.velocity.x = move_toward( + player.velocity.x, + target_velocity, + AIR_REVERSE_ACCELERATION * delta + ) + # 更新朝向 + update_facing_direction(direction) + else: + # 没有按方向键时,应用空中阻力 + apply_deceleration(delta, false) + + # 应用重力 + player.velocity.y += player.gravity * delta + player.move_and_slide() + + # 当垂直速度变为正值时(开始下落),切换到fall状态 + if player.velocity.y > 0: + state_machine.change_state("fall") + return + + # 着地检测 + if player.is_on_ground(): + if abs(player.velocity.x) > 0: + state_machine.change_state("run") + else: + state_machine.change_state("idle_battle") + return diff --git a/Char/Player/States/Player_Wall_Jump.gd.uid b/Char/Player/States/Player_Wall_Jump.gd.uid new file mode 100644 index 0000000..25c0c89 --- /dev/null +++ b/Char/Player/States/Player_Wall_Jump.gd.uid @@ -0,0 +1 @@ +uid://b71px30wip3gu diff --git a/Char/Player/States/Player_Wall_Slide.gd b/Char/Player/States/Player_Wall_Slide.gd new file mode 100644 index 0000000..07dab0a --- /dev/null +++ b/Char/Player/States/Player_Wall_Slide.gd @@ -0,0 +1,79 @@ +# Wall_Slide.gd +extends State + +const WALL_SLIDE_SPEED = 100.0 # 滑墙下落速度限制 +const WALL_UP_RESISTANCE = 1800.0 # 向上滑动时的阻力(大于重力) +const WALL_DOWN_RESISTANCE = 200.0 # 向下滑动时的阻力 + +var can_check_direction := false # 新增变量,用于控制是否检测方向键 + +func enter() -> void: + player.add_attack_up_velocity = true + can_check_direction = false # 重置标志 + animation_player.play("Wall_Slide") + # 监听动画播放完成信号 + if not animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.connect(_on_animation_finished) + # 确保玩家面向正确的方向 + var wall_direction = player.get_node("Detector/Wall/Wall").get_collision_normal().x + if wall_direction != 0: + player.get_node("Body_Animation").scale.x = sign(wall_direction) + player.get_node("Detector/Wall").scale.x = -sign(wall_direction) + +func exit() -> void: + # 断开信号连接 + if animation_player.animation_finished.is_connected(_on_animation_finished): + animation_player.animation_finished.disconnect(_on_animation_finished) + can_check_direction = false + +func _on_animation_finished(anim_name: String) -> void: + if anim_name == "Wall_Slide": + can_check_direction = true + +func physics_update(delta: float) -> void: + #var wall_raycast = player.get_node("Detector/Wall/Wall") + var direction = check_gameplay_input_axis("ui_left", "ui_right") + var wall_normal = player.wall_raycast.get_collision_normal() + + if !player.face_wall(): + state_machine.change_state("fall") + return + + # 只有在动画播放完成后才检查方向键 + if can_check_direction: + # 检查是否离开墙面或按了反方向键 + if sign(direction) == sign(wall_normal.x): + # 在切换到fall状态前更新朝向 + if direction != 0: + player.get_node("Body_Animation").scale.x = -1 if direction < 0 else 1 + player.get_node("Detector/Wall").scale.x = -1 if direction < 0 else 1 + state_machine.change_state("fall") + return + + # 应用墙面阻力 + if player.velocity.y < 0: # 向上移动 + # 应用较大的向下阻力 + player.velocity.y += WALL_UP_RESISTANCE * delta + else: # 向下移动 + # 应用向上的阻力来减缓下落 + player.velocity.y -= WALL_DOWN_RESISTANCE * delta + # 同时仍然受到减小的重力影响 + player.velocity.y += player.gravity * delta * 0.3 + + # 限制最大下落速度 + player.velocity.y = min(player.velocity.y, WALL_SLIDE_SPEED) + + # 蹬墙跳 + if check_gameplay_input_just_pressed("ui_up"): + state_machine.change_state("wall_jump") + return + + # 着地检测 + if player.is_on_ground(): + if abs(player.velocity.x) > 0: + state_machine.change_state("run") + else: + state_machine.change_state("idle_battle") + return + + player.move_and_slide() diff --git a/Char/Player/States/Player_Wall_Slide.gd.uid b/Char/Player/States/Player_Wall_Slide.gd.uid new file mode 100644 index 0000000..98059f2 --- /dev/null +++ b/Char/Player/States/Player_Wall_Slide.gd.uid @@ -0,0 +1 @@ +uid://b3ovdc2fiasfo diff --git a/Level/Rope/Rope.gd b/Level/Rope/Rope.gd new file mode 100644 index 0000000..6597e62 --- /dev/null +++ b/Level/Rope/Rope.gd @@ -0,0 +1,307 @@ +extends Node2D + +var debug_mode: bool = false +# 添加debug绘制相关变量 +var debug_lines: Array[Line2D] = [] +var debug_font: Font + +# 导出变量便于在编辑器中配置 +@export var start_point: Vector2 +@export var end_point: Vector2 +@export var part_distance: float = 12.0 +@export var rope_part_scene: PackedScene +@export var max_deform: float = 30.0 # 最大形变距离 +@export var deform_spread: float = 3.0 # 形变扩散范围 +@export var initial_sag: float = 8.0 # 初始下垂量 + +# Line2D相关导出变量 +@export var rope_texture: Texture2D # 绳索纹理 +@export var rope_width: float = 8 # 绳索宽度 +@export var rope_color: Color = Color.WHITE # 绳索颜色 +@export var rope_texture_tile_factor: float = 1.0 # 纹理平铺系数 + +var rope_parts: Array[RigidBody2D] = [] +var rest_positions: Array[Vector2] = [] # 存储原始位置 +var active_deforms: Dictionary = {} # 存储当前变形 {rope_part: deform_amount} +var _exit_tween: Tween +var _is_exiting := false + +@onready var rope_line: Line2D = $rope_line + +func _ready() -> void: + if rope_part_scene == null: + push_error("Rope part scene is not set!") + return + + # 初始化Line2D + setup_rope_line() + + $rope_start.position = start_point + $rope_end.position = end_point + + # 初始化debug字体 + if debug_mode: + debug_font = ThemeDB.fallback_font + print("[Rope] Initialized with start_point: ", start_point, " end_point: ", end_point) + + generate_rope_parts() + + # 保存生成后的位置作为静止位置 + rest_positions.clear() + for part in rope_parts: + rest_positions.append(part.position) + +func setup_rope_line() -> void: + rope_line.width = rope_width + rope_line.default_color = rope_color + + if rope_texture: + rope_line.texture = rope_texture + rope_line.texture_mode = Line2D.LINE_TEXTURE_TILE + rope_line.texture_repeat = CanvasItem.TEXTURE_REPEAT_ENABLED + + rope_line.joint_mode = Line2D.LINE_JOINT_ROUND + rope_line.begin_cap_mode = Line2D.LINE_CAP_ROUND + rope_line.end_cap_mode = Line2D.LINE_CAP_ROUND + rope_line.antialiased = true + +func _process(_delta: float) -> void: + update_rope_line() + +func update_rope_line() -> void: + rope_line.clear_points() + for part in rope_parts: + rope_line.add_point(part.position) + +func generate_rope_parts() -> void: + # 清理debug线 + if debug_mode: + for line in debug_lines: + line.queue_free() + debug_lines.clear() + print("[Rope] Generating rope parts...") + + # 清理可能存在的旧rope parts + for child in $rope_parts.get_children(): + child.queue_free() + rope_parts.clear() + rest_positions.clear() + + # 计算绳索总长度和需要的部件数量 + var total_distance: float = start_point.distance_to(end_point) + var parts_count: int = int(total_distance / part_distance) + + # 确保至少有一个部件 + if parts_count < 1: + parts_count = 1 + + if debug_mode: + print("[Rope] Total distance: ", total_distance) + print("[Rope] Parts count: ", parts_count) + + # 计算实际的部件间距,确保均匀分布 + var _actual_distance: float = total_distance / parts_count + + # 首先创建所有部件并存储到临时数组 + var temp_parts: Array[Dictionary] = [] + + # 生成每个rope_part + for i in range(parts_count + 1): + var t = float(i) / float(parts_count) # 插值因子 + var part_position = start_point.lerp(end_point, t) + + # 计算下垂量:使用抛物线函数 y = 4h(x-x²) + var sag = initial_sag * 4.0 * t * (1.0 - t) + part_position.y += sag + + var part = rope_part_scene.instantiate() as RigidBody2D + $rope_parts.add_child(part) + part.position = part_position + + # 配置第一个和最后一个点 + if i == 0 or i == parts_count: + part.freeze = true # 固定两端点 + + # 将部件及其位置信息存储到临时数组 + temp_parts.append({ + "part": part, + "position": part_position + }) + + if debug_mode: + print("[Rope] Created part at position: ", part_position) + + # 仅按x坐标排序 + temp_parts.sort_custom(func(a, b): return a["position"].x < b["position"].x) + + # 清空并重新填充rope_parts和original_positions数组,确保顺序正确 + rope_parts.clear() + rest_positions.clear() + + # 创建物理关节连接相邻的部件 + for i in range(temp_parts.size()): + var part = temp_parts[i]["part"] + var pos = temp_parts[i]["position"] + + rope_parts.append(part) + rest_positions.append(pos) + + # 创建与前一个部件的关节连接(除了第一个部件) + if i > 0: + var pin_joint = PinJoint2D.new() + pin_joint.set_node_a(rope_parts[i-1].get_path()) + pin_joint.set_node_b(part.get_path()) + pin_joint.softness = 1.0 # 可以调整这个值来改变绳索的柔软度 + $rope_parts.add_child(pin_joint) + + # 设置关节的位置(在两个部件之间) + var joint_pos = (rope_parts[i-1].position + part.position) / 2 + pin_joint.position = joint_pos + + if debug_mode: + print("[Rope] Parts sorted and connected. Total parts: ", rope_parts.size()) + for i in range(rope_parts.size()): + print("[Rope] Part ", i, ": ", rope_parts[i]) + print("[Rope] Part ", i, " position: ", rope_parts[i].position) + + # 初始更新Line2D + update_rope_line() + +func handle_player_rope_contact(collider: RigidBody2D) -> void: + var contact_index = -1 + for i in range(rope_parts.size()): + if rope_parts[i] == collider: + contact_index = i + break + + if contact_index == -1: + return + + # 如果碰到第一个或最后一个部件,直接返回 + if contact_index == 0 or contact_index == rope_parts.size() - 1: + return + + var max_offset = 10.0 # 最大下移距离 + var tween = create_tween() + + # 同时应用所有部件的移动 + for i in range(rope_parts.size()): + # 跳过第一个和最后一个部件 + if i == 0 or i == rope_parts.size() - 1: + continue + + var part = rope_parts[i] + var target_pos = rest_positions[i] + + # 如果接触点是第二个或倒数第二个部件,最大偏移量减半 + var current_max_offset = max_offset + if contact_index == 1 or contact_index == rope_parts.size() - 2: + current_max_offset = max_offset * 0.5 + + # 计算移动距离 + var move_amount: float + if i <= contact_index: + # 左侧部分,从接触点到起点,线性减少 + move_amount = float(i) / float(contact_index) if contact_index > 0 else 0.0 + else: + # 右侧部分,从接触点到终点,线性减少 + var remaining_parts = rope_parts.size() - 1 - contact_index + move_amount = float(remaining_parts - (i - contact_index)) / float(remaining_parts) if remaining_parts > 0 else 0.0 + + # 计算目标位置 + var target_offset = Vector2(0, current_max_offset * move_amount) + + # 将所有移动添加到同一个tween中,parallel=true使它们同时开始 + tween.parallel().tween_property(part, "position", + target_pos + target_offset, 0.3 + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + +func handle_player_rope_exit() -> void: + # 如果正在执行退出动画,直接返回 + if _is_exiting: + return + + _is_exiting = true + + # 如果已经有正在进行的退出动画,先停止它 + if _exit_tween and _exit_tween.is_valid(): + _exit_tween.kill() + + const DOWN_OFFSET_FACTOR := 1.3 + const UP_OFFSET_FACTOR := 0.5 + + const DOWN_TIME := 0.15 + const UP_TIME := 0.2 + const RECOVER_TIME := 0.1 + + # 找到最大偏移点 + var max_offset_index := 0 + var max_offset := 0.0 + + for i in range(rope_parts.size()): + var current_offset = abs(rope_parts[i].position.y - rest_positions[i].y) + if current_offset > max_offset: + max_offset = current_offset + max_offset_index = i + + _exit_tween = create_tween() + var tween = _exit_tween + + # 第一阶段:下沉 + for i in range(rope_parts.size()): + if i == 0 or i == rope_parts.size() - 1: + continue + + var part = rope_parts[i] + var rest_pos = rest_positions[i] + + var move_amount: float + if i <= max_offset_index: + move_amount = float(i) / float(max_offset_index) if max_offset_index > 0 else 0.0 + else: + var remaining_parts = rope_parts.size() - 1 - max_offset_index + move_amount = float(remaining_parts - (i - max_offset_index)) / float(remaining_parts) if remaining_parts > 0 else 0.0 + + var down_offset = Vector2(0, max_offset * DOWN_OFFSET_FACTOR * move_amount) + + tween.parallel().tween_property(part, "position", + rest_pos + down_offset, DOWN_TIME + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_IN) + + # 第二阶段:反弹 + tween.chain().tween_callback(func(): pass) + for i in range(rope_parts.size()): + if i == 0 or i == rope_parts.size() - 1: + continue + + var part = rope_parts[i] + var rest_pos = rest_positions[i] + + var move_amount: float + if i <= max_offset_index: + move_amount = float(i) / float(max_offset_index) if max_offset_index > 0 else 0.0 + else: + var remaining_parts = rope_parts.size() - 1 - max_offset_index + move_amount = float(remaining_parts - (i - max_offset_index)) / float(remaining_parts) if remaining_parts > 0 else 0.0 + + var up_offset = Vector2(0, -max_offset * UP_OFFSET_FACTOR * move_amount) + + tween.parallel().tween_property(part, "position", + rest_pos + up_offset, UP_TIME + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + + # 第三阶段:恢复到静止位置 + tween.chain().tween_callback(func(): pass) + for i in range(rope_parts.size()): + if i == 0 or i == rope_parts.size() - 1: + continue + + var part = rope_parts[i] + tween.parallel().tween_property(part, "position", + rest_positions[i], RECOVER_TIME + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT) + + # 添加完成回调,重置标志位 + tween.chain().tween_callback(func(): + _is_exiting = false # 动画完成后重置标志位 + ) diff --git a/Level/Rope/Rope.gd.uid b/Level/Rope/Rope.gd.uid new file mode 100644 index 0000000..0cb686d --- /dev/null +++ b/Level/Rope/Rope.gd.uid @@ -0,0 +1 @@ +uid://b880ha4crg02a diff --git a/Level/Rope/Rope.png b/Level/Rope/Rope.png new file mode 100644 index 0000000..30ea360 Binary files /dev/null and b/Level/Rope/Rope.png differ diff --git a/Level/Rope/Rope.png.import b/Level/Rope/Rope.png.import new file mode 100644 index 0000000..846c24f --- /dev/null +++ b/Level/Rope/Rope.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6fyu8qx3sb2c" +path="res://.godot/imported/Rope.png-2ee8c891416c6833c9f4624efc3fd432.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Level/Rope/Rope.png" +dest_files=["res://.godot/imported/Rope.png-2ee8c891416c6833c9f4624efc3fd432.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/Level/Rope/Rope.tscn b/Level/Rope/Rope.tscn new file mode 100644 index 0000000..e7e4b60 --- /dev/null +++ b/Level/Rope/Rope.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=3 uid="uid://bxhllsclvr2a7"] + +[ext_resource type="Script" uid="uid://b880ha4crg02a" path="res://Level/Rope/Rope.gd" id="1_11nh0"] +[ext_resource type="Texture2D" uid="uid://b6fyu8qx3sb2c" path="res://Level/Rope/Rope.png" id="2_j0wl2"] +[ext_resource type="PackedScene" uid="uid://bmiyxjrdbuykk" path="res://Level/Rope/Rope_Part.tscn" id="2_rdxjd"] + +[node name="Rope" type="Node2D" groups=["Rope"]] +z_index = 3 +script = ExtResource("1_11nh0") +part_distance = 4.0 +rope_part_scene = ExtResource("2_rdxjd") + +[node name="rope_start" type="Marker2D" parent="."] + +[node name="rope_end" type="Marker2D" parent="."] + +[node name="rope_parts" type="Node2D" parent="."] +z_index = 2 + +[node name="rope_line" type="Line2D" parent="."] +texture_repeat = 2 +width = 8.0 +texture = ExtResource("2_j0wl2") +texture_mode = 1 diff --git a/Level/Rope/Rope_Part.gd b/Level/Rope/Rope_Part.gd new file mode 100644 index 0000000..371f982 --- /dev/null +++ b/Level/Rope/Rope_Part.gd @@ -0,0 +1,35 @@ +extends RigidBody2D + +signal player_entered(part: RigidBody2D) +signal player_exited(part: RigidBody2D) + +func _ready() -> void: + # 设置碰撞检测 + contact_monitor = true + max_contacts_reported = 4 + + # 连接信号 + body_entered.connect(_on_body_entered) + body_exited.connect(_on_body_exited) + + if get_parent().get_parent().debug_mode: + print("[RopePart] Name: ", name) + print("[RopePart] Collision layer: ", collision_layer) + print("[RopePart] Collision mask: ", collision_mask) + print("[RopePart] Contact monitor: ", contact_monitor) + print("[RopePart] Max contacts: ", max_contacts_reported) + +func _on_body_entered(body: Node2D) -> void: + if get_parent().get_parent().debug_mode: + print("[RopePart] Body entered: ", body.name) + print("[RopePart] Body in player group: ", body.is_in_group("player")) + + if body.is_in_group("player"): + player_entered.emit(self) + +func _on_body_exited(body: Node2D) -> void: + if get_parent().get_parent().debug_mode: + print("[RopePart] Body exited: ", body.name) + + if body.is_in_group("player"): + player_exited.emit(self) diff --git a/Level/Rope/Rope_Part.gd.uid b/Level/Rope/Rope_Part.gd.uid new file mode 100644 index 0000000..3596770 --- /dev/null +++ b/Level/Rope/Rope_Part.gd.uid @@ -0,0 +1 @@ +uid://dijifcwtljije diff --git a/Level/Rope/Rope_Part.tscn b/Level/Rope/Rope_Part.tscn new file mode 100644 index 0000000..7fe6acd --- /dev/null +++ b/Level/Rope/Rope_Part.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://bmiyxjrdbuykk"] + +[ext_resource type="Script" uid="uid://dijifcwtljije" path="res://Level/Rope/Rope_Part.gd" id="1_eqwyf"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_6qj67"] +radius = 2.0 + +[node name="Rope_Part" type="RigidBody2D"] +z_index = 3 +collision_layer = 33554432 +collision_mask = 0 +gravity_scale = 0.0 +lock_rotation = true +freeze = true +script = ExtResource("1_eqwyf") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_6qj67") +one_way_collision = true diff --git a/Level/Test_Level_01.tscn b/Level/Test_Level_01.tscn new file mode 100644 index 0000000..e224224 --- /dev/null +++ b/Level/Test_Level_01.tscn @@ -0,0 +1,206 @@ +[gd_scene load_steps=18 format=4 uid="uid://24145e54ypmx"] + +[ext_resource type="Script" uid="uid://pbvjs78t7p4p" path="res://Level/test_level_01.gd" id="1_a01ci"] +[ext_resource type="Texture2D" uid="uid://cmukg5vvbfde4" path="res://Level/Tiles/Physic_Group.png" id="2_yqabr"] +[ext_resource type="PackedScene" uid="uid://clbhclvndl73s" path="res://Char/Player/Shadow/Shadow.tscn" id="3_mxkfc"] +[ext_resource type="PackedScene" uid="uid://dom46ngh3my6b" path="res://Char/Enemy/Enemy_01.tscn" id="4_ucsmj"] +[ext_resource type="Texture2D" uid="uid://bj6j7q5bldm1c" path="res://Level/Tiles/Art_Group.png" id="4_vq84u"] +[ext_resource type="PackedScene" uid="uid://bxhllsclvr2a7" path="res://Level/Rope/Rope.tscn" id="5_ljfjt"] +[ext_resource type="Texture2D" uid="uid://tox8emeo0w3b" path="res://Char/Enemy/Art/1.png" id="7_qgw53"] +[ext_resource type="Texture2D" uid="uid://6g33ompg5t8a" path="res://Char/Enemy/Art/2.png" id="8_6fvd4"] + +[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_8k7te"] +polygon = PackedVector2Array(8, -8, 8, 8, -8, 8) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_abfeb"] +texture = ExtResource("4_vq84u") +use_texture_padding = false +0:0/0 = 0 +0:0/0/custom_data_0 = 1 +1:0/0 = 0 +1:0/0/custom_data_0 = 1 +2:0/0 = 0 +2:0/0/custom_data_0 = 1 +3:0/0 = 0 +3:0/0/custom_data_0 = 1 +0:1/0 = 0 +0:1/0/custom_data_0 = 1 +1:1/0 = 0 +1:1/0/custom_data_0 = 1 +2:1/0 = 0 +2:1/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_8k7te") +2:1/0/custom_data_0 = 1 +3:1/0 = 0 +3:1/0/custom_data_0 = 1 +0:2/0 = 0 +1:2/0 = 0 +2:2/0 = 0 +3:2/0 = 0 +0:3/0 = 0 +1:3/0 = 0 +1:4/0 = 0 +0:4/0 = 0 +2:3/0 = 0 +3:3/0 = 0 +3:4/0 = 0 +2:4/0 = 0 + +[sub_resource type="TileSet" id="TileSet_c4cnm"] +occlusion_layer_0/light_mask = 1 +custom_data_layer_0/name = "mask_area" +custom_data_layer_0/type = 2 +sources/0 = SubResource("TileSetAtlasSource_abfeb") + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_bqxr8"] +texture = ExtResource("2_yqabr") +0:0/0 = 0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +1:0/0 = 0 +1:0/0/physics_layer_2/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +2:0/0 = 0 +2:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:0/0 = 0 +1:1/0 = 0 +1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, 8, -8, 8) +0:1/0 = 0 +0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +2:1/0 = 0 +2:1/0/physics_layer_3/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +3:1/0 = 0 +3:1/0/physics_layer_3/polygon_0/points = PackedVector2Array(-8, -8, 8, 8, -8, 8) +2:2/0 = 0 +2:2/0/physics_layer_3/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) + +[sub_resource type="TileSet" id="TileSet_w160a"] +physics_layer_0/collision_layer = 524288 +physics_layer_0/collision_mask = 33 +physics_layer_1/collision_layer = 2097152 +physics_layer_1/collision_mask = 33 +physics_layer_2/collision_layer = 8388608 +physics_layer_2/collision_mask = 33 +physics_layer_3/collision_layer = 16777216 +physics_layer_3/collision_mask = 33 +custom_data_layer_0/name = "mask_area" +custom_data_layer_0/type = 2 +sources/0 = SubResource("TileSetAtlasSource_bqxr8") + +[sub_resource type="Gradient" id="Gradient_6i250"] +offsets = PackedFloat32Array(0, 0.00258398, 1) +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_l412j"] +gradient = SubResource("Gradient_6i250") +fill = 1 +fill_from = Vector2(0.535613, 0.507123) +fill_to = Vector2(0.874644, 0.11396) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_x3rhj"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6fvd4"] + +[node name="Test_Level_01" type="Node2D" groups=["Level"]] +script = ExtResource("1_a01ci") + +[node name="Rope" parent="." instance=ExtResource("5_ljfjt")] +start_point = Vector2(0, 211) +end_point = Vector2(264, 211) + +[node name="Tile_Group" type="CanvasGroup" parent="." groups=["Tile_Group"]] + +[node name="View_Layer_1" type="TileMapLayer" parent="Tile_Group"] +z_index = 1 +position = Vector2(0, 1) +tile_map_data = PackedByteArray("AAD/////AAADAAAAAAD//wAAAAADAAAAAAD//wEAAAADAAAAAAD//wIAAAADAAAAAAD//wMAAAADAAAAAAD//wQAAAADAAAAAAD//wUAAAADAAAAAAD//wYAAAADAAAAAAD//wcAAAADAAAAAAD//wgAAAADAAAAAAD//wkAAAADAAAAAAD//woAAAADAAAAAAD//wsAAAADAAAAAAD//wwAAAADAAAAAAD//w0AAAADAAAAAAD//w4AAAADAAAAAAD//w8AAAADAAAAAAD//xAAAAADAAAAAAD//xEAAAADAAAAAAD//xIAAAADAAAAAAD//xMAAAADAAAAAAD//xQAAAADAAAAAAD//xUAAAADAAAAAAD//xYAAAADAAAAAAD//xcAAAADAAAAAAD//xgAAAADAAAAAAD//xkAAAADAAAAAAD//xoAAAADAAAAAAD//xsAAAADAAAAAAD//xwAAAACAAIAAAD//x0AAAACAAIAAAAAAP//AAADAAAAAAAAAAAAAAADAAQAAAAAAAEAAAADAAMAAAAAAAIAAAADAAQAAAAAAAMAAAACAAQAAAAAAAQAAAACAAMAAAAAAAUAAAADAAMAAAAAAAYAAAACAAQAAAAAAAcAAAACAAQAAAAAAAgAAAADAAQAAAAAAAkAAAACAAMAAAAAAAoAAAACAAMAAAAAAAsAAAACAAQAAAAAAAwAAAADAAMAAAAAAA0AAAACAAMAAAAAAA4AAAADAAQAAAAAAA8AAAACAAQAAAAAABAAAAACAAQAAAAAABEAAAADAAQAAAAAABIAAAADAAMAAAAAABMAAAADAAMAAAAAABQAAAADAAQAAAAAABUAAAADAAMAAAAAABYAAAACAAQAAAAAABcAAAACAAMAAAAAABgAAAACAAQAAAAAABkAAAACAAQAAAAAABoAAAADAAQAAAAAABsAAAADAAQAAAAAABwAAAACAAIAAAAAAB0AAAACAAIAAAABAP//AAADAAAAAAABAAAAAAACAAQAAAABAAEAAAACAAQAAAABAAIAAAADAAQAAAABAAMAAAADAAMAAAABAAQAAAADAAQAAAABAAUAAAADAAQAAAABAAYAAAACAAMAAAABAAcAAAADAAQAAAABAAgAAAACAAQAAAABAAkAAAACAAQAAAABAAoAAAADAAQAAAABAAsAAAACAAMAAAABAAwAAAADAAMAAAABAA0AAAACAAQAAAABAA4AAAACAAQAAAABAA8AAAADAAMAAAABABAAAAADAAMAAAABABEAAAADAAMAAAABABIAAAACAAMAAAABABMAAAADAAQAAAABABQAAAADAAMAAAABABUAAAACAAMAAAABABYAAAADAAQAAAABABcAAAADAAQAAAABABgAAAADAAMAAAABABkAAAACAAQAAAABABoAAAACAAMAAAABABsAAAADAAMAAAABABwAAAACAAIAAAABAB0AAAACAAIAAAACAP//AAADAAAAAAACAAAAAAADAAQAAAACAAEAAAADAAMAAAACAAIAAAACAAQAAAACAAMAAAACAAQAAAACAAQAAAADAAMAAAACAAUAAAADAAQAAAACAAYAAAADAAMAAAACAAcAAAACAAMAAAACAAgAAAADAAQAAAACAAkAAAACAAQAAAACAAoAAAACAAMAAAACAAsAAAADAAMAAAACAAwAAAACAAQAAAACAA0AAAADAAMAAAACAA4AAAADAAQAAAACAA8AAAACAAMAAAACABAAAAACAAQAAAACABEAAAACAAMAAAACABIAAAADAAQAAAACABMAAAADAAMAAAACABQAAAADAAMAAAACABUAAAADAAQAAAACABYAAAACAAQAAAACABcAAAADAAQAAAACABgAAAACAAMAAAACABkAAAADAAMAAAACABoAAAADAAMAAAACABsAAAACAAMAAAACABwAAAACAAIAAAACAB0AAAACAAIAAAADAP//AAADAAAAAAADAAAAAAADAAQAAAADAAEAAAACAAMAAAADAAIAAAADAAQAAAADAAMAAAADAAMAAAADAAQAAAADAAMAAAADAAUAAAADAAQAAAADAAYAAAACAAQAAAADAAcAAAACAAQAAAADAAgAAAACAAQAAAADAAkAAAACAAMAAAADAAoAAAADAAQAAAADAAsAAAACAAQAAAADAAwAAAADAAMAAAADAA0AAAADAAQAAAADAA4AAAACAAMAAAADAA8AAAACAAMAAAADABAAAAADAAMAAAADABEAAAACAAQAAAADABIAAAADAAQAAAADABMAAAADAAQAAAADABQAAAADAAMAAAADABUAAAACAAMAAAADABYAAAACAAQAAAADABcAAAACAAQAAAADABgAAAACAAMAAAADABkAAAADAAMAAAADABoAAAADAAMAAAADABsAAAADAAMAAAADABwAAAACAAIAAAADAB0AAAACAAIAAAAEAP//AAADAAAAAAAEAAAAAAADAAQAAAAEAAEAAAADAAQAAAAEAAIAAAACAAMAAAAEAAMAAAACAAMAAAAEAAQAAAADAAQAAAAEAAUAAAACAAQAAAAEAAYAAAADAAMAAAAEAAcAAAACAAQAAAAEAAgAAAADAAMAAAAEAAkAAAADAAQAAAAEAAoAAAADAAQAAAAEAAsAAAACAAQAAAAEAAwAAAACAAMAAAAEAA0AAAACAAMAAAAEAA4AAAADAAMAAAAEAA8AAAADAAQAAAAEABAAAAACAAQAAAAEABEAAAACAAMAAAAEABIAAAADAAMAAAAEABMAAAADAAMAAAAEABQAAAADAAQAAAAEABUAAAACAAQAAAAEABYAAAADAAQAAAAEABcAAAACAAMAAAAEABgAAAADAAMAAAAEABkAAAADAAMAAAAEABoAAAACAAQAAAAEABsAAAADAAQAAAAEABwAAAACAAIAAAAEAB0AAAACAAIAAAAFAP//AAADAAAAAAAFAAAAAAACAAQAAAAFAAEAAAACAAMAAAAFAAIAAAACAAMAAAAFAAMAAAACAAQAAAAFAAQAAAADAAMAAAAFAAUAAAADAAQAAAAFAAYAAAADAAQAAAAFAAcAAAACAAMAAAAFAAgAAAADAAMAAAAFAAkAAAACAAQAAAAFAAoAAAADAAMAAAAFAAsAAAADAAQAAAAFAAwAAAACAAMAAAAFAA0AAAACAAMAAAAFAA4AAAADAAMAAAAFAA8AAAACAAQAAAAFABAAAAACAAQAAAAFABEAAAACAAQAAAAFABIAAAACAAMAAAAFABMAAAADAAQAAAAFABQAAAADAAQAAAAFABUAAAADAAQAAAAFABYAAAADAAMAAAAFABcAAAADAAQAAAAFABgAAAACAAQAAAAFABkAAAACAAMAAAAFABoAAAACAAQAAAAFABsAAAACAAMAAAAFABwAAAACAAIAAAAFAB0AAAACAAIAAAAGAP//AAADAAAAAAAGAAAAAAACAAQAAAAGAAEAAAADAAQAAAAGAAIAAAADAAMAAAAGAAMAAAADAAMAAAAGAAQAAAACAAQAAAAGAAUAAAACAAMAAAAGAAYAAAADAAMAAAAGAAcAAAADAAQAAAAGAAgAAAACAAQAAAAGAAkAAAADAAQAAAAGAAoAAAACAAQAAAAGAAsAAAACAAQAAAAGAAwAAAACAAQAAAAGAA0AAAACAAQAAAAGAA4AAAADAAQAAAAGAA8AAAADAAQAAAAGABAAAAADAAMAAAAGABEAAAADAAMAAAAGABIAAAACAAQAAAAGABMAAAACAAQAAAAGABQAAAACAAMAAAAGABUAAAACAAQAAAAGABYAAAACAAQAAAAGABcAAAADAAQAAAAGABgAAAADAAMAAAAGABkAAAACAAMAAAAGABoAAAACAAQAAAAGABsAAAACAAQAAAAGABwAAAACAAIAAAAGAB0AAAACAAIAAAAHAP//AAADAAAAAAAHAAAAAAACAAQAAAAHAAEAAAADAAMAAAAHAAIAAAACAAQAAAAHAAMAAAACAAQAAAAHAAQAAAACAAMAAAAHAAUAAAACAAQAAAAHAAYAAAADAAMAAAAHAAcAAAADAAQAAAAHAAgAAAACAAQAAAAHAAkAAAADAAMAAAAHAAoAAAADAAQAAAAHAAsAAAADAAMAAAAHAAwAAAADAAMAAAAHAA0AAAADAAMAAAAHAA4AAAADAAMAAAAHAA8AAAADAAQAAAAHABAAAAADAAMAAAAHABEAAAADAAMAAAAHABIAAAADAAMAAAAHABMAAAADAAQAAAAHABQAAAACAAMAAAAHABUAAAADAAMAAAAHABYAAAADAAMAAAAHABcAAAADAAMAAAAHABgAAAACAAQAAAAHABkAAAACAAMAAAAHABoAAAACAAQAAAAHABsAAAADAAMAAAAHABwAAAACAAIAAAAHAB0AAAACAAIAAAAIAP//AAADAAAAAAAIAAAAAAACAAQAAAAIAAEAAAACAAQAAAAIAAIAAAADAAQAAAAIAAMAAAADAAMAAAAIAAQAAAADAAQAAAAIAAUAAAADAAMAAAAIAAYAAAADAAMAAAAIAAcAAAADAAQAAAAIAAgAAAADAAQAAAAIAAkAAAADAAMAAAAIAAoAAAADAAMAAAAIAAsAAAADAAMAAAAIAAwAAAADAAQAAAAIAA0AAAADAAQAAAAIAA4AAAADAAMAAAAIAA8AAAADAAMAAAAIABAAAAACAAQAAAAIABEAAAADAAMAAAAIABIAAAACAAQAAAAIABMAAAADAAQAAAAIABQAAAACAAQAAAAIABUAAAACAAQAAAAIABYAAAADAAQAAAAIABcAAAACAAMAAAAIABgAAAACAAMAAAAIABkAAAADAAMAAAAIABoAAAADAAQAAAAIABsAAAACAAQAAAAIABwAAAACAAIAAAAIAB0AAAACAAIAAAAJAP//AAADAAAAAAAJAAAAAAACAAMAAAAJAAEAAAADAAQAAAAJAAIAAAADAAMAAAAJAAMAAAADAAQAAAAJAAQAAAACAAQAAAAJAAUAAAADAAQAAAAJAAYAAAACAAQAAAAJAAcAAAACAAQAAAAJAAgAAAADAAQAAAAJAAkAAAACAAMAAAAJAAoAAAADAAMAAAAJAAsAAAADAAQAAAAJAAwAAAADAAMAAAAJAA0AAAADAAMAAAAJAA4AAAACAAMAAAAJAA8AAAADAAMAAAAJABAAAAADAAMAAAAJABEAAAADAAMAAAAJABIAAAADAAQAAAAJABMAAAADAAMAAAAJABQAAAADAAMAAAAJABUAAAACAAMAAAAJABYAAAACAAQAAAAJABcAAAADAAMAAAAJABgAAAADAAQAAAAJABkAAAADAAMAAAAJABoAAAACAAQAAAAJABsAAAACAAQAAAAJABwAAAACAAIAAAAJAB0AAAACAAIAAAAKAP//AAADAAAAAAAKAAAAAAADAAMAAAAKAAEAAAACAAQAAAAKAAIAAAACAAMAAAAKAAMAAAADAAMAAAAKAAQAAAADAAMAAAAKAAUAAAACAAMAAAAKAAYAAAADAAMAAAAKAAcAAAADAAMAAAAKAAgAAAADAAQAAAAKAAkAAAACAAMAAAAKAAoAAAACAAMAAAAKAAsAAAADAAMAAAAKAAwAAAADAAQAAAAKAA0AAAACAAQAAAAKAA4AAAADAAQAAAAKAA8AAAADAAQAAAAKABAAAAADAAMAAAAKABEAAAACAAQAAAAKABIAAAADAAQAAAAKABMAAAACAAMAAAAKABQAAAADAAQAAAAKABUAAAACAAQAAAAKABYAAAACAAMAAAAKABcAAAADAAQAAAAKABgAAAADAAMAAAAKABkAAAADAAQAAAAKABoAAAACAAMAAAAKABsAAAADAAQAAAAKABwAAAACAAIAAAAKAB0AAAACAAIAAAALAP//AAADAAAAAAALAAAAAAACAAMAAAALAAEAAAADAAQAAAALAAIAAAADAAMAAAALAAMAAAADAAMAAAALAAQAAAADAAQAAAALAAUAAAADAAMAAAALAAYAAAACAAQAAAALAAcAAAADAAQAAAALAAgAAAACAAMAAAALAAkAAAADAAQAAAALAAoAAAACAAMAAAALAAsAAAACAAMAAAALAAwAAAADAAQAAAALAA0AAAACAAQAAAALAA4AAAACAAQAAAALAA8AAAADAAQAAAALABAAAAACAAQAAAALABEAAAADAAMAAAALABIAAAACAAMAAAALABMAAAACAAQAAAALABQAAAACAAMAAAALABUAAAADAAMAAAALABYAAAACAAQAAAALABcAAAADAAQAAAALABgAAAACAAQAAAALABkAAAADAAMAAAALABoAAAACAAMAAAALABsAAAADAAMAAAALABwAAAACAAIAAAALAB0AAAACAAIAAAAMAP//AAADAAAAAAAMAAAAAAACAAQAAAAMAAEAAAACAAMAAAAMAAIAAAACAAQAAAAMAAMAAAADAAQAAAAMAAQAAAACAAMAAAAMAAUAAAACAAMAAAAMAAYAAAADAAMAAAAMAAcAAAADAAQAAAAMAAgAAAADAAQAAAAMAAkAAAACAAMAAAAMAAoAAAADAAMAAAAMAAsAAAADAAQAAAAMAAwAAAADAAMAAAAMAA0AAAADAAQAAAAMAA4AAAACAAQAAAAMAA8AAAACAAQAAAAMABAAAAACAAMAAAAMABEAAAADAAQAAAAMABIAAAACAAMAAAAMABMAAAACAAMAAAAMABQAAAADAAMAAAAMABUAAAACAAMAAAAMABYAAAACAAMAAAAMABcAAAACAAMAAAAMABgAAAADAAMAAAAMABkAAAADAAQAAAAMABoAAAADAAQAAAAMABsAAAADAAMAAAAMABwAAAACAAIAAAAMAB0AAAACAAIAAAANAP//AAADAAAAAAANAAAAAAADAAQAAAANAAEAAAACAAMAAAANAAIAAAACAAMAAAANAAMAAAACAAQAAAANAAQAAAADAAMAAAANAAUAAAACAAQAAAANAAYAAAACAAQAAAANAAcAAAADAAMAAAANAAgAAAACAAQAAAANAAkAAAACAAQAAAANAAoAAAACAAQAAAANAAsAAAADAAQAAAANAAwAAAADAAQAAAANAA0AAAADAAMAAAANAA4AAAACAAMAAAANAA8AAAADAAQAAAANABAAAAADAAQAAAANABEAAAADAAQAAAANABIAAAADAAMAAAANABMAAAADAAMAAAANABQAAAADAAQAAAANABUAAAACAAQAAAANABYAAAADAAQAAAANABcAAAADAAMAAAANABgAAAACAAMAAAANABkAAAACAAMAAAANABoAAAADAAMAAAANABsAAAADAAMAAAANABwAAAACAAIAAAANAB0AAAACAAIAAAAOAP//AAADAAAAAAAOAAAAAAADAAMAAAAOAAEAAAACAAMAAAAOAAIAAAADAAQAAAAOAAMAAAADAAQAAAAOAAQAAAADAAMAAAAOAAUAAAACAAMAAAAOAAYAAAADAAMAAAAOAAcAAAADAAQAAAAOAAgAAAADAAQAAAAOAAkAAAADAAQAAAAOAAoAAAACAAQAAAAOAAsAAAACAAMAAAAOAAwAAAADAAQAAAAOAA0AAAACAAQAAAAOAA4AAAACAAMAAAAOAA8AAAACAAMAAAAOABAAAAADAAQAAAAOABEAAAADAAMAAAAOABIAAAACAAMAAAAOABMAAAADAAQAAAAOABQAAAACAAMAAAAOABUAAAACAAQAAAAOABYAAAACAAQAAAAOABcAAAADAAQAAAAOABgAAAADAAQAAAAOABkAAAADAAQAAAAOABoAAAACAAMAAAAOABsAAAACAAQAAAAOABwAAAACAAIAAAAOAB0AAAACAAIAAAAPAP//AAADAAAAAAAPAAAAAAADAAQAAAAPAAEAAAADAAMAAAAPAAIAAAACAAQAAAAPAAMAAAADAAQAAAAPAAQAAAACAAQAAAAPAAUAAAADAAQAAAAPAAYAAAADAAQAAAAPAAcAAAACAAQAAAAPAAgAAAADAAMAAAAPAAkAAAADAAQAAAAPAAoAAAACAAQAAAAPAAsAAAACAAMAAAAPAAwAAAACAAQAAAAPAA0AAAADAAQAAAAPAA4AAAACAAMAAAAPAA8AAAACAAQAAAAPABAAAAACAAQAAAAPABEAAAADAAQAAAAPABIAAAACAAMAAAAPABMAAAADAAQAAAAPABQAAAACAAQAAAAPABUAAAACAAQAAAAPABYAAAACAAMAAAAPABcAAAACAAMAAAAPABgAAAADAAQAAAAPABkAAAACAAQAAAAPABoAAAACAAQAAAAPABsAAAADAAMAAAAPABwAAAACAAIAAAAPAB0AAAACAAIAAAAQAP//AAADAAAAAAAQAAAAAAADAAMAAAAQAAEAAAADAAQAAAAQAAIAAAACAAQAAAAQAAMAAAACAAMAAAAQAAQAAAADAAQAAAAQAAUAAAADAAQAAAAQAAYAAAACAAMAAAAQAAcAAAACAAMAAAAQAAgAAAADAAMAAAAQAAkAAAADAAQAAAAQAAoAAAACAAQAAAAQAAsAAAADAAQAAAAQAAwAAAADAAQAAAAQAA0AAAADAAMAAAAQAA4AAAACAAMAAAAQAA8AAAADAAQAAAAQABAAAAADAAQAAAAQABEAAAACAAQAAAAQABIAAAADAAQAAAAQABMAAAACAAQAAAAQABQAAAACAAMAAAAQABUAAAACAAMAAAAQABYAAAADAAMAAAAQABcAAAADAAMAAAAQABgAAAACAAMAAAAQABkAAAADAAMAAAAQABoAAAACAAQAAAAQABsAAAACAAQAAAAQABwAAAACAAIAAAAQAB0AAAACAAIAAAARAP//AAADAAAAAAARAAAAAAACAAQAAAARAAEAAAACAAMAAAARAAIAAAADAAQAAAARAAMAAAADAAMAAAARAAQAAAADAAMAAAARAAUAAAADAAMAAAARAAYAAAACAAQAAAARAAcAAAACAAQAAAARAAgAAAACAAMAAAARAAkAAAADAAMAAAARAAoAAAACAAMAAAARAAsAAAACAAMAAAARAAwAAAACAAQAAAARAA0AAAACAAMAAAARAA4AAAADAAQAAAARAA8AAAACAAQAAAARABAAAAACAAMAAAARABEAAAADAAQAAAARABIAAAADAAQAAAARABMAAAADAAMAAAARABQAAAADAAMAAAARABUAAAADAAQAAAARABYAAAACAAQAAAARABcAAAADAAQAAAARABgAAAACAAMAAAARABkAAAACAAMAAAARABoAAAADAAQAAAARABsAAAADAAQAAAARABwAAAACAAIAAAARAB0AAAACAAIAAAASAP//AAADAAAAAAASAAAAAAACAAQAAAASAAEAAAADAAMAAAASAAIAAAACAAMAAAASAAMAAAACAAMAAAASAAQAAAADAAQAAAASAAUAAAACAAMAAAASAAYAAAADAAQAAAASAAcAAAADAAQAAAASAAgAAAADAAQAAAASAAkAAAACAAMAAAASAAoAAAADAAQAAAASAAsAAAACAAQAAAASAAwAAAADAAQAAAASAA0AAAADAAMAAAASAA4AAAACAAQAAAASAA8AAAADAAMAAAASABAAAAADAAQAAAASABEAAAADAAQAAAASABIAAAADAAMAAAASABMAAAADAAQAAAASABQAAAADAAMAAAASABUAAAACAAMAAAASABYAAAACAAMAAAASABcAAAADAAQAAAASABgAAAACAAQAAAASABkAAAACAAQAAAASABoAAAACAAQAAAASABsAAAACAAQAAAASABwAAAACAAIAAAASAB0AAAACAAIAAAATAP//AAADAAAAAAATAAAAAAACAAQAAAATAAEAAAADAAQAAAATAAIAAAADAAQAAAATAAMAAAADAAQAAAATAAQAAAACAAMAAAATAAUAAAADAAQAAAATAAYAAAACAAMAAAATAAcAAAADAAQAAAATAAgAAAADAAQAAAATAAkAAAACAAMAAAATAAoAAAADAAMAAAATAAsAAAACAAMAAAATAAwAAAADAAMAAAATAA0AAAADAAMAAAATAA4AAAACAAQAAAATAA8AAAACAAQAAAATABAAAAACAAMAAAATABEAAAACAAQAAAATABIAAAACAAMAAAATABMAAAADAAQAAAATABQAAAADAAQAAAATABUAAAACAAQAAAATABYAAAACAAMAAAATABcAAAACAAMAAAATABgAAAACAAMAAAATABkAAAADAAMAAAATABoAAAACAAMAAAATABsAAAACAAMAAAATABwAAAACAAIAAAATAB0AAAACAAIAAAAUAP//AAADAAAAAAAUAAAAAAACAAMAAAAUAAEAAAACAAQAAAAUAAIAAAADAAQAAAAUAAMAAAACAAMAAAAUAAQAAAACAAQAAAAUAAUAAAACAAMAAAAUAAYAAAACAAMAAAAUAAcAAAADAAQAAAAUAAgAAAADAAMAAAAUAAkAAAACAAQAAAAUAAoAAAACAAMAAAAUAAsAAAADAAQAAAAUAAwAAAADAAMAAAAUAA0AAAADAAQAAAAUAA4AAAACAAQAAAAUAA8AAAACAAQAAAAUABAAAAADAAMAAAAUABEAAAADAAQAAAAUABIAAAACAAMAAAAUABMAAAADAAQAAAAUABQAAAACAAMAAAAUABUAAAADAAMAAAAUABYAAAADAAQAAAAUABcAAAADAAMAAAAUABgAAAACAAMAAAAUABkAAAADAAQAAAAUABoAAAACAAMAAAAUABsAAAACAAMAAAAUABwAAAACAAIAAAAUAB0AAAACAAIAAAAVAP//AAADAAAAAAAVAAAAAAADAAQAAAAVAAEAAAACAAQAAAAVAAIAAAACAAQAAAAVAAMAAAADAAQAAAAVAAQAAAACAAQAAAAVAAUAAAADAAQAAAAVAAYAAAACAAMAAAAVAAcAAAADAAMAAAAVAAgAAAADAAQAAAAVAAkAAAADAAMAAAAVAAoAAAADAAQAAAAVAAsAAAADAAMAAAAVAAwAAAADAAQAAAAVAA0AAAACAAQAAAAVAA4AAAADAAMAAAAVAA8AAAACAAMAAAAVABAAAAADAAMAAAAVABEAAAACAAQAAAAVABIAAAADAAMAAAAVABMAAAACAAQAAAAVABQAAAADAAMAAAAVABUAAAADAAQAAAAVABYAAAACAAQAAAAVABcAAAADAAMAAAAVABgAAAACAAQAAAAVABkAAAADAAQAAAAVABoAAAACAAQAAAAVABsAAAACAAQAAAAVABwAAAACAAIAAAAVAB0AAAACAAIAAAAWAP//AAADAAAAAAAWAAAAAAACAAMAAAAWAAEAAAACAAQAAAAWAAIAAAACAAQAAAAWAAMAAAACAAQAAAAWAAQAAAADAAMAAAAWAAUAAAACAAMAAAAWAAYAAAACAAQAAAAWAAcAAAADAAQAAAAWAAgAAAADAAMAAAAWAAkAAAADAAMAAAAWAAoAAAACAAMAAAAWAAsAAAADAAQAAAAWAAwAAAADAAQAAAAWAA0AAAACAAQAAAAWAA4AAAADAAQAAAAWAA8AAAACAAQAAAAWABAAAAADAAMAAAAWABEAAAACAAMAAAAWABIAAAADAAMAAAAWABMAAAADAAQAAAAWABQAAAACAAQAAAAWABUAAAACAAQAAAAWABYAAAADAAQAAAAWABcAAAADAAMAAAAWABgAAAACAAMAAAAWABkAAAACAAMAAAAWABoAAAACAAMAAAAWABsAAAADAAMAAAAWABwAAAACAAIAAAAWAB0AAAACAAIAAAAXAP//AAADAAAAAAAXAAAAAAADAAQAAAAXAAEAAAACAAMAAAAXAAIAAAACAAQAAAAXAAMAAAACAAMAAAAXAAQAAAADAAMAAAAXAAUAAAADAAQAAAAXAAYAAAADAAQAAAAXAAcAAAACAAMAAAAXAAgAAAACAAMAAAAXAAkAAAADAAMAAAAXAAoAAAACAAMAAAAXAAsAAAACAAQAAAAXAAwAAAADAAQAAAAXAA0AAAADAAQAAAAXAA4AAAACAAQAAAAXAA8AAAACAAQAAAAXABAAAAACAAMAAAAXABEAAAACAAMAAAAXABIAAAADAAMAAAAXABMAAAACAAMAAAAXABQAAAACAAMAAAAXABUAAAACAAQAAAAXABYAAAACAAQAAAAXABcAAAACAAQAAAAXABgAAAACAAMAAAAXABkAAAACAAMAAAAXABoAAAADAAQAAAAXABsAAAADAAMAAAAXABwAAAACAAIAAAAXAB0AAAACAAIAAAAYAP//AAADAAAAAAAYAAAAAAACAAMAAAAYAAEAAAACAAMAAAAYAAIAAAACAAQAAAAYAAMAAAADAAMAAAAYAAQAAAADAAMAAAAYAAUAAAACAAMAAAAYAAYAAAADAAMAAAAYAAcAAAADAAQAAAAYAAgAAAACAAQAAAAYAAkAAAADAAQAAAAYAAoAAAADAAQAAAAYAAsAAAACAAMAAAAYAAwAAAADAAQAAAAYAA0AAAACAAQAAAAYAA4AAAACAAMAAAAYAA8AAAADAAQAAAAYABAAAAADAAMAAAAYABEAAAACAAMAAAAYABIAAAACAAQAAAAYABMAAAADAAQAAAAYABQAAAACAAMAAAAYABUAAAACAAMAAAAYABYAAAADAAMAAAAYABcAAAACAAMAAAAYABgAAAACAAQAAAAYABkAAAACAAQAAAAYABoAAAACAAQAAAAYABsAAAADAAMAAAAYABwAAAACAAIAAAAYAB0AAAACAAIAAAAZAP//AAADAAAAAAAZAAAAAAACAAMAAAAZAAEAAAADAAMAAAAZAAIAAAACAAQAAAAZAAMAAAADAAMAAAAZAAQAAAACAAMAAAAZAAUAAAADAAMAAAAZAAYAAAADAAQAAAAZAAcAAAADAAMAAAAZAAgAAAACAAMAAAAZAAkAAAACAAQAAAAZAAoAAAADAAMAAAAZAAsAAAACAAQAAAAZAAwAAAADAAMAAAAZAA0AAAADAAMAAAAZAA4AAAACAAMAAAAZAA8AAAACAAQAAAAZABAAAAACAAQAAAAZABEAAAADAAQAAAAZABIAAAACAAQAAAAZABMAAAADAAMAAAAZABQAAAACAAMAAAAZABUAAAADAAQAAAAZABYAAAACAAMAAAAZABcAAAACAAQAAAAZABgAAAACAAQAAAAZABkAAAACAAMAAAAZABoAAAACAAQAAAAZABsAAAADAAMAAAAZABwAAAACAAIAAAAZAB0AAAACAAIAAAAaAP//AAADAAAAAAAaAAAAAAADAAMAAAAaAAEAAAADAAQAAAAaAAIAAAADAAMAAAAaAAMAAAADAAMAAAAaAAQAAAACAAMAAAAaAAUAAAADAAMAAAAaAAYAAAADAAQAAAAaAAcAAAACAAMAAAAaAAgAAAACAAQAAAAaAAkAAAACAAQAAAAaAAoAAAADAAMAAAAaAAsAAAACAAQAAAAaAAwAAAACAAMAAAAaAA0AAAADAAMAAAAaAA4AAAACAAMAAAAaAA8AAAACAAMAAAAaABAAAAADAAQAAAAaABEAAAACAAQAAAAaABIAAAADAAQAAAAaABMAAAADAAMAAAAaABQAAAADAAMAAAAaABUAAAADAAMAAAAaABYAAAADAAMAAAAaABcAAAADAAQAAAAaABgAAAADAAMAAAAaABkAAAADAAQAAAAaABoAAAACAAQAAAAaABsAAAADAAMAAAAaABwAAAACAAIAAAAaAB0AAAACAAIAAAAbAP//AAADAAAAAAAbAAAAAAACAAMAAAAbAAEAAAACAAQAAAAbAAIAAAADAAQAAAAbAAMAAAADAAMAAAAbAAQAAAADAAMAAAAbAAUAAAACAAQAAAAbAAYAAAACAAMAAAAbAAcAAAACAAQAAAAbAAgAAAACAAQAAAAbAAkAAAADAAQAAAAbAAoAAAACAAQAAAAbAAsAAAACAAQAAAAbAAwAAAADAAMAAAAbAA0AAAACAAQAAAAbAA4AAAACAAMAAAAbAA8AAAACAAMAAAAbABAAAAACAAMAAAAbABEAAAACAAMAAAAbABIAAAACAAMAAAAbABMAAAACAAQAAAAbABQAAAACAAMAAAAbABUAAAACAAQAAAAbABYAAAACAAQAAAAbABcAAAADAAMAAAAbABgAAAACAAMAAAAbABkAAAADAAMAAAAbABoAAAADAAQAAAAbABsAAAADAAMAAAAbABwAAAACAAIAAAAbAB0AAAACAAIAAAAcAP//AAADAAAAAAAcAAAAAAADAAQAAAAcAAEAAAADAAQAAAAcAAIAAAADAAMAAAAcAAMAAAADAAMAAAAcAAQAAAADAAQAAAAcAAUAAAADAAQAAAAcAAYAAAADAAMAAAAcAAcAAAACAAMAAAAcAAgAAAADAAQAAAAcAAkAAAADAAQAAAAcAAoAAAACAAMAAAAcAAsAAAADAAQAAAAcAAwAAAACAAMAAAAcAA0AAAADAAQAAAAcAA4AAAADAAQAAAAcAA8AAAACAAMAAAAcABAAAAADAAQAAAAcABEAAAACAAQAAAAcABIAAAADAAMAAAAcABMAAAADAAQAAAAcABQAAAADAAMAAAAcABUAAAACAAMAAAAcABYAAAACAAQAAAAcABcAAAACAAQAAAAcABgAAAACAAMAAAAcABkAAAACAAMAAAAcABoAAAACAAMAAAAcABsAAAADAAQAAAAcABwAAAACAAIAAAAcAB0AAAACAAIAAAAdAP//AAADAAAAAAAdAAAAAAADAAQAAAAdAAEAAAADAAMAAAAdAAIAAAACAAQAAAAdAAMAAAACAAQAAAAdAAQAAAADAAQAAAAdAAUAAAADAAQAAAAdAAYAAAADAAMAAAAdAAcAAAACAAMAAAAdAAgAAAADAAMAAAAdAAkAAAACAAMAAAAdAAoAAAADAAMAAAAdAAsAAAADAAQAAAAdAAwAAAADAAQAAAAdAA0AAAACAAQAAAAdAA4AAAADAAMAAAAdAA8AAAACAAQAAAAdABAAAAACAAQAAAAdABEAAAACAAQAAAAdABIAAAADAAQAAAAdABMAAAADAAMAAAAdABQAAAACAAQAAAAdABUAAAADAAMAAAAdABYAAAADAAQAAAAdABcAAAADAAQAAAAdABgAAAADAAQAAAAdABkAAAADAAMAAAAdABoAAAADAAMAAAAdABsAAAADAAQAAAAdABwAAAACAAIAAAAdAB0AAAACAAIAAAAeAP//AAADAAAAAAAeAAAAAAACAAMAAAAeAAEAAAADAAQAAAAeAAIAAAACAAQAAAAeAAMAAAADAAQAAAAeAAQAAAACAAMAAAAeAAUAAAADAAQAAAAeAAYAAAACAAQAAAAeAAcAAAADAAQAAAAeAAgAAAADAAQAAAAeAAkAAAACAAMAAAAeAAoAAAACAAQAAAAeAAsAAAACAAQAAAAeAAwAAAACAAMAAAAeAA0AAAADAAQAAAAeAA4AAAADAAQAAAAeAA8AAAACAAQAAAAeABAAAAACAAQAAAAeABEAAAADAAMAAAAeABIAAAADAAMAAAAeABMAAAADAAQAAAAeABQAAAACAAMAAAAeABUAAAADAAQAAAAeABYAAAADAAQAAAAeABcAAAADAAQAAAAeABgAAAACAAQAAAAeABkAAAADAAQAAAAeABoAAAACAAQAAAAeABsAAAADAAQAAAAeABwAAAACAAIAAAAeAB0AAAACAAIAAAAfAP//AAADAAAAAAAfAAAAAAACAAQAAAAfAAEAAAADAAQAAAAfAAIAAAADAAQAAAAfAAMAAAACAAMAAAAfAAQAAAACAAMAAAAfAAUAAAADAAQAAAAfAAYAAAADAAMAAAAfAAcAAAADAAQAAAAfAAgAAAACAAQAAAAfAAkAAAADAAQAAAAfAAoAAAACAAQAAAAfAAsAAAACAAQAAAAfAAwAAAADAAQAAAAfAA0AAAACAAMAAAAfAA4AAAACAAMAAAAfAA8AAAADAAQAAAAfABAAAAADAAMAAAAfABEAAAACAAQAAAAfABIAAAACAAMAAAAfABMAAAACAAQAAAAfABQAAAACAAMAAAAfABUAAAADAAMAAAAfABYAAAADAAQAAAAfABcAAAADAAMAAAAfABgAAAACAAMAAAAfABkAAAACAAMAAAAfABoAAAACAAMAAAAfABsAAAACAAQAAAAfABwAAAACAAIAAAAfAB0AAAACAAIAAAAgAP//AAADAAAAAAAgAAAAAAACAAQAAAAgAAEAAAACAAQAAAAgAAIAAAACAAMAAAAgAAMAAAADAAQAAAAgAAQAAAACAAQAAAAgAAUAAAACAAQAAAAgAAYAAAACAAMAAAAgAAcAAAADAAQAAAAgAAgAAAACAAMAAAAgAAkAAAADAAMAAAAgAAoAAAADAAMAAAAgAAsAAAACAAQAAAAgAAwAAAACAAQAAAAgAA0AAAADAAMAAAAgAA4AAAADAAMAAAAgAA8AAAACAAQAAAAgABAAAAADAAQAAAAgABEAAAADAAMAAAAgABIAAAACAAMAAAAgABMAAAADAAQAAAAgABQAAAADAAQAAAAgABUAAAACAAMAAAAgABYAAAADAAQAAAAgABcAAAACAAMAAAAgABgAAAADAAQAAAAgABkAAAADAAMAAAAgABoAAAACAAMAAAAgABsAAAADAAMAAAAgABwAAAACAAIAAAAgAB0AAAACAAIAAAAhAP//AAADAAAAAAAhAAAAAAADAAQAAAAhAAEAAAACAAMAAAAhAAIAAAACAAQAAAAhAAMAAAADAAQAAAAhAAQAAAADAAMAAAAhAAUAAAADAAMAAAAhAAYAAAADAAMAAAAhAAcAAAADAAQAAAAhAAgAAAACAAQAAAAhAAkAAAADAAMAAAAhAAoAAAACAAMAAAAhAAsAAAADAAQAAAAhAAwAAAACAAMAAAAhAA0AAAADAAMAAAAhAA4AAAACAAQAAAAhAA8AAAADAAQAAAAhABAAAAACAAQAAAAhABEAAAADAAQAAAAhABIAAAACAAMAAAAhABMAAAADAAQAAAAhABQAAAADAAMAAAAhABUAAAADAAQAAAAhABYAAAACAAMAAAAhABcAAAADAAMAAAAhABgAAAADAAQAAAAhABkAAAACAAMAAAAhABoAAAADAAMAAAAhABsAAAADAAQAAAAhABwAAAACAAIAAAAhAB0AAAACAAIAAAAiAP//AAADAAAAAAAiAAAAAAACAAQAAAAiAAEAAAACAAQAAAAiAAIAAAADAAQAAAAiAAMAAAADAAQAAAAiAAQAAAACAAMAAAAiAAUAAAADAAMAAAAiAAYAAAACAAMAAAAiAAcAAAADAAQAAAAiAAgAAAACAAQAAAAiAAkAAAADAAMAAAAiAAoAAAADAAMAAAAiAAsAAAACAAMAAAAiAAwAAAACAAQAAAAiAA0AAAADAAQAAAAiAA4AAAADAAMAAAAiAA8AAAADAAQAAAAiABAAAAACAAQAAAAiABEAAAACAAQAAAAiABIAAAADAAMAAAAiABMAAAACAAQAAAAiABQAAAADAAMAAAAiABUAAAACAAMAAAAiABYAAAACAAMAAAAiABcAAAADAAMAAAAiABgAAAADAAQAAAAiABkAAAACAAMAAAAiABoAAAADAAQAAAAiABsAAAACAAMAAAAiABwAAAACAAIAAAAiAB0AAAACAAIAAAAjAP//AAADAAAAAAAjAAAAAAADAAQAAAAjAAEAAAADAAMAAAAjAAIAAAACAAQAAAAjAAMAAAACAAQAAAAjAAQAAAACAAQAAAAjAAUAAAACAAQAAAAjAAYAAAACAAQAAAAjAAcAAAACAAMAAAAjAAgAAAADAAMAAAAjAAkAAAACAAMAAAAjAAoAAAADAAMAAAAjAAsAAAACAAMAAAAjAAwAAAADAAMAAAAjAA0AAAACAAQAAAAjAA4AAAADAAQAAAAjAA8AAAACAAQAAAAjABAAAAACAAMAAAAjABEAAAADAAMAAAAjABIAAAADAAQAAAAjABMAAAACAAQAAAAjABQAAAADAAMAAAAjABUAAAADAAMAAAAjABYAAAADAAQAAAAjABcAAAADAAMAAAAjABgAAAACAAMAAAAjABkAAAADAAMAAAAjABoAAAACAAMAAAAjABsAAAADAAMAAAAjABwAAAACAAIAAAAjAB0AAAACAAIAAAAkAP//AAADAAAAAAAkAAAAAAADAAQAAAAkAAEAAAACAAMAAAAkAAIAAAACAAMAAAAkAAMAAAACAAQAAAAkAAQAAAADAAMAAAAkAAUAAAADAAQAAAAkAAYAAAADAAQAAAAkAAcAAAACAAQAAAAkAAgAAAADAAQAAAAkAAkAAAACAAQAAAAkAAoAAAADAAMAAAAkAAsAAAACAAQAAAAkAAwAAAADAAQAAAAkAA0AAAACAAMAAAAkAA4AAAADAAQAAAAkAA8AAAACAAQAAAAkABAAAAACAAQAAAAkABEAAAADAAQAAAAkABIAAAACAAMAAAAkABMAAAADAAMAAAAkABQAAAACAAMAAAAkABUAAAACAAMAAAAkABYAAAADAAQAAAAkABcAAAADAAQAAAAkABgAAAADAAMAAAAkABkAAAACAAMAAAAkABoAAAADAAMAAAAkABsAAAACAAMAAAAkABwAAAACAAIAAAAkAB0AAAACAAIAAAAlAP//AAADAAAAAAAlAAAAAAADAAMAAAAlAAEAAAADAAMAAAAlAAIAAAACAAMAAAAlAAMAAAADAAMAAAAlAAQAAAACAAQAAAAlAAUAAAACAAMAAAAlAAYAAAACAAQAAAAlAAcAAAADAAMAAAAlAAgAAAACAAQAAAAlAAkAAAADAAQAAAAlAAoAAAADAAQAAAAlAAsAAAADAAQAAAAlAAwAAAACAAMAAAAlAA0AAAACAAMAAAAlAA4AAAADAAQAAAAlAA8AAAADAAMAAAAlABAAAAADAAQAAAAlABEAAAACAAMAAAAlABIAAAACAAQAAAAlABMAAAACAAMAAAAlABQAAAACAAMAAAAlABUAAAACAAMAAAAlABYAAAADAAMAAAAlABcAAAADAAMAAAAlABgAAAADAAMAAAAlABkAAAACAAQAAAAlABoAAAADAAMAAAAlABsAAAADAAMAAAAlABwAAAACAAIAAAAlAB0AAAACAAIAAAAmAP//AAADAAAAAAAmAAAAAAACAAQAAAAmAAEAAAACAAMAAAAmAAIAAAADAAMAAAAmAAMAAAADAAMAAAAmAAQAAAADAAMAAAAmAAUAAAACAAQAAAAmAAYAAAADAAMAAAAmAAcAAAACAAQAAAAmAAgAAAADAAQAAAAmAAkAAAACAAQAAAAmAAoAAAACAAMAAAAmAAsAAAADAAMAAAAmAAwAAAACAAMAAAAmAA0AAAACAAQAAAAmAA4AAAADAAQAAAAmAA8AAAADAAMAAAAmABAAAAACAAMAAAAmABEAAAACAAQAAAAmABIAAAADAAQAAAAmABMAAAADAAMAAAAmABQAAAADAAQAAAAmABUAAAADAAMAAAAmABYAAAACAAMAAAAmABcAAAACAAMAAAAmABgAAAADAAMAAAAmABkAAAACAAMAAAAmABoAAAACAAMAAAAmABsAAAADAAMAAAAmABwAAAACAAIAAAAmAB0AAAACAAIAAAAnAP//AAADAAAAAAAnAAAAAAACAAQAAAAnAAEAAAADAAQAAAAnAAIAAAACAAMAAAAnAAMAAAADAAQAAAAnAAQAAAACAAMAAAAnAAUAAAADAAMAAAAnAAYAAAACAAMAAAAnAAcAAAADAAMAAAAnAAgAAAADAAQAAAAnAAkAAAADAAQAAAAnAAoAAAACAAQAAAAnAAsAAAACAAQAAAAnAAwAAAACAAQAAAAnAA0AAAADAAQAAAAnAA4AAAADAAQAAAAnAA8AAAACAAMAAAAnABAAAAADAAQAAAAnABEAAAADAAQAAAAnABIAAAACAAQAAAAnABMAAAADAAMAAAAnABQAAAACAAQAAAAnABUAAAADAAQAAAAnABYAAAACAAQAAAAnABcAAAACAAMAAAAnABgAAAACAAMAAAAnABkAAAACAAMAAAAnABoAAAACAAMAAAAnABsAAAADAAQAAAAnABwAAAACAAIAAAAnAB0AAAACAAIAAAAoAP//AAADAAAAAAAoAAAAAAADAAQAAAAoAAEAAAACAAMAAAAoAAIAAAACAAMAAAAoAAMAAAADAAQAAAAoAAQAAAADAAMAAAAoAAUAAAACAAMAAAAoAAYAAAADAAMAAAAoAAcAAAADAAMAAAAoAAgAAAACAAQAAAAoAAkAAAADAAQAAAAoAAoAAAACAAMAAAAoAAsAAAACAAQAAAAoAAwAAAADAAQAAAAoAA0AAAADAAQAAAAoAA4AAAADAAMAAAAoAA8AAAACAAMAAAAoABAAAAACAAMAAAAoABEAAAADAAMAAAAoABIAAAACAAMAAAAoABMAAAACAAMAAAAoABQAAAADAAMAAAAoABUAAAACAAQAAAAoABYAAAADAAMAAAAoABcAAAACAAQAAAAoABgAAAADAAMAAAAoABkAAAACAAMAAAAoABoAAAADAAMAAAAoABsAAAADAAQAAAAoABwAAAACAAIAAAAoAB0AAAACAAIAAAApAP//AAADAAAAAAApAAAAAAACAAMAAAApAAEAAAACAAMAAAApAAIAAAACAAMAAAApAAMAAAACAAQAAAApAAQAAAADAAMAAAApAAUAAAADAAQAAAApAAYAAAACAAQAAAApAAcAAAADAAQAAAApAAgAAAACAAQAAAApAAkAAAACAAQAAAApAAoAAAADAAQAAAApAAsAAAADAAMAAAApAAwAAAACAAQAAAApAA0AAAADAAMAAAApAA4AAAADAAQAAAApAA8AAAADAAQAAAApABAAAAADAAMAAAApABEAAAACAAMAAAApABIAAAACAAMAAAApABMAAAADAAMAAAApABQAAAACAAQAAAApABUAAAACAAQAAAApABYAAAACAAQAAAApABcAAAACAAQAAAApABgAAAADAAQAAAApABkAAAADAAQAAAApABoAAAADAAQAAAApABsAAAACAAMAAAApABwAAAACAAIAAAApAB0AAAACAAIAAAAqAP//AAADAAAAAAAqAAAAAAADAAMAAAAqAAEAAAACAAQAAAAqAAIAAAACAAMAAAAqAAMAAAADAAQAAAAqAAQAAAACAAMAAAAqAAUAAAADAAQAAAAqAAYAAAACAAQAAAAqAAcAAAACAAQAAAAqAAgAAAADAAQAAAAqAAkAAAADAAQAAAAqAAoAAAADAAMAAAAqAAsAAAACAAQAAAAqAAwAAAACAAMAAAAqAA0AAAACAAQAAAAqAA4AAAADAAMAAAAqAA8AAAACAAQAAAAqABAAAAACAAQAAAAqABEAAAADAAMAAAAqABIAAAACAAMAAAAqABMAAAACAAMAAAAqABQAAAADAAMAAAAqABUAAAADAAMAAAAqABYAAAACAAMAAAAqABcAAAACAAQAAAAqABgAAAADAAQAAAAqABkAAAACAAMAAAAqABoAAAADAAQAAAAqABsAAAADAAQAAAAqABwAAAACAAIAAAAqAB0AAAACAAIAAAArAP//AAADAAAAAAArAAAAAAADAAQAAAArAAEAAAADAAQAAAArAAIAAAADAAQAAAArAAMAAAADAAQAAAArAAQAAAACAAMAAAArAAUAAAACAAMAAAArAAYAAAADAAQAAAArAAcAAAACAAMAAAArAAgAAAADAAQAAAArAAkAAAADAAQAAAArAAoAAAADAAQAAAArAAsAAAADAAQAAAArAAwAAAADAAQAAAArAA0AAAADAAQAAAArAA4AAAADAAQAAAArAA8AAAADAAQAAAArABAAAAACAAQAAAArABEAAAACAAMAAAArABIAAAADAAMAAAArABMAAAADAAQAAAArABQAAAACAAQAAAArABUAAAACAAMAAAArABYAAAACAAQAAAArABcAAAACAAQAAAArABgAAAADAAQAAAArABkAAAADAAQAAAArABoAAAACAAQAAAArABsAAAADAAMAAAArABwAAAACAAIAAAArAB0AAAACAAIAAAAsAP//AAADAAAAAAAsAAAAAAACAAQAAAAsAAEAAAACAAMAAAAsAAIAAAACAAMAAAAsAAMAAAADAAMAAAAsAAQAAAACAAQAAAAsAAUAAAACAAQAAAAsAAYAAAADAAMAAAAsAAcAAAACAAQAAAAsAAgAAAACAAMAAAAsAAkAAAACAAQAAAAsAAoAAAADAAMAAAAsAAsAAAACAAMAAAAsAAwAAAACAAQAAAAsAA0AAAADAAMAAAAsAA4AAAADAAQAAAAsAA8AAAADAAQAAAAsABAAAAADAAQAAAAsABEAAAACAAMAAAAsABIAAAACAAQAAAAsABMAAAADAAMAAAAsABQAAAACAAQAAAAsABUAAAACAAQAAAAsABYAAAACAAMAAAAsABcAAAACAAQAAAAsABgAAAACAAMAAAAsABkAAAADAAQAAAAsABoAAAADAAQAAAAsABsAAAACAAQAAAAsABwAAAACAAIAAAAsAB0AAAACAAIAAAAtAP//AAADAAAAAAAtAAAAAAACAAMAAAAtAAEAAAACAAQAAAAtAAIAAAADAAMAAAAtAAMAAAACAAMAAAAtAAQAAAADAAMAAAAtAAUAAAACAAQAAAAtAAYAAAADAAMAAAAtAAcAAAACAAQAAAAtAAgAAAADAAMAAAAtAAkAAAACAAMAAAAtAAoAAAACAAMAAAAtAAsAAAADAAQAAAAtAAwAAAADAAQAAAAtAA0AAAACAAQAAAAtAA4AAAADAAMAAAAtAA8AAAACAAMAAAAtABAAAAACAAQAAAAtABEAAAADAAQAAAAtABIAAAACAAQAAAAtABMAAAACAAMAAAAtABQAAAADAAQAAAAtABUAAAADAAQAAAAtABYAAAADAAQAAAAtABcAAAADAAMAAAAtABgAAAADAAQAAAAtABkAAAADAAMAAAAtABoAAAACAAQAAAAtABsAAAACAAQAAAAtABwAAAACAAIAAAAtAB0AAAACAAIAAAAuAP//AAADAAAAAAAuAAAAAAACAAMAAAAuAAEAAAACAAMAAAAuAAIAAAACAAMAAAAuAAMAAAACAAMAAAAuAAQAAAACAAQAAAAuAAUAAAADAAMAAAAuAAYAAAACAAMAAAAuAAcAAAADAAMAAAAuAAgAAAACAAQAAAAuAAkAAAACAAQAAAAuAAoAAAADAAQAAAAuAAsAAAACAAMAAAAuAAwAAAADAAMAAAAuAA0AAAACAAQAAAAuAA4AAAADAAMAAAAuAA8AAAACAAQAAAAuABAAAAADAAMAAAAuABEAAAADAAMAAAAuABIAAAACAAQAAAAuABMAAAACAAQAAAAuABQAAAACAAQAAAAuABUAAAADAAQAAAAuABYAAAACAAMAAAAuABcAAAACAAMAAAAuABgAAAACAAMAAAAuABkAAAADAAMAAAAuABoAAAACAAQAAAAuABsAAAACAAMAAAAuABwAAAACAAIAAAAuAB0AAAACAAIAAAAvAP//AAADAAAAAAAvAAAAAAACAAMAAAAvAAEAAAADAAMAAAAvAAIAAAADAAMAAAAvAAMAAAACAAMAAAAvAAQAAAADAAQAAAAvAAUAAAACAAQAAAAvAAYAAAADAAQAAAAvAAcAAAACAAQAAAAvAAgAAAADAAMAAAAvAAkAAAACAAMAAAAvAAoAAAACAAMAAAAvAAsAAAACAAMAAAAvAAwAAAADAAMAAAAvAA0AAAACAAQAAAAvAA4AAAADAAMAAAAvAA8AAAADAAQAAAAvABAAAAACAAQAAAAvABEAAAADAAQAAAAvABIAAAADAAQAAAAvABMAAAACAAQAAAAvABQAAAACAAQAAAAvABUAAAACAAMAAAAvABYAAAACAAQAAAAvABcAAAADAAMAAAAvABgAAAACAAQAAAAvABkAAAACAAMAAAAvABoAAAACAAMAAAAvABsAAAACAAQAAAAvABwAAAACAAIAAAAvAB0AAAACAAIAAAAwAP//AAADAAAAAAAwAAAAAAACAAQAAAAwAAEAAAADAAMAAAAwAAIAAAACAAQAAAAwAAMAAAADAAQAAAAwAAQAAAACAAMAAAAwAAUAAAACAAMAAAAwAAYAAAACAAMAAAAwAAcAAAACAAQAAAAwAAgAAAADAAQAAAAwAAkAAAADAAQAAAAwAAoAAAACAAQAAAAwAAsAAAADAAMAAAAwAAwAAAACAAMAAAAwAA0AAAADAAQAAAAwAA4AAAACAAQAAAAwAA8AAAADAAMAAAAwABAAAAACAAMAAAAwABEAAAADAAMAAAAwABIAAAADAAQAAAAwABMAAAADAAQAAAAwABQAAAADAAQAAAAwABUAAAADAAMAAAAwABYAAAADAAMAAAAwABcAAAACAAMAAAAwABgAAAACAAMAAAAwABkAAAADAAQAAAAwABoAAAACAAMAAAAwABsAAAACAAQAAAAwABwAAAACAAIAAAAwAB0AAAACAAIAAAAxAP//AAADAAAAAAAxAAAAAAADAAMAAAAxAAEAAAADAAQAAAAxAAIAAAACAAQAAAAxAAMAAAACAAMAAAAxAAQAAAACAAQAAAAxAAUAAAADAAMAAAAxAAYAAAACAAMAAAAxAAcAAAACAAQAAAAxAAgAAAACAAQAAAAxAAkAAAACAAMAAAAxAAoAAAADAAMAAAAxAAsAAAACAAMAAAAxAAwAAAADAAMAAAAxAA0AAAADAAMAAAAxAA4AAAADAAQAAAAxAA8AAAADAAMAAAAxABAAAAACAAMAAAAxABEAAAADAAMAAAAxABIAAAACAAMAAAAxABMAAAACAAQAAAAxABQAAAADAAQAAAAxABUAAAADAAMAAAAxABYAAAADAAMAAAAxABcAAAADAAMAAAAxABgAAAACAAQAAAAxABkAAAADAAMAAAAxABoAAAACAAMAAAAxABsAAAACAAQAAAAxABwAAAACAAIAAAAxAB0AAAACAAIAAAAyAP//AAADAAAAAAAyAAAAAAACAAMAAAAyAAEAAAADAAQAAAAyAAIAAAADAAQAAAAyAAMAAAADAAQAAAAyAAQAAAACAAMAAAAyAAUAAAACAAMAAAAyAAYAAAACAAMAAAAyAAcAAAADAAMAAAAyAAgAAAACAAMAAAAyAAkAAAADAAQAAAAyAAoAAAADAAMAAAAyAAsAAAACAAMAAAAyAAwAAAACAAQAAAAyAA0AAAACAAMAAAAyAA4AAAADAAMAAAAyAA8AAAADAAMAAAAyABAAAAADAAMAAAAyABEAAAACAAMAAAAyABIAAAACAAMAAAAyABMAAAACAAQAAAAyABQAAAADAAQAAAAyABUAAAADAAQAAAAyABYAAAADAAQAAAAyABcAAAACAAMAAAAyABgAAAACAAMAAAAyABkAAAADAAMAAAAyABoAAAADAAQAAAAyABsAAAADAAQAAAAyABwAAAACAAIAAAAyAB0AAAACAAIAAAAzAP//AAADAAAAAAAzAAAAAAACAAMAAAAzAAEAAAACAAQAAAAzAAIAAAADAAQAAAAzAAMAAAACAAMAAAAzAAQAAAADAAMAAAAzAAUAAAADAAMAAAAzAAYAAAADAAQAAAAzAAcAAAACAAMAAAAzAAgAAAACAAMAAAAzAAkAAAACAAQAAAAzAAoAAAACAAQAAAAzAAsAAAACAAMAAAAzAAwAAAADAAQAAAAzAA0AAAADAAMAAAAzAA4AAAADAAMAAAAzAA8AAAADAAQAAAAzABAAAAADAAQAAAAzABEAAAADAAMAAAAzABIAAAACAAMAAAAzABMAAAACAAMAAAAzABQAAAADAAQAAAAzABUAAAADAAQAAAAzABYAAAACAAMAAAAzABcAAAADAAMAAAAzABgAAAACAAQAAAAzABkAAAACAAMAAAAzABoAAAACAAQAAAAzABsAAAACAAMAAAAzABwAAAACAAIAAAAzAB0AAAACAAIAAAA0AP//AAADAAAAAAA0AAAAAAADAAQAAAA0AAEAAAACAAQAAAA0AAIAAAACAAQAAAA0AAMAAAADAAQAAAA0AAQAAAACAAQAAAA0AAUAAAADAAQAAAA0AAYAAAACAAQAAAA0AAcAAAACAAMAAAA0AAgAAAADAAMAAAA0AAkAAAADAAQAAAA0AAoAAAACAAQAAAA0AAsAAAACAAMAAAA0AAwAAAACAAQAAAA0AA0AAAADAAMAAAA0AA4AAAADAAMAAAA0AA8AAAADAAQAAAA0ABAAAAACAAMAAAA0ABEAAAADAAMAAAA0ABIAAAACAAMAAAA0ABMAAAADAAQAAAA0ABQAAAADAAQAAAA0ABUAAAADAAQAAAA0ABYAAAACAAQAAAA0ABcAAAADAAMAAAA0ABgAAAACAAMAAAA0ABkAAAACAAMAAAA0ABoAAAACAAQAAAA0ABsAAAACAAMAAAA0ABwAAAACAAIAAAA0AB0AAAACAAIAAAA1AP//AAADAAAAAAA1AAAAAAADAAMAAAA1AAEAAAADAAMAAAA1AAIAAAADAAQAAAA1AAMAAAADAAQAAAA1AAQAAAADAAMAAAA1AAUAAAADAAMAAAA1AAYAAAADAAMAAAA1AAcAAAACAAQAAAA1AAgAAAADAAQAAAA1AAkAAAACAAMAAAA1AAoAAAADAAQAAAA1AAsAAAACAAMAAAA1AAwAAAADAAMAAAA1AA0AAAACAAQAAAA1AA4AAAADAAQAAAA1AA8AAAADAAQAAAA1ABAAAAACAAQAAAA1ABEAAAACAAMAAAA1ABIAAAACAAQAAAA1ABMAAAADAAQAAAA1ABQAAAADAAQAAAA1ABUAAAACAAMAAAA1ABYAAAADAAMAAAA1ABcAAAACAAMAAAA1ABgAAAACAAQAAAA1ABkAAAACAAMAAAA1ABoAAAACAAQAAAA1ABsAAAACAAMAAAA1ABwAAAACAAIAAAA1AB0AAAACAAIAAAA2AP//AAADAAAAAAA2AAAAAAACAAQAAAA2AAEAAAACAAQAAAA2AAIAAAADAAQAAAA2AAMAAAADAAQAAAA2AAQAAAADAAQAAAA2AAUAAAACAAQAAAA2AAYAAAADAAMAAAA2AAcAAAACAAQAAAA2AAgAAAADAAQAAAA2AAkAAAACAAQAAAA2AAoAAAADAAQAAAA2AAsAAAACAAMAAAA2AAwAAAADAAMAAAA2AA0AAAACAAMAAAA2AA4AAAACAAQAAAA2AA8AAAADAAQAAAA2ABAAAAADAAMAAAA2ABEAAAADAAQAAAA2ABIAAAACAAMAAAA2ABMAAAADAAQAAAA2ABQAAAACAAQAAAA2ABUAAAACAAQAAAA2ABYAAAADAAMAAAA2ABcAAAACAAQAAAA2ABgAAAADAAQAAAA2ABkAAAACAAMAAAA2ABoAAAADAAMAAAA2ABsAAAACAAMAAAA2ABwAAAACAAIAAAA2AB0AAAACAAIAAAA3AP//AAADAAAAAAA3AAAAAAACAAMAAAA3AAEAAAADAAMAAAA3AAIAAAACAAMAAAA3AAMAAAACAAQAAAA3AAQAAAADAAMAAAA3AAUAAAADAAQAAAA3AAYAAAACAAQAAAA3AAcAAAACAAMAAAA3AAgAAAADAAMAAAA3AAkAAAACAAQAAAA3AAoAAAADAAQAAAA3AAsAAAADAAQAAAA3AAwAAAADAAMAAAA3AA0AAAADAAQAAAA3AA4AAAADAAQAAAA3AA8AAAACAAQAAAA3ABAAAAACAAQAAAA3ABEAAAACAAQAAAA3ABIAAAADAAQAAAA3ABMAAAACAAMAAAA3ABQAAAACAAQAAAA3ABUAAAADAAMAAAA3ABYAAAACAAMAAAA3ABcAAAADAAMAAAA3ABgAAAADAAQAAAA3ABkAAAACAAMAAAA3ABoAAAACAAQAAAA3ABwAAAACAAIAAAA3AB0AAAACAAIAAAA4AP//AAADAAAAAAA4AAAAAAABAAMAAAA4AAEAAAABAAQAAAA4AAIAAAAAAAQAAAA4AAMAAAABAAQAAAA4AAQAAAAAAAQAAAA4AAUAAAABAAQAAAA4AAYAAAABAAMAAAA4AAcAAAAAAAMAAAA4AAgAAAAAAAMAAAA4AAkAAAAAAAMAAAA4AAoAAAAAAAQAAAA4AAsAAAAAAAMAAAA4AAwAAAAAAAQAAAA4AA0AAAAAAAMAAAA4AA4AAAAAAAMAAAA4AA8AAAAAAAMAAAA4ABAAAAABAAMAAAA4ABEAAAAAAAMAAAA4ABIAAAAAAAMAAAA4ABMAAAAAAAMAAAA4ABQAAAABAAMAAAA4ABUAAAABAAMAAAA4ABYAAAABAAMAAAA4ABcAAAABAAQAAAA4ABgAAAAAAAMAAAA4ABkAAAABAAMAAAA4ABsAAAABAAMAAAA4ABwAAAACAAIAAAA4AB0AAAACAAIAAAA5AP//AAADAAAAAAA5AAAAAAAAAAQAAAA5AAEAAAAAAAMAAAA5AAIAAAABAAQAAAA5AAMAAAABAAMAAAA5AAQAAAABAAQAAAA5AAUAAAABAAMAAAA5AAYAAAAAAAQAAAA5AAcAAAAAAAMAAAA5AAgAAAABAAMAAAA5AAkAAAAAAAMAAAA5AAoAAAAAAAQAAAA5AAsAAAABAAQAAAA5AAwAAAAAAAQAAAA5AA0AAAABAAQAAAA5AA4AAAABAAMAAAA5AA8AAAABAAQAAAA5ABAAAAAAAAMAAAA5ABEAAAAAAAMAAAA5ABIAAAAAAAQAAAA5ABMAAAAAAAMAAAA5ABQAAAAAAAMAAAA5ABUAAAAAAAQAAAA5ABYAAAABAAMAAAA5ABcAAAABAAMAAAA5ABgAAAAAAAQAAAA5ABoAAAABAAMAAAA5ABsAAAABAAMAAAA5ABwAAAACAAIAAAA5AB0AAAACAAIAAAA6AP//AAADAAAAAAA6AAAAAAABAAQAAAA6AAEAAAABAAQAAAA6AAIAAAABAAQAAAA6AAMAAAABAAQAAAA6AAQAAAABAAQAAAA6AAUAAAABAAMAAAA6AAYAAAAAAAMAAAA6AAcAAAABAAQAAAA6AAgAAAAAAAQAAAA6AAkAAAAAAAQAAAA6AAoAAAABAAQAAAA6AAsAAAAAAAMAAAA6AAwAAAABAAQAAAA6AA0AAAAAAAQAAAA6AA4AAAAAAAMAAAA6AA8AAAABAAMAAAA6ABAAAAAAAAQAAAA6ABEAAAABAAQAAAA6ABIAAAABAAMAAAA6ABMAAAABAAMAAAA6ABQAAAAAAAQAAAA6ABUAAAAAAAQAAAA6ABYAAAAAAAQAAAA6ABcAAAAAAAMAAAA6ABkAAAABAAQAAAA6ABoAAAABAAQAAAA6ABsAAAABAAMAAAA6ABwAAAAAAAIAAAA6AB0AAAAAAAIAAAA7AP//AAADAAAAAAA7AAAAAAAAAAQAAAA7AAEAAAAAAAMAAAA7AAIAAAAAAAQAAAA7AAMAAAABAAQAAAA7AAQAAAABAAMAAAA7AAUAAAABAAQAAAA7AAYAAAAAAAQAAAA7AAcAAAAAAAQAAAA7AAgAAAAAAAQAAAA7AAkAAAAAAAQAAAA7AAoAAAAAAAMAAAA7AAsAAAABAAQAAAA7AAwAAAAAAAMAAAA7AA0AAAABAAQAAAA7AA4AAAABAAMAAAA7AA8AAAAAAAMAAAA7ABAAAAABAAMAAAA7ABEAAAABAAMAAAA7ABIAAAAAAAQAAAA7ABMAAAABAAMAAAA7ABQAAAABAAQAAAA7ABUAAAABAAMAAAA7ABYAAAABAAMAAAA7ABgAAAABAAQAAAA7ABkAAAABAAMAAAA7ABoAAAAAAAMAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAIAAAA7AB0AAAAAAAIAAAA8AP//AAADAAAAAAA8AAAAAAAAAAMAAAA8AAEAAAAAAAMAAAA8AAIAAAABAAMAAAA8AAMAAAABAAQAAAA8AAQAAAAAAAQAAAA8AAUAAAABAAQAAAA8AAYAAAAAAAQAAAA8AAcAAAAAAAMAAAA8AAgAAAAAAAMAAAA8AAkAAAABAAQAAAA8AAoAAAAAAAMAAAA8AAsAAAAAAAMAAAA8AAwAAAABAAMAAAA8AA0AAAABAAMAAAA8AA4AAAABAAMAAAA8AA8AAAAAAAQAAAA8ABAAAAAAAAQAAAA8ABEAAAAAAAQAAAA8ABIAAAAAAAQAAAA8ABMAAAABAAMAAAA8ABQAAAAAAAQAAAA8ABUAAAAAAAMAAAA8ABcAAAABAAMAAAA8ABgAAAABAAQAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAABAAQAAAA8ABwAAAAAAAIAAAA8AB0AAAAAAAIAAAA9AP//AAADAAAAAAA9AAAAAAAAAAQAAAA9AAEAAAAAAAMAAAA9AAIAAAABAAMAAAA9AAMAAAAAAAQAAAA9AAQAAAABAAQAAAA9AAUAAAABAAQAAAA9AAYAAAABAAQAAAA9AAcAAAAAAAMAAAA9AAgAAAAAAAQAAAA9AAkAAAABAAQAAAA9AAoAAAAAAAMAAAA9AAsAAAABAAMAAAA9AAwAAAAAAAQAAAA9AA0AAAAAAAQAAAA9AA4AAAABAAMAAAA9AA8AAAAAAAQAAAA9ABAAAAABAAMAAAA9ABEAAAAAAAMAAAA9ABIAAAABAAMAAAA9ABMAAAAAAAQAAAA9ABQAAAABAAQAAAA9ABYAAAAAAAQAAAA9ABcAAAAAAAMAAAA9ABgAAAAAAAMAAAA9ABkAAAABAAMAAAA9ABoAAAAAAAQAAAA9ABsAAAAAAAMAAAA9ABwAAAAAAAIAAAA9AB0AAAAAAAIAAAA+AP//AAADAAAAAAA+AAAAAAAAAAMAAAA+AAEAAAABAAMAAAA+AAIAAAAAAAQAAAA+AAMAAAABAAMAAAA+AAQAAAAAAAMAAAA+AAUAAAAAAAMAAAA+AAYAAAABAAMAAAA+AAcAAAABAAMAAAA+AAgAAAAAAAMAAAA+AAkAAAAAAAMAAAA+AAoAAAABAAMAAAA+AAsAAAABAAMAAAA+AAwAAAABAAQAAAA+AA0AAAABAAMAAAA+AA4AAAAAAAQAAAA+AA8AAAABAAMAAAA+ABAAAAABAAQAAAA+ABEAAAABAAMAAAA+ABIAAAABAAQAAAA+ABMAAAAAAAQAAAA+ABUAAAABAAQAAAA+ABYAAAABAAMAAAA+ABcAAAABAAMAAAA+ABgAAAAAAAMAAAA+ABkAAAABAAMAAAA+ABoAAAABAAQAAAA+ABsAAAAAAAMAAAA+ABwAAAAAAAIAAAA+AB0AAAAAAAIAAAA/AP//AAADAAAAAAA/AAAAAAAAAAMAAAA/AAEAAAABAAQAAAA/AAIAAAAAAAMAAAA/AAMAAAABAAQAAAA/AAQAAAABAAMAAAA/AAUAAAABAAQAAAA/AAYAAAABAAQAAAA/AAcAAAAAAAMAAAA/AAgAAAAAAAMAAAA/AAkAAAABAAMAAAA/AAoAAAAAAAMAAAA/AAsAAAABAAQAAAA/AAwAAAAAAAMAAAA/AA0AAAAAAAMAAAA/AA4AAAAAAAMAAAA/AA8AAAAAAAQAAAA/ABAAAAABAAMAAAA/ABEAAAABAAQAAAA/ABIAAAABAAQAAAA/ABQAAAABAAQAAAA/ABUAAAABAAMAAAA/ABYAAAABAAMAAAA/ABcAAAABAAQAAAA/ABgAAAABAAQAAAA/ABkAAAAAAAMAAAA/ABoAAAAAAAMAAAA/ABsAAAABAAMAAAA/ABwAAAAAAAIAAAA/AB0AAAAAAAIAAABAAP//AAADAAAAAABAAAAAAAABAAMAAABAAAEAAAAAAAQAAABAAAIAAAABAAQAAABAAAMAAAAAAAQAAABAAAQAAAAAAAQAAABAAAUAAAAAAAMAAABAAAYAAAAAAAQAAABAAAcAAAAAAAQAAABAAAgAAAAAAAQAAABAAAkAAAAAAAMAAABAAAoAAAABAAQAAABAAAsAAAAAAAQAAABAAAwAAAABAAQAAABAAA0AAAABAAMAAABAAA4AAAAAAAQAAABAAA8AAAABAAMAAABAABAAAAAAAAMAAABAABEAAAAAAAQAAABAABMAAAAAAAMAAABAABQAAAAAAAQAAABAABUAAAAAAAMAAABAABYAAAAAAAMAAABAABcAAAAAAAMAAABAABgAAAABAAMAAABAABkAAAAAAAMAAABAABoAAAAAAAMAAABAABsAAAABAAQAAABAABwAAAAAAAIAAABAAB0AAAAAAAIAAABBAP//AAADAAAAAABBAAAAAAABAAQAAABBAAEAAAABAAQAAABBAAIAAAAAAAMAAABBAAMAAAAAAAQAAABBAAQAAAAAAAQAAABBAAUAAAAAAAMAAABBAAYAAAABAAQAAABBAAcAAAAAAAQAAABBAAgAAAABAAQAAABBAAkAAAAAAAQAAABBAAoAAAAAAAQAAABBAAsAAAAAAAQAAABBAAwAAAABAAQAAABBAA0AAAABAAMAAABBAA4AAAABAAMAAABBAA8AAAABAAMAAABBABAAAAAAAAQAAABBABIAAAAAAAQAAABBABMAAAAAAAQAAABBABQAAAABAAMAAABBABUAAAAAAAQAAABBABYAAAAAAAQAAABBABcAAAABAAMAAABBABgAAAABAAQAAABBABkAAAABAAMAAABBABoAAAAAAAMAAABBABsAAAAAAAQAAABBABwAAAAAAAIAAABBAB0AAAAAAAIAAABCAP//AAADAAAAAABCAAAAAAABAAQAAABCAAEAAAAAAAQAAABCAAIAAAAAAAQAAABCAAMAAAABAAQAAABCAAQAAAAAAAQAAABCAAUAAAAAAAMAAABCAAYAAAAAAAQAAABCAAcAAAABAAMAAABCAAgAAAABAAMAAABCAAkAAAABAAMAAABCAAoAAAABAAQAAABCAAsAAAAAAAQAAABCAAwAAAAAAAQAAABCAA0AAAABAAMAAABCAA4AAAAAAAQAAABCAA8AAAAAAAQAAABCABEAAAABAAQAAABCABIAAAABAAMAAABCABMAAAABAAMAAABCABQAAAAAAAMAAABCABUAAAAAAAMAAABCABYAAAABAAMAAABCABcAAAABAAQAAABCABgAAAAAAAQAAABCABkAAAABAAQAAABCABoAAAAAAAMAAABCABsAAAABAAMAAABCABwAAAAAAAIAAABCAB0AAAAAAAIAAABDAP//AAADAAAAAABDAAAAAAABAAMAAABDAAEAAAAAAAQAAABDAAIAAAABAAMAAABDAAMAAAAAAAMAAABDAAQAAAABAAMAAABDAAUAAAABAAMAAABDAAYAAAAAAAQAAABDAAcAAAAAAAMAAABDAAgAAAAAAAQAAABDAAkAAAABAAMAAABDAAoAAAABAAMAAABDAAsAAAABAAQAAABDAAwAAAABAAMAAABDAA0AAAABAAMAAABDAA4AAAAAAAMAAABDABAAAAABAAQAAABDABEAAAABAAMAAABDABIAAAAAAAMAAABDABMAAAAAAAQAAABDABQAAAABAAMAAABDABUAAAABAAQAAABDABYAAAABAAQAAABDABcAAAABAAMAAABDABgAAAAAAAQAAABDABkAAAABAAMAAABDABoAAAAAAAMAAABDABsAAAABAAQAAABDABwAAAAAAAIAAABDAB0AAAAAAAIAAABEAP//AAADAAAAAABEAAAAAAAAAAQAAABEAAEAAAAAAAMAAABEAAIAAAAAAAMAAABEAAMAAAABAAQAAABEAAQAAAAAAAMAAABEAAUAAAAAAAMAAABEAAYAAAABAAQAAABEAAcAAAABAAMAAABEAAgAAAABAAMAAABEAAkAAAAAAAMAAABEAAoAAAAAAAQAAABEAAsAAAABAAQAAABEAAwAAAAAAAQAAABEAA0AAAAAAAQAAABEAA8AAAABAAMAAABEABAAAAAAAAQAAABEABEAAAABAAMAAABEABIAAAAAAAQAAABEABMAAAABAAQAAABEABQAAAAAAAQAAABEABUAAAABAAMAAABEABYAAAABAAMAAABEABcAAAAAAAMAAABEABgAAAABAAQAAABEABkAAAABAAQAAABEABoAAAABAAQAAABEABsAAAABAAQAAABEABwAAAAAAAIAAABEAB0AAAAAAAIAAABFAP//AAADAAAAAABFAAAAAAABAAMAAABFAAEAAAAAAAQAAABFAAIAAAABAAMAAABFAAMAAAABAAQAAABFAAQAAAAAAAQAAABFAAUAAAABAAQAAABFAAYAAAABAAMAAABFAAcAAAABAAQAAABFAAgAAAAAAAQAAABFAAkAAAAAAAQAAABFAAoAAAABAAQAAABFAAsAAAAAAAMAAABFAAwAAAABAAMAAABFAA4AAAAAAAQAAABFAA8AAAABAAQAAABFABAAAAAAAAQAAABFABEAAAABAAQAAABFABIAAAAAAAQAAABFABMAAAAAAAMAAABFABQAAAABAAMAAABFABUAAAAAAAQAAABFABYAAAABAAMAAABFABcAAAABAAMAAABFABgAAAABAAMAAABFABkAAAABAAMAAABFABoAAAABAAQAAABFABsAAAAAAAQAAABFABwAAAAAAAIAAABFAB0AAAAAAAIAAABGAP//AAADAAAAAABGAAAAAAAAAAMAAABGAAEAAAABAAQAAABGAAIAAAABAAMAAABGAAMAAAAAAAMAAABGAAQAAAABAAQAAABGAAUAAAAAAAMAAABGAAYAAAAAAAQAAABGAAcAAAAAAAMAAABGAAgAAAABAAQAAABGAAkAAAAAAAMAAABGAAoAAAAAAAQAAABGAAsAAAAAAAQAAABGAA0AAAABAAMAAABGAA4AAAAAAAMAAABGAA8AAAAAAAQAAABGABAAAAABAAMAAABGABEAAAAAAAMAAABGABIAAAAAAAMAAABGABMAAAABAAMAAABGABQAAAABAAMAAABGABUAAAABAAMAAABGABYAAAABAAQAAABGABcAAAAAAAQAAABGABgAAAABAAMAAABGABkAAAABAAQAAABGABoAAAAAAAQAAABGABsAAAAAAAQAAABGABwAAAAAAAIAAABGAB0AAAAAAAIAAABHAP//AAADAAAAAABHAAAAAAAAAAQAAABHAAEAAAAAAAMAAABHAAIAAAAAAAQAAABHAAMAAAABAAQAAABHAAQAAAAAAAQAAABHAAUAAAABAAMAAABHAAYAAAAAAAQAAABHAAcAAAABAAQAAABHAAgAAAABAAMAAABHAAkAAAAAAAQAAABHAAoAAAABAAMAAABHAAsAAAABAAQAAABHAAwAAAAAAAMAAABHAA0AAAABAAMAAABHAA4AAAAAAAMAAABHAA8AAAABAAQAAABHABAAAAAAAAQAAABHABEAAAAAAAMAAABHABIAAAABAAMAAABHABMAAAAAAAMAAABHABQAAAABAAQAAABHABUAAAABAAMAAABHABYAAAAAAAMAAABHABcAAAAAAAMAAABHABgAAAABAAQAAABHABkAAAABAAQAAABHABoAAAAAAAQAAABHABsAAAABAAQAAABHABwAAAAAAAIAAABHAB0AAAAAAAIAAABIAP//AAADAAAAAABIAAAAAAABAAMAAABIAAEAAAAAAAMAAABIAAIAAAABAAQAAABIAAMAAAAAAAMAAABIAAQAAAAAAAMAAABIAAUAAAAAAAMAAABIAAYAAAAAAAQAAABIAAcAAAABAAQAAABIAAgAAAAAAAMAAABIAAkAAAAAAAQAAABIAAoAAAAAAAQAAABIAAsAAAABAAMAAABIAAwAAAABAAQAAABIAA0AAAAAAAQAAABIAA4AAAAAAAQAAABIAA8AAAAAAAMAAABIABAAAAABAAMAAABIABEAAAABAAQAAABIABIAAAAAAAQAAABIABMAAAABAAMAAABIABQAAAAAAAQAAABIABUAAAABAAMAAABIABYAAAABAAMAAABIABcAAAABAAQAAABIABgAAAAAAAQAAABIABkAAAABAAMAAABIABoAAAAAAAQAAABIABsAAAAAAAQAAABIABwAAAAAAAIAAABIAB0AAAAAAAIAAABJAP//AAADAAAAAABJAAAAAAAAAAQAAABJAAEAAAAAAAQAAABJAAIAAAAAAAMAAABJAAMAAAAAAAMAAABJAAQAAAAAAAQAAABJAAUAAAABAAMAAABJAAYAAAABAAMAAABJAAcAAAAAAAQAAABJAAgAAAAAAAMAAABJAAkAAAAAAAQAAABJAAoAAAABAAMAAABJAAsAAAABAAMAAABJAAwAAAAAAAQAAABJAA0AAAAAAAMAAABJAA4AAAAAAAMAAABJAA8AAAAAAAMAAABJABAAAAABAAMAAABJABEAAAABAAQAAABJABIAAAABAAMAAABJABMAAAAAAAQAAABJABQAAAAAAAQAAABJABUAAAAAAAMAAABJABYAAAABAAQAAABJABcAAAAAAAQAAABJABgAAAAAAAMAAABJABkAAAAAAAQAAABJABoAAAAAAAQAAABJABsAAAABAAMAAABJABwAAAAAAAIAAABJAB0AAAAAAAIAAABKAP//AAADAAAAAABKAAAAAAABAAMAAABKAAEAAAABAAMAAABKAAIAAAAAAAQAAABKAAMAAAABAAMAAABKAAQAAAABAAMAAABKAAUAAAABAAMAAABKAAYAAAABAAMAAABKAAcAAAAAAAQAAABKAAgAAAAAAAQAAABKAAkAAAAAAAMAAABKAAoAAAAAAAMAAABKAAsAAAAAAAQAAABKAAwAAAAAAAQAAABKAA0AAAABAAMAAABKAA4AAAAAAAQAAABKAA8AAAAAAAQAAABKABAAAAABAAQAAABKABEAAAAAAAMAAABKABIAAAAAAAMAAABKABMAAAAAAAQAAABKABQAAAABAAQAAABKABUAAAAAAAMAAABKABYAAAAAAAQAAABKABcAAAAAAAQAAABKABgAAAAAAAMAAABKABkAAAAAAAMAAABKABoAAAABAAQAAABKABsAAAAAAAMAAABKABwAAAAAAAIAAABKAB0AAAAAAAIAAABLAP//AAADAAAAAABLAAAAAAAAAAQAAABLAAEAAAAAAAQAAABLAAIAAAAAAAMAAABLAAMAAAABAAQAAABLAAQAAAAAAAMAAABLAAUAAAABAAQAAABLAAYAAAAAAAQAAABLAAcAAAABAAMAAABLAAgAAAAAAAQAAABLAAkAAAABAAMAAABLAAoAAAABAAMAAABLAAsAAAAAAAMAAABLAAwAAAABAAQAAABLAA0AAAAAAAMAAABLAA4AAAABAAMAAABLAA8AAAAAAAMAAABLABAAAAABAAMAAABLABEAAAABAAMAAABLABIAAAABAAQAAABLABMAAAAAAAMAAABLABQAAAAAAAMAAABLABUAAAABAAQAAABLABYAAAABAAQAAABLABcAAAAAAAQAAABLABgAAAABAAMAAABLABkAAAAAAAQAAABLABoAAAABAAQAAABLABsAAAABAAMAAABLABwAAAAAAAIAAABLAB0AAAAAAAIAAABMAP//AAADAAAAAABMAAAAAAABAAMAAABMAAEAAAABAAQAAABMAAIAAAABAAQAAABMAAMAAAAAAAQAAABMAAQAAAABAAMAAABMAAUAAAABAAMAAABMAAYAAAABAAMAAABMAAcAAAABAAQAAABMAAgAAAAAAAQAAABMAAkAAAAAAAQAAABMAAoAAAABAAQAAABMAAsAAAAAAAQAAABMAAwAAAAAAAMAAABMAA0AAAAAAAMAAABMAA4AAAAAAAQAAABMAA8AAAAAAAQAAABMABAAAAABAAMAAABMABEAAAABAAQAAABMABIAAAAAAAMAAABMABMAAAABAAQAAABMABQAAAAAAAQAAABMABUAAAABAAQAAABMABYAAAABAAQAAABMABcAAAABAAQAAABMABgAAAABAAQAAABMABkAAAAAAAQAAABMABoAAAABAAMAAABMABsAAAAAAAQAAABMABwAAAAAAAIAAABMAB0AAAAAAAIAAABNAP//AAADAAAAAABNAAAAAAABAAQAAABNAAEAAAABAAMAAABNAAIAAAAAAAMAAABNAAMAAAAAAAQAAABNAAQAAAABAAMAAABNAAUAAAAAAAQAAABNAAYAAAABAAMAAABNAAcAAAAAAAMAAABNAAgAAAAAAAMAAABNAAkAAAABAAMAAABNAAoAAAAAAAMAAABNAAsAAAABAAQAAABNAAwAAAAAAAQAAABNAA0AAAAAAAMAAABNAA4AAAAAAAMAAABNAA8AAAAAAAQAAABNABAAAAAAAAMAAABNABEAAAAAAAMAAABNABIAAAABAAQAAABNABMAAAABAAMAAABNABQAAAABAAMAAABNABUAAAAAAAMAAABNABYAAAAAAAQAAABNABcAAAABAAQAAABNABgAAAABAAQAAABNABkAAAAAAAQAAABNABoAAAAAAAMAAABNABsAAAABAAMAAABNABwAAAAAAAIAAABNAB0AAAAAAAIAAABOAP//AAADAAAAAABOAAAAAAAAAAQAAABOAAEAAAABAAQAAABOAAIAAAABAAMAAABOAAMAAAAAAAMAAABOAAQAAAABAAQAAABOAAUAAAABAAMAAABOAAYAAAABAAMAAABOAAcAAAABAAMAAABOAAgAAAABAAMAAABOAAkAAAAAAAQAAABOAAoAAAAAAAMAAABOAAsAAAABAAMAAABOAAwAAAAAAAQAAABOAA0AAAABAAQAAABOAA4AAAAAAAQAAABOAA8AAAABAAQAAABOABAAAAAAAAQAAABOABEAAAABAAMAAABOABIAAAABAAMAAABOABMAAAABAAQAAABOABQAAAAAAAQAAABOABUAAAAAAAMAAABOABYAAAABAAMAAABOABcAAAABAAQAAABOABgAAAAAAAMAAABOABkAAAAAAAQAAABOABoAAAAAAAMAAABOABsAAAABAAMAAABOABwAAAAAAAIAAABOAB0AAAAAAAIAAABPAP//AAADAAAAAABPAAAAAAAAAAMAAABPAAEAAAABAAMAAABPAAIAAAABAAMAAABPAAMAAAAAAAMAAABPAAQAAAAAAAMAAABPAAUAAAAAAAMAAABPAAYAAAABAAQAAABPAAcAAAAAAAQAAABPAAgAAAABAAQAAABPAAkAAAABAAMAAABPAAoAAAABAAQAAABPAAsAAAABAAMAAABPAAwAAAAAAAQAAABPAA0AAAABAAQAAABPAA4AAAABAAMAAABPAA8AAAABAAMAAABPABAAAAAAAAMAAABPABEAAAAAAAQAAABPABIAAAABAAQAAABPABMAAAAAAAQAAABPABQAAAABAAQAAABPABUAAAABAAMAAABPABYAAAABAAMAAABPABcAAAAAAAQAAABPABgAAAABAAMAAABPABkAAAAAAAMAAABPABoAAAABAAMAAABPABsAAAAAAAMAAABPABwAAAAAAAIAAABPAB0AAAAAAAIAAABQAP//AAADAAAAAABQAAAAAAABAAQAAABQAAEAAAABAAMAAABQAAIAAAABAAMAAABQAAMAAAAAAAQAAABQAAQAAAABAAMAAABQAAUAAAAAAAQAAABQAAYAAAABAAMAAABQAAcAAAABAAQAAABQAAgAAAABAAMAAABQAAkAAAAAAAMAAABQAAoAAAABAAMAAABQAAsAAAAAAAMAAABQAAwAAAAAAAQAAABQAA0AAAABAAMAAABQAA4AAAABAAMAAABQAA8AAAAAAAQAAABQABAAAAABAAQAAABQABEAAAAAAAQAAABQABIAAAAAAAQAAABQABMAAAAAAAQAAABQABQAAAAAAAQAAABQABUAAAABAAQAAABQABYAAAABAAQAAABQABcAAAAAAAMAAABQABgAAAAAAAQAAABQABkAAAAAAAQAAABQABoAAAAAAAMAAABQABsAAAABAAQAAABQABwAAAAAAAIAAABQAB0AAAAAAAIAAABRAP//AAADAAAAAABRAAAAAAABAAQAAABRAAEAAAAAAAQAAABRAAIAAAABAAQAAABRAAMAAAABAAMAAABRAAQAAAAAAAMAAABRAAUAAAAAAAMAAABRAAYAAAABAAQAAABRAAcAAAAAAAMAAABRAAgAAAABAAMAAABRAAkAAAABAAQAAABRAAoAAAABAAMAAABRAAsAAAABAAQAAABRAAwAAAABAAQAAABRAA0AAAAAAAMAAABRAA4AAAAAAAMAAABRAA8AAAABAAMAAABRABAAAAAAAAQAAABRABEAAAABAAMAAABRABIAAAABAAQAAABRABMAAAABAAMAAABRABQAAAABAAMAAABRABUAAAABAAMAAABRABYAAAABAAQAAABRABcAAAABAAQAAABRABgAAAABAAMAAABRABkAAAAAAAMAAABRABoAAAAAAAMAAABRABsAAAAAAAMAAABRABwAAAAAAAIAAABRAB0AAAAAAAIAAABSAP//AAADAAAAAABSAAAAAAAAAAQAAABSAAEAAAAAAAMAAABSAAIAAAAAAAMAAABSAAMAAAAAAAMAAABSAAQAAAABAAQAAABSAAUAAAAAAAQAAABSAAYAAAAAAAQAAABSAAcAAAABAAMAAABSAAgAAAABAAMAAABSAAkAAAABAAQAAABSAAoAAAAAAAQAAABSAAsAAAAAAAMAAABSAAwAAAABAAMAAABSAA0AAAAAAAQAAABSAA4AAAABAAQAAABSAA8AAAABAAMAAABSABAAAAAAAAQAAABSABEAAAABAAQAAABSABIAAAAAAAMAAABSABMAAAABAAMAAABSABQAAAABAAMAAABSABUAAAABAAMAAABSABYAAAABAAQAAABSABcAAAAAAAQAAABSABgAAAAAAAMAAABSABkAAAAAAAQAAABSABoAAAAAAAQAAABSABsAAAAAAAQAAABSABwAAAAAAAIAAABSAB0AAAAAAAIAAABTAP//AAADAAAAAABTAAAAAAAAAAQAAABTAAEAAAABAAQAAABTAAIAAAAAAAMAAABTAAMAAAAAAAMAAABTAAQAAAAAAAQAAABTAAUAAAABAAMAAABTAAYAAAABAAQAAABTAAcAAAAAAAQAAABTAAgAAAABAAQAAABTAAkAAAAAAAMAAABTAAoAAAABAAMAAABTAAsAAAAAAAQAAABTAAwAAAAAAAQAAABTAA0AAAAAAAQAAABTAA4AAAABAAMAAABTAA8AAAAAAAQAAABTABAAAAAAAAQAAABTABEAAAABAAQAAABTABIAAAABAAMAAABTABMAAAABAAMAAABTABQAAAAAAAQAAABTABUAAAABAAQAAABTABYAAAABAAQAAABTABcAAAABAAQAAABTABgAAAAAAAMAAABTABkAAAABAAMAAABTABoAAAAAAAQAAABTABsAAAAAAAMAAABTABwAAAAAAAIAAABTAB0AAAAAAAIAAABUAP//AAADAAAAAABUAAAAAAABAAMAAABUAAEAAAAAAAQAAABUAAIAAAAAAAMAAABUAAMAAAAAAAMAAABUAAQAAAAAAAMAAABUAAUAAAABAAQAAABUAAYAAAAAAAMAAABUAAcAAAAAAAQAAABUAAgAAAABAAMAAABUAAkAAAAAAAMAAABUAAoAAAABAAMAAABUAAsAAAAAAAMAAABUAAwAAAABAAQAAABUAA0AAAABAAMAAABUAA4AAAAAAAQAAABUAA8AAAABAAQAAABUABAAAAABAAQAAABUABEAAAAAAAMAAABUABIAAAABAAMAAABUABMAAAABAAMAAABUABQAAAABAAMAAABUABUAAAABAAQAAABUABYAAAAAAAMAAABUABcAAAABAAMAAABUABgAAAABAAQAAABUABkAAAAAAAMAAABUABoAAAAAAAMAAABUABsAAAAAAAMAAABUABwAAAAAAAIAAABUAB0AAAAAAAIAAABVAP//AAADAAAAAABVAAAAAAABAAMAAABVAAEAAAAAAAMAAABVAAIAAAABAAQAAABVAAMAAAAAAAMAAABVAAQAAAABAAMAAABVAAUAAAAAAAMAAABVAAYAAAABAAMAAABVAAcAAAABAAQAAABVAAgAAAABAAMAAABVAAkAAAABAAQAAABVAAoAAAAAAAMAAABVAAsAAAABAAQAAABVAAwAAAABAAMAAABVAA0AAAAAAAQAAABVAA4AAAABAAMAAABVAA8AAAAAAAMAAABVABAAAAABAAQAAABVABEAAAAAAAQAAABVABIAAAABAAMAAABVABMAAAABAAQAAABVABQAAAAAAAMAAABVABUAAAABAAQAAABVABYAAAAAAAQAAABVABcAAAAAAAQAAABVABgAAAAAAAQAAABVABkAAAABAAMAAABVABoAAAABAAQAAABVABsAAAABAAQAAABVABwAAAAAAAIAAABVAB0AAAAAAAIAAABWAP//AAADAAAAAABWAAAAAAAAAAQAAABWAAEAAAABAAQAAABWAAIAAAAAAAMAAABWAAMAAAAAAAQAAABWAAQAAAABAAMAAABWAAUAAAABAAQAAABWAAYAAAAAAAMAAABWAAcAAAAAAAQAAABWAAgAAAABAAQAAABWAAkAAAABAAMAAABWAAoAAAABAAQAAABWAAsAAAAAAAMAAABWAAwAAAABAAMAAABWAA0AAAABAAQAAABWAA4AAAAAAAQAAABWAA8AAAAAAAQAAABWABAAAAAAAAMAAABWABEAAAAAAAQAAABWABIAAAAAAAMAAABWABMAAAAAAAMAAABWABQAAAAAAAQAAABWABUAAAAAAAMAAABWABYAAAAAAAMAAABWABcAAAAAAAQAAABWABgAAAAAAAQAAABWABkAAAAAAAQAAABWABoAAAABAAQAAABWABsAAAABAAMAAABWABwAAAAAAAIAAABWAB0AAAAAAAIAAABXAP//AAADAAAAAABXAAAAAAABAAMAAABXAAEAAAAAAAMAAABXAAIAAAABAAMAAABXAAMAAAABAAQAAABXAAQAAAABAAMAAABXAAUAAAAAAAMAAABXAAYAAAABAAMAAABXAAcAAAAAAAMAAABXAAgAAAABAAMAAABXAAkAAAABAAMAAABXAAoAAAAAAAMAAABXAAsAAAABAAQAAABXAAwAAAABAAQAAABXAA0AAAAAAAMAAABXAA4AAAAAAAMAAABXAA8AAAAAAAMAAABXABAAAAABAAMAAABXABEAAAAAAAQAAABXABIAAAABAAQAAABXABMAAAABAAMAAABXABQAAAABAAMAAABXABUAAAABAAMAAABXABYAAAABAAQAAABXABcAAAAAAAMAAABXABgAAAABAAMAAABXABkAAAAAAAMAAABXABoAAAAAAAQAAABXABsAAAAAAAQAAABXABwAAAAAAAIAAABXAB0AAAAAAAIAAABYAP//AAADAAAAAABYAAAAAAAAAAQAAABYAAEAAAABAAQAAABYAAIAAAAAAAQAAABYAAMAAAAAAAQAAABYAAQAAAABAAQAAABYAAUAAAAAAAMAAABYAAYAAAAAAAMAAABYAAcAAAABAAMAAABYAAgAAAAAAAMAAABYAAkAAAAAAAQAAABYAAoAAAABAAQAAABYAAsAAAABAAQAAABYAAwAAAABAAMAAABYAA0AAAABAAQAAABYAA4AAAAAAAQAAABYAA8AAAAAAAMAAABYABAAAAABAAQAAABYABEAAAAAAAMAAABYABIAAAAAAAMAAABYABMAAAAAAAQAAABYABQAAAABAAMAAABYABUAAAAAAAQAAABYABYAAAABAAMAAABYABcAAAAAAAMAAABYABgAAAABAAMAAABYABkAAAABAAMAAABYABoAAAABAAQAAABYABsAAAABAAMAAABYABwAAAAAAAIAAABYAB0AAAAAAAIAAABZAP//AAADAAAAAABZAAAAAAAAAAQAAABZAAEAAAAAAAMAAABZAAIAAAABAAQAAABZAAMAAAAAAAMAAABZAAQAAAABAAQAAABZAAUAAAAAAAMAAABZAAYAAAAAAAQAAABZAAcAAAABAAQAAABZAAgAAAABAAQAAABZAAkAAAAAAAMAAABZAAoAAAAAAAQAAABZAAsAAAAAAAMAAABZAAwAAAABAAMAAABZAA0AAAABAAMAAABZAA4AAAAAAAQAAABZAA8AAAAAAAQAAABZABAAAAABAAMAAABZABEAAAAAAAMAAABZABIAAAAAAAMAAABZABMAAAABAAQAAABZABQAAAABAAQAAABZABUAAAAAAAMAAABZABYAAAABAAQAAABZABcAAAAAAAMAAABZABgAAAABAAMAAABZABkAAAAAAAMAAABZABoAAAAAAAMAAABZABsAAAAAAAQAAABZABwAAAAAAAIAAABZAB0AAAAAAAIAAABaAP//AAADAAAAAABaAAAAAAABAAMAAABaAAEAAAAAAAMAAABaAAIAAAAAAAMAAABaAAMAAAAAAAMAAABaAAQAAAABAAMAAABaAAUAAAABAAQAAABaAAYAAAAAAAMAAABaAAcAAAAAAAMAAABaAAgAAAABAAMAAABaAAkAAAABAAQAAABaAAoAAAAAAAMAAABaAAsAAAAAAAQAAABaAAwAAAABAAMAAABaAA0AAAABAAMAAABaAA4AAAABAAQAAABaAA8AAAAAAAMAAABaABAAAAAAAAQAAABaABEAAAAAAAMAAABaABIAAAABAAMAAABaABMAAAAAAAQAAABaABQAAAABAAMAAABaABUAAAABAAMAAABaABYAAAAAAAMAAABaABcAAAABAAQAAABaABgAAAAAAAQAAABaABkAAAAAAAQAAABaABoAAAABAAMAAABaABsAAAAAAAQAAABaABwAAAAAAAIAAABaAB0AAAAAAAIAAABbAP//AAADAAAAAABbAAAAAAABAAMAAABbAAEAAAABAAQAAABbAAIAAAAAAAQAAABbAAMAAAABAAQAAABbAAQAAAAAAAQAAABbAAUAAAAAAAQAAABbAAYAAAABAAQAAABbAAcAAAAAAAQAAABbAAgAAAABAAMAAABbAAkAAAABAAMAAABbAAoAAAABAAMAAABbAAsAAAABAAMAAABbAAwAAAAAAAMAAABbAA0AAAAAAAMAAABbAA4AAAABAAQAAABbAA8AAAABAAQAAABbABAAAAAAAAMAAABbABEAAAAAAAQAAABbABIAAAABAAQAAABbABMAAAABAAQAAABbABQAAAAAAAMAAABbABUAAAABAAQAAABbABYAAAAAAAMAAABbABcAAAABAAQAAABbABgAAAABAAMAAABbABkAAAABAAMAAABbABoAAAAAAAMAAABbABsAAAAAAAQAAABbABwAAAAAAAIAAABbAB0AAAAAAAIAAABcAP//AAADAAAAAABcAAAAAAAAAAMAAABcAAEAAAABAAQAAABcAAIAAAAAAAMAAABcAAMAAAABAAMAAABcAAQAAAABAAQAAABcAAUAAAAAAAMAAABcAAYAAAAAAAMAAABcAAcAAAAAAAMAAABcAAgAAAAAAAQAAABcAAkAAAABAAQAAABcAAoAAAAAAAMAAABcAAsAAAABAAMAAABcAAwAAAABAAMAAABcAA0AAAABAAMAAABcAA4AAAABAAMAAABcAA8AAAAAAAMAAABcABAAAAABAAMAAABcABEAAAABAAQAAABcABIAAAAAAAQAAABcABMAAAABAAMAAABcABQAAAAAAAQAAABcABUAAAABAAQAAABcABYAAAABAAMAAABcABcAAAABAAMAAABcABgAAAABAAQAAABcABkAAAAAAAQAAABcABoAAAABAAQAAABcABsAAAABAAQAAABcABwAAAAAAAIAAABcAB0AAAAAAAIAAABdAP//AAADAAAAAABdAAAAAAABAAQAAABdAAEAAAAAAAMAAABdAAIAAAAAAAMAAABdAAMAAAAAAAMAAABdAAQAAAABAAMAAABdAAUAAAABAAQAAABdAAYAAAAAAAQAAABdAAcAAAAAAAMAAABdAAgAAAAAAAMAAABdAAkAAAAAAAQAAABdAAoAAAAAAAQAAABdAAsAAAABAAMAAABdAAwAAAAAAAMAAABdAA0AAAAAAAMAAABdAA4AAAAAAAMAAABdAA8AAAAAAAMAAABdABAAAAAAAAMAAABdABEAAAAAAAQAAABdABIAAAAAAAMAAABdABMAAAAAAAQAAABdABQAAAAAAAQAAABdABUAAAABAAQAAABdABYAAAABAAMAAABdABcAAAABAAMAAABdABgAAAABAAQAAABdABkAAAABAAQAAABdABoAAAABAAMAAABdABsAAAAAAAMAAABdABwAAAAAAAIAAABdAB0AAAAAAAIAAABeAP//AAADAAAAAABeAAAAAAABAAMAAABeAAEAAAAAAAQAAABeAAIAAAAAAAQAAABeAAMAAAAAAAQAAABeAAQAAAAAAAMAAABeAAUAAAABAAMAAABeAAYAAAAAAAQAAABeAAcAAAAAAAQAAABeAAgAAAAAAAMAAABeAAkAAAAAAAQAAABeAAoAAAABAAMAAABeAAsAAAAAAAMAAABeAAwAAAABAAMAAABeAA0AAAABAAQAAABeAA4AAAABAAMAAABeAA8AAAAAAAQAAABeABAAAAAAAAMAAABeABEAAAABAAMAAABeABIAAAABAAMAAABeABMAAAAAAAQAAABeABQAAAABAAMAAABeABUAAAAAAAMAAABeABYAAAAAAAMAAABeABcAAAAAAAMAAABeABgAAAAAAAQAAABeABkAAAABAAQAAABeABoAAAABAAMAAABeABsAAAAAAAMAAABeABwAAAAAAAIAAABeAB0AAAAAAAIAAABfAP//AAADAAAAAABfAAAAAAAAAAMAAABfAAEAAAABAAMAAABfAAIAAAABAAMAAABfAAMAAAABAAMAAABfAAQAAAAAAAMAAABfAAUAAAABAAMAAABfAAYAAAABAAMAAABfAAcAAAAAAAQAAABfAAgAAAAAAAMAAABfAAkAAAAAAAMAAABfAAoAAAAAAAQAAABfAAsAAAAAAAQAAABfAAwAAAAAAAQAAABfAA0AAAAAAAMAAABfAA4AAAABAAQAAABfAA8AAAAAAAMAAABfABAAAAABAAQAAABfABEAAAAAAAQAAABfABIAAAABAAMAAABfABMAAAAAAAQAAABfABQAAAAAAAMAAABfABUAAAAAAAMAAABfABYAAAABAAQAAABfABcAAAAAAAQAAABfABgAAAAAAAMAAABfABkAAAABAAQAAABfABoAAAABAAQAAABfABsAAAAAAAQAAABfABwAAAAAAAIAAABfAB0AAAAAAAIAAABgAP//AAADAAAAAABgAAAAAAABAAMAAABgAAEAAAABAAMAAABgAAIAAAABAAQAAABgAAMAAAAAAAMAAABgAAQAAAAAAAMAAABgAAUAAAAAAAQAAABgAAYAAAAAAAMAAABgAAcAAAAAAAMAAABgAAgAAAAAAAQAAABgAAkAAAAAAAMAAABgAAoAAAAAAAQAAABgAAsAAAAAAAQAAABgAAwAAAAAAAMAAABgAA0AAAAAAAMAAABgAA4AAAAAAAQAAABgAA8AAAAAAAQAAABgABAAAAAAAAMAAABgABEAAAABAAMAAABgABIAAAABAAQAAABgABMAAAABAAQAAABgABQAAAABAAMAAABgABUAAAABAAQAAABgABYAAAABAAMAAABgABcAAAABAAMAAABgABgAAAABAAMAAABgABkAAAABAAMAAABgABoAAAAAAAMAAABgABsAAAABAAMAAABgABwAAAAAAAIAAABgAB0AAAAAAAIAAABhAP//AAADAAAAAABhAAAAAAABAAMAAABhAAEAAAAAAAMAAABhAAIAAAABAAQAAABhAAMAAAABAAMAAABhAAQAAAAAAAMAAABhAAUAAAABAAQAAABhAAYAAAABAAQAAABhAAcAAAAAAAMAAABhAAgAAAABAAQAAABhAAkAAAABAAQAAABhAAoAAAABAAMAAABhAAsAAAABAAQAAABhAAwAAAABAAMAAABhAA0AAAAAAAMAAABhAA4AAAABAAQAAABhAA8AAAAAAAQAAABhABAAAAAAAAQAAABhABEAAAABAAMAAABhABIAAAABAAMAAABhABMAAAABAAMAAABhABQAAAABAAMAAABhABUAAAABAAQAAABhABYAAAABAAMAAABhABcAAAABAAMAAABhABgAAAABAAQAAABhABkAAAABAAQAAABhABoAAAABAAMAAABhABsAAAABAAMAAABhABwAAAAAAAIAAABhAB0AAAAAAAIAAABiAP//AAADAAAAAABiAAAAAAABAAMAAABiAAEAAAAAAAQAAABiAAIAAAAAAAMAAABiAAMAAAABAAMAAABiAAQAAAABAAQAAABiAAUAAAABAAQAAABiAAYAAAAAAAMAAABiAAcAAAAAAAQAAABiAAgAAAAAAAMAAABiAAkAAAABAAQAAABiAAoAAAAAAAQAAABiAAsAAAABAAQAAABiAAwAAAAAAAQAAABiAA0AAAABAAQAAABiAA4AAAABAAMAAABiAA8AAAAAAAQAAABiABAAAAABAAQAAABiABEAAAAAAAMAAABiABIAAAAAAAMAAABiABMAAAABAAQAAABiABQAAAABAAQAAABiABUAAAABAAQAAABiABYAAAABAAMAAABiABcAAAAAAAMAAABiABgAAAAAAAMAAABiABkAAAABAAQAAABiABoAAAABAAMAAABiABsAAAAAAAQAAABiABwAAAAAAAIAAABiAB0AAAAAAAIAAABjAP//AAADAAAAAABjAAAAAAABAAQAAABjAAEAAAAAAAQAAABjAAIAAAABAAMAAABjAAMAAAABAAMAAABjAAQAAAABAAMAAABjAAUAAAAAAAMAAABjAAYAAAABAAQAAABjAAcAAAABAAQAAABjAAgAAAABAAMAAABjAAkAAAABAAQAAABjAAoAAAABAAMAAABjAAsAAAABAAQAAABjAAwAAAAAAAMAAABjAA0AAAAAAAMAAABjAA4AAAABAAQAAABjAA8AAAABAAMAAABjABAAAAABAAQAAABjABEAAAAAAAQAAABjABIAAAAAAAQAAABjABMAAAAAAAMAAABjABQAAAAAAAMAAABjABUAAAAAAAMAAABjABYAAAABAAQAAABjABcAAAABAAMAAABjABgAAAABAAQAAABjABkAAAAAAAQAAABjABoAAAAAAAMAAABjABsAAAABAAQAAABjABwAAAAAAAIAAABjAB0AAAAAAAIAAABkAP//AAADAAAAAABkAAAAAAAAAAQAAABkAAEAAAABAAQAAABkAAIAAAAAAAQAAABkAAMAAAAAAAQAAABkAAQAAAABAAMAAABkAAUAAAABAAMAAABkAAYAAAAAAAQAAABkAAcAAAABAAQAAABkAAgAAAABAAQAAABkAAkAAAABAAQAAABkAAoAAAABAAQAAABkAAsAAAABAAMAAABkAAwAAAABAAMAAABkAA0AAAAAAAQAAABkAA4AAAAAAAMAAABkAA8AAAAAAAMAAABkABAAAAABAAQAAABkABEAAAABAAQAAABkABIAAAAAAAQAAABkABMAAAAAAAMAAABkABQAAAAAAAMAAABkABUAAAABAAMAAABkABYAAAAAAAQAAABkABcAAAABAAQAAABkABgAAAAAAAQAAABkABkAAAABAAMAAABkABoAAAABAAMAAABkABsAAAAAAAMAAABkABwAAAAAAAIAAABkAB0AAAAAAAIAAABlAP//AAADAAIAAABlAAAAAAADAAIAAABlAAEAAAADAAIAAABlAAIAAAADAAIAAABlAAMAAAADAAIAAABlAAQAAAADAAIAAABlAAUAAAADAAIAAABlAAYAAAADAAIAAABlAAcAAAADAAIAAABlAAgAAAADAAIAAABlAAkAAAADAAIAAABlAAoAAAADAAIAAABlAAsAAAADAAIAAABlAAwAAAADAAIAAABlAA0AAAADAAIAAABlAA4AAAADAAIAAABlAA8AAAADAAIAAABlABAAAAADAAIAAABlABEAAAADAAIAAABlABIAAAADAAIAAABlABMAAAADAAIAAABlABQAAAADAAIAAABlABUAAAADAAIAAABlABYAAAADAAIAAABlABcAAAADAAIAAABlABgAAAADAAIAAABlABkAAAADAAIAAABlABoAAAADAAIAAABlABsAAAADAAIAAABlABwAAAADAAIAAABlAB0AAAADAAIAAABmAP//AAADAAIAAABmAAAAAAADAAIAAABmAAEAAAADAAIAAABmAAIAAAADAAIAAABmAAMAAAADAAIAAABmAAQAAAADAAIAAABmAAUAAAADAAIAAABmAAYAAAADAAIAAABmAAcAAAADAAIAAABmAAgAAAADAAIAAABmAAkAAAADAAIAAABmAAoAAAADAAIAAABmAAsAAAADAAIAAABmAAwAAAADAAIAAABmAA0AAAADAAIAAABmAA4AAAADAAIAAABmAA8AAAADAAIAAABmABAAAAADAAIAAABmABEAAAADAAIAAABmABIAAAADAAIAAABmABMAAAADAAIAAABmABQAAAADAAIAAABmABUAAAADAAIAAABmABYAAAADAAIAAABmABcAAAADAAIAAABmABgAAAADAAIAAABmABkAAAADAAIAAABmABoAAAADAAIAAABmABsAAAADAAIAAABmABwAAAADAAIAAABmAB0AAAADAAIAAABnAP//AAADAAIAAABnAAAAAAADAAIAAABnAAEAAAADAAIAAABnAAIAAAADAAIAAABnAAMAAAADAAIAAABnAAQAAAADAAIAAABnAAUAAAADAAIAAABnAAYAAAADAAIAAABnAAcAAAADAAIAAABnAAgAAAADAAIAAABnAAkAAAADAAIAAABnAAoAAAADAAIAAABnAAsAAAADAAIAAABnAAwAAAADAAIAAABnAA0AAAADAAIAAABnAA4AAAADAAIAAABnAA8AAAADAAIAAABnABAAAAADAAIAAABnABEAAAADAAIAAABnABIAAAADAAIAAABnABMAAAADAAIAAABnABQAAAADAAIAAABnABUAAAADAAIAAABnABYAAAADAAIAAABnABcAAAADAAIAAABnABgAAAADAAIAAABnABkAAAADAAIAAABnABoAAAADAAIAAABnABsAAAADAAIAAABnABwAAAADAAIAAABnAB0AAAADAAIAAABoAP//AAADAAIAAABoAAAAAAADAAIAAABoAAEAAAADAAIAAABoAAIAAAADAAIAAABoAAMAAAADAAIAAABoAAQAAAADAAIAAABoAAUAAAADAAIAAABoAAYAAAADAAIAAABoAAcAAAADAAIAAABoAAgAAAADAAIAAABoAAkAAAADAAIAAABoAAoAAAADAAIAAABoAAsAAAADAAIAAABoAAwAAAADAAIAAABoAA0AAAADAAIAAABoAA4AAAADAAIAAABoAA8AAAADAAIAAABoABAAAAADAAIAAABoABEAAAADAAIAAABoABIAAAADAAIAAABoABMAAAADAAIAAABoABQAAAADAAIAAABoABUAAAADAAIAAABoABYAAAADAAIAAABoABcAAAADAAIAAABoABgAAAADAAIAAABoABkAAAADAAIAAABoABoAAAADAAIAAABoABsAAAADAAIAAABoABwAAAADAAIAAABoAB0AAAADAAIAAABpAP//AAADAAIAAABpAAAAAAADAAIAAABpAAEAAAADAAIAAABpAAIAAAADAAIAAABpAAMAAAADAAIAAABpAAQAAAADAAIAAABpAAUAAAADAAIAAABpAAYAAAADAAIAAABpAAcAAAADAAIAAABpAAgAAAADAAIAAABpAAkAAAADAAIAAABpAAoAAAADAAIAAABpAAsAAAADAAIAAABpAAwAAAADAAIAAABpAA0AAAADAAIAAABpAA4AAAADAAIAAABpAA8AAAADAAIAAABpABAAAAADAAIAAABpABEAAAADAAIAAABpABIAAAADAAIAAABpABMAAAADAAIAAABpABQAAAADAAIAAABpABUAAAADAAIAAABpABYAAAADAAIAAABpABcAAAADAAIAAABpABgAAAADAAIAAABpABkAAAADAAIAAABpABoAAAADAAIAAABpABsAAAADAAIAAABpABwAAAADAAIAAABpAB0AAAADAAIAAABqAP//AAADAAIAAABqAAAAAAADAAIAAABqAAEAAAADAAIAAABqAAIAAAADAAIAAABqAAMAAAADAAIAAABqAAQAAAADAAIAAABqAAUAAAADAAIAAABqAAYAAAADAAIAAABqAAcAAAADAAIAAABqAAgAAAADAAIAAABqAAkAAAADAAIAAABqAAoAAAADAAIAAABqAAsAAAADAAIAAABqAAwAAAADAAIAAABqAA0AAAADAAIAAABqAA4AAAADAAIAAABqAA8AAAADAAIAAABqABAAAAADAAIAAABqABEAAAADAAIAAABqABIAAAADAAIAAABqABMAAAADAAIAAABqABQAAAADAAIAAABqABUAAAADAAIAAABqABYAAAADAAIAAABqABcAAAADAAIAAABqABgAAAADAAIAAABqABkAAAADAAIAAABqABoAAAADAAIAAABqABsAAAADAAIAAABqABwAAAADAAIAAABqAB0AAAADAAIAAABrAP//AAADAAIAAABrAAAAAAADAAIAAABrAAEAAAADAAIAAABrAAIAAAADAAIAAABrAAMAAAADAAIAAABrAAQAAAADAAIAAABrAAUAAAADAAIAAABrAAYAAAADAAIAAABrAAcAAAADAAIAAABrAAgAAAADAAIAAABrAAkAAAADAAIAAABrAAoAAAADAAIAAABrAAsAAAADAAIAAABrAAwAAAADAAIAAABrAA0AAAADAAIAAABrAA4AAAADAAIAAABrAA8AAAADAAIAAABrABAAAAADAAIAAABrABEAAAADAAIAAABrABIAAAADAAIAAABrABMAAAADAAIAAABrABQAAAADAAIAAABrABUAAAADAAIAAABrABYAAAADAAIAAABrABcAAAADAAIAAABrABgAAAADAAIAAABrABkAAAADAAIAAABrABoAAAADAAIAAABrABsAAAADAAIAAABrABwAAAADAAIAAABrAB0AAAADAAIAAAAAAB4AAAAAAAIAAAAAAB8AAAAAAAIAAAAAACAAAAAAAAIAAAAAACEAAAAAAAIAAAAAACIAAAAAAAIAAAAAACMAAAAAAAIAAAABAB4AAAAAAAIAAAABAB8AAAAAAAIAAAABACAAAAAAAAIAAAABACEAAAAAAAIAAAABACIAAAAAAAIAAAABACMAAAAAAAIAAAACAB4AAAAAAAIAAAACAB8AAAAAAAIAAAACACAAAAAAAAIAAAACACEAAAAAAAIAAAACACIAAAAAAAIAAAACACMAAAAAAAIAAAADAB4AAAAAAAIAAAADAB8AAAAAAAIAAAADACAAAAAAAAIAAAADACEAAAAAAAIAAAADACIAAAAAAAIAAAADACMAAAAAAAIAAAAEAB4AAAAAAAIAAAAEAB8AAAAAAAIAAAAEACAAAAAAAAIAAAAEACEAAAAAAAIAAAAEACIAAAAAAAIAAAAEACMAAAAAAAIAAAAFAB4AAAAAAAIAAAAFAB8AAAAAAAIAAAAFACAAAAAAAAIAAAAFACEAAAAAAAIAAAAFACIAAAAAAAIAAAAFACMAAAAAAAIAAAAGAB4AAAAAAAIAAAAGAB8AAAAAAAIAAAAGACAAAAAAAAIAAAAGACEAAAAAAAIAAAAGACIAAAAAAAIAAAAGACMAAAAAAAIAAAAHAB4AAAAAAAIAAAAHAB8AAAAAAAIAAAAHACAAAAAAAAIAAAAHACEAAAAAAAIAAAAHACIAAAAAAAIAAAAHACMAAAAAAAIAAAAIAB4AAAAAAAIAAAAIAB8AAAAAAAIAAAAIACAAAAAAAAIAAAAIACEAAAAAAAIAAAAIACIAAAAAAAIAAAAIACMAAAAAAAIAAAAJAB4AAAAAAAIAAAAJAB8AAAAAAAIAAAAJACAAAAAAAAIAAAAJACEAAAAAAAIAAAAJACIAAAAAAAIAAAAJACMAAAAAAAIAAAAKAB4AAAAAAAIAAAAKAB8AAAAAAAIAAAAKACAAAAAAAAIAAAAKACEAAAAAAAIAAAAKACIAAAAAAAIAAAAKACMAAAAAAAIAAAALAB4AAAAAAAIAAAALAB8AAAAAAAIAAAALACAAAAAAAAIAAAALACEAAAAAAAIAAAALACIAAAAAAAIAAAALACMAAAAAAAIAAAAMAB4AAAAAAAIAAAAMAB8AAAAAAAIAAAAMACAAAAAAAAIAAAAMACEAAAAAAAIAAAAMACIAAAAAAAIAAAAMACMAAAAAAAIAAAANAB4AAAAAAAIAAAANAB8AAAAAAAIAAAANACAAAAAAAAIAAAANACEAAAAAAAIAAAANACIAAAAAAAIAAAANACMAAAAAAAIAAAAOAB4AAAAAAAIAAAAOAB8AAAAAAAIAAAAOACAAAAAAAAIAAAAOACEAAAAAAAIAAAAOACIAAAAAAAIAAAAOACMAAAAAAAIAAAAPAB4AAAAAAAIAAAAPAB8AAAAAAAIAAAAPACAAAAAAAAIAAAAPACEAAAAAAAIAAAAPACIAAAAAAAIAAAAPACMAAAAAAAIAAAAQAB4AAAAAAAIAAAAQAB8AAAAAAAIAAAAQACAAAAAAAAIAAAAQACEAAAAAAAIAAAAQACIAAAAAAAIAAAAQACMAAAAAAAIAAAARAB4AAAAAAAIAAAARAB8AAAAAAAIAAAARACAAAAAAAAIAAAARACEAAAAAAAIAAAARACIAAAAAAAIAAAARACMAAAAAAAIAAAASAB4AAAAAAAIAAAASAB8AAAAAAAIAAAASACAAAAAAAAIAAAASACEAAAAAAAIAAAASACIAAAAAAAIAAAASACMAAAAAAAIAAAATAB4AAAAAAAIAAAATAB8AAAAAAAIAAAATACAAAAAAAAIAAAATACEAAAAAAAIAAAATACIAAAAAAAIAAAATACMAAAAAAAIAAAAUAB4AAAAAAAIAAAAUAB8AAAAAAAIAAAAUACAAAAAAAAIAAAAUACEAAAAAAAIAAAAUACIAAAAAAAIAAAAUACMAAAAAAAIAAAAVAB4AAAAAAAIAAAAVAB8AAAAAAAIAAAAVACAAAAAAAAIAAAAVACEAAAAAAAIAAAAVACIAAAAAAAIAAAAVACMAAAAAAAIAAAAWAB4AAAAAAAIAAAAWAB8AAAAAAAIAAAAWACAAAAAAAAIAAAAWACEAAAAAAAIAAAAWACIAAAAAAAIAAAAWACMAAAAAAAIAAAAXAB4AAAAAAAIAAAAXAB8AAAAAAAIAAAAXACAAAAAAAAIAAAAXACEAAAAAAAIAAAAXACIAAAAAAAIAAAAXACMAAAAAAAIAAAAYAB4AAAAAAAIAAAAYAB8AAAAAAAIAAAAYACAAAAAAAAIAAAAYACEAAAAAAAIAAAAYACIAAAAAAAIAAAAYACMAAAAAAAIAAAAZAB4AAAAAAAIAAAAZAB8AAAAAAAIAAAAZACAAAAAAAAIAAAAZACEAAAAAAAIAAAAZACIAAAAAAAIAAAAZACMAAAAAAAIAAAAaAB4AAAAAAAIAAAAaAB8AAAAAAAIAAAAaACAAAAAAAAIAAAAaACEAAAAAAAIAAAAaACIAAAAAAAIAAAAaACMAAAAAAAIAAAAbAB4AAAAAAAIAAAAbAB8AAAAAAAIAAAAbACAAAAAAAAIAAAAbACEAAAAAAAIAAAAbACIAAAAAAAIAAAAbACMAAAAAAAIAAAAcAB4AAAAAAAIAAAAcAB8AAAAAAAIAAAAcACAAAAAAAAIAAAAcACEAAAAAAAIAAAAcACIAAAAAAAIAAAAcACMAAAAAAAIAAAAdAB4AAAAAAAIAAAAdAB8AAAAAAAIAAAAdACAAAAAAAAIAAAAdACEAAAAAAAIAAAAdACIAAAAAAAIAAAAdACMAAAAAAAIAAAAeAB4AAAAAAAIAAAAeAB8AAAAAAAIAAAAeACAAAAAAAAIAAAAeACEAAAAAAAIAAAAeACIAAAAAAAIAAAAeACMAAAAAAAIAAAAfAB4AAAAAAAIAAAAfAB8AAAAAAAIAAAAfACAAAAAAAAIAAAAfACEAAAAAAAIAAAAfACIAAAAAAAIAAAAfACMAAAAAAAIAAAAgAB4AAAAAAAIAAAAgAB8AAAAAAAIAAAAgACAAAAAAAAIAAAAgACEAAAAAAAIAAAAgACIAAAAAAAIAAAAgACMAAAAAAAIAAAAhAB4AAAAAAAIAAAAhAB8AAAAAAAIAAAAhACAAAAAAAAIAAAAhACEAAAAAAAIAAAAhACIAAAAAAAIAAAAhACMAAAAAAAIAAAAiAB4AAAAAAAIAAAAiAB8AAAAAAAIAAAAiACAAAAAAAAIAAAAiACEAAAAAAAIAAAAiACIAAAAAAAIAAAAiACMAAAAAAAIAAAAjAB4AAAAAAAIAAAAjAB8AAAAAAAIAAAAjACAAAAAAAAIAAAAjACEAAAAAAAIAAAAjACIAAAAAAAIAAAAjACMAAAAAAAIAAAAkAB4AAAAAAAIAAAAkAB8AAAAAAAIAAAAkACAAAAAAAAIAAAAkACEAAAAAAAIAAAAkACIAAAAAAAIAAAAkACMAAAAAAAIAAAAlAB4AAAAAAAIAAAAlAB8AAAAAAAIAAAAlACAAAAAAAAIAAAAlACEAAAAAAAIAAAAlACIAAAAAAAIAAAAlACMAAAAAAAIAAAAmAB4AAAAAAAIAAAAmAB8AAAAAAAIAAAAmACAAAAAAAAIAAAAmACEAAAAAAAIAAAAmACIAAAAAAAIAAAAmACMAAAAAAAIAAAAnAB4AAAAAAAIAAAAnAB8AAAAAAAIAAAAnACAAAAAAAAIAAAAnACEAAAAAAAIAAAAnACIAAAAAAAIAAAAnACMAAAAAAAIAAAAoAB4AAAAAAAIAAAAoAB8AAAAAAAIAAAAoACAAAAAAAAIAAAAoACEAAAAAAAIAAAAoACIAAAAAAAIAAAAoACMAAAAAAAIAAAApAB4AAAAAAAIAAAApAB8AAAAAAAIAAAApACAAAAAAAAIAAAApACEAAAAAAAIAAAApACIAAAAAAAIAAAApACMAAAAAAAIAAAAqAB4AAAAAAAIAAAAqAB8AAAAAAAIAAAAqACAAAAAAAAIAAAAqACEAAAAAAAIAAAAqACIAAAAAAAIAAAAqACMAAAAAAAIAAAArAB4AAAAAAAIAAAArAB8AAAAAAAIAAAArACAAAAAAAAIAAAArACEAAAAAAAIAAAArACIAAAAAAAIAAAArACMAAAAAAAIAAAAsAB4AAAAAAAIAAAAsAB8AAAAAAAIAAAAsACAAAAAAAAIAAAAsACEAAAAAAAIAAAAsACIAAAAAAAIAAAAsACMAAAAAAAIAAAAtAB4AAAAAAAIAAAAtAB8AAAAAAAIAAAAtACAAAAAAAAIAAAAtACEAAAAAAAIAAAAtACIAAAAAAAIAAAAtACMAAAAAAAIAAAAuAB4AAAAAAAIAAAAuAB8AAAAAAAIAAAAuACAAAAAAAAIAAAAuACEAAAAAAAIAAAAuACIAAAAAAAIAAAAuACMAAAAAAAIAAAAvAB4AAAAAAAIAAAAvAB8AAAAAAAIAAAAvACAAAAAAAAIAAAAvACEAAAAAAAIAAAAvACIAAAAAAAIAAAAvACMAAAAAAAIAAAAwAB4AAAAAAAIAAAAwAB8AAAAAAAIAAAAwACAAAAAAAAIAAAAwACEAAAAAAAIAAAAwACIAAAAAAAIAAAAwACMAAAAAAAIAAAAxAB4AAAAAAAIAAAAxAB8AAAAAAAIAAAAxACAAAAAAAAIAAAAxACEAAAAAAAIAAAAxACIAAAAAAAIAAAAxACMAAAAAAAIAAAAyAB4AAAAAAAIAAAAyAB8AAAAAAAIAAAAyACAAAAAAAAIAAAAyACEAAAAAAAIAAAAyACIAAAAAAAIAAAAyACMAAAAAAAIAAAAzAB4AAAAAAAIAAAAzAB8AAAAAAAIAAAAzACAAAAAAAAIAAAAzACEAAAAAAAIAAAAzACIAAAAAAAIAAAAzACMAAAAAAAIAAAA0AB4AAAAAAAIAAAA0AB8AAAAAAAIAAAA0ACAAAAAAAAIAAAA0ACEAAAAAAAIAAAA0ACIAAAAAAAIAAAA0ACMAAAAAAAIAAAA1AB4AAAAAAAIAAAA1AB8AAAAAAAIAAAA1ACAAAAAAAAIAAAA1ACEAAAAAAAIAAAA1ACIAAAAAAAIAAAA1ACMAAAAAAAIAAAA2AB4AAAAAAAIAAAA2AB8AAAAAAAIAAAA2ACAAAAAAAAIAAAA2ACEAAAAAAAIAAAA2ACIAAAAAAAIAAAA2ACMAAAAAAAIAAAA3AB4AAAAAAAIAAAA3AB8AAAAAAAIAAAA3ACAAAAAAAAIAAAA3ACEAAAAAAAIAAAA3ACIAAAAAAAIAAAA3ACMAAAAAAAIAAAA4AB4AAAAAAAIAAAA4AB8AAAAAAAIAAAA4ACAAAAAAAAIAAAA4ACEAAAAAAAIAAAA4ACIAAAAAAAIAAAA4ACMAAAAAAAIAAAA5AB4AAAAAAAIAAAA5AB8AAAAAAAIAAAA5ACAAAAAAAAIAAAA5ACEAAAAAAAIAAAA5ACIAAAAAAAIAAAA5ACMAAAAAAAIAAAA6AB4AAAAAAAIAAAA6AB8AAAAAAAIAAAA6ACAAAAAAAAIAAAA6ACEAAAAAAAIAAAA6ACIAAAAAAAIAAAA6ACMAAAAAAAIAAAA7AB4AAAAAAAIAAAA7AB8AAAAAAAIAAAA7ACAAAAAAAAIAAAA7ACEAAAAAAAIAAAA7ACIAAAAAAAIAAAA7ACMAAAAAAAIAAAA8AB4AAAAAAAIAAAA8AB8AAAAAAAIAAAA8ACAAAAAAAAIAAAA8ACEAAAAAAAIAAAA8ACIAAAAAAAIAAAA8ACMAAAAAAAIAAAA9AB4AAAAAAAIAAAA9AB8AAAAAAAIAAAA9ACAAAAAAAAIAAAA9ACEAAAAAAAIAAAA9ACIAAAAAAAIAAAA9ACMAAAAAAAIAAAA+AB4AAAAAAAIAAAA+AB8AAAAAAAIAAAA+ACAAAAAAAAIAAAA+ACEAAAAAAAIAAAA+ACIAAAAAAAIAAAA+ACMAAAAAAAIAAAA/AB4AAAAAAAIAAAA/AB8AAAAAAAIAAAA/ACAAAAAAAAIAAAA/ACEAAAAAAAIAAAA/ACIAAAAAAAIAAAA/ACMAAAAAAAIAAABAAB4AAAAAAAIAAABAAB8AAAAAAAIAAABAACAAAAAAAAIAAABAACEAAAAAAAIAAABAACIAAAAAAAIAAABAACMAAAAAAAIAAABBAB4AAAAAAAIAAABBAB8AAAAAAAIAAABBACAAAAAAAAIAAABBACEAAAAAAAIAAABBACIAAAAAAAIAAABBACMAAAAAAAIAAABCAB4AAAAAAAIAAABCAB8AAAAAAAIAAABCACAAAAAAAAIAAABCACEAAAAAAAIAAABCACIAAAAAAAIAAABCACMAAAAAAAIAAABDAB4AAAAAAAIAAABDAB8AAAAAAAIAAABDACAAAAAAAAIAAABDACEAAAAAAAIAAABDACIAAAAAAAIAAABDACMAAAAAAAIAAABEAB4AAAAAAAIAAABEAB8AAAAAAAIAAABEACAAAAAAAAIAAABEACEAAAAAAAIAAABEACIAAAAAAAIAAABEACMAAAAAAAIAAABFAB4AAAAAAAIAAABFAB8AAAAAAAIAAABFACAAAAAAAAIAAABFACEAAAAAAAIAAABFACIAAAAAAAIAAABFACMAAAAAAAIAAABGAB4AAAAAAAIAAABGAB8AAAAAAAIAAABGACAAAAAAAAIAAABGACEAAAAAAAIAAABGACIAAAAAAAIAAABGACMAAAAAAAIAAABHAB4AAAAAAAIAAABHAB8AAAAAAAIAAABHACAAAAAAAAIAAABHACEAAAAAAAIAAABHACIAAAAAAAIAAABHACMAAAAAAAIAAABIAB4AAAAAAAIAAABIAB8AAAAAAAIAAABIACAAAAAAAAIAAABIACEAAAAAAAIAAABIACIAAAAAAAIAAABIACMAAAAAAAIAAABJAB4AAAAAAAIAAABJAB8AAAAAAAIAAABJACAAAAAAAAIAAABJACEAAAAAAAIAAABJACIAAAAAAAIAAABJACMAAAAAAAIAAABKAB4AAAAAAAIAAABKAB8AAAAAAAIAAABKACAAAAAAAAIAAABKACEAAAAAAAIAAABKACIAAAAAAAIAAABKACMAAAAAAAIAAABLAB4AAAAAAAIAAABLAB8AAAAAAAIAAABLACAAAAAAAAIAAABLACEAAAAAAAIAAABLACIAAAAAAAIAAABLACMAAAAAAAIAAABMAB4AAAAAAAIAAABMAB8AAAAAAAIAAABMACAAAAAAAAIAAABMACEAAAAAAAIAAABMACIAAAAAAAIAAABMACMAAAAAAAIAAABNAB4AAAAAAAIAAABNAB8AAAAAAAIAAABNACAAAAAAAAIAAABNACEAAAAAAAIAAABNACIAAAAAAAIAAABNACMAAAAAAAIAAABOAB4AAAAAAAIAAABOAB8AAAAAAAIAAABOACAAAAAAAAIAAABOACEAAAAAAAIAAABOACIAAAAAAAIAAABOACMAAAAAAAIAAABPAB4AAAAAAAIAAABPAB8AAAAAAAIAAABPACAAAAAAAAIAAABPACEAAAAAAAIAAABPACIAAAAAAAIAAABPACMAAAAAAAIAAABQAB4AAAAAAAIAAABQAB8AAAAAAAIAAABQACAAAAAAAAIAAABQACEAAAAAAAIAAABQACIAAAAAAAIAAABQACMAAAAAAAIAAABRAB4AAAAAAAIAAABRAB8AAAAAAAIAAABRACAAAAAAAAIAAABRACEAAAAAAAIAAABRACIAAAAAAAIAAABRACMAAAAAAAIAAABSAB4AAAAAAAIAAABSAB8AAAAAAAIAAABSACAAAAAAAAIAAABSACEAAAAAAAIAAABSACIAAAAAAAIAAABSACMAAAAAAAIAAABTAB4AAAAAAAIAAABTAB8AAAAAAAIAAABTACAAAAAAAAIAAABTACEAAAAAAAIAAABTACIAAAAAAAIAAABTACMAAAAAAAIAAABUAB4AAAAAAAIAAABUAB8AAAAAAAIAAABUACAAAAAAAAIAAABUACEAAAAAAAIAAABUACIAAAAAAAIAAABUACMAAAAAAAIAAABVAB4AAAAAAAIAAABVAB8AAAAAAAIAAABVACAAAAAAAAIAAABVACEAAAAAAAIAAABVACIAAAAAAAIAAABVACMAAAAAAAIAAABWAB4AAAAAAAIAAABWAB8AAAAAAAIAAABWACAAAAAAAAIAAABWACEAAAAAAAIAAABWACIAAAAAAAIAAABWACMAAAAAAAIAAABXAB4AAAAAAAIAAABXAB8AAAAAAAIAAABXACAAAAAAAAIAAABXACEAAAAAAAIAAABXACIAAAAAAAIAAABXACMAAAAAAAIAAABYAB4AAAAAAAIAAABYAB8AAAAAAAIAAABYACAAAAAAAAIAAABYACEAAAAAAAIAAABYACIAAAAAAAIAAABYACMAAAAAAAIAAABZAB4AAAAAAAIAAABZAB8AAAAAAAIAAABZACAAAAAAAAIAAABZACEAAAAAAAIAAABZACIAAAAAAAIAAABZACMAAAAAAAIAAABaAB4AAAAAAAIAAABaAB8AAAAAAAIAAABaACAAAAAAAAIAAABaACEAAAAAAAIAAABaACIAAAAAAAIAAABaACMAAAAAAAIAAABbAB4AAAAAAAIAAABbAB8AAAAAAAIAAABbACAAAAAAAAIAAABbACEAAAAAAAIAAABbACIAAAAAAAIAAABbACMAAAAAAAIAAABcAB4AAAAAAAIAAABcAB8AAAAAAAIAAABcACAAAAAAAAIAAABcACEAAAAAAAIAAABcACIAAAAAAAIAAABcACMAAAAAAAIAAABdAB4AAAAAAAIAAABdAB8AAAAAAAIAAABdACAAAAAAAAIAAABdACEAAAAAAAIAAABdACIAAAAAAAIAAABdACMAAAAAAAIAAABeAB4AAAAAAAIAAABeAB8AAAAAAAIAAABeACAAAAAAAAIAAABeACEAAAAAAAIAAABeACIAAAAAAAIAAABeACMAAAAAAAIAAABfAB4AAAAAAAIAAABfAB8AAAAAAAIAAABfACAAAAAAAAIAAABfACEAAAAAAAIAAABfACIAAAAAAAIAAABfACMAAAAAAAIAAABgAB4AAAAAAAIAAABgAB8AAAAAAAIAAABgACAAAAAAAAIAAABgACEAAAAAAAIAAABgACIAAAAAAAIAAABgACMAAAAAAAIAAABhAB4AAAAAAAIAAABhAB8AAAAAAAIAAABhACAAAAAAAAIAAABhACEAAAAAAAIAAABhACIAAAAAAAIAAABhACMAAAAAAAIAAABiAB4AAAAAAAIAAABiAB8AAAAAAAIAAABiACAAAAAAAAIAAABiACEAAAAAAAIAAABiACIAAAAAAAIAAABiACMAAAAAAAIAAABjAB4AAAAAAAIAAABjAB8AAAAAAAIAAABjACAAAAAAAAIAAABjACEAAAAAAAIAAABjACIAAAAAAAIAAABjACMAAAAAAAIAAABkAB4AAAAAAAIAAABkAB8AAAAAAAIAAABkACAAAAAAAAIAAABkACEAAAAAAAIAAABkACIAAAAAAAIAAABkACMAAAAAAAIAAABlAB4AAAADAAIAAABlAB8AAAAAAAIAAABlACAAAAAAAAIAAABlACEAAAAAAAIAAABlACIAAAAAAAIAAABlACMAAAAAAAIAAABmAB4AAAADAAIAAABmAB8AAAAAAAIAAABmACAAAAAAAAIAAABmACEAAAAAAAIAAABmACIAAAAAAAIAAABmACMAAAAAAAIAAABnAB4AAAADAAIAAABnAB8AAAAAAAIAAABnACAAAAAAAAIAAABnACEAAAAAAAIAAABnACIAAAAAAAIAAABnACMAAAAAAAIAAABoAB4AAAADAAIAAABoAB8AAAAAAAIAAABoACAAAAAAAAIAAABoACEAAAAAAAIAAABoACIAAAAAAAIAAABoACMAAAAAAAIAAABpAB4AAAADAAIAAABpAB8AAAAAAAIAAABpACAAAAAAAAIAAABpACEAAAAAAAIAAABpACIAAAAAAAIAAABpACMAAAAAAAIAAABqAB4AAAADAAIAAABqAB8AAAAAAAIAAABqACAAAAAAAAIAAABqACEAAAAAAAIAAABqACIAAAAAAAIAAABqACMAAAAAAAIAAAA3ABsAAAADAAMAAAA4ABoAAAAAAAQAAAA5ABkAAAABAAMAAAA6ABgAAAAAAAMAAAA7ABcAAAABAAQAAAA8ABYAAAABAAMAAAA9ABUAAAABAAQAAAA+ABQAAAAAAAMAAAA/ABMAAAABAAQAAABAABIAAAAAAAQAAABBABEAAAAAAAQAAABCABAAAAABAAMAAABDAA8AAAABAAMAAABEAA4AAAABAAMAAABFAA0AAAAAAAMAAABGAAwAAAABAAQAAABrAB4AAAADAAIAAAA=") +tile_set = SubResource("TileSet_c4cnm") +metadata/_edit_lock_ = true + +[node name="View_Layer_2" type="TileMapLayer" parent="Tile_Group"] +light_mask = 2 +z_index = 2 +tile_set = SubResource("TileSet_c4cnm") +metadata/_edit_lock_ = true + +[node name="View_Layer_3" type="TileMapLayer" parent="Tile_Group"] +z_index = 3 +tile_map_data = PackedByteArray("AABHAA4AAAADAAIAAABHAA8AAAADAAIAAABHABAAAAADAAIAAABHABEAAAADAAIAAABHABIAAAADAAIAAABHABMAAAADAAIAAABHABQAAAADAAIAAABHABUAAAADAAIAAABHABYAAAADAAIAAABHABcAAAADAAIAAABHABgAAAADAAIAAABHABkAAAADAAIAAABHABoAAAADAAIAAABHABsAAAADAAIAAABIAA4AAAADAAIAAABIAA8AAAADAAIAAABIABAAAAADAAIAAABIABEAAAADAAIAAABIABIAAAADAAIAAABIABMAAAADAAIAAABIABQAAAADAAIAAABIABUAAAADAAIAAABIABYAAAADAAIAAABIABcAAAADAAIAAABIABgAAAADAAIAAABIABkAAAADAAIAAABIABoAAAADAAIAAABIABsAAAADAAIAAABJAA4AAAADAAIAAABJAA8AAAADAAIAAABJABAAAAADAAIAAABJABEAAAADAAIAAABJABIAAAADAAIAAABJABMAAAADAAIAAABJABQAAAADAAIAAABJABUAAAADAAIAAABJABYAAAADAAIAAABJABcAAAADAAIAAABJABgAAAADAAIAAABJABkAAAADAAIAAABJABoAAAADAAIAAABJABsAAAADAAIAAABKAA4AAAADAAIAAABKAA8AAAADAAIAAABKABAAAAADAAIAAABKABEAAAADAAIAAABKABIAAAADAAIAAABKABMAAAADAAIAAABKABQAAAADAAIAAABKABUAAAADAAIAAABKABYAAAADAAIAAABKABcAAAADAAIAAABKABgAAAADAAIAAABKABkAAAADAAIAAABKABoAAAADAAIAAABKABsAAAADAAIAAABLAA4AAAADAAIAAABLAA8AAAADAAIAAABLABAAAAADAAIAAABLABEAAAADAAIAAABLABIAAAADAAIAAABLABMAAAADAAIAAABLABQAAAADAAIAAABLABUAAAADAAIAAABLABYAAAADAAIAAABLABcAAAADAAIAAABLABgAAAADAAIAAABLABkAAAADAAIAAABLABoAAAADAAIAAABLABsAAAADAAIAAABMAA4AAAADAAIAAABMAA8AAAADAAIAAABMABAAAAADAAIAAABMABEAAAADAAIAAABMABIAAAADAAIAAABMABMAAAADAAIAAABMABQAAAADAAIAAABMABUAAAADAAIAAABMABYAAAADAAIAAABMABcAAAADAAIAAABMABgAAAADAAIAAABMABkAAAADAAIAAABMABoAAAADAAIAAABMABsAAAADAAIAAABNAA4AAAADAAIAAABNAA8AAAADAAIAAABNABAAAAADAAIAAABNABEAAAADAAIAAABNABIAAAADAAIAAABNABMAAAADAAIAAABNABQAAAADAAIAAABNABUAAAADAAIAAABNABYAAAADAAIAAABNABcAAAADAAIAAABNABgAAAADAAIAAABNABkAAAADAAIAAABNABoAAAADAAIAAABNABsAAAADAAIAAABOAA4AAAADAAIAAABOAA8AAAADAAIAAABOABAAAAADAAIAAABOABEAAAADAAIAAABOABIAAAADAAIAAABOABMAAAADAAIAAABOABQAAAADAAIAAABOABUAAAADAAIAAABOABYAAAADAAIAAABOABcAAAADAAIAAABOABgAAAADAAIAAABOABkAAAADAAIAAABOABoAAAADAAIAAABOABsAAAADAAIAAABPAA4AAAADAAIAAABPAA8AAAADAAIAAABPABAAAAADAAIAAABPABEAAAADAAIAAABPABIAAAADAAIAAABPABMAAAADAAIAAABPABQAAAADAAIAAABPABUAAAADAAIAAABPABYAAAADAAIAAABPABcAAAADAAIAAABPABgAAAADAAIAAABPABkAAAADAAIAAABPABoAAAADAAIAAABPABsAAAADAAIAAABQAA4AAAADAAIAAABQAA8AAAADAAIAAABQABAAAAADAAIAAABQABEAAAADAAIAAABQABIAAAADAAIAAABQABMAAAADAAIAAABQABQAAAADAAIAAABQABUAAAADAAIAAABQABYAAAADAAIAAABQABcAAAADAAIAAABQABgAAAADAAIAAABQABkAAAADAAIAAABQABoAAAADAAIAAABQABsAAAADAAIAAABRAA4AAAADAAIAAABRAA8AAAADAAIAAABRABAAAAADAAIAAABRABEAAAADAAIAAABRABIAAAADAAIAAABRABMAAAADAAIAAABRABQAAAADAAIAAABRABUAAAADAAIAAABRABYAAAADAAIAAABRABcAAAADAAIAAABRABgAAAADAAIAAABRABkAAAADAAIAAABRABoAAAADAAIAAABRABsAAAADAAIAAABSAA4AAAADAAIAAABSAA8AAAADAAIAAABSABAAAAADAAIAAABSABEAAAADAAIAAABSABIAAAADAAIAAABSABMAAAADAAIAAABSABQAAAADAAIAAABSABUAAAADAAIAAABSABYAAAADAAIAAABSABcAAAADAAIAAABSABgAAAADAAIAAABSABkAAAADAAIAAABSABoAAAADAAIAAABSABsAAAADAAIAAABTAA4AAAADAAIAAABTAA8AAAADAAIAAABTABAAAAADAAIAAABTABEAAAADAAIAAABTABIAAAADAAIAAABTABMAAAADAAIAAABTABQAAAADAAIAAABTABUAAAADAAIAAABTABYAAAADAAIAAABTABcAAAADAAIAAABTABgAAAADAAIAAABTABkAAAADAAIAAABTABoAAAADAAIAAABTABsAAAADAAIAAABUAA4AAAADAAIAAABUAA8AAAADAAIAAABUABAAAAADAAIAAABUABEAAAADAAIAAABUABIAAAADAAIAAABUABMAAAADAAIAAABUABQAAAADAAIAAABUABUAAAADAAIAAABUABYAAAADAAIAAABUABcAAAADAAIAAABUABgAAAADAAIAAABUABkAAAADAAIAAABUABoAAAADAAIAAABUABsAAAADAAIAAABVAA4AAAADAAIAAABVAA8AAAADAAIAAABVABAAAAADAAIAAABVABEAAAADAAIAAABVABIAAAADAAIAAABVABMAAAADAAIAAABVABQAAAADAAIAAABVABUAAAADAAIAAABVABYAAAADAAIAAABVABcAAAADAAIAAABVABgAAAADAAIAAABVABkAAAADAAIAAABVABoAAAADAAIAAABVABsAAAADAAIAAABWAA4AAAADAAIAAABWAA8AAAADAAIAAABWABAAAAADAAIAAABWABEAAAADAAIAAABWABIAAAADAAIAAABWABMAAAADAAIAAABWABQAAAADAAIAAABWABUAAAADAAIAAABWABYAAAADAAIAAABWABcAAAADAAIAAABWABgAAAADAAIAAABWABkAAAADAAIAAABWABoAAAADAAIAAABWABsAAAADAAIAAABXAA4AAAADAAIAAABXAA8AAAADAAIAAABXABAAAAADAAIAAABXABEAAAADAAIAAABXABIAAAADAAIAAABXABMAAAADAAIAAABXABQAAAADAAIAAABXABUAAAADAAIAAABXABYAAAADAAIAAABXABcAAAADAAIAAABXABgAAAADAAIAAABXABkAAAADAAIAAABXABoAAAADAAIAAABXABsAAAADAAIAAABYAA4AAAADAAIAAABYAA8AAAADAAIAAABYABAAAAADAAIAAABYABEAAAADAAIAAABYABIAAAADAAIAAABYABMAAAADAAIAAABYABQAAAADAAIAAABYABUAAAADAAIAAABYABYAAAADAAIAAABYABcAAAADAAIAAABYABgAAAADAAIAAABYABkAAAADAAIAAABYABoAAAADAAIAAABYABsAAAADAAIAAABZAA4AAAADAAIAAABZAA8AAAADAAIAAABZABAAAAADAAIAAABZABEAAAADAAIAAABZABIAAAADAAIAAABZABMAAAADAAIAAABZABQAAAADAAIAAABZABUAAAADAAIAAABZABYAAAADAAIAAABZABcAAAADAAIAAABZABgAAAADAAIAAABZABkAAAADAAIAAABZABoAAAADAAIAAABZABsAAAADAAIAAABaAA4AAAADAAIAAABaAA8AAAADAAIAAABaABAAAAADAAIAAABaABEAAAADAAIAAABaABIAAAADAAIAAABaABMAAAADAAIAAABaABQAAAADAAIAAABaABUAAAADAAIAAABaABYAAAADAAIAAABaABcAAAADAAIAAABaABgAAAADAAIAAABaABkAAAADAAIAAABaABoAAAADAAIAAABaABsAAAADAAIAAABbAA4AAAADAAIAAABbAA8AAAADAAIAAABbABAAAAADAAIAAABbABEAAAADAAIAAABbABIAAAADAAIAAABbABMAAAADAAIAAABbABQAAAADAAIAAABbABUAAAADAAIAAABbABYAAAADAAIAAABbABcAAAADAAIAAABbABgAAAADAAIAAABbABkAAAADAAIAAABbABoAAAADAAIAAABbABsAAAADAAIAAABcAA4AAAADAAIAAABcAA8AAAADAAIAAABcABAAAAADAAIAAABcABEAAAADAAIAAABcABIAAAADAAIAAABcABMAAAADAAIAAABcABQAAAADAAIAAABcABUAAAADAAIAAABcABYAAAADAAIAAABcABcAAAADAAIAAABcABgAAAADAAIAAABcABkAAAADAAIAAABcABoAAAADAAIAAABcABsAAAADAAIAAABdAA4AAAADAAIAAABdAA8AAAADAAIAAABdABAAAAADAAIAAABdABEAAAADAAIAAABdABIAAAADAAIAAABdABMAAAADAAIAAABdABQAAAADAAIAAABdABUAAAADAAIAAABdABYAAAADAAIAAABdABcAAAADAAIAAABdABgAAAADAAIAAABdABkAAAADAAIAAABdABoAAAADAAIAAABdABsAAAADAAIAAABeAA4AAAADAAIAAABeAA8AAAADAAIAAABeABAAAAADAAIAAABeABEAAAADAAIAAABeABIAAAADAAIAAABeABMAAAADAAIAAABeABQAAAADAAIAAABeABUAAAADAAIAAABeABYAAAADAAIAAABeABcAAAADAAIAAABeABgAAAADAAIAAABeABkAAAADAAIAAABeABoAAAADAAIAAABeABsAAAADAAIAAABfAA4AAAADAAIAAABfAA8AAAADAAIAAABfABAAAAADAAIAAABfABEAAAADAAIAAABfABIAAAADAAIAAABfABMAAAADAAIAAABfABQAAAADAAIAAABfABUAAAADAAIAAABfABYAAAADAAIAAABfABcAAAADAAIAAABfABgAAAADAAIAAABfABkAAAADAAIAAABfABoAAAADAAIAAABfABsAAAADAAIAAABgAA4AAAADAAIAAABgAA8AAAADAAIAAABgABAAAAADAAIAAABgABEAAAADAAIAAABgABIAAAADAAIAAABgABMAAAADAAIAAABgABQAAAADAAIAAABgABUAAAADAAIAAABgABYAAAADAAIAAABgABcAAAADAAIAAABgABgAAAADAAIAAABgABkAAAADAAIAAABgABoAAAADAAIAAABgABsAAAADAAIAAABhAA4AAAADAAIAAABhAA8AAAADAAIAAABhABAAAAADAAIAAABhABEAAAADAAIAAABhABIAAAADAAIAAABhABMAAAADAAIAAABhABQAAAADAAIAAABhABUAAAADAAIAAABhABYAAAADAAIAAABhABcAAAADAAIAAABhABgAAAADAAIAAABhABkAAAADAAIAAABhABoAAAADAAIAAABhABsAAAADAAIAAABiAA4AAAADAAIAAABiAA8AAAADAAIAAABiABAAAAADAAIAAABiABEAAAADAAIAAABiABIAAAADAAIAAABiABMAAAADAAIAAABiABQAAAADAAIAAABiABUAAAADAAIAAABiABYAAAADAAIAAABiABcAAAADAAIAAABiABgAAAADAAIAAABiABkAAAADAAIAAABiABoAAAADAAIAAABiABsAAAADAAIAAABjAA4AAAADAAIAAABjAA8AAAADAAIAAABjABAAAAADAAIAAABjABEAAAADAAIAAABjABIAAAADAAIAAABjABMAAAADAAIAAABjABQAAAADAAIAAABjABUAAAADAAIAAABjABYAAAADAAIAAABjABcAAAADAAIAAABjABgAAAADAAIAAABjABkAAAADAAIAAABjABoAAAADAAIAAABjABsAAAADAAIAAABkAA4AAAADAAIAAABkAA8AAAADAAIAAABkABAAAAADAAIAAABkABEAAAADAAIAAABkABIAAAADAAIAAABkABMAAAADAAIAAABkABQAAAADAAIAAABkABUAAAADAAIAAABkABYAAAADAAIAAABkABcAAAADAAIAAABkABgAAAADAAIAAABkABkAAAADAAIAAABkABoAAAADAAIAAABkABsAAAADAAIAAABAABUAAAADAAIAAABAABYAAAADAAIAAABAABcAAAADAAIAAABAABgAAAADAAIAAABAABkAAAADAAIAAABAABoAAAADAAIAAABAABsAAAADAAIAAABBABUAAAADAAIAAABBABYAAAADAAIAAABBABcAAAADAAIAAABBABgAAAADAAIAAABBABkAAAADAAIAAABBABoAAAADAAIAAABBABsAAAADAAIAAABCABUAAAADAAIAAABCABYAAAADAAIAAABCABcAAAADAAIAAABCABgAAAADAAIAAABCABkAAAADAAIAAABCABoAAAADAAIAAABCABsAAAADAAIAAABDABUAAAADAAIAAABDABYAAAADAAIAAABDABcAAAADAAIAAABDABgAAAADAAIAAABDABkAAAADAAIAAABDABoAAAADAAIAAABDABsAAAADAAIAAABEABUAAAADAAIAAABEABYAAAADAAIAAABEABcAAAADAAIAAABEABgAAAADAAIAAABEABkAAAADAAIAAABEABoAAAADAAIAAABEABsAAAADAAIAAABFABUAAAADAAIAAABFABYAAAADAAIAAABFABcAAAADAAIAAABFABgAAAADAAIAAABFABkAAAADAAIAAABFABoAAAADAAIAAABFABsAAAADAAIAAABGABUAAAADAAIAAABGABYAAAADAAIAAABGABcAAAADAAIAAABGABgAAAADAAIAAABGABkAAAADAAIAAABGABoAAAADAAIAAABGABsAAAADAAIAAAA9ABgAAAADAAIAAAA9ABkAAAADAAIAAAA9ABoAAAADAAIAAAA9ABsAAAADAAIAAAA+ABgAAAADAAIAAAA+ABkAAAADAAIAAAA+ABoAAAADAAIAAAA+ABsAAAADAAIAAAA/ABgAAAADAAIAAAA/ABkAAAADAAIAAAA/ABoAAAADAAIAAAA/ABsAAAADAAIAAABEABIAAAADAAIAAABEABMAAAADAAIAAABEABQAAAADAAIAAABFABIAAAADAAIAAABFABMAAAADAAIAAABFABQAAAADAAIAAABGABIAAAADAAIAAABGABMAAAADAAIAAABGABQAAAADAAIAAAA6ABsAAAADAAIAAAA7ABsAAAADAAIAAAA8ABsAAAADAAIAAAA7ABoAAAADAAIAAAA8ABoAAAADAAIAAAA8ABkAAAADAAIAAAA+ABcAAAADAAIAAAA/ABYAAAADAAIAAABBABQAAAADAAIAAABCABMAAAADAAIAAABDABIAAAADAAIAAABEABEAAAADAAIAAABFABAAAAADAAIAAABGAA8AAAADAAIAAABGABAAAAADAAIAAABGABEAAAADAAIAAABFABEAAAADAAIAAABDABMAAAADAAIAAABDABQAAAADAAIAAABCABQAAAADAAIAAAA/ABcAAAADAAIAAAAAAB4AAAADAAIAAAAAAB8AAAADAAIAAAAAACAAAAADAAIAAAAAACEAAAADAAIAAAAAACIAAAADAAIAAAAAACMAAAADAAIAAAABAB4AAAADAAIAAAABAB8AAAADAAIAAAABACAAAAADAAIAAAABACEAAAADAAIAAAABACIAAAADAAIAAAABACMAAAADAAIAAAACAB4AAAADAAIAAAACAB8AAAADAAIAAAACACAAAAADAAIAAAACACEAAAADAAIAAAACACIAAAADAAIAAAACACMAAAADAAIAAAADAB4AAAADAAIAAAADAB8AAAADAAIAAAADACAAAAADAAIAAAADACEAAAADAAIAAAADACIAAAADAAIAAAADACMAAAADAAIAAAAEAB4AAAADAAIAAAAEAB8AAAADAAIAAAAEACAAAAADAAIAAAAEACEAAAADAAIAAAAEACIAAAADAAIAAAAEACMAAAADAAIAAAAFAB4AAAADAAIAAAAFAB8AAAADAAIAAAAFACAAAAADAAIAAAAFACEAAAADAAIAAAAFACIAAAADAAIAAAAFACMAAAADAAIAAAAGAB4AAAADAAIAAAAGAB8AAAADAAIAAAAGACAAAAADAAIAAAAGACEAAAADAAIAAAAGACIAAAADAAIAAAAGACMAAAADAAIAAAAHAB4AAAADAAIAAAAHAB8AAAADAAIAAAAHACAAAAADAAIAAAAHACEAAAADAAIAAAAHACIAAAADAAIAAAAHACMAAAADAAIAAAAIAB4AAAADAAIAAAAIAB8AAAADAAIAAAAIACAAAAADAAIAAAAIACEAAAADAAIAAAAIACIAAAADAAIAAAAIACMAAAADAAIAAAAJAB4AAAADAAIAAAAJAB8AAAADAAIAAAAJACAAAAADAAIAAAAJACEAAAADAAIAAAAJACIAAAADAAIAAAAJACMAAAADAAIAAAAKAB4AAAADAAIAAAAKAB8AAAADAAIAAAAKACAAAAADAAIAAAAKACEAAAADAAIAAAAKACIAAAADAAIAAAAKACMAAAADAAIAAAALAB4AAAADAAIAAAALAB8AAAADAAIAAAALACAAAAADAAIAAAALACEAAAADAAIAAAALACIAAAADAAIAAAALACMAAAADAAIAAAAMAB4AAAADAAIAAAAMAB8AAAADAAIAAAAMACAAAAADAAIAAAAMACEAAAADAAIAAAAMACIAAAADAAIAAAAMACMAAAADAAIAAAANAB4AAAADAAIAAAANAB8AAAADAAIAAAANACAAAAADAAIAAAANACEAAAADAAIAAAANACIAAAADAAIAAAANACMAAAADAAIAAAAOAB4AAAADAAIAAAAOAB8AAAADAAIAAAAOACAAAAADAAIAAAAOACEAAAADAAIAAAAOACIAAAADAAIAAAAOACMAAAADAAIAAAAPAB4AAAADAAIAAAAPAB8AAAADAAIAAAAPACAAAAADAAIAAAAPACEAAAADAAIAAAAPACIAAAADAAIAAAAPACMAAAADAAIAAAAQAB4AAAADAAIAAAAQAB8AAAADAAIAAAAQACAAAAADAAIAAAAQACEAAAADAAIAAAAQACIAAAADAAIAAAAQACMAAAADAAIAAAARAB4AAAADAAIAAAARAB8AAAADAAIAAAARACAAAAADAAIAAAARACEAAAADAAIAAAARACIAAAADAAIAAAARACMAAAADAAIAAAASAB4AAAADAAIAAAASAB8AAAADAAIAAAASACAAAAADAAIAAAASACEAAAADAAIAAAASACIAAAADAAIAAAASACMAAAADAAIAAAATAB4AAAADAAIAAAATAB8AAAADAAIAAAATACAAAAADAAIAAAATACEAAAADAAIAAAATACIAAAADAAIAAAATACMAAAADAAIAAAAUAB4AAAADAAIAAAAUAB8AAAADAAIAAAAUACAAAAADAAIAAAAUACEAAAADAAIAAAAUACIAAAADAAIAAAAUACMAAAADAAIAAAAVAB4AAAADAAIAAAAVAB8AAAADAAIAAAAVACAAAAADAAIAAAAVACEAAAADAAIAAAAVACIAAAADAAIAAAAVACMAAAADAAIAAAAWAB4AAAADAAIAAAAWAB8AAAADAAIAAAAWACAAAAADAAIAAAAWACEAAAADAAIAAAAWACIAAAADAAIAAAAWACMAAAADAAIAAAAXAB4AAAADAAIAAAAXAB8AAAADAAIAAAAXACAAAAADAAIAAAAXACEAAAADAAIAAAAXACIAAAADAAIAAAAXACMAAAADAAIAAAAYAB4AAAADAAIAAAAYAB8AAAADAAIAAAAYACAAAAADAAIAAAAYACEAAAADAAIAAAAYACIAAAADAAIAAAAYACMAAAADAAIAAAAZAB4AAAADAAIAAAAZAB8AAAADAAIAAAAZACAAAAADAAIAAAAZACEAAAADAAIAAAAZACIAAAADAAIAAAAZACMAAAADAAIAAAAaAB4AAAADAAIAAAAaAB8AAAADAAIAAAAaACAAAAADAAIAAAAaACEAAAADAAIAAAAaACIAAAADAAIAAAAaACMAAAADAAIAAAAbAB4AAAADAAIAAAAbAB8AAAADAAIAAAAbACAAAAADAAIAAAAbACEAAAADAAIAAAAbACIAAAADAAIAAAAbACMAAAADAAIAAAAcAB4AAAADAAIAAAAcAB8AAAADAAIAAAAcACAAAAADAAIAAAAcACEAAAADAAIAAAAcACIAAAADAAIAAAAcACMAAAADAAIAAAAdAB4AAAADAAIAAAAdAB8AAAADAAIAAAAdACAAAAADAAIAAAAdACEAAAADAAIAAAAdACIAAAADAAIAAAAdACMAAAADAAIAAAAeAB4AAAADAAIAAAAeAB8AAAADAAIAAAAeACAAAAADAAIAAAAeACEAAAADAAIAAAAeACIAAAADAAIAAAAeACMAAAADAAIAAAAfAB4AAAADAAIAAAAfAB8AAAADAAIAAAAfACAAAAADAAIAAAAfACEAAAADAAIAAAAfACIAAAADAAIAAAAfACMAAAADAAIAAAAgAB4AAAADAAIAAAAgAB8AAAADAAIAAAAgACAAAAADAAIAAAAgACEAAAADAAIAAAAgACIAAAADAAIAAAAgACMAAAADAAIAAAAhAB4AAAADAAIAAAAhAB8AAAADAAIAAAAhACAAAAADAAIAAAAhACEAAAADAAIAAAAhACIAAAADAAIAAAAhACMAAAADAAIAAAAiAB4AAAADAAIAAAAiAB8AAAADAAIAAAAiACAAAAADAAIAAAAiACEAAAADAAIAAAAiACIAAAADAAIAAAAiACMAAAADAAIAAAAjAB4AAAADAAIAAAAjAB8AAAADAAIAAAAjACAAAAADAAIAAAAjACEAAAADAAIAAAAjACIAAAADAAIAAAAjACMAAAADAAIAAAAkAB4AAAADAAIAAAAkAB8AAAADAAIAAAAkACAAAAADAAIAAAAkACEAAAADAAIAAAAkACIAAAADAAIAAAAkACMAAAADAAIAAAAlAB4AAAADAAIAAAAlAB8AAAADAAIAAAAlACAAAAADAAIAAAAlACEAAAADAAIAAAAlACIAAAADAAIAAAAlACMAAAADAAIAAAAmAB4AAAADAAIAAAAmAB8AAAADAAIAAAAmACAAAAADAAIAAAAmACEAAAADAAIAAAAmACIAAAADAAIAAAAmACMAAAADAAIAAAAnAB4AAAADAAIAAAAnAB8AAAADAAIAAAAnACAAAAADAAIAAAAnACEAAAADAAIAAAAnACIAAAADAAIAAAAnACMAAAADAAIAAAAoAB4AAAADAAIAAAAoAB8AAAADAAIAAAAoACAAAAADAAIAAAAoACEAAAADAAIAAAAoACIAAAADAAIAAAAoACMAAAADAAIAAAApAB4AAAADAAIAAAApAB8AAAADAAIAAAApACAAAAADAAIAAAApACEAAAADAAIAAAApACIAAAADAAIAAAApACMAAAADAAIAAAAqAB4AAAADAAIAAAAqAB8AAAADAAIAAAAqACAAAAADAAIAAAAqACEAAAADAAIAAAAqACIAAAADAAIAAAAqACMAAAADAAIAAAArAB4AAAADAAIAAAArAB8AAAADAAIAAAArACAAAAADAAIAAAArACEAAAADAAIAAAArACIAAAADAAIAAAArACMAAAADAAIAAAAsAB4AAAADAAIAAAAsAB8AAAADAAIAAAAsACAAAAADAAIAAAAsACEAAAADAAIAAAAsACIAAAADAAIAAAAsACMAAAADAAIAAAAtAB4AAAADAAIAAAAtAB8AAAADAAIAAAAtACAAAAADAAIAAAAtACEAAAADAAIAAAAtACIAAAADAAIAAAAtACMAAAADAAIAAAAuAB4AAAADAAIAAAAuAB8AAAADAAIAAAAuACAAAAADAAIAAAAuACEAAAADAAIAAAAuACIAAAADAAIAAAAuACMAAAADAAIAAAAvAB4AAAADAAIAAAAvAB8AAAADAAIAAAAvACAAAAADAAIAAAAvACEAAAADAAIAAAAvACIAAAADAAIAAAAvACMAAAADAAIAAAAwAB4AAAADAAIAAAAwAB8AAAADAAIAAAAwACAAAAADAAIAAAAwACEAAAADAAIAAAAwACIAAAADAAIAAAAwACMAAAADAAIAAAAxAB4AAAADAAIAAAAxAB8AAAADAAIAAAAxACAAAAADAAIAAAAxACEAAAADAAIAAAAxACIAAAADAAIAAAAxACMAAAADAAIAAAAyAB4AAAADAAIAAAAyAB8AAAADAAIAAAAyACAAAAADAAIAAAAyACEAAAADAAIAAAAyACIAAAADAAIAAAAyACMAAAADAAIAAAAzAB4AAAADAAIAAAAzAB8AAAADAAIAAAAzACAAAAADAAIAAAAzACEAAAADAAIAAAAzACIAAAADAAIAAAAzACMAAAADAAIAAAA0AB4AAAADAAIAAAA0AB8AAAADAAIAAAA0ACAAAAADAAIAAAA0ACEAAAADAAIAAAA0ACIAAAADAAIAAAA0ACMAAAADAAIAAAA1AB4AAAADAAIAAAA1AB8AAAADAAIAAAA1ACAAAAADAAIAAAA1ACEAAAADAAIAAAA1ACIAAAADAAIAAAA1ACMAAAADAAIAAAA2AB4AAAADAAIAAAA2AB8AAAADAAIAAAA2ACAAAAADAAIAAAA2ACEAAAADAAIAAAA2ACIAAAADAAIAAAA2ACMAAAADAAIAAAA3AB4AAAADAAIAAAA3AB8AAAADAAIAAAA3ACAAAAADAAIAAAA3ACEAAAADAAIAAAA3ACIAAAADAAIAAAA3ACMAAAADAAIAAAA4AB4AAAADAAIAAAA4AB8AAAADAAIAAAA4ACAAAAADAAIAAAA4ACEAAAADAAIAAAA4ACIAAAADAAIAAAA4ACMAAAADAAIAAAA5AB4AAAADAAIAAAA5AB8AAAADAAIAAAA5ACAAAAADAAIAAAA5ACEAAAADAAIAAAA5ACIAAAADAAIAAAA5ACMAAAADAAIAAAA6AB4AAAADAAIAAAA6AB8AAAADAAIAAAA6ACAAAAADAAIAAAA6ACEAAAADAAIAAAA6ACIAAAADAAIAAAA6ACMAAAADAAIAAAA7AB4AAAADAAIAAAA7AB8AAAADAAIAAAA7ACAAAAADAAIAAAA7ACEAAAADAAIAAAA7ACIAAAADAAIAAAA7ACMAAAADAAIAAAA8AB4AAAADAAIAAAA8AB8AAAADAAIAAAA8ACAAAAADAAIAAAA8ACEAAAADAAIAAAA8ACIAAAADAAIAAAA8ACMAAAADAAIAAAA9AB4AAAADAAIAAAA9AB8AAAADAAIAAAA9ACAAAAADAAIAAAA9ACEAAAADAAIAAAA9ACIAAAADAAIAAAA9ACMAAAADAAIAAAA+AB4AAAADAAIAAAA+AB8AAAADAAIAAAA+ACAAAAADAAIAAAA+ACEAAAADAAIAAAA+ACIAAAADAAIAAAA+ACMAAAADAAIAAAA/AB4AAAADAAIAAAA/AB8AAAADAAIAAAA/ACAAAAADAAIAAAA/ACEAAAADAAIAAAA/ACIAAAADAAIAAAA/ACMAAAADAAIAAABAAB4AAAADAAIAAABAAB8AAAADAAIAAABAACAAAAADAAIAAABAACEAAAADAAIAAABAACIAAAADAAIAAABAACMAAAADAAIAAABBAB4AAAADAAIAAABBAB8AAAADAAIAAABBACAAAAADAAIAAABBACEAAAADAAIAAABBACIAAAADAAIAAABBACMAAAADAAIAAABCAB4AAAADAAIAAABCAB8AAAADAAIAAABCACAAAAADAAIAAABCACEAAAADAAIAAABCACIAAAADAAIAAABCACMAAAADAAIAAABDAB4AAAADAAIAAABDAB8AAAADAAIAAABDACAAAAADAAIAAABDACEAAAADAAIAAABDACIAAAADAAIAAABDACMAAAADAAIAAABEAB4AAAADAAIAAABEAB8AAAADAAIAAABEACAAAAADAAIAAABEACEAAAADAAIAAABEACIAAAADAAIAAABEACMAAAADAAIAAABFAB4AAAADAAIAAABFAB8AAAADAAIAAABFACAAAAADAAIAAABFACEAAAADAAIAAABFACIAAAADAAIAAABFACMAAAADAAIAAABGAB4AAAADAAIAAABGAB8AAAADAAIAAABGACAAAAADAAIAAABGACEAAAADAAIAAABGACIAAAADAAIAAABGACMAAAADAAIAAABHAB4AAAADAAIAAABHAB8AAAADAAIAAABHACAAAAADAAIAAABHACEAAAADAAIAAABHACIAAAADAAIAAABHACMAAAADAAIAAABIAB4AAAADAAIAAABIAB8AAAADAAIAAABIACAAAAADAAIAAABIACEAAAADAAIAAABIACIAAAADAAIAAABIACMAAAADAAIAAABJAB4AAAADAAIAAABJAB8AAAADAAIAAABJACAAAAADAAIAAABJACEAAAADAAIAAABJACIAAAADAAIAAABJACMAAAADAAIAAABKAB4AAAADAAIAAABKAB8AAAADAAIAAABKACAAAAADAAIAAABKACEAAAADAAIAAABKACIAAAADAAIAAABKACMAAAADAAIAAABLAB4AAAADAAIAAABLAB8AAAADAAIAAABLACAAAAADAAIAAABLACEAAAADAAIAAABLACIAAAADAAIAAABLACMAAAADAAIAAABMAB4AAAADAAIAAABMAB8AAAADAAIAAABMACAAAAADAAIAAABMACEAAAADAAIAAABMACIAAAADAAIAAABMACMAAAADAAIAAABNAB4AAAADAAIAAABNAB8AAAADAAIAAABNACAAAAADAAIAAABNACEAAAADAAIAAABNACIAAAADAAIAAABNACMAAAADAAIAAABOAB4AAAADAAIAAABOAB8AAAADAAIAAABOACAAAAADAAIAAABOACEAAAADAAIAAABOACIAAAADAAIAAABOACMAAAADAAIAAABPAB4AAAADAAIAAABPAB8AAAADAAIAAABPACAAAAADAAIAAABPACEAAAADAAIAAABPACIAAAADAAIAAABPACMAAAADAAIAAABQAB4AAAADAAIAAABQAB8AAAADAAIAAABQACAAAAADAAIAAABQACEAAAADAAIAAABQACIAAAADAAIAAABQACMAAAADAAIAAABRAB4AAAADAAIAAABRAB8AAAADAAIAAABRACAAAAADAAIAAABRACEAAAADAAIAAABRACIAAAADAAIAAABRACMAAAADAAIAAABSAB4AAAADAAIAAABSAB8AAAADAAIAAABSACAAAAADAAIAAABSACEAAAADAAIAAABSACIAAAADAAIAAABSACMAAAADAAIAAABTAB4AAAADAAIAAABTAB8AAAADAAIAAABTACAAAAADAAIAAABTACEAAAADAAIAAABTACIAAAADAAIAAABTACMAAAADAAIAAABUAB4AAAADAAIAAABUAB8AAAADAAIAAABUACAAAAADAAIAAABUACEAAAADAAIAAABUACIAAAADAAIAAABUACMAAAADAAIAAABVAB4AAAADAAIAAABVAB8AAAADAAIAAABVACAAAAADAAIAAABVACEAAAADAAIAAABVACIAAAADAAIAAABVACMAAAADAAIAAABWAB4AAAADAAIAAABWAB8AAAADAAIAAABWACAAAAADAAIAAABWACEAAAADAAIAAABWACIAAAADAAIAAABWACMAAAADAAIAAABXAB4AAAADAAIAAABXAB8AAAADAAIAAABXACAAAAADAAIAAABXACEAAAADAAIAAABXACIAAAADAAIAAABXACMAAAADAAIAAABYAB4AAAADAAIAAABYAB8AAAADAAIAAABYACAAAAADAAIAAABYACEAAAADAAIAAABYACIAAAADAAIAAABYACMAAAADAAIAAABZAB4AAAADAAIAAABZAB8AAAADAAIAAABZACAAAAADAAIAAABZACEAAAADAAIAAABZACIAAAADAAIAAABZACMAAAADAAIAAABaAB4AAAADAAIAAABaAB8AAAADAAIAAABaACAAAAADAAIAAABaACEAAAADAAIAAABaACIAAAADAAIAAABaACMAAAADAAIAAABbAB4AAAADAAIAAABbAB8AAAADAAIAAABbACAAAAADAAIAAABbACEAAAADAAIAAABbACIAAAADAAIAAABbACMAAAADAAIAAABcAB4AAAADAAIAAABcAB8AAAADAAIAAABcACAAAAADAAIAAABcACEAAAADAAIAAABcACIAAAADAAIAAABcACMAAAADAAIAAABdAB4AAAADAAIAAABdAB8AAAADAAIAAABdACAAAAADAAIAAABdACEAAAADAAIAAABdACIAAAADAAIAAABdACMAAAADAAIAAABeAB4AAAADAAIAAABeAB8AAAADAAIAAABeACAAAAADAAIAAABeACEAAAADAAIAAABeACIAAAADAAIAAABeACMAAAADAAIAAABfAB4AAAADAAIAAABfAB8AAAADAAIAAABfACAAAAADAAIAAABfACEAAAADAAIAAABfACIAAAADAAIAAABfACMAAAADAAIAAABgAB4AAAADAAIAAABgAB8AAAADAAIAAABgACAAAAADAAIAAABgACEAAAADAAIAAABgACIAAAADAAIAAABgACMAAAADAAIAAABhAB4AAAADAAIAAABhAB8AAAADAAIAAABhACAAAAADAAIAAABhACEAAAADAAIAAABhACIAAAADAAIAAABhACMAAAADAAIAAABiAB4AAAADAAIAAABiAB8AAAADAAIAAABiACAAAAADAAIAAABiACEAAAADAAIAAABiACIAAAADAAIAAABiACMAAAADAAIAAABjAB4AAAADAAIAAABjAB8AAAADAAIAAABjACAAAAADAAIAAABjACEAAAADAAIAAABjACIAAAADAAIAAABjACMAAAADAAIAAABkAB4AAAADAAIAAABkAB8AAAADAAIAAABkACAAAAADAAIAAABkACEAAAADAAIAAABkACIAAAADAAIAAABkACMAAAADAAIAAABlAB4AAAADAAIAAABlAB8AAAADAAIAAABlACAAAAADAAIAAABlACEAAAADAAIAAABlACIAAAADAAIAAABlACMAAAADAAIAAABmAB4AAAADAAIAAABmAB8AAAADAAIAAABmACAAAAADAAIAAABmACEAAAADAAIAAABmACIAAAADAAIAAABmACMAAAADAAIAAABnAB4AAAADAAIAAABnAB8AAAADAAIAAABnACAAAAADAAIAAABnACEAAAADAAIAAABnACIAAAADAAIAAABnACMAAAADAAIAAABoAB4AAAADAAIAAABoAB8AAAADAAIAAABoACAAAAADAAIAAABoACEAAAADAAIAAABoACIAAAADAAIAAABoACMAAAADAAIAAABpAB4AAAADAAIAAABpAB8AAAADAAIAAABpACAAAAADAAIAAABpACEAAAADAAIAAABpACIAAAADAAIAAABpACMAAAADAAIAAABqAB4AAAADAAIAAABqAB8AAAADAAIAAABqACAAAAADAAIAAABqACEAAAADAAIAAABqACIAAAADAAIAAABqACMAAAADAAIAAAD//x4AAAADAAIAAAD//x8AAAADAAIAAAD//yAAAAADAAIAAAD//yEAAAADAAIAAAD//yIAAAADAAIAAAD//yMAAAADAAIAAAA6ABwAAAADAAIAAAA6AB0AAAADAAIAAAA7ABwAAAADAAIAAAA7AB0AAAADAAIAAAA8ABwAAAADAAIAAAA8AB0AAAADAAIAAAA9ABwAAAADAAIAAAA9AB0AAAADAAIAAAA+ABwAAAADAAIAAAA+AB0AAAADAAIAAAA/ABwAAAADAAIAAAA/AB0AAAADAAIAAABAABwAAAADAAIAAABAAB0AAAADAAIAAABBABwAAAADAAIAAABBAB0AAAADAAIAAABCABwAAAADAAIAAABCAB0AAAADAAIAAABDABwAAAADAAIAAABDAB0AAAADAAIAAABEABwAAAADAAIAAABEAB0AAAADAAIAAABFABwAAAADAAIAAABFAB0AAAADAAIAAABGABwAAAADAAIAAABGAB0AAAADAAIAAABHABwAAAADAAIAAABHAB0AAAADAAIAAABIABwAAAADAAIAAABIAB0AAAADAAIAAABJABwAAAADAAIAAABJAB0AAAADAAIAAABKABwAAAADAAIAAABKAB0AAAADAAIAAABLABwAAAADAAIAAABLAB0AAAADAAIAAABMABwAAAADAAIAAABMAB0AAAADAAIAAABNABwAAAADAAIAAABNAB0AAAADAAIAAABOABwAAAADAAIAAABOAB0AAAADAAIAAABPABwAAAADAAIAAABPAB0AAAADAAIAAABQABwAAAADAAIAAABQAB0AAAADAAIAAABRABwAAAADAAIAAABRAB0AAAADAAIAAABSABwAAAADAAIAAABSAB0AAAADAAIAAABTABwAAAADAAIAAABTAB0AAAADAAIAAABUABwAAAADAAIAAABUAB0AAAADAAIAAABVABwAAAADAAIAAABVAB0AAAADAAIAAABWABwAAAADAAIAAABWAB0AAAADAAIAAABXABwAAAADAAIAAABXAB0AAAADAAIAAABYABwAAAADAAIAAABYAB0AAAADAAIAAABZABwAAAADAAIAAABZAB0AAAADAAIAAABaABwAAAADAAIAAABaAB0AAAADAAIAAABbABwAAAADAAIAAABbAB0AAAADAAIAAABcABwAAAADAAIAAABcAB0AAAADAAIAAABdABwAAAADAAIAAABdAB0AAAADAAIAAABeABwAAAADAAIAAABeAB0AAAADAAIAAABfABwAAAADAAIAAABfAB0AAAADAAIAAABgABwAAAADAAIAAABgAB0AAAADAAIAAABhABwAAAADAAIAAABhAB0AAAADAAIAAABiABwAAAADAAIAAABiAB0AAAADAAIAAABjABwAAAADAAIAAABjAB0AAAADAAIAAABkABwAAAADAAIAAABkAB0AAAADAAIAAABlABwAAAADAAIAAABlAB0AAAADAAIAAABmABwAAAADAAIAAABmAB0AAAADAAIAAABnABwAAAADAAIAAABnAB0AAAADAAIAAABoABwAAAADAAIAAABoAB0AAAADAAIAAABpABwAAAADAAIAAABpAB0AAAADAAIAAABqABwAAAADAAIAAABqAB0AAAADAAIAAABrABwAAAADAAIAAABrAB0AAAADAAIAAABrAB4AAAADAAIAAABrAB8AAAADAAIAAABrACAAAAADAAIAAABrACEAAAADAAIAAABrACIAAAADAAIAAABrACMAAAADAAIAAAA5AB0AAAADAAIAAAA5ABwAAAADAAIAAAA4AB0AAAADAAIAAABlAP//AAADAAIAAABlAAAAAAADAAIAAABlAAEAAAADAAIAAABlAAIAAAADAAIAAABlAAMAAAADAAIAAABlAAQAAAADAAIAAABlAAUAAAADAAIAAABlAAYAAAADAAIAAABlAAcAAAADAAIAAABlAAgAAAADAAIAAABlAAkAAAADAAIAAABlAAoAAAADAAIAAABlAAsAAAADAAIAAABlAAwAAAADAAIAAABlAA0AAAADAAIAAABlAA4AAAADAAIAAABlAA8AAAADAAIAAABlABAAAAADAAIAAABlABEAAAADAAIAAABlABIAAAADAAIAAABlABMAAAADAAIAAABlABQAAAADAAIAAABlABUAAAADAAIAAABlABYAAAADAAIAAABlABcAAAADAAIAAABlABgAAAADAAIAAABlABkAAAADAAIAAABlABoAAAADAAIAAABlABsAAAADAAIAAABmAP//AAADAAIAAABmAAAAAAADAAIAAABmAAEAAAADAAIAAABmAAIAAAADAAIAAABmAAMAAAADAAIAAABmAAQAAAADAAIAAABmAAUAAAADAAIAAABmAAYAAAADAAIAAABmAAcAAAADAAIAAABmAAgAAAADAAIAAABmAAkAAAADAAIAAABmAAoAAAADAAIAAABmAAsAAAADAAIAAABmAAwAAAADAAIAAABmAA0AAAADAAIAAABmAA4AAAADAAIAAABmAA8AAAADAAIAAABmABAAAAADAAIAAABmABEAAAADAAIAAABmABIAAAADAAIAAABmABMAAAADAAIAAABmABQAAAADAAIAAABmABUAAAADAAIAAABmABYAAAADAAIAAABmABcAAAADAAIAAABmABgAAAADAAIAAABmABkAAAADAAIAAABmABoAAAADAAIAAABmABsAAAADAAIAAABnAP//AAADAAIAAABnAAAAAAADAAIAAABnAAEAAAADAAIAAABnAAIAAAADAAIAAABnAAMAAAADAAIAAABnAAQAAAADAAIAAABnAAUAAAADAAIAAABnAAYAAAADAAIAAABnAAcAAAADAAIAAABnAAgAAAADAAIAAABnAAkAAAADAAIAAABnAAoAAAADAAIAAABnAAsAAAADAAIAAABnAAwAAAADAAIAAABnAA0AAAADAAIAAABnAA4AAAADAAIAAABnAA8AAAADAAIAAABnABAAAAADAAIAAABnABEAAAADAAIAAABnABIAAAADAAIAAABnABMAAAADAAIAAABnABQAAAADAAIAAABnABUAAAADAAIAAABnABYAAAADAAIAAABnABcAAAADAAIAAABnABgAAAADAAIAAABnABkAAAADAAIAAABnABoAAAADAAIAAABnABsAAAADAAIAAABoAP//AAADAAIAAABoAAAAAAADAAIAAABoAAEAAAADAAIAAABoAAIAAAADAAIAAABoAAMAAAADAAIAAABoAAQAAAADAAIAAABoAAUAAAADAAIAAABoAAYAAAADAAIAAABoAAcAAAADAAIAAABoAAgAAAADAAIAAABoAAkAAAADAAIAAABoAAoAAAADAAIAAABoAAsAAAADAAIAAABoAAwAAAADAAIAAABoAA0AAAADAAIAAABoAA4AAAADAAIAAABoAA8AAAADAAIAAABoABAAAAADAAIAAABoABEAAAADAAIAAABoABIAAAADAAIAAABoABMAAAADAAIAAABoABQAAAADAAIAAABoABUAAAADAAIAAABoABYAAAADAAIAAABoABcAAAADAAIAAABoABgAAAADAAIAAABoABkAAAADAAIAAABoABoAAAADAAIAAABoABsAAAADAAIAAABpAP//AAADAAIAAABpAAAAAAADAAIAAABpAAEAAAADAAIAAABpAAIAAAADAAIAAABpAAMAAAADAAIAAABpAAQAAAADAAIAAABpAAUAAAADAAIAAABpAAYAAAADAAIAAABpAAcAAAADAAIAAABpAAgAAAADAAIAAABpAAkAAAADAAIAAABpAAoAAAADAAIAAABpAAsAAAADAAIAAABpAAwAAAADAAIAAABpAA0AAAADAAIAAABpAA4AAAADAAIAAABpAA8AAAADAAIAAABpABAAAAADAAIAAABpABEAAAADAAIAAABpABIAAAADAAIAAABpABMAAAADAAIAAABpABQAAAADAAIAAABpABUAAAADAAIAAABpABYAAAADAAIAAABpABcAAAADAAIAAABpABgAAAADAAIAAABpABkAAAADAAIAAABpABoAAAADAAIAAABpABsAAAADAAIAAABqAP//AAADAAIAAABqAAAAAAADAAIAAABqAAEAAAADAAIAAABqAAIAAAADAAIAAABqAAMAAAADAAIAAABqAAQAAAADAAIAAABqAAUAAAADAAIAAABqAAYAAAADAAIAAABqAAcAAAADAAIAAABqAAgAAAADAAIAAABqAAkAAAADAAIAAABqAAoAAAADAAIAAABqAAsAAAADAAIAAABqAAwAAAADAAIAAABqAA0AAAADAAIAAABqAA4AAAADAAIAAABqAA8AAAADAAIAAABqABAAAAADAAIAAABqABEAAAADAAIAAABqABIAAAADAAIAAABqABMAAAADAAIAAABqABQAAAADAAIAAABqABUAAAADAAIAAABqABYAAAADAAIAAABqABcAAAADAAIAAABqABgAAAADAAIAAABqABkAAAADAAIAAABqABoAAAADAAIAAABqABsAAAADAAIAAABrAP//AAADAAIAAABrAAAAAAADAAIAAABrAAEAAAADAAIAAABrAAIAAAADAAIAAABrAAMAAAADAAIAAABrAAQAAAADAAIAAABrAAUAAAADAAIAAABrAAYAAAADAAIAAABrAAcAAAADAAIAAABrAAgAAAADAAIAAABrAAkAAAADAAIAAABrAAoAAAADAAIAAABrAAsAAAADAAIAAABrAAwAAAADAAIAAABrAA0AAAADAAIAAABrAA4AAAADAAIAAABrAA8AAAADAAIAAABrABAAAAADAAIAAABrABEAAAADAAIAAABrABIAAAADAAIAAABrABMAAAADAAIAAABrABQAAAADAAIAAABrABUAAAADAAIAAABrABYAAAADAAIAAABrABcAAAADAAIAAABrABgAAAADAAIAAABrABkAAAADAAIAAABrABoAAAADAAIAAABrABsAAAADAAIAAAA=") +tile_set = SubResource("TileSet_c4cnm") +metadata/_edit_lock_ = true + +[node name="Physical_Layer" type="TileMapLayer" parent="Tile_Group"] +z_index = 2 +tile_map_data = PackedByteArray("AAD/////AAABAAAAAAD//wAAAAACAAAAAAD//wEAAAACAAAAAAD//wIAAAACAAAAAAD//wMAAAACAAAAAAD//wQAAAACAAAAAAD//wUAAAACAAAAAAD//wYAAAACAAAAAAD//wcAAAACAAAAAAD//wgAAAACAAAAAAD//wkAAAACAAAAAAD//xMAAAACAAAAAAD//xQAAAACAAAAAAD//xUAAAACAAAAAAD//xYAAAACAAAAAAD//xcAAAACAAAAAAD//xgAAAACAAAAAAA6ABgAAAACAAEAAAA7ABcAAAACAAEAAAA7ABgAAAACAAIAAAA8ABcAAAACAAIAAAA8ABgAAAAAAAAAAAA9ABcAAAAAAAAAAABkAP//AAABAAAAAAD//xkAAAACAAAAAAD//xoAAAACAAAAAAD//xsAAAACAAAAAAD//xwAAAAAAAAAAAD//x0AAAAAAAAAAAAAAP//AAABAAAAAAAAABwAAAAAAAAAAAAAAB0AAAAAAAAAAAABAP//AAABAAAAAAABABwAAAAAAAAAAAABAB0AAAAAAAAAAAACAP//AAABAAAAAAACABwAAAAAAAAAAAACAB0AAAAAAAAAAAADAP//AAABAAAAAAADABwAAAAAAAAAAAADAB0AAAAAAAAAAAAEAP//AAABAAAAAAAEABwAAAAAAAAAAAAEAB0AAAAAAAAAAAAFAP//AAABAAAAAAAFABwAAAAAAAAAAAAFAB0AAAAAAAAAAAAGAP//AAABAAAAAAAGABwAAAAAAAAAAAAGAB0AAAAAAAAAAAAHAP//AAABAAAAAAAHABwAAAAAAAAAAAAHAB0AAAAAAAAAAAAIAP//AAABAAAAAAAIABwAAAAAAAAAAAAIAB0AAAAAAAAAAAAJAP//AAABAAAAAAAJABwAAAAAAAAAAAAJAB0AAAAAAAAAAAAKAP//AAABAAAAAAAKABwAAAAAAAAAAAAKAB0AAAAAAAAAAAALAP//AAABAAAAAAALABwAAAAAAAAAAAALAB0AAAAAAAAAAAAMAP//AAABAAAAAAAMABwAAAAAAAAAAAAMAB0AAAAAAAAAAAANAP//AAABAAAAAAANABwAAAAAAAAAAAANAB0AAAAAAAAAAAAOAP//AAABAAAAAAAOABwAAAAAAAAAAAAOAB0AAAAAAAAAAAAPAP//AAABAAAAAAAPABwAAAAAAAAAAAAPAB0AAAAAAAAAAAAQAP//AAABAAAAAAAQAAwAAAACAAEAAAAQAA0AAAACAAIAAAAQABwAAAAAAAAAAAAQAB0AAAAAAAAAAAARAP//AAABAAAAAAARAAwAAAAAAAAAAAARAA0AAAABAAAAAAARABwAAAAAAAAAAAARAB0AAAAAAAAAAAASAP//AAABAAAAAAASAAwAAAAAAAAAAAASAA0AAAABAAAAAAASABwAAAAAAAAAAAASAB0AAAAAAAAAAAATAP//AAABAAAAAAATAAwAAAAAAAAAAAATAA0AAAABAAAAAAATABwAAAAAAAAAAAATAB0AAAAAAAAAAAAUAP//AAABAAAAAAAUAAwAAAAAAAAAAAAUAA0AAAABAAAAAAAUABwAAAAAAAAAAAAUAB0AAAAAAAAAAAAVAP//AAABAAAAAAAVAAwAAAAAAAAAAAAVAA0AAAABAAAAAAAVABwAAAAAAAAAAAAVAB0AAAAAAAAAAAAWAP//AAABAAAAAAAWAAwAAAAAAAAAAAAWAA0AAAABAAAAAAAWABwAAAAAAAAAAAAWAB0AAAAAAAAAAAAXAP//AAABAAAAAAAXAAwAAAAAAAAAAAAXAA0AAAABAAAAAAAXABwAAAAAAAAAAAAXAB0AAAAAAAAAAAAYAP//AAABAAAAAAAYAAwAAAAAAAAAAAAYAA0AAAABAAAAAAAYABwAAAAAAAAAAAAYAB0AAAAAAAAAAAAZAP//AAABAAAAAAAZAAwAAAAAAAAAAAAZAA0AAAABAAAAAAAZABwAAAAAAAAAAAAZAB0AAAAAAAAAAAAaAP//AAABAAAAAAAaAAwAAAAAAAAAAAAaAA0AAAABAAAAAAAaABwAAAAAAAAAAAAaAB0AAAAAAAAAAAAbAP//AAABAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAABAAAAAAAbABwAAAAAAAAAAAAbAB0AAAAAAAAAAAAcAP//AAABAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAABAAAAAAAcABwAAAAAAAAAAAAcAB0AAAAAAAAAAAAdAP//AAABAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAABAAAAAAAdABwAAAAAAAAAAAAdAB0AAAAAAAAAAAAeAP//AAABAAAAAAAeAAwAAAAAAAAAAAAeAA0AAAABAAAAAAAeABwAAAAAAAAAAAAeAB0AAAAAAAAAAAAfAP//AAABAAAAAAAfAAwAAAAAAAAAAAAfAA0AAAABAAAAAAAfABwAAAAAAAAAAAAfAB0AAAAAAAAAAAAgAP//AAABAAAAAAAgAAwAAAAAAAAAAAAgAA0AAAABAAAAAAAgABwAAAAAAAAAAAAgAB0AAAAAAAAAAAAhAP//AAABAAAAAAAhAAwAAAAAAAAAAAAhAA0AAAABAAAAAAAhABwAAAAAAAAAAAAhAB0AAAAAAAAAAAAiAP//AAABAAAAAAAiAAwAAAAAAAAAAAAiAA0AAAABAAAAAAAiABwAAAAAAAAAAAAiAB0AAAAAAAAAAAAjAP//AAABAAAAAAAjAAwAAAAAAAAAAAAjAA0AAAABAAAAAAAjABwAAAAAAAAAAAAjAB0AAAAAAAAAAAAkAP//AAABAAAAAAAkAAwAAAADAAEAAAAkAA0AAAACAAIAAAAkABwAAAAAAAAAAAAkAB0AAAAAAAAAAAAlAP//AAABAAAAAAAlABwAAAAAAAAAAAAlAB0AAAAAAAAAAAAmAP//AAABAAAAAAAmABwAAAAAAAAAAAAmAB0AAAAAAAAAAAAnAP//AAABAAAAAAAnABwAAAAAAAAAAAAnAB0AAAAAAAAAAAAoAP//AAABAAAAAAAoABwAAAAAAAAAAAAoAB0AAAAAAAAAAAApAP//AAABAAAAAAApABwAAAAAAAAAAAApAB0AAAAAAAAAAAAqAP//AAABAAAAAAAqABwAAAAAAAAAAAAqAB0AAAAAAAAAAAArAP//AAABAAAAAAArABwAAAAAAAAAAAArAB0AAAAAAAAAAAAsAP//AAABAAAAAAAsABwAAAAAAAAAAAAsAB0AAAAAAAAAAAAtAP//AAABAAAAAAAtABwAAAAAAAAAAAAtAB0AAAAAAAAAAAAuAP//AAABAAAAAAAuABwAAAAAAAAAAAAuAB0AAAAAAAAAAAAvAP//AAABAAAAAAAvABwAAAAAAAAAAAAvAB0AAAAAAAAAAAAwAP//AAABAAAAAAAwABwAAAAAAAAAAAAwAB0AAAAAAAAAAAAxAP//AAABAAAAAAAxABwAAAAAAAAAAAAxAB0AAAAAAAAAAAAyAP//AAABAAAAAAAyABwAAAAAAAAAAAAyAB0AAAAAAAAAAAAzAP//AAABAAAAAAAzABwAAAAAAAAAAAAzAB0AAAAAAAAAAAA0AP//AAABAAAAAAA0ABwAAAAAAAAAAAA0AB0AAAAAAAAAAAA1AP//AAABAAAAAAA1ABwAAAAAAAAAAAA1AB0AAAAAAAAAAAA2AP//AAABAAAAAAA2ABwAAAAAAAAAAAA2AB0AAAAAAAAAAAA3AP//AAABAAAAAAA3ABsAAAACAAEAAAA3ABwAAAAAAAAAAAA3AB0AAAAAAAAAAAA4AP//AAABAAAAAAA4ABoAAAACAAEAAAA4ABsAAAACAAIAAAA4ABwAAAAAAAAAAAA5AP//AAABAAAAAAA5ABkAAAACAAEAAAA5ABoAAAACAAIAAAA5ABsAAAAAAAAAAAA6AP//AAABAAAAAAA6ABkAAAACAAIAAAA6ABoAAAAAAAAAAAA7AP//AAABAAAAAAA7ABkAAAAAAAAAAAA8AP//AAABAAAAAAA8ABYAAAACAAEAAAA9AP//AAABAAAAAAA9ABUAAAACAAEAAAA9ABYAAAACAAIAAAA+AP//AAABAAAAAAA+ABQAAAACAAEAAAA+ABUAAAACAAIAAAA+ABYAAAAAAAAAAAA/AP//AAABAAAAAAA/ABMAAAACAAEAAAA/ABQAAAACAAIAAAA/ABUAAAAAAAAAAABAAP//AAABAAAAAABAABIAAAACAAEAAABAABMAAAACAAIAAABAABQAAAAAAAAAAABBAP//AAABAAAAAABBABEAAAACAAEAAABBABIAAAACAAIAAABBABMAAAAAAAAAAABCAP//AAABAAAAAABCABAAAAACAAEAAABCABEAAAACAAIAAABCABIAAAAAAAAAAABDAP//AAABAAAAAABDAA8AAAACAAEAAABDABAAAAACAAIAAABDABEAAAAAAAAAAABEAP//AAABAAAAAABEAA4AAAACAAEAAABEAA8AAAACAAIAAABEABAAAAAAAAAAAABFAP//AAABAAAAAABFAA0AAAACAAEAAABFAA4AAAACAAIAAABFAA8AAAAAAAAAAABGAP//AAABAAAAAABGAAwAAAAAAAEAAABGAA0AAAACAAIAAABGAA4AAAAAAAAAAABHAP//AAABAAAAAABHAAwAAAAAAAAAAABHAA0AAAABAAAAAABIAP//AAABAAAAAABIAAwAAAAAAAAAAABIAA0AAAABAAAAAABJAP//AAABAAAAAABJAAwAAAAAAAAAAABJAA0AAAABAAAAAABKAP//AAABAAAAAABKAAwAAAAAAAAAAABKAA0AAAABAAAAAABLAP//AAABAAAAAABLAAwAAAAAAAAAAABLAA0AAAABAAAAAABMAP//AAABAAAAAABMAAwAAAAAAAAAAABMAA0AAAABAAAAAABNAP//AAABAAAAAABNAAwAAAAAAAAAAABNAA0AAAABAAAAAABOAP//AAABAAAAAABOAAwAAAAAAAAAAABOAA0AAAABAAAAAABPAP//AAABAAAAAABPAAwAAAAAAAAAAABPAA0AAAABAAAAAABQAP//AAABAAAAAABQAAwAAAAAAAAAAABQAA0AAAABAAAAAABRAP//AAABAAAAAABRAAwAAAAAAAAAAABRAA0AAAABAAAAAABSAP//AAABAAAAAABSAAwAAAAAAAAAAABSAA0AAAABAAAAAABTAP//AAABAAAAAABTAAwAAAAAAAAAAABTAA0AAAABAAAAAABUAP//AAABAAAAAABUAAwAAAAAAAAAAABUAA0AAAABAAAAAABVAP//AAABAAAAAABVAAwAAAAAAAAAAABVAA0AAAABAAAAAABWAP//AAABAAAAAABWAAwAAAAAAAAAAABWAA0AAAABAAAAAABXAP//AAABAAAAAABXAAwAAAAAAAAAAABXAA0AAAABAAAAAABYAP//AAABAAAAAABYAAwAAAAAAAAAAABYAA0AAAABAAAAAABZAP//AAABAAAAAABZAAwAAAAAAAAAAABZAA0AAAABAAAAAABaAP//AAABAAAAAABaAAwAAAAAAAAAAABaAA0AAAABAAAAAABbAP//AAABAAAAAABbAAwAAAAAAAAAAABbAA0AAAABAAAAAABcAP//AAABAAAAAABcAAwAAAAAAAAAAABcAA0AAAABAAAAAABdAP//AAABAAAAAABdAAwAAAAAAAAAAABdAA0AAAABAAAAAABeAP//AAABAAAAAABeAAwAAAAAAAAAAABeAA0AAAABAAAAAABfAP//AAABAAAAAABfAAwAAAAAAAAAAABfAA0AAAABAAAAAABgAP//AAABAAAAAABgAAwAAAAAAAAAAABgAA0AAAABAAAAAABhAP//AAABAAAAAABhAAwAAAAAAAAAAABhAA0AAAABAAAAAABiAP//AAABAAAAAABiAAwAAAAAAAAAAABiAA0AAAABAAAAAABjAP//AAABAAAAAABjAAwAAAAAAAAAAABjAA0AAAABAAAAAAD//woAAAACAAAAAAD//wsAAAACAAAAAAD//wwAAAACAAAAAAD//w0AAAACAAAAAAD//w4AAAACAAAAAAD//w8AAAACAAAAAAD//xAAAAACAAAAAAD//xEAAAACAAAAAAD//xIAAAACAAAAAABkAAwAAAAAAAAAAABkAA0AAAABAAAAAAA=") +tile_set = SubResource("TileSet_w160a") +metadata/_edit_lock_ = true + +[node name="Player" parent="." instance=ExtResource("3_mxkfc")] +position = Vector2(88, 339) + +[node name="Light" type="Node2D" parent="."] +visible = false + +[node name="PointLight2D_1" type="PointLight2D" parent="Light"] +visible = false +position = Vector2(77, 234) +color = Color(0.299384, 0.000221401, 0.977566, 1) +energy = 6.45 +texture = SubResource("GradientTexture2D_l412j") +texture_scale = 5.0 + +[node name="PointLight2D_2" type="PointLight2D" parent="Light"] +visible = false +position = Vector2(341, 234) +color = Color(0.299384, 0.000221401, 0.977566, 1) +energy = 6.45 +texture = SubResource("GradientTexture2D_l412j") +texture_scale = 5.0 + +[node name="PointLight2D_3" type="PointLight2D" parent="Light"] +visible = false +position = Vector2(600, 234) +color = Color(0.299384, 0.000221401, 0.977566, 1) +energy = 6.45 +texture = SubResource("GradientTexture2D_l412j") +texture_scale = 5.0 + +[node name="DirectionalLight2D" type="DirectionalLight2D" parent="Light"] +visible = false +energy = 7.4 +blend_mode = 1 + +[node name="Effect_Group" type="Node" parent="." groups=["Effect_Group"]] + +[node name="Enemy_Group" type="Node" parent="."] + +[node name="0" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(322, 448) + +[node name="1" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(607, 448) + +[node name="2" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(663, 448) + +[node name="3" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(362, 195) + +[node name="4" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(1303, 195) + +[node name="5" parent="Enemy_Group" instance=ExtResource("4_ucsmj")] +position = Vector2(395, 448) + +[node name="1" type="Sprite2D" parent="."] +visible = false +z_index = 5 +material = SubResource("ShaderMaterial_x3rhj") +position = Vector2(267, 412) +scale = Vector2(1.5, 1.5) +texture = ExtResource("7_qgw53") + +[node name="2" type="Sprite2D" parent="."] +visible = false +z_index = 5 +material = SubResource("ShaderMaterial_6fvd4") +position = Vector2(204, 411) +scale = Vector2(1.53, 1.53) +texture = ExtResource("8_6fvd4") diff --git a/Level/Test_Level_02.tscn b/Level/Test_Level_02.tscn new file mode 100644 index 0000000..14c15b9 --- /dev/null +++ b/Level/Test_Level_02.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=7 format=4 uid="uid://mey2r63jur8h"] + +[ext_resource type="Texture2D" uid="uid://bj6j7q5bldm1c" path="res://Level/Tiles/Art_Group.png" id="1_jqjyl"] +[ext_resource type="Script" uid="uid://b778cjtx0rerf" path="res://Level/Tiles/tile_group.gd" id="1_whuxa"] +[ext_resource type="PackedScene" uid="uid://cqvw1nk6yco4e" path="res://Char/Char_Components/Blood/blood_stain.tscn" id="2_36cey"] + +[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_8k7te"] +polygon = PackedVector2Array(8, -8, 8, 8, -8, 8) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_v5yy2"] +texture = ExtResource("1_jqjyl") +use_texture_padding = false +0:0/0 = 0 +0:0/0/custom_data_0 = 1 +1:0/0 = 0 +1:0/0/custom_data_0 = 1 +2:0/0 = 0 +2:0/0/custom_data_0 = 1 +3:0/0 = 0 +3:0/0/custom_data_0 = 1 +0:1/0 = 0 +0:1/0/custom_data_0 = 1 +1:1/0 = 0 +1:1/0/custom_data_0 = 1 +2:1/0 = 0 +2:1/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_8k7te") +2:1/0/custom_data_0 = 1 +3:1/0 = 0 +3:1/0/custom_data_0 = 1 +0:2/0 = 0 +1:2/0 = 0 +2:2/0 = 0 +3:2/0 = 0 + +[sub_resource type="TileSet" id="TileSet_p7xpq"] +occlusion_layer_0/light_mask = 1 +custom_data_layer_0/name = "mask_area" +custom_data_layer_0/type = 2 +sources/0 = SubResource("TileSetAtlasSource_v5yy2") + +[node name="Test_Level_02" type="Node2D" groups=["Level"]] + +[node name="Tile_Group" type="CanvasGroup" parent="." groups=["Tile_Group"]] +script = ExtResource("1_whuxa") + +[node name="View_Layer_1" type="TileMapLayer" parent="Tile_Group"] +light_mask = 2 +visibility_layer = 2 +tile_map_data = PackedByteArray("AAAEAAUAAAADAAIAAAAEAAYAAAADAAIAAAAEAAcAAAADAAIAAAAEAAgAAAADAAIAAAAEAAkAAAADAAIAAAAEAAoAAAADAAIAAAAEAAsAAAADAAIAAAAEAAwAAAADAAIAAAAEAA0AAAADAAIAAAAFAAUAAAADAAIAAAAFAAYAAAADAAIAAAAFAAcAAAADAAIAAAAFAAgAAAADAAIAAAAFAAkAAAADAAIAAAAFAAoAAAADAAIAAAAFAAsAAAADAAIAAAAFAAwAAAADAAIAAAAFAA0AAAADAAIAAAAGAAUAAAADAAIAAAAGAAYAAAADAAIAAAAGAAcAAAADAAIAAAAGAAgAAAADAAIAAAAGAAkAAAADAAIAAAAGAAoAAAADAAIAAAAGAAsAAAADAAIAAAAGAAwAAAADAAIAAAAGAA0AAAADAAIAAAAHAAUAAAADAAIAAAAHAAYAAAADAAIAAAAHAAcAAAADAAIAAAAHAAgAAAADAAIAAAAHAAkAAAADAAIAAAAHAAoAAAADAAIAAAAHAAsAAAADAAIAAAAHAAwAAAADAAIAAAAHAA0AAAADAAIAAAAIAAUAAAADAAIAAAAIAAYAAAADAAIAAAAIAAcAAAADAAIAAAAIAAgAAAADAAIAAAAIAAkAAAADAAIAAAAIAAoAAAADAAIAAAAIAAsAAAADAAIAAAAIAAwAAAADAAIAAAAIAA0AAAADAAIAAAAJAAUAAAADAAIAAAAJAAYAAAADAAIAAAAJAAcAAAADAAIAAAAJAAgAAAADAAIAAAAJAAkAAAADAAIAAAAJAAoAAAADAAIAAAAJAAsAAAADAAIAAAAJAAwAAAADAAIAAAAJAA0AAAADAAIAAAAKAAUAAAADAAIAAAAKAAYAAAADAAIAAAAKAAcAAAADAAIAAAAKAAgAAAADAAIAAAAKAAkAAAADAAIAAAAKAAoAAAADAAIAAAAKAAsAAAADAAIAAAAKAAwAAAADAAIAAAAKAA0AAAADAAIAAAALAAUAAAADAAIAAAALAAYAAAADAAIAAAALAAcAAAADAAIAAAALAAgAAAADAAIAAAALAAkAAAADAAIAAAALAAoAAAADAAIAAAALAAsAAAADAAIAAAALAAwAAAADAAIAAAALAA0AAAADAAIAAAAMAAUAAAADAAIAAAAMAAYAAAADAAIAAAAMAAcAAAADAAIAAAAMAAgAAAADAAIAAAAMAAkAAAADAAIAAAAMAAoAAAADAAIAAAAMAAsAAAADAAIAAAAMAAwAAAADAAIAAAAMAA0AAAADAAIAAAANAAUAAAADAAIAAAANAAYAAAADAAIAAAANAAcAAAADAAIAAAANAAgAAAADAAIAAAANAAkAAAADAAIAAAANAAoAAAADAAIAAAANAAsAAAADAAIAAAANAAwAAAADAAIAAAANAA0AAAADAAIAAAAOAAUAAAADAAIAAAAOAAYAAAADAAIAAAAOAAcAAAADAAIAAAAOAAgAAAADAAIAAAAOAAkAAAADAAIAAAAOAAoAAAADAAIAAAAOAAsAAAADAAIAAAAOAAwAAAADAAIAAAAOAA0AAAADAAIAAAA=") +tile_set = SubResource("TileSet_p7xpq") + +[node name="View_Layer_2" type="TileMapLayer" parent="Tile_Group"] +light_mask = 2 +visibility_layer = 2 +tile_map_data = PackedByteArray("AAAGAAgAAAABAAAAAAAGAAkAAAABAAAAAAAGAAoAAAABAAAAAAAHAAgAAAABAAAAAAAHAAkAAAABAAAAAAAHAAoAAAABAAAAAAAIAAgAAAABAAAAAAAIAAkAAAABAAAAAAAIAAoAAAABAAAAAAAKAAgAAAACAAAAAAAKAAkAAAACAAEAAAAKAAoAAAACAAAAAAALAAgAAAACAAAAAAALAAkAAAACAAAAAAALAAoAAAACAAAAAAAMAAgAAAACAAAAAAAMAAkAAAACAAAAAAAMAAoAAAACAAAAAAA=") +tile_set = SubResource("TileSet_p7xpq") + +[node name="Effect_Group" type="Node" parent="."] + +[node name="Blood_Stain_Trail" parent="Effect_Group" instance=ExtResource("2_36cey")] +position = Vector2(145, 170) + +[node name="Camera2D" type="Camera2D" parent="."] diff --git a/Level/Test_Level_03.tscn b/Level/Test_Level_03.tscn new file mode 100644 index 0000000..8d54ca1 --- /dev/null +++ b/Level/Test_Level_03.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://cwhq012x0sjb3"] + +[ext_resource type="PackedScene" uid="uid://bxhllsclvr2a7" path="res://Level/Rope/Rope.tscn" id="1_m0x3m"] +[ext_resource type="PackedScene" uid="uid://clbhclvndl73s" path="res://Char/Player/Shadow/Shadow.tscn" id="3_5oxgn"] + +[node name="Test_Level_03" type="Node2D"] + +[node name="Rope" parent="." instance=ExtResource("1_m0x3m")] +start_point = Vector2(143, 237) +end_point = Vector2(390, 236) + +[node name="Player" parent="." instance=ExtResource("3_5oxgn")] +position = Vector2(185, 99) diff --git a/Level/Tiles/Art.png.import b/Level/Tiles/Art.png.import new file mode 100644 index 0000000..f299ef2 --- /dev/null +++ b/Level/Tiles/Art.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhkwb3m7vuhjr" +path="res://.godot/imported/Art.png-8f39b27c629c9662929543d503725949.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Level/Tiles/Art.png" +dest_files=["res://.godot/imported/Art.png-8f39b27c629c9662929543d503725949.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/Level/Tiles/Art_Group.png b/Level/Tiles/Art_Group.png new file mode 100644 index 0000000..9a97fdd Binary files /dev/null and b/Level/Tiles/Art_Group.png differ diff --git a/Level/Tiles/Art_Group.png.import b/Level/Tiles/Art_Group.png.import new file mode 100644 index 0000000..87b1a4d --- /dev/null +++ b/Level/Tiles/Art_Group.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bj6j7q5bldm1c" +path="res://.godot/imported/Art_Group.png-60c3f6a4dbf3924f3965b93257ac85c4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Level/Tiles/Art_Group.png" +dest_files=["res://.godot/imported/Art_Group.png-60c3f6a4dbf3924f3965b93257ac85c4.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/Level/Tiles/Physic_Group.png b/Level/Tiles/Physic_Group.png new file mode 100644 index 0000000..6949b02 Binary files /dev/null and b/Level/Tiles/Physic_Group.png differ diff --git a/Level/Tiles/Physic_Group.png.import b/Level/Tiles/Physic_Group.png.import new file mode 100644 index 0000000..2923394 --- /dev/null +++ b/Level/Tiles/Physic_Group.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmukg5vvbfde4" +path="res://.godot/imported/Physic_Group.png-b98f59436b4f7906ebcc35297b26fd8c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Level/Tiles/Physic_Group.png" +dest_files=["res://.godot/imported/Physic_Group.png-b98f59436b4f7906ebcc35297b26fd8c.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/Level/Tiles/tile_group.gd b/Level/Tiles/tile_group.gd new file mode 100644 index 0000000..f57fb0b --- /dev/null +++ b/Level/Tiles/tile_group.gd @@ -0,0 +1,104 @@ +#tile_map.gd +extends CanvasGroup + +# 定义一个信号来通知血迹精灵更新 +signal mask_tiles_updated + +var tilemaplayers: Array[TileMapLayer] = [] +var mask_tiles: Array[Vector2i] = [] + +class TileMaskInfo: + var position: Vector2i + var shapes: Array[Dictionary] = [] +var mask_tile_info: Array[TileMaskInfo] = [] + +func _ready(): + # 获取所有的 TileMapLayer + collect_tilemaplayers() + update_mask_tiles() + # 为每个 TileMapLayer 订阅变化信号 + for layer in tilemaplayers: + layer.changed.connect(_on_tilemap_changed) + + +#region 收集所有的 TileMapLayer +func collect_tilemaplayers() -> void: + tilemaplayers.clear() + for child in self.get_children(): + if child is TileMapLayer: + tilemaplayers.append(child) + +func update_mask_tiles() -> void: + mask_tiles.clear() + mask_tile_info.clear() + + for layer in tilemaplayers: + if not is_instance_valid(layer): + continue + + var used_cells = layer.get_used_cells() + for coords in used_cells: + if not is_instance_valid(layer): + break + var tile_data = layer.get_cell_tile_data(coords) + if tile_data and tile_data.get_custom_data("mask_area") == 1: + if not coords in mask_tiles: + mask_tiles.append(coords) + + # 创建新的遮罩信息 + var info = TileMaskInfo.new() + info.position = coords + + # 获取瓦片形状 + # 尝试从物理层获取形状 + var has_shape = false + for physics_layer_id in layer.tile_set.get_physics_layers_count(): + if tile_data.get_collision_polygons_count(physics_layer_id) > 0: + has_shape = true + for i in tile_data.get_collision_polygons_count(physics_layer_id): + var polygon = tile_data.get_collision_polygon_points(physics_layer_id, i) + if polygon.size() > 0: + info.shapes.append({ + "type": "polygon", + "points": polygon + }) + + # 如果没有物理形状,尝试从遮挡层获取形状 + if not has_shape: + for occlusion_layer_id in layer.tile_set.get_occlusion_layers_count(): + var occluder = tile_data.get_occluder(occlusion_layer_id) + if occluder: + var polygon = occluder.polygon + if polygon.size() > 0: + info.shapes.append({ + "type": "polygon", + "points": polygon + }) + has_shape = true + break + + # 如果都没有形状,使用默认矩形 + if not has_shape: + var tile_size = layer.tile_set.tile_size + info.shapes.append({ + "type": "rect", + "size": Vector2(tile_size) + }) + + mask_tile_info.append(info) + +func _on_tilemap_changed(): + update_mask_tiles() + # 发送信号通知所有血迹更新 + mask_tiles_updated.emit() + +func cleanup(): + for layer in tilemaplayers: + if is_instance_valid(layer) and layer.changed.is_connected(_on_tilemap_changed): + layer.changed.disconnect(_on_tilemap_changed) + tilemaplayers.clear() + mask_tiles.clear() + +func _exit_tree(): + cleanup() +#endregion diff --git a/Level/Tiles/tile_group.gd.uid b/Level/Tiles/tile_group.gd.uid new file mode 100644 index 0000000..7a388fd --- /dev/null +++ b/Level/Tiles/tile_group.gd.uid @@ -0,0 +1 @@ +uid://b778cjtx0rerf diff --git a/Level/test_level_01.gd b/Level/test_level_01.gd new file mode 100644 index 0000000..ea909ab --- /dev/null +++ b/Level/test_level_01.gd @@ -0,0 +1,18 @@ +extends Node2D # 或者extends Node,取决于你的level场景的根节点类型 + +func _ready(): + # 初始化时的设置(如果需要的话) + pass + +func _process(_delta): + # 检测是否按下重置按键 + if Input.is_action_just_pressed("Level_Reset"): + reset_level() + +func reset_level(): + # 方法1:重新加载当前场景 + get_tree().reload_current_scene() + + # 或者方法2:如果你想要更精确的控制 + # var current_scene_path = scene_file_path # 获取当前场景路径 + # get_tree().change_scene_to_file(current_scene_path) diff --git a/Level/test_level_01.gd.uid b/Level/test_level_01.gd.uid new file mode 100644 index 0000000..b4f6cd6 --- /dev/null +++ b/Level/test_level_01.gd.uid @@ -0,0 +1 @@ +uid://pbvjs78t7p4p diff --git a/Level/test_level_02.gd b/Level/test_level_02.gd new file mode 100644 index 0000000..11aa6a5 --- /dev/null +++ b/Level/test_level_02.gd @@ -0,0 +1,64 @@ +# Level.gd +extends Node2D + +# 定义一个信号来通知血迹精灵更新 +signal mask_tiles_updated + +@onready var canvas_group = $Tile_Group + +var tilemaplayers: Array[TileMapLayer] = [] +var mask_tiles: Array[Vector2i] = [] + +func _ready(): + # 获取所有的 TileMapLayer + collect_tilemaplayers() + update_mask_tiles() + # 为每个 TileMapLayer 订阅变化信号 + for layer in tilemaplayers: + layer.changed.connect(_on_tilemap_changed) + + +#region 收集所有的 TileMapLayer +func collect_tilemaplayers() -> void: + tilemaplayers.clear() + for child in canvas_group.get_children(): + if child is TileMapLayer: + tilemaplayers.append(child) + +func update_mask_tiles() -> void: + mask_tiles.clear() + + # 添加安全检查 + if not is_instance_valid(canvas_group): + return + + # 遍历每个 TileMapLayer + for layer in tilemaplayers: + # 添加安全检查 + if not is_instance_valid(layer): + continue + + var used_cells = layer.get_used_cells() + for coords in used_cells: + if not is_instance_valid(layer): # 再次检查,以防在循环中被释放 + break + var tile_data = layer.get_cell_tile_data(coords) + if tile_data and tile_data.get_custom_data("mask_area") == 1: + if not coords in mask_tiles: + mask_tiles.append(coords) + +func _on_tilemap_changed(): + update_mask_tiles() + # 发送信号通知所有血迹更新 + mask_tiles_updated.emit() + +func cleanup(): + for layer in tilemaplayers: + if is_instance_valid(layer) and layer.changed.is_connected(_on_tilemap_changed): + layer.changed.disconnect(_on_tilemap_changed) + tilemaplayers.clear() + mask_tiles.clear() + +func _exit_tree(): + cleanup() +#endregion diff --git a/Level/test_level_02.gd.uid b/Level/test_level_02.gd.uid new file mode 100644 index 0000000..0356727 --- /dev/null +++ b/Level/test_level_02.gd.uid @@ -0,0 +1 @@ +uid://c5uq6s4870730 diff --git a/Level/test_level_03.gd b/Level/test_level_03.gd new file mode 100644 index 0000000..e69de29 diff --git a/Level/test_level_03.gd.uid b/Level/test_level_03.gd.uid new file mode 100644 index 0000000..a76de57 --- /dev/null +++ b/Level/test_level_03.gd.uid @@ -0,0 +1 @@ +uid://b507sqy7f6xf5 diff --git a/UI/Art/spr_cursor_0.png b/UI/Art/spr_cursor_0.png new file mode 100644 index 0000000..576f39a Binary files /dev/null and b/UI/Art/spr_cursor_0.png differ diff --git a/UI/Art/spr_cursor_0.png.import b/UI/Art/spr_cursor_0.png.import new file mode 100644 index 0000000..c8e552b --- /dev/null +++ b/UI/Art/spr_cursor_0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8v4thcgqj535" +path="res://.godot/imported/spr_cursor_0.png-de01425e97d4024bd4a11094242aac07.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://UI/Art/spr_cursor_0.png" +dest_files=["res://.godot/imported/spr_cursor_0.png-de01425e97d4024bd4a11094242aac07.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/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..1992237 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,64 @@ +[preset.0] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../..//D3_v5.exe" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=true +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=true +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=true +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +application/export_d3d12=0 +application/d3d12_agility_sdk_multiarch=true +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..1eecf77 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://03xwnbggdli" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..05ff9c1 --- /dev/null +++ b/project.godot @@ -0,0 +1,117 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="D3_v5" +run/main_scene="res://Level/Test_Level_01.tscn" +run/print_header=false +config/features=PackedStringArray("4.4", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +TimeScreenController="*res://Autoload/time_screen_controller.gd" + +[display] + +window/size/window_width_override=1600 +window/size/window_height_override=900 +window/stretch/mode="viewport" + +[global_group] + +Player="" +FX="" +Enemy="" +After_Image="" +Level="" +Tile_Group="" +Rope="" +Effect_Group="" + +[input] + +ui_left={ +"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":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) +, 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,"location":0,"echo":false,"script":null) +] +} +ui_right={ +"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":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) +, 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,"location":0,"echo":false,"script":null) +] +} +ui_up={ +"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":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null) +, 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,"location":0,"echo":false,"script":null) +, 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,"location":0,"echo":false,"script":null) +] +} +ui_down={ +"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":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null) +, 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,"location":0,"echo":false,"script":null) +] +} +Attack={ +"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":1,"position":Vector2(253, 28),"global_position":Vector2(267, 98),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} +Dash={ +"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(522, 22),"global_position":Vector2(536, 92),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} +Level_Reset={ +"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":0,"physical_keycode":96,"key_label":0,"unicode":183,"location":0,"echo":false,"script":null) +] +} + +[layer_names] + +2d_render/layer_1="Sky" +2d_render/layer_2="Background wall" +2d_physics/layer_1="Player" +2d_physics/layer_2="Player_Hit" +2d_physics/layer_3="Player_Hurt" +2d_physics/layer_6="Enemy" +2d_physics/layer_7="Enemy_Hit" +2d_physics/layer_8="Enemy_Hurt" +2d_physics/layer_20="Floor" +2d_physics/layer_21="One_Way_Floor" +2d_physics/layer_22="Wall" +2d_physics/layer_23="Door" +2d_physics/layer_24="Ceil" +2d_physics/layer_25="Slope" +2d_physics/layer_26="Rope" + +[physics] + +2d/default_gravity=1500.0 + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +2d/snap/snap_2d_transforms_to_pixel=true +2d/snap/snap_2d_vertices_to_pixel=true diff --git a/翻译提示词参考.txt b/翻译提示词参考.txt deleted file mode 100644 index 8aabc86..0000000 --- a/翻译提示词参考.txt +++ /dev/null @@ -1,62 +0,0 @@ -现在你要帮忙解释一篇文章成简体中文。 - -规则: -- 翻译时要准确传达学术论文的事实和背景,同时风格上保持为通俗易懂并且严谨的科普文风格。 -- 保留特定的英文术语、数字或名字,并在其前后加上空格,例如:"中 UN 文","不超过 10 秒"。 -- 即使上意译也要保留术语,例如 FLAC,JPEG 等。保留公司缩写,例如 Microsoft, Amazon 等。 -- 保留引用的论文,例如 [20] 这样的引用;同时也要保留针对图例的引用,例如保留 Figure 1 并翻译为图 1。 -- 全角括号换成半角括号,并在左括号前面加半角空格,右括号后面加半角空格。 -- 输入格式为Markdown格式,输出格式也必须保留原始Markdown格式 - - -现在有三个角色: -- 英语老师,精通英文,能精确的理解英文并用中文表达 -- 中文老师,精通中文,擅长按照中文使用喜欢撰写通俗易懂的科普文 -- 校长,精通中文和英文,擅长校对审查 - - -和步骤来翻译这篇文章,每一步都必须遵守以上规则,打印每一步的输出结果: - -Step 1:现在你是英语老师,精通英文,对原文按照字面意思直译,务必遵守原意,翻译时保持原始英文的段落结构,不要合并分段 - -Step 2:扮演中文老师,精通中文,擅长写通俗易懂的科普文章,对英语老师翻译的内容重新意译,遵守原意的前提下让内容更通俗易懂,符合中文表达习惯,但不要增加和删减内容,保持原始分段 - -Step 3: 英文老师将中文老师的文稿反向翻译成英文(回译稿) - -Step 4:扮演校长,精通中文和英文,校对回译稿和原稿中的区别,重点检查两点:翻译稿和原文有出入的位置;不符合中文表达习惯的位置; - -Step 5:中文老师基于校长的修改意见,修改初稿 - -本条消息只需要回复OK,接下来的消息我将会给你发送完整内容,收到后请按照上面的规则和下面的格式打印翻译结果,返回格式如下,"{xxx}"表示占位符: - -### 英语老师直译结果 -{英语老师直译结果} - -### 中文老师意译初稿 -{中文老师意译初稿} - -### 英语老师回译 -{英语老师回译稿} - -### 校长校对意见 - -以下是在中文翻译中缺失的部分: - -{重复以下列表,直到列出所有缺失的内容} -- 对比原文缺失或表达歧义部分{1...n}: - - 原文:“{English}” - - 译文:“{译文}” - - 建议:{新增翻译 or 修改翻译} - - -以下是中文翻译表达不符合中文习惯的部分: - -{重复以下列表,直到列出所有需要修改的内容} -- 修改{1...n}: - - 原文:“{English}” - - 译文:“{译文}” - - 建议:{修改后内容} - - -### 中文老师翻译终稿 -{中文老师翻译终稿} \ No newline at end of file