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()
{
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
OxFace.CurrentHP.Sync += BossStatusUpdate;
HorseFace.CurrentHP.Sync += BossStatusUpdate;
_exit.AreaEntered += Exit_AreaEntered;
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
OxFace.CurrentHP.Sync += BossStatusUpdate;
HorseFace.CurrentHP.Sync += BossStatusUpdate;
_exit.AreaEntered += Exit_AreaEntered;
}
private void ActivateTrap_BodyEntered(Node3D body)
{
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
StartBossFight();
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
StartBossFight();
}
public void StartBossFight()
{
OxFaceStatue.Hide();
HorseHeadStatue.Hide();
OxFace.StartFight();
HorseFace.StartFight();
OxFaceStatue.Hide();
HorseHeadStatue.Hide();
OxFace.StartFight();
HorseFace.StartFight();
}
public void OnBossFightEnded()
{
GateCollision.CallDeferred(MethodName.QueueFree);
GateCollision.CallDeferred(MethodName.QueueFree);
}
private void BossStatusUpdate(double hp)
{
if (OxFace.CurrentHP.Value <= 0 && HorseFace.CurrentHP.Value <= 0)
OnBossFightEnded();
if (OxFace.CurrentHP.Value <= 0 && HorseFace.CurrentHP.Value <= 0)
OnBossFightEnded();
}
public void ExitReached()
=> Game.FloorExitReached();
=> Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area)
{
if (area.GetOwner() is IPlayer)
ExitReached();
if (area.GetOwner() is IPlayer)
ExitReached();
}
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="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="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://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"]

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

View File

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