Boss Floor 1 Update

-Updated Model (Ver. 3)
-Cloud Setup
-Skybox Setup
-Lighting/Environment
This commit is contained in:
Pal
2025-09-09 06:10:14 -07:00
parent 09abd588c2
commit 65bcd4b5b7
76 changed files with 1856 additions and 752 deletions

View File

@@ -33,44 +33,44 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
public void Setup() public void Setup()
{ {
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered; ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
OxFace.CurrentHP.Sync += BossStatusUpdate; OxFace.CurrentHP.Sync += BossStatusUpdate;
HorseFace.CurrentHP.Sync += BossStatusUpdate; HorseFace.CurrentHP.Sync += BossStatusUpdate;
_exit.AreaEntered += Exit_AreaEntered; _exit.AreaEntered += Exit_AreaEntered;
} }
private void ActivateTrap_BodyEntered(Node3D body) private void ActivateTrap_BodyEntered(Node3D body)
{ {
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered; ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
StartBossFight(); StartBossFight();
} }
public void StartBossFight() public void StartBossFight()
{ {
OxFaceStatue.Hide(); OxFaceStatue.Hide();
HorseHeadStatue.Hide(); HorseHeadStatue.Hide();
OxFace.StartFight(); OxFace.StartFight();
HorseFace.StartFight(); HorseFace.StartFight();
} }
public void OnBossFightEnded() public void OnBossFightEnded()
{ {
GateCollision.CallDeferred(MethodName.QueueFree); GateCollision.CallDeferred(MethodName.QueueFree);
} }
private void BossStatusUpdate(double hp) private void BossStatusUpdate(double hp)
{ {
if (OxFace.CurrentHP.Value <= 0 && HorseFace.CurrentHP.Value <= 0) if (OxFace.CurrentHP.Value <= 0 && HorseFace.CurrentHP.Value <= 0)
OnBossFightEnded(); OnBossFightEnded();
} }
public void ExitReached() public void ExitReached()
=> Game.FloorExitReached(); => Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area) private void Exit_AreaEntered(Area3D area)
{ {
if (area.GetOwner() is IPlayer) if (area.GetOwner() is IPlayer)
ExitReached(); ExitReached();
} }
public void InitializeDungeon() public void InitializeDungeon()

View File

@@ -17,7 +17,7 @@
[ext_resource type="Texture2D" uid="uid://cururtxtgylxf" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_COLUMN.jpg" id="15_ojbcg"] [ext_resource type="Texture2D" uid="uid://cururtxtgylxf" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_COLUMN.jpg" id="15_ojbcg"]
[ext_resource type="PackedScene" uid="uid://db206brufi83s" path="res://src/items/weapons/Weapon.tscn" id="16_aqomv"] [ext_resource type="PackedScene" uid="uid://db206brufi83s" path="res://src/items/weapons/Weapon.tscn" id="16_aqomv"]
[ext_resource type="PackedScene" uid="uid://1fl6s352e2ej" path="res://src/items/throwable/ThrowableItem.tscn" id="16_db2o3"] [ext_resource type="PackedScene" uid="uid://1fl6s352e2ej" path="res://src/items/throwable/ThrowableItem.tscn" id="16_db2o3"]
[ext_resource type="VideoStream" uid="uid://cms0sqekyx4pf" path="res://src/video/Sky Video.ogv" id="16_ojbcg"] [ext_resource type="VideoStream" uid="uid://b7mlxo845l5to" path="res://src/video/Sky Test.ogv" id="16_ojbcg"]
[ext_resource type="Resource" uid="uid://cfhwlpa0d7wb4" path="res://src/items/weapons/resources/MysteryRod.tres" id="17_db2o3"] [ext_resource type="Resource" uid="uid://cfhwlpa0d7wb4" path="res://src/items/weapons/resources/MysteryRod.tres" id="17_db2o3"]
[ext_resource type="Resource" uid="uid://bph8c6by4s047" path="res://src/items/throwable/resources/GeomanticDice.tres" id="18_ntxe5"] [ext_resource type="Resource" uid="uid://bph8c6by4s047" path="res://src/items/throwable/resources/GeomanticDice.tres" id="18_ntxe5"]
[ext_resource type="PackedScene" uid="uid://b07srt3lckt4e" path="res://src/items/accessory/Accessory.tscn" id="18_qlp0t"] [ext_resource type="PackedScene" uid="uid://b07srt3lckt4e" path="res://src/items/accessory/Accessory.tscn" id="18_qlp0t"]

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://7uqsqpk8jv22"
path="res://.godot/imported/BELL ANIMATIONS.glb-d8e7a69f814c1bc0d9f099c74deed14f.scn"
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/BELL ANIMATIONS.glb"
dest_files=["res://.godot/imported/BELL ANIMATIONS.glb-d8e7a69f814c1bc0d9f099c74deed14f.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://df7dqlwnx6srv"
path="res://.godot/imported/BELL ANIMATIONS_CHAIN_TEX.png-81d8246b627f3bdb37befb6a86f4416d.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "23d9d131e0ad9c97741d45e74e39c3e2"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/BELL ANIMATIONS_CHAIN_TEX.png"
dest_files=["res://.godot/imported/BELL ANIMATIONS_CHAIN_TEX.png-81d8246b627f3bdb37befb6a86f4416d.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bi53t6xps6wuv"
path="res://.godot/imported/BELL ANIMATIONS_COLUMN.jpg-68dfb40c7ace636494104544a0f31e53.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "b534d6c15a62da0430767b1a0f3b687f"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/BELL ANIMATIONS_COLUMN.jpg"
dest_files=["res://.godot/imported/BELL ANIMATIONS_COLUMN.jpg-68dfb40c7ace636494104544a0f31e53.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://g4vx8m554aeb"
path="res://.godot/imported/BELL ANIMATIONS_concrete_0003_color_1k.png-a52df55f6da96e09a4a953f1646e91d6.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "e9d0d15dfb27e2595fee02f430f1a3df"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/BELL ANIMATIONS_concrete_0003_color_1k.png"
dest_files=["res://.godot/imported/BELL ANIMATIONS_concrete_0003_color_1k.png-a52df55f6da96e09a4a953f1646e91d6.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=true
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=0

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bqfa6q71io36i"
path="res://.godot/imported/Boss Floor 1 Ver. 3.glb-f7427abcba4ab8fbb8b1f43a066296fc.scn"
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver. 3.glb"
dest_files=["res://.godot/imported/Boss Floor 1 Ver. 3.glb-f7427abcba4ab8fbb8b1f43a066296fc.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqv0oifquilsa"
path="res://.godot/imported/Boss Floor 1 Ver_AREA1_BLOCKED.png-bc4ba9b335af5477bb68531cdef3679a.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "814b16e0ed5b1d9c5539a1eed17500c2"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_AREA1_BLOCKED.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_AREA1_BLOCKED.png-bc4ba9b335af5477bb68531cdef3679a.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://burw8x227lce2"
path="res://.godot/imported/Boss Floor 1 Ver_CEILING_1.jpg-789507ac864768cfc4e95b8abb7076dc.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "3d6e3a1f727e4ba346b1f8bd49a76e28"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_CEILING_1.jpg"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_CEILING_1.jpg-789507ac864768cfc4e95b8abb7076dc.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bppmel4i6xifp"
path="res://.godot/imported/Boss Floor 1 Ver_CHAIN_TEX.png-00256d7d73b85978efc80f2e534bb732.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "23d9d131e0ad9c97741d45e74e39c3e2"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_CHAIN_TEX.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_CHAIN_TEX.png-00256d7d73b85978efc80f2e534bb732.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2ivtrqyyod2q"
path="res://.godot/imported/Boss Floor 1 Ver_COLUM2N.png-73513d88b0866b0c17d087d3bbd75846.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "aa07ab7f59f9440053a56b318be20581"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_COLUM2N.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_COLUM2N.png-73513d88b0866b0c17d087d3bbd75846.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0thpxnbjnfcw"
path="res://.godot/imported/Boss Floor 1 Ver_COLUMN-DARKER.png-f3e52da35b18b91883fbcc2f24359b13.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "62e8a3cd8ea8225f9875dee292b91d0b"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_COLUMN-DARKER.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_COLUMN-DARKER.png-f3e52da35b18b91883fbcc2f24359b13.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://p5mj81vpgovn"
path="res://.godot/imported/Boss Floor 1 Ver_COLUMN.jpg-9d0f60b4b212b7a8b557178fddec9d6c.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "b534d6c15a62da0430767b1a0f3b687f"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_COLUMN.jpg"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_COLUMN.jpg-9d0f60b4b212b7a8b557178fddec9d6c.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dlf7hcqgear34"
path="res://.godot/imported/Boss Floor 1 Ver_COLUMN3.jpg-d3b385c4ad44c5b4919da3d6d3666664.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "3f97927b9fe1bfcc3a23e1438895a16f"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_COLUMN3.jpg"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_COLUMN3.jpg-d3b385c4ad44c5b4919da3d6d3666664.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bfcb0mknmw5a7"
path="res://.godot/imported/Boss Floor 1 Ver_FLOOR1.jpg-dbb9bf56828431e1707a69972ab1e8ac.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "e23dd1b477467088dbb6f6690c77ad73"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_FLOOR1.jpg"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_FLOOR1.jpg-dbb9bf56828431e1707a69972ab1e8ac.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ben3q8gpume4y"
path="res://.godot/imported/Boss Floor 1 Ver_HAND_CYCLE_MOTIF.png-f14333f7320fc6ba6dec6a8e9922081e.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "4e98dc2cfcd7d8743e8fe74b03bd3712"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_HAND_CYCLE_MOTIF.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_HAND_CYCLE_MOTIF.png-f14333f7320fc6ba6dec6a8e9922081e.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bcu58ooy22scc"
path="res://.godot/imported/Boss Floor 1 Ver_RAIL_TRANSPARENT_PLANE.png-34ece830f5f10346d6fb588757fc4b20.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "c4ffb928b7447583be969671a5ad1254"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_RAIL_TRANSPARENT_PLANE.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_RAIL_TRANSPARENT_PLANE.png-34ece830f5f10346d6fb588757fc4b20.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://kbq263oarje4"
path="res://.godot/imported/Boss Floor 1 Ver_SA115.png-1cd3c0f8a7c476485a4c2ee394e10c5a.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "fabb9289c82f142ecb54e8a2667d6e57"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_SA115.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_SA115.png-1cd3c0f8a7c476485a4c2ee394e10c5a.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv11u63aeqtr8"
path="res://.godot/imported/Boss Floor 1 Ver_SNEK TILE.png-f2ec57f96fb403e197f37d9d02bae0d9.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "8b33e39ce47b4b2d5f3be8dd942326e2"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_SNEK TILE.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_SNEK TILE.png-f2ec57f96fb403e197f37d9d02bae0d9.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bn04efxno8xnk"
path="res://.godot/imported/Boss Floor 1 Ver_STONE_PANEL_1png.png-a094686ffd426ef5f62d4e0e3bbcc238.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "227975486c1181a9276cf8c8194791a5"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_STONE_PANEL_1png.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_STONE_PANEL_1png.png-a094686ffd426ef5f62d4e0e3bbcc238.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bk1uv7qgqo8v"
path="res://.godot/imported/Boss Floor 1 Ver_STONE_PANEL_2png.png-5762f9dd62d6b7adddbfd5877953f6e9.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "250f3babc9d84771c41d8bf13023b798"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_STONE_PANEL_2png.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_STONE_PANEL_2png.png-5762f9dd62d6b7adddbfd5877953f6e9.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cccfccoyy4vhe"
path="res://.godot/imported/Boss Floor 1 Ver_TILE4.png-764ac7cddec69e1898fdf051a3d139fb.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "9635fa0f67978d0bbc3cd49048bec1c6"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_TILE4.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_TILE4.png-764ac7cddec69e1898fdf051a3d139fb.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cat7u6fxm4lmo"
path="res://.godot/imported/Boss Floor 1 Ver_TILE5.png-76789dd4ba3bc974b4dfca611e69a8ef.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "291187513aecb7604aa6994b9ca7a239"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_TILE5.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_TILE5.png-76789dd4ba3bc974b4dfca611e69a8ef.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8fkhcvod75sl"
path="res://.godot/imported/Boss Floor 1 Ver_WALL TILE 1.jpg-0e8fc58cd791e15e6c945a92270f1bab.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "c591bfa502b4a13cdf376c08035fb58d"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_WALL TILE 1.jpg"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_WALL TILE 1.jpg-0e8fc58cd791e15e6c945a92270f1bab.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dr4o3a7q08q0k"
path="res://.godot/imported/Boss Floor 1 Ver_brick3.png-d3cedd0055cc6f104bd821f007ab62f0.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "4e53f276338db9090e7f2fdc2c90feb2"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_brick3.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_brick3.png-d3cedd0055cc6f104bd821f007ab62f0.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://co4kwwg6axpvm"
path="res://.godot/imported/Boss Floor 1 Ver_brick_corridor_corrected.png-b2a839fbb28ecc88151175214cea7daf.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "01d2dbbb6734168b9ef81eb42bfdb764"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_brick_corridor_corrected.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_brick_corridor_corrected.png-b2a839fbb28ecc88151175214cea7daf.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://du2638dx67grl"
path="res://.godot/imported/Boss Floor 1 Ver_darkbrick.png-4b583977ad877059335a49a74134f893.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "68c10aa0eb12d3ce4e6477c9edb3c294"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_darkbrick.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_darkbrick.png-4b583977ad877059335a49a74134f893.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ti2ubdfrncy7"
path="res://.godot/imported/Boss Floor 1 Ver_hand-tiile.png-c74fe039548dd1801f0f9ccf9424e1ff.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "d3ae9d17bf47107d7c4fdd341980bd5a"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_hand-tiile.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_hand-tiile.png-c74fe039548dd1801f0f9ccf9424e1ff.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0m70x7u6muob"
path="res://.godot/imported/Boss Floor 1 Ver_hand-tiile_26.png-3aac7ecd7cec7231ee09d7ad3aae834d.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "748095e78d4b53a700b06c6a8a75ace9"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_hand-tiile_26.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_hand-tiile_26.png-3aac7ecd7cec7231ee09d7ad3aae834d.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dklna8mnv237w"
path="res://.godot/imported/Boss Floor 1 Ver_lower_corridor_lower.png-27b3cda4d2fba0a3e3d6b7e33216abcc.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "11718783be351bc85b6cb01552e92311"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_lower_corridor_lower.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_lower_corridor_lower.png-27b3cda4d2fba0a3e3d6b7e33216abcc.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c4qookyq52kiv"
path="res://.godot/imported/Boss Floor 1 Ver_mother.png-ee73e977b9f32684b38c8779a49345d0.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "0557edb32f31fcbcdb10c4c6f0694eab"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_mother.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_mother.png-ee73e977b9f32684b38c8779a49345d0.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bkfvdo13b6ss4"
path="res://.godot/imported/Boss Floor 1 Ver_swirled_column.png-480cce7d3d8f1f5235e8f8cd19179336.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "b95255ab479b02e2d0ee83096779cac5"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_swirled_column.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_swirled_column.png-480cce7d3d8f1f5235e8f8cd19179336.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cq4fv2s3yj57q"
path="res://.godot/imported/Boss Floor 1 Ver_swirled_column_25.png-67269327b9b1ebcf36826d37b64e2e1d.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "b95255ab479b02e2d0ee83096779cac5"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_swirled_column_25.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_swirled_column_25.png-67269327b9b1ebcf36826d37b64e2e1d.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c1s648mqbl6kx"
path="res://.godot/imported/Boss Floor 1 Ver_tile2.png-699fb0eeb3db42fe78d00403c9037c34.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "d7f876bee51403664d422b95f64dd4f7"
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver_tile2.png"
dest_files=["res://.godot/imported/Boss Floor 1 Ver_tile2.png-699fb0eeb3db42fe78d00403c9037c34.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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dh2b74lac57p0"
path="res://.godot/imported/Sunset Skybox.png-4822d2c316daccf9cbe6fd4bc8b9c8bf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://src/map/dungeon/models/Set A/15. Boss Floor A/Sunset Skybox.png"
dest_files=["res://.godot/imported/Sunset Skybox.png-4822d2c316daccf9cbe6fd4bc8b9c8bf.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=0

View File

@@ -0,0 +1,5 @@
[gd_scene load_steps=2 format=3 uid="uid://b5mavjmak1n8y"]
[ext_resource type="PackedScene" uid="uid://bqfa6q71io36i" path="res://src/map/dungeon/models/Set A/15. Boss Floor A/Boss Floor 1 Ver. 3.glb" id="1_1wnkl"]
[node name="Boss Floor 1 Ver_ 3" instance=ExtResource("1_1wnkl")]

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,86 @@
shader_type spatial;
render_mode depth_draw_opaque;
uniform float height_scale = 0.3;
uniform float wave_speed = 0.2;
uniform float upper_transparency = 0.99;
uniform float global_transparency = 0.9;
uniform vec2 time_factor = vec2(2.0, 3.0);
uniform sampler2D texture_albedo : source_color;
uniform vec3 uv1_scale;
uniform vec3 uv1_offset;
uniform vec4 color1 : source_color = vec4(0.88, 0.91, 0.93, 1.0);
uniform vec4 color2 : source_color = vec4(0.88, 0.99, 0.95, 1.0);
varying flat vec3 out_color;
varying flat vec3 soft_color;
vec3 lerpColor(vec4 a, vec4 b, float t){
float rr = a.r + (b.r - a.r) * t;
float gg = a.g + (b.g - a.g) * t;
float bb = a.b + (b.b - a.b) * t;
return vec3(rr, gg, bb);
}
float hash(vec2 p) {
return fract(sin(dot(p * 17.17, vec2(14.91, 67.31))) * 4791.9511);
}
float noise(vec2 x) {
vec2 p = floor(x);
vec2 f = fract(x);
f = f * f * (3.0 - 2.0 * f);
vec2 a = vec2(1.0, 0.0);
return mix(mix(hash(p + a.yy), hash(p + a.xy), f.x),
mix(hash(p + a.yx), hash(p + a.xx), f.x), f.y);
}
float fbm(vec2 x, float time) {
float height = 0.1;
float amplitude = 0.5;
float frequency = 9.5;
for (int i = 0; i < 6; i++){
height += noise(x * frequency + time * time_factor * wave_speed) * amplitude;
amplitude *= 0.5;
frequency *= 2.0;
}
return height;
}
void vertex() {
UV=UV*uv1_scale.xy+uv1_offset.xy;
out_color = vec3(color1.r, color1.g, color1.b);
soft_color = vec3(color1.r, color1.g, color1.b);
float height = fbm(VERTEX.xz * 4.0, TIME);
VERTEX.y += height * height_scale;
COLOR.xyz = vec3(height);
if (VERTEX.y > 0.3){
out_color = lerpColor(color1, color2, clamp((VERTEX.y) / 3.0, 0.5, 1.0));
soft_color = vec3(color2.r, color2.g, color2.b);
}
}
void fragment(){
ALBEDO = COLOR.xyz;
vec2 base_uv = UV;
vec4 albedo_tex = texture(texture_albedo,base_uv);
ALPHA = global_transparency;
ALBEDO = out_color * albedo_tex.rgb * COLOR.xyz;
if (soft_color.r==color2.r && soft_color.g==color2.g && color2.b==color2.b) {
ALPHA = upper_transparency;
}
}

View File

@@ -0,0 +1 @@
uid://dr68ani6ouefm

View File

@@ -0,0 +1,87 @@
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, unshaded;
// Uniformy dla zmiennych konfigurowalnych
uniform vec4 cloud_color = vec4(1.0, 1.0, 1.0, 1.0); // Kolor chmur (w tym przezroczystość)
uniform float cloud_opacity : hint_range(0.0, 1.0) = 0.01; // Przezroczystość chmur
// Funkcja do interpolacji (fade) używana w szumie Perlin'a
float fade(float t) {
return t * t * t * (t * (t * 6.0 - 90.0) + 10.0);
}
// Funkcja do generowania gradientu
float grad(int hash, float x, float y) {
int h = hash & 7; // maska hash
float u = h < 4 ? x : y;
float v = h < 4 ? y : x;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}
// Funkcja do generowania prostego szumu Perlin'a
float perlin_noise(vec2 coord) {
vec2 p = floor(coord);
vec2 f = fract(coord);
f = f * f * (3.0 - 2.0 * f);
float n = p.x + p.y * 90.0;
float res = mix(
mix(grad(int(n + 0.0), f.x, f.y),
grad(int(n + 1.0), f.x - 1.0, f.y), fade(f.x)),
mix(grad(int(n + 57.0), f.x, f.y - 1.0),
grad(int(n + 58.0), f.x - 1.0, f.y - 1.0), fade(f.x)),
fade(f.y));
return res;
}
// Funkcja do generowania warstwowego szumu dla bardziej chmurowego efektu
float layered_perlin_noise(vec2 coord, float scale, float amplitude) {
float noise = 0.002;
float persistence = 0.02; // Ustawienie wpływu kolejnych warstw szumu
// Dodajemy kilka warstw szumu, aby uzyskać bardziej złożony efekt
for (int i = 0; i < 5; i++) {
noise += perlin_noise(coord * scale) * amplitude;
scale *= 9.0;
amplitude *= persistence;
}
return noise;
}
void fragment() {
// Pobranie współrzędnych UV
vec2 uv = UV;
// Dodanie animacji do współrzędnych UV
float speed = 0.0001; // Prędkość przesuwania chmur
vec2 animated_uv = uv + vec2(TIME * speed, TIME * speed);
// Parametry dla różnych chmur
int num_clouds = 9; // Więcej chmur
float cloud_size = 0.02; // Bardzo mały rozmiar chmury
float scale = 9000.0; // Zmniejszona skala szumu
// Inicjalizacja zmiennej do przechowywania wyniku końcowego
float final_noise = 0.0;
for (int i = 0; i < num_clouds; i++) {
// Losowe przesunięcie dla każdej chmury
float random_offset = float(i) * 0.01;
vec2 cloud_center = vec2(fract(sin(float(i) * 0.1) * 43758.5453), fract(cos(float(i) * 0.1) * 43758.5453));
// Modyfikacja współrzędnych UV dla efektu szumu
vec2 cloud_uv = (animated_uv - cloud_center) * (scale * cloud_size);
float noise = layered_perlin_noise(cloud_uv, 1.0, 1.0);
// Wygładzanie i ograniczenie wartości szumu
noise = smoothstep(0.3, 0.7, noise);
final_noise = max(final_noise, noise);
}
// Ustawienie koloru chmur na podstawie uniformu
vec4 color = vec4(cloud_color.rgb, cloud_color.a * final_noise * cloud_opacity);
ALBEDO = color.rgb;
ALPHA = color.a;
}

View File

@@ -0,0 +1 @@
uid://c6juvl0sx8vef

View File

@@ -96,557 +96,557 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<ISaveChunk<Play
#region Initialization #region Initialization
public void InitializePlayerState() public void InitializePlayerState()
{ {
Inventory = new Inventory(); Inventory = new Inventory();
Stats = InitializePlayerStats(); Stats = InitializePlayerStats();
SetProcessInput(false); SetProcessInput(false);
SetPhysicsProcess(false); SetPhysicsProcess(false);
EquippedWeapon.Changed += EquippedWeapon_Sync; EquippedWeapon.Changed += EquippedWeapon_Sync;
EquippedArmor.Changed += EquippedArmor_Sync; EquippedArmor.Changed += EquippedArmor_Sync;
EquippedAccessory.Changed += EquippedAccessory_Sync; EquippedAccessory.Changed += EquippedAccessory_Sync;
Stats.CurrentHP.Changed += CurrentHP_Sync; Stats.CurrentHP.Changed += CurrentHP_Sync;
Stats.CurrentExp.Changed += CurrentEXP_Sync; Stats.CurrentExp.Changed += CurrentEXP_Sync;
HealthTimer.WaitTime = _healthTimerWaitTime; HealthTimer.WaitTime = _healthTimerWaitTime;
HealthTimer.Timeout += OnHealthTimerTimeout; HealthTimer.Timeout += OnHealthTimerTimeout;
} }
public void Setup() public void Setup()
{ {
var container = new SimpleInjector.Container(); var container = new SimpleInjector.Container();
container.Register<IPlayerLogic, PlayerLogic>(Lifestyle.Singleton); container.Register<IPlayerLogic, PlayerLogic>(Lifestyle.Singleton);
//container.Verify(); //container.Verify();
PlayerLogic = container.GetInstance<IPlayerLogic>(); PlayerLogic = container.GetInstance<IPlayerLogic>();
PlayerLogic.Set(this as IPlayer); PlayerLogic.Set(this as IPlayer);
PlayerLogic.Set(Settings); PlayerLogic.Set(Settings);
PlayerLogic.Set(Stats); PlayerLogic.Set(Stats);
PlayerLogic.Set(_gameRepo); PlayerLogic.Set(_gameRepo);
_expToNextLevel = new Dictionary<int, int> _expToNextLevel = new Dictionary<int, int>
{ {
{ 2, 12 }, { 2, 12 },
{ 3, 39 }, { 3, 39 },
{ 4, 87 }, { 4, 87 },
{ 5, 162 }, { 5, 162 },
{ 6, 270 }, { 6, 270 },
{ 7, 417 }, { 7, 417 },
{ 8, 609 } { 8, 609 }
}; };
_damageCalculator = new DamageCalculator(); _damageCalculator = new DamageCalculator();
Hitbox.AreaEntered += Hitbox_AreaEntered; Hitbox.AreaEntered += Hitbox_AreaEntered;
CollisionDetector.AreaEntered += CollisionDetector_AreaEntered; CollisionDetector.AreaEntered += CollisionDetector_AreaEntered;
AnimationPlayer.AnimationFinished += OnAnimationFinished; AnimationPlayer.AnimationFinished += OnAnimationFinished;
} }
public void OnResolved() public void OnResolved()
{ {
Settings = new PlayerLogic.Settings() { RotationSpeed = _playerStatResource.RotationSpeed, MoveSpeed = _playerStatResource.MoveSpeed, Acceleration = _playerStatResource.Acceleration }; Settings = new PlayerLogic.Settings() { RotationSpeed = _playerStatResource.RotationSpeed, MoveSpeed = _playerStatResource.MoveSpeed, Acceleration = _playerStatResource.Acceleration };
PlayerChunk = new SaveChunk<PlayerData>( PlayerChunk = new SaveChunk<PlayerData>(
onSave: (chunk) => new PlayerData() onSave: (chunk) => new PlayerData()
{ {
PlayerStats = Stats, PlayerStats = Stats,
Inventory = Inventory Inventory = Inventory
}, },
onLoad: (chunk, data) => onLoad: (chunk, data) =>
{ {
Stats = new PlayerStats( Stats = new PlayerStats(
data.PlayerStats.CurrentHP, data.PlayerStats.CurrentHP,
data.PlayerStats.MaximumHP, data.PlayerStats.MaximumHP,
data.PlayerStats.CurrentVT, data.PlayerStats.CurrentVT,
data.PlayerStats.MaximumVT, data.PlayerStats.MaximumVT,
data.PlayerStats.CurrentAttack, data.PlayerStats.CurrentAttack,
data.PlayerStats.BonusAttack, data.PlayerStats.BonusAttack,
data.PlayerStats.MaxAttack, data.PlayerStats.MaxAttack,
data.PlayerStats.CurrentDefense, data.PlayerStats.CurrentDefense,
data.PlayerStats.BonusDefense, data.PlayerStats.BonusDefense,
data.PlayerStats.MaxDefense, data.PlayerStats.MaxDefense,
data.PlayerStats.CurrentExp, data.PlayerStats.CurrentExp,
data.PlayerStats.CurrentLevel, data.PlayerStats.CurrentLevel,
data.PlayerStats.ExpToNextLevel, data.PlayerStats.ExpToNextLevel,
data.PlayerStats.Luck); data.PlayerStats.Luck);
Inventory = data.Inventory; Inventory = data.Inventory;
} }
); );
PlayerBinding = PlayerLogic.Bind(); PlayerBinding = PlayerLogic.Bind();
PlayerBinding PlayerBinding
.Handle((in PlayerLogic.Output.Animations.Attack output) => .Handle((in PlayerLogic.Output.Animations.Attack output) =>
{ {
if (PlayerIsHittingGeometry()) if (PlayerIsHittingGeometry())
{ {
AnimationPlayer.Play("hit_wall"); AnimationPlayer.Play("hit_wall");
_gameRepo.OnPlayerAttackedWall(); _gameRepo.OnPlayerAttackedWall();
} }
else else
{ {
PlayAttackAnimation(); PlayAttackAnimation();
} }
}) })
.Handle((in PlayerLogic.Output.ThrowItem output) => .Handle((in PlayerLogic.Output.ThrowItem output) =>
{ {
}) })
.Handle((in PlayerLogic.Output.Move output) => .Handle((in PlayerLogic.Output.Move output) =>
{ {
Move(output.delta); Move(output.delta);
}); });
GameChunk.AddChunk(PlayerChunk); GameChunk.AddChunk(PlayerChunk);
PlayerLogic.Start(); PlayerLogic.Start();
this.Provide(); this.Provide();
SetProcessInput(false); SetProcessInput(false);
SetPhysicsProcess(false); SetPhysicsProcess(false);
} }
public void OnReady() public void OnReady()
{ {
SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2; SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2;
} }
#endregion #endregion
public void Activate() public void Activate()
{ {
SetProcessInput(true); SetProcessInput(true);
SetPhysicsProcess(true); SetPhysicsProcess(true);
HealthTimer.Start(); HealthTimer.Start();
} }
public void Deactivate() public void Deactivate()
{ {
SetProcessInput(false); SetProcessInput(false);
SetPhysicsProcess(false); SetPhysicsProcess(false);
HealthTimer.Stop(); HealthTimer.Stop();
} }
public void Attack() public void Attack()
{ {
PlayerLogic.Input(new PlayerLogic.Input.Attack()); PlayerLogic.Input(new PlayerLogic.Input.Attack());
} }
public void RaiseHP(int amountToRaise) public void RaiseHP(int amountToRaise)
{ {
Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise); Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise);
Stats.SetCurrentHP(Stats.MaximumHP.Value); Stats.SetCurrentHP(Stats.MaximumHP.Value);
_gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXHP Up."); _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXHP Up.");
} }
public void HealHP(int amountToRestore) public void HealHP(int amountToRestore)
{ {
Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore); Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore);
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
_gameRepo.AnnounceMessageInInventory($"{raiseString}HP Restored."); _gameRepo.AnnounceMessageInInventory($"{raiseString}HP Restored.");
} }
public void RaiseVT(int amountToRaise) public void RaiseVT(int amountToRaise)
{ {
if (Stats.CurrentVT == Stats.MaximumVT) if (Stats.CurrentVT == Stats.MaximumVT)
{ {
Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise); Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise);
Stats.SetCurrentVT(Stats.MaximumVT.Value); Stats.SetCurrentVT(Stats.MaximumVT.Value);
_gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXVT Up."); _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXVT Up.");
} }
} }
public void HealVT(int amountToRestore) public void HealVT(int amountToRestore)
{ {
Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore); Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore);
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
_gameRepo.AnnounceMessageInInventory($"{raiseString}VT Restored."); _gameRepo.AnnounceMessageInInventory($"{raiseString}VT Restored.");
} }
public void ModifyBonusAttack(int amount) public void ModifyBonusAttack(int amount)
{ {
Stats.SetBonusAttack(Stats.BonusAttack.Value + amount); Stats.SetBonusAttack(Stats.BonusAttack.Value + amount);
} }
public void ModifyBonusDefense(int amount) public void ModifyBonusDefense(int amount)
{ {
Stats.SetBonusDefense(Stats.BonusDefense.Value + amount); Stats.SetBonusDefense(Stats.BonusDefense.Value + amount);
} }
public void ModifyMaximumHP(int amount) public void ModifyMaximumHP(int amount)
{ {
Stats.SetMaximumHP(Stats.MaximumHP.Value + amount); Stats.SetMaximumHP(Stats.MaximumHP.Value + amount);
} }
public void ModifyMaximumVT(int amount) public void ModifyMaximumVT(int amount)
{ {
Stats.SetMaximumVT(Stats.MaximumVT.Value + amount); Stats.SetMaximumVT(Stats.MaximumVT.Value + amount);
} }
public void ModifyBonusLuck(double amount) public void ModifyBonusLuck(double amount)
{ {
Stats.SetLuck(Stats.Luck.Value + amount); Stats.SetLuck(Stats.Luck.Value + amount);
} }
public void Move(float delta) public void Move(float delta)
{ {
var rawInput = GlobalInputVector; var rawInput = GlobalInputVector;
var strafeLeftInput = LeftStrafeInputVector; var strafeLeftInput = LeftStrafeInputVector;
var strafeRightInput = RightStrafeInputVector; var strafeRightInput = RightStrafeInputVector;
var transform = Transform; var transform = Transform;
transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis; transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis;
var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized(); var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized();
var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration; var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration;
_knockbackStrength *= 0.9f; _knockbackStrength *= 0.9f;
Transform = Transform with { Basis = transform.Basis }; Transform = Transform with { Basis = transform.Basis };
Velocity = velocity + (_knockbackDirection * _knockbackStrength); Velocity = velocity + (_knockbackDirection * _knockbackStrength);
MoveAndSlide(); MoveAndSlide();
} }
public void TeleportPlayer(Transform3D newTransform) public void TeleportPlayer(Transform3D newTransform)
{ {
Transform = newTransform; Transform = newTransform;
} }
public void TakeDamage(double damage, ElementType elementType, bool isCriticalHit = false) public void TakeDamage(double damage, ElementType elementType, bool isCriticalHit = false)
{ {
if (Stats.CurrentHP.Value > 0) if (Stats.CurrentHP.Value > 0)
{ {
_damageCalculator.CalculateDamage(damage, elementType, Stats.CurrentDefense.Value + Stats.BonusDefense.Value, ((Armor)_equippedArmor.Value).Stats.ElementalResistanceSet); _damageCalculator.CalculateDamage(damage, elementType, Stats.CurrentDefense.Value + Stats.BonusDefense.Value, ((Armor)_equippedArmor.Value).Stats.ElementalResistanceSet);
Stats.SetCurrentHP(Stats.CurrentHP.Value - (int)damage); Stats.SetCurrentHP(Stats.CurrentHP.Value - (int)damage);
} }
} }
public void Knockback(float impulse) public void Knockback(float impulse)
{ {
_knockbackStrength = impulse; _knockbackStrength = impulse;
_knockbackDirection = GlobalBasis.Z.Normalized(); _knockbackDirection = GlobalBasis.Z.Normalized();
} }
public void GainExp(double expGained) public void GainExp(double expGained)
{ {
Stats.SetCurrentExp(Stats.CurrentExp.Value + expGained); Stats.SetCurrentExp(Stats.CurrentExp.Value + expGained);
} }
public void LevelUp() public void LevelUp()
{ {
var rng = new RandomNumberGenerator(); var rng = new RandomNumberGenerator();
rng.Randomize(); rng.Randomize();
var hpIncrease = rng.RandiRange(3, 6); var hpIncrease = rng.RandiRange(3, 6);
Stats.SetMaximumHP(Stats.MaximumHP.Value + hpIncrease); Stats.SetMaximumHP(Stats.MaximumHP.Value + hpIncrease);
var nextLevel = Stats.CurrentLevel.Value + 1; var nextLevel = Stats.CurrentLevel.Value + 1;
var expToNextLevel = _expToNextLevel[nextLevel]; var expToNextLevel = _expToNextLevel[nextLevel];
var newCurrentExp = Mathf.Max(Stats.CurrentExp.Value - Stats.ExpToNextLevel.Value, 0); var newCurrentExp = Mathf.Max(Stats.CurrentExp.Value - Stats.ExpToNextLevel.Value, 0);
Stats.SetCurrentLevel(nextLevel); Stats.SetCurrentLevel(nextLevel);
Stats.SetExpToNextLevel(expToNextLevel); Stats.SetExpToNextLevel(expToNextLevel);
Stats.SetCurrentExp(newCurrentExp); Stats.SetCurrentExp(newCurrentExp);
} }
public void Die() public void Die()
{ {
EquippedWeapon.Sync -= EquippedWeapon_Sync; EquippedWeapon.Sync -= EquippedWeapon_Sync;
EquippedArmor.Sync -= EquippedArmor_Sync; EquippedArmor.Sync -= EquippedArmor_Sync;
EquippedAccessory.Sync -= EquippedAccessory_Sync; EquippedAccessory.Sync -= EquippedAccessory_Sync;
Stats.CurrentHP.Sync -= CurrentHP_Sync; Stats.CurrentHP.Sync -= CurrentHP_Sync;
Stats.CurrentExp.Sync -= CurrentEXP_Sync; Stats.CurrentExp.Sync -= CurrentEXP_Sync;
HealthTimer.WaitTime = _healthTimerWaitTime; HealthTimer.WaitTime = _healthTimerWaitTime;
HealthTimer.Timeout -= OnHealthTimerTimeout; HealthTimer.Timeout -= OnHealthTimerTimeout;
SwordSlashAnimation.Stop(); SwordSlashAnimation.Stop();
SetProcessInput(false); SetProcessInput(false);
SetPhysicsProcess(false); SetPhysicsProcess(false);
//Hitbox.AreaEntered -= Hitbox_AreaEntered; //Hitbox.AreaEntered -= Hitbox_AreaEntered;
//CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered; //CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered;
//AnimationPlayer.AnimationFinished -= OnAnimationFinished; //AnimationPlayer.AnimationFinished -= OnAnimationFinished;
Game.GameOver(); Game.GameOver();
} }
public override void _Input(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (@event.IsActionPressed(GameInputs.Attack)) if (@event.IsActionPressed(GameInputs.Attack))
Attack(); Attack();
if (@event.IsActionPressed(GameInputs.Sprint)) if (@event.IsActionPressed(GameInputs.Sprint))
Settings.MoveSpeed *= 2; Settings.MoveSpeed *= 2;
if (@event.IsActionReleased(GameInputs.Sprint)) if (@event.IsActionReleased(GameInputs.Sprint))
Settings.MoveSpeed /= 2; Settings.MoveSpeed /= 2;
} }
public void OnPhysicsProcess(double delta) public void OnPhysicsProcess(double delta)
{ {
PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta)); PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta));
PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform)); PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform));
} }
public void Equip(EquipableItem equipable) public void Equip(EquipableItem equipable)
{ {
if (equipable.ItemTag == ItemTag.MysteryItem) if (equipable.ItemTag == ItemTag.MysteryItem)
{ {
var rerolledItem = Game.RerollItem(equipable) as EquipableItem; var rerolledItem = Game.RerollItem(equipable) as EquipableItem;
Equip(rerolledItem); Equip(rerolledItem);
return; return;
} }
if (equipable is Weapon weapon) if (equipable is Weapon weapon)
{ {
Unequip(_equippedWeapon.Value); Unequip(_equippedWeapon.Value);
weapon.IsEquipped = true; weapon.IsEquipped = true;
_equippedWeapon.OnNext(weapon); _equippedWeapon.OnNext(weapon);
} }
else if (equipable is Armor armor) else if (equipable is Armor armor)
{ {
Unequip(_equippedArmor.Value); Unequip(_equippedArmor.Value);
armor.IsEquipped = true; armor.IsEquipped = true;
_equippedArmor.OnNext(armor); _equippedArmor.OnNext(armor);
} }
else if (equipable is Accessory accessory) else if (equipable is Accessory accessory)
{ {
Unequip(_equippedAccessory.Value); Unequip(_equippedAccessory.Value);
accessory.IsEquipped = true; accessory.IsEquipped = true;
_equippedAccessory.OnNext(accessory); _equippedAccessory.OnNext(accessory);
} }
else else
throw new NotImplementedException("Item type is not supported."); throw new NotImplementedException("Item type is not supported.");
} }
public void Unequip(EquipableItem equipable) public void Unequip(EquipableItem equipable)
{ {
if (equipable is Weapon weapon) if (equipable is Weapon weapon)
{ {
weapon.IsEquipped = false; weapon.IsEquipped = false;
ModifyBonusAttack(-weapon.Damage); ModifyBonusAttack(-weapon.Damage);
_equippedWeapon.OnNext(new Weapon()); _equippedWeapon.OnNext(new Weapon());
} }
else if (equipable is Armor armor) else if (equipable is Armor armor)
{ {
armor.IsEquipped = false; armor.IsEquipped = false;
ModifyBonusDefense(-armor.Defense); ModifyBonusDefense(-armor.Defense);
_equippedArmor.OnNext(new Armor()); _equippedArmor.OnNext(new Armor());
} }
else if (equipable is Accessory accessory) else if (equipable is Accessory accessory)
{ {
accessory.IsEquipped = false; accessory.IsEquipped = false;
ModifyMaximumHP(-accessory.MaxHPUp); ModifyMaximumHP(-accessory.MaxHPUp);
ModifyMaximumVT(-accessory.MaxVTUp); ModifyMaximumVT(-accessory.MaxVTUp);
ModifyBonusAttack(-accessory.ATKUp); ModifyBonusAttack(-accessory.ATKUp);
ModifyBonusDefense(-accessory.DEFUp); ModifyBonusDefense(-accessory.DEFUp);
ModifyBonusLuck(-accessory.LuckUp); ModifyBonusLuck(-accessory.LuckUp);
_equippedAccessory.OnNext(new Accessory()); _equippedAccessory.OnNext(new Accessory());
} }
else else
throw new NotImplementedException("Item type is not supported."); throw new NotImplementedException("Item type is not supported.");
} }
private static Vector3 GlobalInputVector private static Vector3 GlobalInputVector
{ {
get get
{ {
var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown); var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown);
var input = new Vector3 var input = new Vector3
{ {
X = rawInput.X, X = rawInput.X,
Z = rawInput.Y Z = rawInput.Y
}; };
return input with { Y = 0f }; return input with { Y = 0f };
} }
} }
private static float LeftStrafeInputVector private static float LeftStrafeInputVector
{ {
get get
{ {
return Input.GetActionStrength(GameInputs.StrafeLeft); return Input.GetActionStrength(GameInputs.StrafeLeft);
} }
} }
private static float RightStrafeInputVector private static float RightStrafeInputVector
{ {
get get
{ {
return Input.GetActionStrength(GameInputs.StrafeRight); return Input.GetActionStrength(GameInputs.StrafeRight);
} }
} }
private void ThrowItem() private void ThrowItem()
{ {
var itemScene = GD.Load<PackedScene>("res://src/items/throwable/ThrowableItem.tscn"); var itemScene = GD.Load<PackedScene>("res://src/items/throwable/ThrowableItem.tscn");
var throwItem = itemScene.Instantiate<ThrowableItem>(); var throwItem = itemScene.Instantiate<ThrowableItem>();
GetTree().Root.AddChildEx(throwItem); GetTree().Root.AddChildEx(throwItem);
throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0); throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0);
throwItem.GlobalRotation = GlobalRotation; throwItem.GlobalRotation = GlobalRotation;
} }
private void PlayAttackAnimation() private void PlayAttackAnimation()
{ {
var attackSpeed = ((Weapon)EquippedWeapon.Value).AttackSpeed; var attackSpeed = ((Weapon)EquippedWeapon.Value).AttackSpeed;
AnimationPlayer.SetSpeedScale((float)attackSpeed); AnimationPlayer.SetSpeedScale((float)attackSpeed);
if (EquippedWeapon.Value.ItemName == "Atonement") if (EquippedWeapon.Value.ItemName == "Atonement")
AnimationPlayer.Play("atonement_attack"); AnimationPlayer.Play("atonement_attack");
else else
AnimationPlayer.Play("attack"); AnimationPlayer.Play("attack");
_gameRepo.OnPlayerAttack(); _gameRepo.OnPlayerAttack();
} }
private void OnAnimationFinished(StringName animation) private void OnAnimationFinished(StringName animation)
{ {
PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished());
} }
private void OnExitTree() private void OnExitTree()
{ {
PlayerLogic.Stop(); PlayerLogic.Stop();
PlayerBinding.Dispose(); PlayerBinding.Dispose();
AnimationPlayer.AnimationFinished -= OnAnimationFinished; AnimationPlayer.AnimationFinished -= OnAnimationFinished;
} }
private void OnPlayerPositionUpdated(Vector3 globalPosition) => GlobalPosition = globalPosition; private void OnPlayerPositionUpdated(Vector3 globalPosition) => GlobalPosition = globalPosition;
private void OnHealthTimerTimeout() private void OnHealthTimerTimeout()
{ {
if (Stats.CurrentHP.Value <= 0) if (Stats.CurrentHP.Value <= 0)
return; return;
if (Stats.CurrentVT.Value > 0) if (Stats.CurrentVT.Value > 0)
{ {
if (((Accessory)EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption) if (((Accessory)EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption)
{ {
reduceOnTick = !reduceOnTick; reduceOnTick = !reduceOnTick;
} }
Stats.SetCurrentHP(Stats.CurrentHP.Value + 1); Stats.SetCurrentHP(Stats.CurrentHP.Value + 1);
if (reduceOnTick) if (reduceOnTick)
Stats.SetCurrentVT(Stats.CurrentVT.Value - 1); Stats.SetCurrentVT(Stats.CurrentVT.Value - 1);
} }
else else
Stats.SetCurrentHP(Stats.CurrentHP.Value - 1); Stats.SetCurrentHP(Stats.CurrentHP.Value - 1);
} }
private void EquippedWeapon_Sync(EquipableItem obj) private void EquippedWeapon_Sync(EquipableItem obj)
{ {
ModifyBonusAttack(((Weapon)obj).Damage); ModifyBonusAttack(((Weapon)obj).Damage);
} }
private void EquippedArmor_Sync(EquipableItem obj) private void EquippedArmor_Sync(EquipableItem obj)
{ {
ModifyBonusDefense(((Armor)obj).Defense); ModifyBonusDefense(((Armor)obj).Defense);
} }
private void EquippedAccessory_Sync(EquipableItem accessory) private void EquippedAccessory_Sync(EquipableItem accessory)
{ {
ModifyMaximumHP(((Accessory)accessory).MaxHPUp); ModifyMaximumHP(((Accessory)accessory).MaxHPUp);
ModifyMaximumVT(((Accessory)accessory).MaxVTUp); ModifyMaximumVT(((Accessory)accessory).MaxVTUp);
ModifyBonusAttack(((Accessory)accessory).ATKUp); ModifyBonusAttack(((Accessory)accessory).ATKUp);
ModifyBonusDefense(((Accessory)accessory).DEFUp); ModifyBonusDefense(((Accessory)accessory).DEFUp);
ModifyBonusLuck(((Accessory)accessory).LuckUp); ModifyBonusLuck(((Accessory)accessory).LuckUp);
} }
private void CurrentHP_Sync(int newHealth) private void CurrentHP_Sync(int newHealth)
{ {
if (newHealth <= 0) if (newHealth <= 0)
Die(); Die();
} }
private void CurrentEXP_Sync(double newExp) private void CurrentEXP_Sync(double newExp)
{ {
if (Stats.CurrentExp.Value >= Stats.ExpToNextLevel.Value) if (Stats.CurrentExp.Value >= Stats.ExpToNextLevel.Value)
LevelUp(); LevelUp();
} }
private void Hitbox_AreaEntered(Area3D area) private void Hitbox_AreaEntered(Area3D area)
{ {
var target = area.GetOwner(); var target = area.GetOwner();
if (target is IEnemy enemy) if (target is IEnemy enemy)
HitEnemy(enemy); HitEnemy(enemy);
} }
private void HitEnemy(IEnemy enemy) private void HitEnemy(IEnemy enemy)
{ {
var attackValue = Stats.CurrentAttack.Value + Stats.BonusAttack.Value; var attackValue = Stats.CurrentAttack.Value + Stats.BonusAttack.Value;
var ignoreElementalResistance = ((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.IgnoreAffinity; var ignoreElementalResistance = ((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.IgnoreAffinity;
var isCriticalHit = BattleExtensions.IsCriticalHit(Stats.Luck.Value); var isCriticalHit = BattleExtensions.IsCriticalHit(Stats.Luck.Value);
var element = ((Weapon)EquippedWeapon.Value).WeaponElement; var element = ((Weapon)EquippedWeapon.Value).WeaponElement;
enemy.TakeDamage( enemy.TakeDamage(
attackValue * ((Weapon)EquippedWeapon.Value).ElementalDamageBonus, attackValue * ((Weapon)EquippedWeapon.Value).ElementalDamageBonus,
element, element,
isCriticalHit, isCriticalHit,
false, false,
ignoreElementalResistance); ignoreElementalResistance);
if (((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.Knockback) if (((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.Knockback)
enemy.Knockback(0.3f, -CurrentBasis.Z.Normalized()); enemy.Knockback(0.3f, -CurrentBasis.Z.Normalized());
_gameRepo.OnPlayerAttackedEnemy(); _gameRepo.OnPlayerAttackedEnemy();
} }
private void CollisionDetector_AreaEntered(Area3D area) private void CollisionDetector_AreaEntered(Area3D area)
{ {
if (area.GetParent() is InventoryItem inventoryItem) if (area.GetParent() is InventoryItem inventoryItem)
{ {
var isAdded = Inventory.TryAdd(inventoryItem); var isAdded = Inventory.TryAdd(inventoryItem);
if (isAdded) if (isAdded)
{ {
_gameRepo.AnnounceMessageOnMainScreen($"{inventoryItem.ItemName} picked up."); _gameRepo.AnnounceMessageOnMainScreen($"{inventoryItem.ItemName} picked up.");
inventoryItem.QueueFree(); inventoryItem.QueueFree();
} }
else else
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {inventoryItem.ItemName}."); _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {inventoryItem.ItemName}.");
} }
if (area.GetParent() is DroppedItem droppedItem) if (area.GetParent() is DroppedItem droppedItem)
{ {
var isAdded = Inventory.TryAdd(droppedItem.Item); var isAdded = Inventory.TryAdd(droppedItem.Item);
if (isAdded) if (isAdded)
{ {
_gameRepo.AnnounceMessageOnMainScreen($"{droppedItem.Item.ItemName} picked up."); _gameRepo.AnnounceMessageOnMainScreen($"{droppedItem.Item.ItemName} picked up.");
droppedItem.QueueFree(); droppedItem.QueueFree();
} }
else else
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}."); _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}.");
} }
if (area.GetParent() is ThrownItem thrownItem) if (area.GetParent() is ThrownItem thrownItem)
{ {
var isAdded = Inventory.TryAdd(thrownItem.ItemThatIsThrown); var isAdded = Inventory.TryAdd(thrownItem.ItemThatIsThrown);
if (isAdded) if (isAdded)
{ {
_gameRepo.AnnounceMessageOnMainScreen($"{thrownItem.ItemThatIsThrown.ItemName} picked up."); _gameRepo.AnnounceMessageOnMainScreen($"{thrownItem.ItemThatIsThrown.ItemName} picked up.");
thrownItem.QueueFree(); thrownItem.QueueFree();
} }
else else
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {thrownItem.ItemThatIsThrown.ItemName}."); _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {thrownItem.ItemThatIsThrown.ItemName}.");
} }
if (area.GetParent() is Restorative restorative) if (area.GetParent() is Restorative restorative)
{ {
_gameRepo.OnRestorativePickedUp(restorative); _gameRepo.OnRestorativePickedUp(restorative);
restorative.QueueFree(); restorative.QueueFree();
} }
} }
private PlayerStats InitializePlayerStats() private PlayerStats InitializePlayerStats()
{ {
var playerStats = new PlayerStats( var playerStats = new PlayerStats(
currentHP: new AutoProp<int>(_playerStatResource.CurrentHP), currentHP: new AutoProp<int>(_playerStatResource.CurrentHP),
maximumHP: new AutoProp<int>(_playerStatResource.MaximumHP), maximumHP: new AutoProp<int>(_playerStatResource.MaximumHP),
currentVT: new AutoProp<int>(_playerStatResource.CurrentVT), currentVT: new AutoProp<int>(_playerStatResource.CurrentVT),
maximumVT: new AutoProp<int>(_playerStatResource.MaximumVT), maximumVT: new AutoProp<int>(_playerStatResource.MaximumVT),
currentAttack: new AutoProp<int>(_playerStatResource.CurrentAttack), currentAttack: new AutoProp<int>(_playerStatResource.CurrentAttack),
currentDefense: new AutoProp<int>(_playerStatResource.CurrentDefense), currentDefense: new AutoProp<int>(_playerStatResource.CurrentDefense),
maxAttack: new AutoProp<int>(_playerStatResource.MaxAttack), maxAttack: new AutoProp<int>(_playerStatResource.MaxAttack),
maxDefense: new AutoProp<int>(_playerStatResource.MaxDefense), maxDefense: new AutoProp<int>(_playerStatResource.MaxDefense),
bonusAttack: new AutoProp<int>(_playerStatResource.BonusAttack), bonusAttack: new AutoProp<int>(_playerStatResource.BonusAttack),
bonusDefense: new AutoProp<int>(_playerStatResource.BonusDefense), bonusDefense: new AutoProp<int>(_playerStatResource.BonusDefense),
currentExp: new AutoProp<double>(_playerStatResource.CurrentExp), currentExp: new AutoProp<double>(_playerStatResource.CurrentExp),
expToNextLevel: new AutoProp<int>(_playerStatResource.ExpToNextLevel), expToNextLevel: new AutoProp<int>(_playerStatResource.ExpToNextLevel),
currentLevel: new AutoProp<int>(_playerStatResource.CurrentLevel), currentLevel: new AutoProp<int>(_playerStatResource.CurrentLevel),
luck: new AutoProp<double>(_playerStatResource.Luck)); luck: new AutoProp<double>(_playerStatResource.Luck));
return playerStats; return playerStats;
} }
private bool PlayerIsHittingGeometry() private bool PlayerIsHittingGeometry()
{ {
var collisions = WallCheck.GetCollidingBodies(); var collisions = WallCheck.GetCollidingBodies();
return collisions.Count > 0; return collisions.Count > 0;
} }
private void WallCheck_BodyEntered(Node body) private void WallCheck_BodyEntered(Node body)
{ {
PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished());
GD.Print("Hit wall"); GD.Print("Hit wall");
AnimationPlayer.Stop(); AnimationPlayer.Stop();
} }
} }

View File

@@ -0,0 +1 @@
uid://b7mlxo845l5to