commit 0427a58635f2dd7f3230777c689afaf755cecb05 Author: Lexi Quinn Date: Wed Nov 8 14:28:55 2023 +1100 waited far too long for an initial commit but here we are diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/Assets/TextureAtlases/bubble.tres b/Assets/TextureAtlases/bubble.tres new file mode 100644 index 0000000..55cf58e --- /dev/null +++ b/Assets/TextureAtlases/bubble.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d0vafwv4lhjji"] + +[ext_resource type="Texture2D" uid="uid://chhmkmlfrobhu" path="res://Assets/Textures/bubble.png" id="1_bkvds"] + +[resource] +atlas = ExtResource("1_bkvds") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/dog.tres b/Assets/TextureAtlases/dog.tres new file mode 100644 index 0000000..e6019d9 --- /dev/null +++ b/Assets/TextureAtlases/dog.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://t088ud0ub7r"] + +[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="1_klis4"] + +[resource] +atlas = ExtResource("1_klis4") +region = Rect2(0, 0, 32, 32) diff --git a/Assets/TextureAtlases/dog_fast.tres b/Assets/TextureAtlases/dog_fast.tres new file mode 100644 index 0000000..6dd4ca4 --- /dev/null +++ b/Assets/TextureAtlases/dog_fast.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dd212gh03wloa"] + +[ext_resource type="Texture2D" uid="uid://55cchelc8cqw" path="res://Assets/Textures/eye_dog_fast.png" id="1_0hpxg"] + +[resource] +atlas = ExtResource("1_0hpxg") +region = Rect2(0, 0, 32, 32) diff --git a/Assets/TextureAtlases/dog_fast_boss.tres b/Assets/TextureAtlases/dog_fast_boss.tres new file mode 100644 index 0000000..5075ddb --- /dev/null +++ b/Assets/TextureAtlases/dog_fast_boss.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://ff3cys53p37j"] + +[ext_resource type="Texture2D" uid="uid://c070a2dbkw55e" path="res://Assets/Textures/eye_dog_boss.png" id="1_emrg4"] + +[resource] +atlas = ExtResource("1_emrg4") +region = Rect2(0, 0, 32, 32) diff --git a/Assets/TextureAtlases/dog_fast_heavy.tres b/Assets/TextureAtlases/dog_fast_heavy.tres new file mode 100644 index 0000000..d4e5f28 --- /dev/null +++ b/Assets/TextureAtlases/dog_fast_heavy.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://c0543ucoalwmi"] + +[ext_resource type="Texture2D" uid="uid://54qqmcwcnsun" path="res://Assets/Textures/eye_dog_heavy.png" id="1_7fwbx"] + +[resource] +atlas = ExtResource("1_7fwbx") +region = Rect2(0, 0, 32, 32) diff --git a/Assets/TextureAtlases/dummy.tres b/Assets/TextureAtlases/dummy.tres new file mode 100644 index 0000000..33d3c6c --- /dev/null +++ b/Assets/TextureAtlases/dummy.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://brjk5pu0up85s"] + +[ext_resource type="Texture2D" uid="uid://c8h7sihm5uv32" path="res://Assets/Textures/dummy.png" id="1_gqyi8"] + +[resource] +atlas = ExtResource("1_gqyi8") +region = Rect2(0, 0, 48, 48) diff --git a/Assets/TextureAtlases/g_accelerator.tres b/Assets/TextureAtlases/g_accelerator.tres new file mode 100644 index 0000000..fc7c31c --- /dev/null +++ b/Assets/TextureAtlases/g_accelerator.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d1am28tgvwaa0"] + +[ext_resource type="Texture2D" uid="uid://cx5cwn11fuugq" path="res://Assets/Textures/accelerator.png" id="1_e3hoc"] + +[resource] +atlas = ExtResource("1_e3hoc") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_assault.tres b/Assets/TextureAtlases/g_assault.tres new file mode 100644 index 0000000..0c7b91e --- /dev/null +++ b/Assets/TextureAtlases/g_assault.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://ca4lwwd3e0y73"] + +[ext_resource type="Texture2D" uid="uid://celay30i4soud" path="res://Assets/Textures/g_assault.png" id="1_5fof3"] + +[resource] +atlas = ExtResource("1_5fof3") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_glue_gun.tres b/Assets/TextureAtlases/g_glue_gun.tres new file mode 100644 index 0000000..49d6a69 --- /dev/null +++ b/Assets/TextureAtlases/g_glue_gun.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://jmxhiwsiw1f5"] + +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://Assets/Textures/glue_gun.png" id="1_2wjjm"] + +[resource] +atlas = ExtResource("1_2wjjm") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_grenade_launcher.tres b/Assets/TextureAtlases/g_grenade_launcher.tres new file mode 100644 index 0000000..892a5b6 --- /dev/null +++ b/Assets/TextureAtlases/g_grenade_launcher.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bwufgga1pjyt"] + +[ext_resource type="Texture2D" uid="uid://3qcdx7n440sc" path="res://Assets/Textures/grenade_launcher.png" id="1_qc0g6"] + +[resource] +atlas = ExtResource("1_qc0g6") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_rocket_launcher.tres b/Assets/TextureAtlases/g_rocket_launcher.tres new file mode 100644 index 0000000..304659c --- /dev/null +++ b/Assets/TextureAtlases/g_rocket_launcher.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://clr6kfyci5jqb"] + +[ext_resource type="Texture2D" uid="uid://by1y15lm0bppe" path="res://Assets/Textures/rocket_launcher.png" id="1_0bxom"] + +[resource] +atlas = ExtResource("1_0bxom") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_sniper.tres b/Assets/TextureAtlases/g_sniper.tres new file mode 100644 index 0000000..94355f0 --- /dev/null +++ b/Assets/TextureAtlases/g_sniper.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://fmqq24n7rwvm"] + +[ext_resource type="Texture2D" uid="uid://cv2eycs1j0ho7" path="res://Assets/Textures/g_sniper.png" id="1_weegr"] + +[resource] +atlas = ExtResource("1_weegr") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/gauntlet.tres b/Assets/TextureAtlases/gauntlet.tres new file mode 100644 index 0000000..b80dd05 --- /dev/null +++ b/Assets/TextureAtlases/gauntlet.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dkbkam81k355s"] + +[ext_resource type="Texture2D" uid="uid://cu1usmlhagpte" path="res://Assets/Textures/gauntlet.png" id="1_ueosg"] + +[resource] +atlas = ExtResource("1_ueosg") +region = Rect2(64, 0, 64, 64) diff --git a/Assets/TextureAtlases/green.tres b/Assets/TextureAtlases/green.tres new file mode 100644 index 0000000..af4dbd6 --- /dev/null +++ b/Assets/TextureAtlases/green.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bgt3j4cuq814m"] + +[ext_resource type="Texture2D" uid="uid://dyqh1uu4pocv1" path="res://Assets/Textures/green.png" id="1_gvbxi"] + +[resource] +atlas = ExtResource("1_gvbxi") +region = Rect2(0, 0, 96, 96) diff --git a/Assets/TextureAtlases/gun.tres b/Assets/TextureAtlases/gun.tres new file mode 100644 index 0000000..4713b17 --- /dev/null +++ b/Assets/TextureAtlases/gun.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d060ag2vw7dp1"] + +[ext_resource type="Texture2D" uid="uid://ctjktwiq2fcjm" path="res://Assets/Textures/gun.png" id="1_m5tps"] + +[resource] +resource_local_to_scene = true +atlas = ExtResource("1_m5tps") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/player.tres b/Assets/TextureAtlases/player.tres new file mode 100644 index 0000000..4d10042 --- /dev/null +++ b/Assets/TextureAtlases/player.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bf3gkg7f2oyg7"] + +[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="1_fx7vy"] + +[resource] +resource_local_to_scene = true +atlas = ExtResource("1_fx7vy") +region = Rect2(0, 0, 32, 32) diff --git a/Assets/TextureAtlases/rarityborders.tres b/Assets/TextureAtlases/rarityborders.tres new file mode 100644 index 0000000..4c16e4e --- /dev/null +++ b/Assets/TextureAtlases/rarityborders.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://buf8t5gc7iw3a"] + +[ext_resource type="Texture2D" uid="uid://cns2qqfpjcx4l" path="res://Assets/Textures/cardborders.png" id="1_faqjw"] + +[resource] +atlas = ExtResource("1_faqjw") +region = Rect2(0, 0, 320, 64) diff --git a/Assets/TextureAtlases/red.tres b/Assets/TextureAtlases/red.tres new file mode 100644 index 0000000..a3d9361 --- /dev/null +++ b/Assets/TextureAtlases/red.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://hxev3a2ktya"] + +[ext_resource type="Texture2D" uid="uid://cjqxkraykhxxk" path="res://Assets/Textures/red.png" id="1_ecb2i"] + +[resource] +atlas = ExtResource("1_ecb2i") +region = Rect2(0, 0, 96, 96) diff --git a/Assets/TextureAtlases/spike.tres b/Assets/TextureAtlases/spike.tres new file mode 100644 index 0000000..437b542 --- /dev/null +++ b/Assets/TextureAtlases/spike.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://sybn6bjbj5fh"] + +[ext_resource type="Texture2D" uid="uid://duywsy7jmh4u" path="res://Assets/Textures/spike.png" id="1_nf07h"] + +[resource] +atlas = ExtResource("1_nf07h") +region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/target_list.tres b/Assets/TextureAtlases/target_list.tres new file mode 100644 index 0000000..62d1538 --- /dev/null +++ b/Assets/TextureAtlases/target_list.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bgeu8dnqaxq7v"] + +[ext_resource type="Texture2D" uid="uid://cc2umukpibmx1" path="res://Assets/Textures/target_list.png" id="1_s0pjb"] + +[resource] +atlas = ExtResource("1_s0pjb") +region = Rect2(0, 0, 128, 128) diff --git a/Assets/Textures/8directionplayer.png b/Assets/Textures/8directionplayer.png new file mode 100644 index 0000000..8766948 Binary files /dev/null and b/Assets/Textures/8directionplayer.png differ diff --git a/Assets/Textures/8directionplayer.png.import b/Assets/Textures/8directionplayer.png.import new file mode 100644 index 0000000..e5cc001 --- /dev/null +++ b/Assets/Textures/8directionplayer.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwqifoaxbsbio" +path="res://.godot/imported/8directionplayer.png-9f1d9c7387ae05b7b8a30ff9aa0fac65.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/8directionplayer.png" +dest_files=["res://.godot/imported/8directionplayer.png-9f1d9c7387ae05b7b8a30ff9aa0fac65.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 diff --git a/Assets/Textures/8directionplayer.png~ b/Assets/Textures/8directionplayer.png~ new file mode 100644 index 0000000..8766948 Binary files /dev/null and b/Assets/Textures/8directionplayer.png~ differ diff --git a/Assets/Textures/accelerator.png b/Assets/Textures/accelerator.png new file mode 100644 index 0000000..3fc6ef4 Binary files /dev/null and b/Assets/Textures/accelerator.png differ diff --git a/Assets/Textures/accelerator.png.import b/Assets/Textures/accelerator.png.import new file mode 100644 index 0000000..a4f1065 --- /dev/null +++ b/Assets/Textures/accelerator.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cx5cwn11fuugq" +path="res://.godot/imported/accelerator.png-1a0f15190d75444ec6328a57ff1e8fbe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/accelerator.png" +dest_files=["res://.godot/imported/accelerator.png-1a0f15190d75444ec6328a57ff1e8fbe.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 diff --git a/Assets/Textures/bomb.png b/Assets/Textures/bomb.png new file mode 100644 index 0000000..e48dd60 Binary files /dev/null and b/Assets/Textures/bomb.png differ diff --git a/Assets/Textures/bomb.png.import b/Assets/Textures/bomb.png.import new file mode 100644 index 0000000..88ef533 --- /dev/null +++ b/Assets/Textures/bomb.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b54d5dc4jmlau" +path="res://.godot/imported/bomb.png-c85d126612097bd650bbb12e0b92da53.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/bomb.png" +dest_files=["res://.godot/imported/bomb.png-c85d126612097bd650bbb12e0b92da53.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 diff --git a/Assets/Textures/border.png b/Assets/Textures/border.png new file mode 100644 index 0000000..f1b77d8 Binary files /dev/null and b/Assets/Textures/border.png differ diff --git a/Assets/Textures/border.png.import b/Assets/Textures/border.png.import new file mode 100644 index 0000000..00d5a61 --- /dev/null +++ b/Assets/Textures/border.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqnapc8cscl7i" +path="res://.godot/imported/border.png-47da00bdbff46b23863f8be9462051bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/border.png" +dest_files=["res://.godot/imported/border.png-47da00bdbff46b23863f8be9462051bb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/border.png~ b/Assets/Textures/border.png~ new file mode 100644 index 0000000..5ea1ee1 Binary files /dev/null and b/Assets/Textures/border.png~ differ diff --git a/Assets/Textures/bubble.png b/Assets/Textures/bubble.png new file mode 100644 index 0000000..3387aec Binary files /dev/null and b/Assets/Textures/bubble.png differ diff --git a/Assets/Textures/bubble.png.import b/Assets/Textures/bubble.png.import new file mode 100644 index 0000000..3fc6a15 --- /dev/null +++ b/Assets/Textures/bubble.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chhmkmlfrobhu" +path="res://.godot/imported/bubble.png-c2f885e19b7eb3ae809aa20e6bf51aa3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/bubble.png" +dest_files=["res://.godot/imported/bubble.png-c2f885e19b7eb3ae809aa20e6bf51aa3.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 diff --git a/Assets/Textures/bubble.png~ b/Assets/Textures/bubble.png~ new file mode 100644 index 0000000..d73f501 Binary files /dev/null and b/Assets/Textures/bubble.png~ differ diff --git a/Assets/Textures/cardborders.png b/Assets/Textures/cardborders.png new file mode 100644 index 0000000..fef93d0 Binary files /dev/null and b/Assets/Textures/cardborders.png differ diff --git a/Assets/Textures/cardborders.png.import b/Assets/Textures/cardborders.png.import new file mode 100644 index 0000000..e51399f --- /dev/null +++ b/Assets/Textures/cardborders.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cns2qqfpjcx4l" +path="res://.godot/imported/cardborders.png-5faa2488d4f1c3044da9277ad169e255.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/cardborders.png" +dest_files=["res://.godot/imported/cardborders.png-5faa2488d4f1c3044da9277ad169e255.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/cardhand.png b/Assets/Textures/cardhand.png new file mode 100644 index 0000000..e2f248c Binary files /dev/null and b/Assets/Textures/cardhand.png differ diff --git a/Assets/Textures/cardhand.png.import b/Assets/Textures/cardhand.png.import new file mode 100644 index 0000000..23bedef --- /dev/null +++ b/Assets/Textures/cardhand.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlqnhs8or4ik2" +path="res://.godot/imported/cardhand.png-ee31a714eca672ddf6e505fa756e2e32.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/cardhand.png" +dest_files=["res://.godot/imported/cardhand.png-ee31a714eca672ddf6e505fa756e2e32.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 diff --git a/Assets/Textures/cardhand.png~ b/Assets/Textures/cardhand.png~ new file mode 100644 index 0000000..54fdca9 Binary files /dev/null and b/Assets/Textures/cardhand.png~ differ diff --git a/Assets/Textures/cardpush.png b/Assets/Textures/cardpush.png new file mode 100644 index 0000000..f45fc26 Binary files /dev/null and b/Assets/Textures/cardpush.png differ diff --git a/Assets/Textures/cardpush.png.import b/Assets/Textures/cardpush.png.import new file mode 100644 index 0000000..e57cd8e --- /dev/null +++ b/Assets/Textures/cardpush.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnhq713soxnc4" +path="res://.godot/imported/cardpush.png-ff7b6308969d7426e4bcda3c97653870.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/cardpush.png" +dest_files=["res://.godot/imported/cardpush.png-ff7b6308969d7426e4bcda3c97653870.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/crosshair.png b/Assets/Textures/crosshair.png new file mode 100644 index 0000000..8f56476 Binary files /dev/null and b/Assets/Textures/crosshair.png differ diff --git a/Assets/Textures/crosshair.png.import b/Assets/Textures/crosshair.png.import new file mode 100644 index 0000000..645e255 --- /dev/null +++ b/Assets/Textures/crosshair.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0btebva6djdl" +path="res://.godot/imported/crosshair.png-c5fc4b061aab0e53d43a2e64ec40573a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/crosshair.png" +dest_files=["res://.godot/imported/crosshair.png-c5fc4b061aab0e53d43a2e64ec40573a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/crosshair.png~ b/Assets/Textures/crosshair.png~ new file mode 100644 index 0000000..39edcfb Binary files /dev/null and b/Assets/Textures/crosshair.png~ differ diff --git a/Assets/Textures/dummy.png b/Assets/Textures/dummy.png new file mode 100644 index 0000000..0137117 Binary files /dev/null and b/Assets/Textures/dummy.png differ diff --git a/Assets/Textures/dummy.png.import b/Assets/Textures/dummy.png.import new file mode 100644 index 0000000..e1d1ce0 --- /dev/null +++ b/Assets/Textures/dummy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8h7sihm5uv32" +path="res://.godot/imported/dummy.png-3d59eeab3b88aff19f41713bd8ef6b4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/dummy.png" +dest_files=["res://.godot/imported/dummy.png-3d59eeab3b88aff19f41713bd8ef6b4c.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 diff --git a/Assets/Textures/enemyhealth.png b/Assets/Textures/enemyhealth.png new file mode 100644 index 0000000..ce98f8d Binary files /dev/null and b/Assets/Textures/enemyhealth.png differ diff --git a/Assets/Textures/enemyhealth.png.import b/Assets/Textures/enemyhealth.png.import new file mode 100644 index 0000000..4f8b93c --- /dev/null +++ b/Assets/Textures/enemyhealth.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://r202vo47jw1q" +path="res://.godot/imported/enemyhealth.png-06bafefa2afa5a94b9192b00e9045f10.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/enemyhealth.png" +dest_files=["res://.godot/imported/enemyhealth.png-06bafefa2afa5a94b9192b00e9045f10.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/eye_dog.png b/Assets/Textures/eye_dog.png new file mode 100644 index 0000000..9f8214b Binary files /dev/null and b/Assets/Textures/eye_dog.png differ diff --git a/Assets/Textures/eye_dog.png.import b/Assets/Textures/eye_dog.png.import new file mode 100644 index 0000000..933fd75 --- /dev/null +++ b/Assets/Textures/eye_dog.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj13g1w14mekw" +path="res://.godot/imported/eye_dog.png-2b08e774f06f7b23a123081bdacd558a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/eye_dog.png" +dest_files=["res://.godot/imported/eye_dog.png-2b08e774f06f7b23a123081bdacd558a.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 diff --git a/Assets/Textures/eye_dog.png~ b/Assets/Textures/eye_dog.png~ new file mode 100644 index 0000000..cc70098 Binary files /dev/null and b/Assets/Textures/eye_dog.png~ differ diff --git a/Assets/Textures/eye_dog_boss.png b/Assets/Textures/eye_dog_boss.png new file mode 100644 index 0000000..ef5309c Binary files /dev/null and b/Assets/Textures/eye_dog_boss.png differ diff --git a/Assets/Textures/eye_dog_boss.png.import b/Assets/Textures/eye_dog_boss.png.import new file mode 100644 index 0000000..88dffa7 --- /dev/null +++ b/Assets/Textures/eye_dog_boss.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c070a2dbkw55e" +path="res://.godot/imported/eye_dog_boss.png-f98e154c9696724f63bbab7ab14fd483.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/eye_dog_boss.png" +dest_files=["res://.godot/imported/eye_dog_boss.png-f98e154c9696724f63bbab7ab14fd483.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 diff --git a/Assets/Textures/eye_dog_fast.png b/Assets/Textures/eye_dog_fast.png new file mode 100644 index 0000000..37b15dd Binary files /dev/null and b/Assets/Textures/eye_dog_fast.png differ diff --git a/Assets/Textures/eye_dog_fast.png.import b/Assets/Textures/eye_dog_fast.png.import new file mode 100644 index 0000000..1454830 --- /dev/null +++ b/Assets/Textures/eye_dog_fast.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://55cchelc8cqw" +path="res://.godot/imported/eye_dog_fast.png-b97e84283919cc098b006f3a56b30818.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/eye_dog_fast.png" +dest_files=["res://.godot/imported/eye_dog_fast.png-b97e84283919cc098b006f3a56b30818.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/eye_dog_heavy.png b/Assets/Textures/eye_dog_heavy.png new file mode 100644 index 0000000..47152c3 Binary files /dev/null and b/Assets/Textures/eye_dog_heavy.png differ diff --git a/Assets/Textures/eye_dog_heavy.png.import b/Assets/Textures/eye_dog_heavy.png.import new file mode 100644 index 0000000..bb5876c --- /dev/null +++ b/Assets/Textures/eye_dog_heavy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://54qqmcwcnsun" +path="res://.godot/imported/eye_dog_heavy.png-661153760342e712ba1555603a9dd9b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/eye_dog_heavy.png" +dest_files=["res://.godot/imported/eye_dog_heavy.png-661153760342e712ba1555603a9dd9b8.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 diff --git a/Assets/Textures/g_assault.png b/Assets/Textures/g_assault.png new file mode 100644 index 0000000..9b651a8 Binary files /dev/null and b/Assets/Textures/g_assault.png differ diff --git a/Assets/Textures/g_assault.png.import b/Assets/Textures/g_assault.png.import new file mode 100644 index 0000000..43fa149 --- /dev/null +++ b/Assets/Textures/g_assault.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://celay30i4soud" +path="res://.godot/imported/g_assault.png-18634d790d834a408188c873cb3b1336.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/g_assault.png" +dest_files=["res://.godot/imported/g_assault.png-18634d790d834a408188c873cb3b1336.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 diff --git a/Assets/Textures/g_sniper.png b/Assets/Textures/g_sniper.png new file mode 100644 index 0000000..286c284 Binary files /dev/null and b/Assets/Textures/g_sniper.png differ diff --git a/Assets/Textures/g_sniper.png.import b/Assets/Textures/g_sniper.png.import new file mode 100644 index 0000000..5200106 --- /dev/null +++ b/Assets/Textures/g_sniper.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv2eycs1j0ho7" +path="res://.godot/imported/g_sniper.png-540afb6cf2bb7c1448f9a3771f0c56fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/g_sniper.png" +dest_files=["res://.godot/imported/g_sniper.png-540afb6cf2bb7c1448f9a3771f0c56fe.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 diff --git a/Assets/Textures/gauntlet.png b/Assets/Textures/gauntlet.png new file mode 100644 index 0000000..6efeb66 Binary files /dev/null and b/Assets/Textures/gauntlet.png differ diff --git a/Assets/Textures/gauntlet.png.import b/Assets/Textures/gauntlet.png.import new file mode 100644 index 0000000..cb5a3c7 --- /dev/null +++ b/Assets/Textures/gauntlet.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cu1usmlhagpte" +path="res://.godot/imported/gauntlet.png-26b4bf1ad5fbad7b55ce01c74b36db4b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/gauntlet.png" +dest_files=["res://.godot/imported/gauntlet.png-26b4bf1ad5fbad7b55ce01c74b36db4b.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 diff --git a/Assets/Textures/glue_gun.png b/Assets/Textures/glue_gun.png new file mode 100644 index 0000000..2d6b0f0 Binary files /dev/null and b/Assets/Textures/glue_gun.png differ diff --git a/Assets/Textures/glue_gun.png.import b/Assets/Textures/glue_gun.png.import new file mode 100644 index 0000000..d39fb6c --- /dev/null +++ b/Assets/Textures/glue_gun.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://oblavj8vj30n" +path="res://.godot/imported/glue_gun.png-e9e16bf72630f36d6fabf28ef7667749.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/glue_gun.png" +dest_files=["res://.godot/imported/glue_gun.png-e9e16bf72630f36d6fabf28ef7667749.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 diff --git a/Assets/Textures/glue_icon.png b/Assets/Textures/glue_icon.png new file mode 100644 index 0000000..9168e56 Binary files /dev/null and b/Assets/Textures/glue_icon.png differ diff --git a/Assets/Textures/glue_icon.png.import b/Assets/Textures/glue_icon.png.import new file mode 100644 index 0000000..2dd9673 --- /dev/null +++ b/Assets/Textures/glue_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpixdxdjnr5tw" +path="res://.godot/imported/glue_icon.png-21b9eb3ddf8649e750f774f343b60139.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/glue_icon.png" +dest_files=["res://.godot/imported/glue_icon.png-21b9eb3ddf8649e750f774f343b60139.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 diff --git a/Assets/Textures/grass.png b/Assets/Textures/grass.png new file mode 100644 index 0000000..cd0ffd1 Binary files /dev/null and b/Assets/Textures/grass.png differ diff --git a/Assets/Textures/grass.png.import b/Assets/Textures/grass.png.import new file mode 100644 index 0000000..3e41218 --- /dev/null +++ b/Assets/Textures/grass.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blnfsojw4ukq4" +path="res://.godot/imported/grass.png-bd8693609e2236b94b5eb6d9741bc1d7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/grass.png" +dest_files=["res://.godot/imported/grass.png-bd8693609e2236b94b5eb6d9741bc1d7.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 diff --git a/Assets/Textures/green.png b/Assets/Textures/green.png new file mode 100644 index 0000000..5cbf47d Binary files /dev/null and b/Assets/Textures/green.png differ diff --git a/Assets/Textures/green.png.import b/Assets/Textures/green.png.import new file mode 100644 index 0000000..b1a2244 --- /dev/null +++ b/Assets/Textures/green.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyqh1uu4pocv1" +path="res://.godot/imported/green.png-1858fb7b418df7714b6f9cb16192a802.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/green.png" +dest_files=["res://.godot/imported/green.png-1858fb7b418df7714b6f9cb16192a802.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/grenade_launcher.png b/Assets/Textures/grenade_launcher.png new file mode 100644 index 0000000..b34fdde Binary files /dev/null and b/Assets/Textures/grenade_launcher.png differ diff --git a/Assets/Textures/grenade_launcher.png.import b/Assets/Textures/grenade_launcher.png.import new file mode 100644 index 0000000..43b9eae --- /dev/null +++ b/Assets/Textures/grenade_launcher.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3qcdx7n440sc" +path="res://.godot/imported/grenade_launcher.png-3275b92d0df686a016f2abc93d27971f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/grenade_launcher.png" +dest_files=["res://.godot/imported/grenade_launcher.png-3275b92d0df686a016f2abc93d27971f.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 diff --git a/Assets/Textures/gun.png b/Assets/Textures/gun.png new file mode 100644 index 0000000..4641809 Binary files /dev/null and b/Assets/Textures/gun.png differ diff --git a/Assets/Textures/gun.png.import b/Assets/Textures/gun.png.import new file mode 100644 index 0000000..46fd676 --- /dev/null +++ b/Assets/Textures/gun.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctjktwiq2fcjm" +path="res://.godot/imported/gun.png-6adaeb1547ed5ef4c0cdeaf82c51750f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/gun.png" +dest_files=["res://.godot/imported/gun.png-6adaeb1547ed5ef4c0cdeaf82c51750f.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 diff --git a/Assets/Textures/gun.png~ b/Assets/Textures/gun.png~ new file mode 100644 index 0000000..bc7b112 Binary files /dev/null and b/Assets/Textures/gun.png~ differ diff --git a/Assets/Textures/icon.svg b/Assets/Textures/icon.svg new file mode 100644 index 0000000..b370ceb --- /dev/null +++ b/Assets/Textures/icon.svg @@ -0,0 +1 @@ + diff --git a/Assets/Textures/icon.svg.import b/Assets/Textures/icon.svg.import new file mode 100644 index 0000000..0ec1b1d --- /dev/null +++ b/Assets/Textures/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5tgmdqqpg2x" +path="res://.godot/imported/icon.svg-8c0dfe7377b8350deb604d8d5f0f7e7b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/icon.svg" +dest_files=["res://.godot/imported/icon.svg-8c0dfe7377b8350deb604d8d5f0f7e7b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/Assets/Textures/icon_eye_dog.png b/Assets/Textures/icon_eye_dog.png new file mode 100644 index 0000000..c5e9060 Binary files /dev/null and b/Assets/Textures/icon_eye_dog.png differ diff --git a/Assets/Textures/icon_eye_dog.png.import b/Assets/Textures/icon_eye_dog.png.import new file mode 100644 index 0000000..7cd813a --- /dev/null +++ b/Assets/Textures/icon_eye_dog.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://g00wwrlxxdc5" +path="res://.godot/imported/icon_eye_dog.png-3bce6f978ac13692e2a12291b10c5729.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/icon_eye_dog.png" +dest_files=["res://.godot/imported/icon_eye_dog.png-3bce6f978ac13692e2a12291b10c5729.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/icon_eye_dog_boss.png b/Assets/Textures/icon_eye_dog_boss.png new file mode 100644 index 0000000..2c052df Binary files /dev/null and b/Assets/Textures/icon_eye_dog_boss.png differ diff --git a/Assets/Textures/icon_eye_dog_boss.png.import b/Assets/Textures/icon_eye_dog_boss.png.import new file mode 100644 index 0000000..115f6fa --- /dev/null +++ b/Assets/Textures/icon_eye_dog_boss.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cde0voyrwnqkl" +path="res://.godot/imported/icon_eye_dog_boss.png-2e375a379507be43f07a5b78a57627eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/icon_eye_dog_boss.png" +dest_files=["res://.godot/imported/icon_eye_dog_boss.png-2e375a379507be43f07a5b78a57627eb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/icon_eye_dog_fast.png b/Assets/Textures/icon_eye_dog_fast.png new file mode 100644 index 0000000..61d9e24 Binary files /dev/null and b/Assets/Textures/icon_eye_dog_fast.png differ diff --git a/Assets/Textures/icon_eye_dog_fast.png.import b/Assets/Textures/icon_eye_dog_fast.png.import new file mode 100644 index 0000000..61c07d8 --- /dev/null +++ b/Assets/Textures/icon_eye_dog_fast.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv5p03aw78vwd" +path="res://.godot/imported/icon_eye_dog_fast.png-0a08e5ef41b3ff60b195f0e078e24ab8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/icon_eye_dog_fast.png" +dest_files=["res://.godot/imported/icon_eye_dog_fast.png-0a08e5ef41b3ff60b195f0e078e24ab8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/icon_eye_dog_heavy.png b/Assets/Textures/icon_eye_dog_heavy.png new file mode 100644 index 0000000..b7e173c Binary files /dev/null and b/Assets/Textures/icon_eye_dog_heavy.png differ diff --git a/Assets/Textures/icon_eye_dog_heavy.png.import b/Assets/Textures/icon_eye_dog_heavy.png.import new file mode 100644 index 0000000..5174398 --- /dev/null +++ b/Assets/Textures/icon_eye_dog_heavy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://08n5jvq5tptf" +path="res://.godot/imported/icon_eye_dog_heavy.png-ba04528959a64035e32de54c20620c3f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/icon_eye_dog_heavy.png" +dest_files=["res://.godot/imported/icon_eye_dog_heavy.png-ba04528959a64035e32de54c20620c3f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/lifebar_bg.png b/Assets/Textures/lifebar_bg.png new file mode 100644 index 0000000..8f8d009 Binary files /dev/null and b/Assets/Textures/lifebar_bg.png differ diff --git a/Assets/Textures/lifebar_bg.png.import b/Assets/Textures/lifebar_bg.png.import new file mode 100644 index 0000000..7ff5783 --- /dev/null +++ b/Assets/Textures/lifebar_bg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvy2lvtotaxb3" +path="res://.godot/imported/lifebar_bg.png-63c9446f11412b81b7c013bf123145b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/lifebar_bg.png" +dest_files=["res://.godot/imported/lifebar_bg.png-63c9446f11412b81b7c013bf123145b8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/lifebar_pip.png b/Assets/Textures/lifebar_pip.png new file mode 100644 index 0000000..31593df Binary files /dev/null and b/Assets/Textures/lifebar_pip.png differ diff --git a/Assets/Textures/lifebar_pip.png.import b/Assets/Textures/lifebar_pip.png.import new file mode 100644 index 0000000..fdf1a48 --- /dev/null +++ b/Assets/Textures/lifebar_pip.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0ey8r48lgjw1" +path="res://.godot/imported/lifebar_pip.png-b3e6bbe395302ee5c47f1dcdc6428bb0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/lifebar_pip.png" +dest_files=["res://.godot/imported/lifebar_pip.png-b3e6bbe395302ee5c47f1dcdc6428bb0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/minimap_enemy.png b/Assets/Textures/minimap_enemy.png new file mode 100644 index 0000000..dae7868 Binary files /dev/null and b/Assets/Textures/minimap_enemy.png differ diff --git a/Assets/Textures/minimap_enemy.png.import b/Assets/Textures/minimap_enemy.png.import new file mode 100644 index 0000000..861feab --- /dev/null +++ b/Assets/Textures/minimap_enemy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1fn60m6xfcsq" +path="res://.godot/imported/minimap_enemy.png-2bceafa30e365833d70abe194a0b5124.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/minimap_enemy.png" +dest_files=["res://.godot/imported/minimap_enemy.png-2bceafa30e365833d70abe194a0b5124.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 diff --git a/Assets/Textures/minimap_enemy.png~ b/Assets/Textures/minimap_enemy.png~ new file mode 100644 index 0000000..16a1dc1 Binary files /dev/null and b/Assets/Textures/minimap_enemy.png~ differ diff --git a/Assets/Textures/minimap_node.png b/Assets/Textures/minimap_node.png new file mode 100644 index 0000000..fb3839d Binary files /dev/null and b/Assets/Textures/minimap_node.png differ diff --git a/Assets/Textures/minimap_node.png.import b/Assets/Textures/minimap_node.png.import new file mode 100644 index 0000000..8aaa4a4 --- /dev/null +++ b/Assets/Textures/minimap_node.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ba85u6i558x4w" +path="res://.godot/imported/minimap_node.png-d61d29a3dd693a73784cc7f586bc7555.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/minimap_node.png" +dest_files=["res://.godot/imported/minimap_node.png-d61d29a3dd693a73784cc7f586bc7555.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 diff --git a/Assets/Textures/minimap_path_visual.png b/Assets/Textures/minimap_path_visual.png new file mode 100644 index 0000000..626ebcf Binary files /dev/null and b/Assets/Textures/minimap_path_visual.png differ diff --git a/Assets/Textures/minimap_path_visual.png.import b/Assets/Textures/minimap_path_visual.png.import new file mode 100644 index 0000000..e31cd71 --- /dev/null +++ b/Assets/Textures/minimap_path_visual.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cy786nrpcdr5o" +path="res://.godot/imported/minimap_path_visual.png-8b70bf7eef5ad033c50356b9c59e3808.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/minimap_path_visual.png" +dest_files=["res://.godot/imported/minimap_path_visual.png-8b70bf7eef5ad033c50356b9c59e3808.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 diff --git a/Assets/Textures/minimap_player.png b/Assets/Textures/minimap_player.png new file mode 100644 index 0000000..87e2646 Binary files /dev/null and b/Assets/Textures/minimap_player.png differ diff --git a/Assets/Textures/minimap_player.png.import b/Assets/Textures/minimap_player.png.import new file mode 100644 index 0000000..00ab613 --- /dev/null +++ b/Assets/Textures/minimap_player.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c60fh34ttgcvh" +path="res://.godot/imported/minimap_player.png-426894f528256139caec57f6a1ca6198.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/minimap_player.png" +dest_files=["res://.godot/imported/minimap_player.png-426894f528256139caec57f6a1ca6198.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 diff --git a/Assets/Textures/minimap_tree.png b/Assets/Textures/minimap_tree.png new file mode 100644 index 0000000..6449acd Binary files /dev/null and b/Assets/Textures/minimap_tree.png differ diff --git a/Assets/Textures/minimap_tree.png.import b/Assets/Textures/minimap_tree.png.import new file mode 100644 index 0000000..97bf144 --- /dev/null +++ b/Assets/Textures/minimap_tree.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dg47vgt0uccw1" +path="res://.godot/imported/minimap_tree.png-aafe73105bc9814fb174ec534eda4e1e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/minimap_tree.png" +dest_files=["res://.godot/imported/minimap_tree.png-aafe73105bc9814fb174ec534eda4e1e.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 diff --git a/Assets/Textures/on_fire_icon.png b/Assets/Textures/on_fire_icon.png new file mode 100644 index 0000000..063d265 Binary files /dev/null and b/Assets/Textures/on_fire_icon.png differ diff --git a/Assets/Textures/on_fire_icon.png.import b/Assets/Textures/on_fire_icon.png.import new file mode 100644 index 0000000..04e6565 --- /dev/null +++ b/Assets/Textures/on_fire_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0h8yi1xe4ru5" +path="res://.godot/imported/on_fire_icon.png-24fc8775d04dcc3995421e503781c7fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/on_fire_icon.png" +dest_files=["res://.godot/imported/on_fire_icon.png-24fc8775d04dcc3995421e503781c7fe.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 diff --git a/Assets/Textures/oohyeahwooyeah.png b/Assets/Textures/oohyeahwooyeah.png new file mode 100644 index 0000000..500403f Binary files /dev/null and b/Assets/Textures/oohyeahwooyeah.png differ diff --git a/Assets/Textures/oohyeahwooyeah.png.import b/Assets/Textures/oohyeahwooyeah.png.import new file mode 100644 index 0000000..e714d78 --- /dev/null +++ b/Assets/Textures/oohyeahwooyeah.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7quxr23mnj5w" +path.s3tc="res://.godot/imported/oohyeahwooyeah.png-20c3434d935c3783442ae98aba45f770.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Textures/oohyeahwooyeah.png" +dest_files=["res://.godot/imported/oohyeahwooyeah.png-20c3434d935c3783442ae98aba45f770.s3tc.ctex"] + +[params] + +compress/mode=2 +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 diff --git a/Assets/Textures/radial.png b/Assets/Textures/radial.png new file mode 100644 index 0000000..b35676b Binary files /dev/null and b/Assets/Textures/radial.png differ diff --git a/Assets/Textures/radial.png.import b/Assets/Textures/radial.png.import new file mode 100644 index 0000000..dc70161 --- /dev/null +++ b/Assets/Textures/radial.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gh4yvnerf1f5" +path="res://.godot/imported/radial.png-4275bf8b3469ef399dbaa9c86a28c9ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/radial.png" +dest_files=["res://.godot/imported/radial.png-4275bf8b3469ef399dbaa9c86a28c9ed.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/ready.png b/Assets/Textures/ready.png new file mode 100644 index 0000000..478e7d3 Binary files /dev/null and b/Assets/Textures/ready.png differ diff --git a/Assets/Textures/ready.png.import b/Assets/Textures/ready.png.import new file mode 100644 index 0000000..ecee6c1 --- /dev/null +++ b/Assets/Textures/ready.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://m4ehy5bahsup" +path="res://.godot/imported/ready.png-324a1676aa713b3c113f6947f317204b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/ready.png" +dest_files=["res://.godot/imported/ready.png-324a1676aa713b3c113f6947f317204b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/red.png b/Assets/Textures/red.png new file mode 100644 index 0000000..dbdf8fb Binary files /dev/null and b/Assets/Textures/red.png differ diff --git a/Assets/Textures/red.png.import b/Assets/Textures/red.png.import new file mode 100644 index 0000000..335c310 --- /dev/null +++ b/Assets/Textures/red.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjqxkraykhxxk" +path.s3tc="res://.godot/imported/red.png-906118aab604286bad2aef98ee509875.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Textures/red.png" +dest_files=["res://.godot/imported/red.png-906118aab604286bad2aef98ee509875.s3tc.ctex"] + +[params] + +compress/mode=2 +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 diff --git a/Assets/Textures/rocket_launcher.png b/Assets/Textures/rocket_launcher.png new file mode 100644 index 0000000..fad5e8c Binary files /dev/null and b/Assets/Textures/rocket_launcher.png differ diff --git a/Assets/Textures/rocket_launcher.png.import b/Assets/Textures/rocket_launcher.png.import new file mode 100644 index 0000000..64dfcd2 --- /dev/null +++ b/Assets/Textures/rocket_launcher.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by1y15lm0bppe" +path="res://.godot/imported/rocket_launcher.png-b3967e10fe92066919e91518c35aac06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/rocket_launcher.png" +dest_files=["res://.godot/imported/rocket_launcher.png-b3967e10fe92066919e91518c35aac06.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 diff --git a/Assets/Textures/scopetest.png b/Assets/Textures/scopetest.png new file mode 100644 index 0000000..1a0e475 Binary files /dev/null and b/Assets/Textures/scopetest.png differ diff --git a/Assets/Textures/scopetest.png.import b/Assets/Textures/scopetest.png.import new file mode 100644 index 0000000..ad19e53 --- /dev/null +++ b/Assets/Textures/scopetest.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bepgxu7wtcl1i" +path="res://.godot/imported/scopetest.png-67622c4a1fb91662a6422da2eebebaa6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/scopetest.png" +dest_files=["res://.godot/imported/scopetest.png-67622c4a1fb91662a6422da2eebebaa6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/scopetest.png~ b/Assets/Textures/scopetest.png~ new file mode 100644 index 0000000..6ffafff Binary files /dev/null and b/Assets/Textures/scopetest.png~ differ diff --git a/Assets/Textures/spike.png b/Assets/Textures/spike.png new file mode 100644 index 0000000..f27c3f6 Binary files /dev/null and b/Assets/Textures/spike.png differ diff --git a/Assets/Textures/spike.png.import b/Assets/Textures/spike.png.import new file mode 100644 index 0000000..f2790dd --- /dev/null +++ b/Assets/Textures/spike.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://duywsy7jmh4u" +path="res://.godot/imported/spike.png-c96630296dde04541d0a1d2bf09362bf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/spike.png" +dest_files=["res://.godot/imported/spike.png-c96630296dde04541d0a1d2bf09362bf.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 diff --git a/Assets/Textures/stone wall 7.png b/Assets/Textures/stone wall 7.png new file mode 100644 index 0000000..62d76d7 Binary files /dev/null and b/Assets/Textures/stone wall 7.png differ diff --git a/Assets/Textures/stone wall 7.png.import b/Assets/Textures/stone wall 7.png.import new file mode 100644 index 0000000..8b1817c --- /dev/null +++ b/Assets/Textures/stone wall 7.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://r8cr41blojpm" +path.s3tc="res://.godot/imported/stone wall 7.png-469dc03eddd8a7dadec795871754c70e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Textures/stone wall 7.png" +dest_files=["res://.godot/imported/stone wall 7.png-469dc03eddd8a7dadec795871754c70e.s3tc.ctex"] + +[params] + +compress/mode=2 +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 diff --git a/Assets/Textures/target_icon.png b/Assets/Textures/target_icon.png new file mode 100644 index 0000000..c018feb Binary files /dev/null and b/Assets/Textures/target_icon.png differ diff --git a/Assets/Textures/target_icon.png.import b/Assets/Textures/target_icon.png.import new file mode 100644 index 0000000..04885c0 --- /dev/null +++ b/Assets/Textures/target_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hnfa76d6tdi" +path="res://.godot/imported/target_icon.png-52b48b3583774442e6ace899a7e119fd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/target_icon.png" +dest_files=["res://.godot/imported/target_icon.png-52b48b3583774442e6ace899a7e119fd.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 diff --git a/Assets/Textures/target_list.png b/Assets/Textures/target_list.png new file mode 100644 index 0000000..f10c875 Binary files /dev/null and b/Assets/Textures/target_list.png differ diff --git a/Assets/Textures/target_list.png.import b/Assets/Textures/target_list.png.import new file mode 100644 index 0000000..31b5e01 --- /dev/null +++ b/Assets/Textures/target_list.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc2umukpibmx1" +path="res://.godot/imported/target_list.png-22999316bc250bbe67cd788be5f870a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/target_list.png" +dest_files=["res://.godot/imported/target_list.png-22999316bc250bbe67cd788be5f870a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/Textures/tree.png b/Assets/Textures/tree.png new file mode 100644 index 0000000..bd26c41 Binary files /dev/null and b/Assets/Textures/tree.png differ diff --git a/Assets/Textures/tree.png.import b/Assets/Textures/tree.png.import new file mode 100644 index 0000000..5a3a01a --- /dev/null +++ b/Assets/Textures/tree.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy2ukmg6koun1" +path="res://.godot/imported/tree.png-ae585c51ec7ebe34c0b176bbf7b19dc1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/tree.png" +dest_files=["res://.godot/imported/tree.png-ae585c51ec7ebe34c0b176bbf7b19dc1.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 diff --git a/Assets/Textures/wavecounter.png b/Assets/Textures/wavecounter.png new file mode 100644 index 0000000..a05f69d Binary files /dev/null and b/Assets/Textures/wavecounter.png differ diff --git a/Assets/Textures/wavecounter.png.import b/Assets/Textures/wavecounter.png.import new file mode 100644 index 0000000..236c1d0 --- /dev/null +++ b/Assets/Textures/wavecounter.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6iego7256jf2" +path="res://.godot/imported/wavecounter.png-a95bcf6589e41e41d68df7cdaa017619.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/wavecounter.png" +dest_files=["res://.godot/imported/wavecounter.png-a95bcf6589e41e41d68df7cdaa017619.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/PCs/Blue/blue.tres b/PCs/Blue/blue.tres new file mode 100644 index 0000000..b140022 --- /dev/null +++ b/PCs/Blue/blue.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="HeroClass" load_steps=5 format=3 uid="uid://dxonpv8qbyrjy"] + +[ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_aeu85"] +[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="1_uvyoy"] +[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="2_3yr5a"] +[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="3_wyb0n"] + +[resource] +script = ExtResource("1_aeu85") +hero_name = "Blue" +deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("1_uvyoy"), ExtResource("2_3yr5a"), ExtResource("3_wyb0n")]) diff --git a/PCs/Green/green.tres b/PCs/Green/green.tres new file mode 100644 index 0000000..a84271e --- /dev/null +++ b/PCs/Green/green.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="HeroClass" load_steps=6 format=3 uid="uid://ogbkbf1v7j7l"] + +[ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_cpfpk"] +[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="1_hv6hq"] +[ext_resource type="Texture2D" uid="uid://bgt3j4cuq814m" path="res://Assets/TextureAtlases/green.tres" id="2_4p73e"] +[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="2_jdi4m"] +[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="3_f04lj"] + +[resource] +script = ExtResource("1_cpfpk") +hero_name = "Green" +texture = ExtResource("2_4p73e") +deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("1_hv6hq"), ExtResource("2_jdi4m"), ExtResource("3_f04lj")]) diff --git a/PCs/Red/red.tres b/PCs/Red/red.tres new file mode 100644 index 0000000..88e2518 --- /dev/null +++ b/PCs/Red/red.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="HeroClass" load_steps=6 format=3 uid="uid://b5pc3frhx467q"] + +[ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_1wkap"] +[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="1_iiksa"] +[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="2_hkiwr"] +[ext_resource type="Texture2D" uid="uid://hxev3a2ktya" path="res://Assets/TextureAtlases/red.tres" id="2_kjc7g"] +[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="3_ruhqi"] + +[resource] +script = ExtResource("1_1wkap") +hero_name = "Red" +texture = ExtResource("2_kjc7g") +deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("1_iiksa"), ExtResource("2_hkiwr"), ExtResource("3_ruhqi")]) diff --git a/PCs/Universal/ClassCards/Assault/card_assault.tres b/PCs/Universal/ClassCards/Assault/card_assault.tres new file mode 100644 index 0000000..4cf7e84 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/card_assault.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bmoreipvttks8"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_yqa4b"] +[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="2_8j5h0"] +[ext_resource type="PackedScene" uid="uid://fernyl7fsifv" path="res://PCs/Universal/ClassCards/Assault/tower_assault.tscn" id="3_0r6s7"] +[ext_resource type="Resource" uid="uid://w15ojqyxd72q" path="res://Resources/WeaponStats/assault.tres" id="3_k2yr3"] +[ext_resource type="Resource" uid="uid://cktq4o3yuxgsa" path="res://Resources/TurretStats/assault.tres" id="3_p4byc"] +[ext_resource type="PackedScene" uid="uid://d1xe6hsq05110" path="res://PCs/Universal/ClassCards/Assault/weapon_assault.tscn" id="3_wj5gm"] + +[resource] +script = ExtResource("1_yqa4b") +title = "Assault" +rarity = 0 +faction = 0 +sprite = ExtResource("2_8j5h0") +turret = ExtResource("3_0r6s7") +weapon = ExtResource("3_wj5gm") +weapon_stats = ExtResource("3_k2yr3") +tower_stats = ExtResource("3_p4byc") diff --git a/PCs/Universal/ClassCards/Assault/tower.gd b/PCs/Universal/ClassCards/Assault/tower.gd new file mode 100644 index 0000000..a9f5cf3 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/tower.gd @@ -0,0 +1,45 @@ +extends Node3D +class_name Tower + +@export var stats : TowerStats +@export var model : Node3D + +var targeted_enemy +var cooldown := 0.0 +var other_cooldown := 0.0 + +func _ready() -> void: + cooldown = 1.0 / stats.fire_rate + + +func _process(delta: float) -> void: + other_cooldown -= delta + if !targeted_enemy: + acquire_target() + else: + if model.global_position.distance_to(targeted_enemy.global_position) > stats.fire_range: + targeted_enemy = null + if targeted_enemy: + aim() + if other_cooldown <= 0: + shoot() + other_cooldown = cooldown + + +func shoot(): + targeted_enemy.damage(stats.damage) + + +func aim(): + model.look_at(targeted_enemy.global_position) + + +func acquire_target(): + var most_progressed_enemy = null + for enemy in get_tree().get_nodes_in_group("Enemies"): + if model.global_position.distance_to(enemy.global_position) > stats.fire_range: + continue + if (most_progressed_enemy == null or enemy.progress >= most_progressed_enemy.progress) and enemy.stats.target_type & stats.can_target: + most_progressed_enemy = enemy + if most_progressed_enemy != null: + targeted_enemy = most_progressed_enemy diff --git a/PCs/Universal/ClassCards/Assault/tower_assault.tscn b/PCs/Universal/ClassCards/Assault/tower_assault.tscn new file mode 100644 index 0000000..ddb6a9b --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/tower_assault.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=3 uid="uid://fernyl7fsifv"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/tower.gd" id="1_c2874"] +[ext_resource type="Resource" uid="uid://cktq4o3yuxgsa" path="res://Resources/TurretStats/assault.tres" id="2_t516u"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_c2874") +stats = ExtResource("2_t516u") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.714825, 0, -0.423869) +size = Vector3(0.481654, 0.427749, 1.38438) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.715, 0, -0.424) +size = Vector3(0.481654, 0.427749, 1.38438) diff --git a/PCs/Universal/ClassCards/Assault/weapon.gd b/PCs/Universal/ClassCards/Assault/weapon.gd new file mode 100644 index 0000000..1d97054 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/weapon.gd @@ -0,0 +1,66 @@ +extends Sprite3D +class_name Weapon + +@export var stats : WeaponStats +@export var hero : Hero + +var cooldown := 0.0 +var other_cooldown := 0.0 +var trigger_held := false +var second_trigger_held := false + + +func _ready() -> void: + cooldown = 1.0 / stats.fire_rate + $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) + + +func set_raycast_origin(node): + $RayCast3D.global_position = node.global_position + + +func set_hero(value): + hero = value + + +func _process(delta: float) -> void: + if stats != null: + other_cooldown -= delta + + +func _physics_process(_delta: float) -> void: + if trigger_held: + shoot() + + +func hold_trigger(): + trigger_held = true + + +func release_trigger(): + trigger_held = false + + +func hold_second_trigger(): + second_trigger_held = true + + +func release_second_trigger(): + second_trigger_held = false + + +func shoot(): + if other_cooldown <= 0 and stats != null: + other_cooldown = cooldown + $AnimationPlayer.play("shoot") + if $RayCast3D.is_colliding(): + var target = $RayCast3D.get_collider() + if target != null: + var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) + if target_hitbox is Hitbox: + target_hitbox.damage(stats.damage) + +@rpc +func networked_shoot(): + $AnimationPlayer.play("shoot") + diff --git a/PCs/Universal/ClassCards/Assault/weapon_assault.tscn b/PCs/Universal/ClassCards/Assault/weapon_assault.tscn new file mode 100644 index 0000000..239e093 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/weapon_assault.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=7 format=3 uid="uid://d1xe6hsq05110"] + +[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="1_117ne"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/weapon.gd" id="2_4ie8w"] +[ext_resource type="Resource" uid="uid://w15ojqyxd72q" path="res://Resources/WeaponStats/assault.tres" id="3_s4ckt"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_117ne") +script = ExtResource("2_4ie8w") +stats = ExtResource("3_s4ckt") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] +collision_mask = 4 diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb.gd b/PCs/Universal/ClassCards/BombLauncher/bomb.gd new file mode 100644 index 0000000..a16e826 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bomb.gd @@ -0,0 +1,20 @@ +extends RigidBody3D +class_name Bomb + +@export var max_bounces := 1 +@export var damage := 10.0 +@export var explosion_range := 3.0 +var bounces := 0 + +func _on_body_entered(_body: Node) -> void: + bounces += 1 + var collided_body = get_colliding_bodies()[0].get_collision_layer_value(3) + if bounces > max_bounces or collided_body: + explode() + + +func explode(): + for enemy in get_tree().get_nodes_in_group("Enemies"): + if global_position.distance_to(enemy.global_position) <= explosion_range: + enemy.damage(damage) + queue_free() diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb.tscn b/PCs/Universal/ClassCards/BombLauncher/bomb.tscn new file mode 100644 index 0000000..300e91a --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bomb.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=5 format=3 uid="uid://d147iwg2wcqc5"] + +[ext_resource type="Texture2D" uid="uid://b54d5dc4jmlau" path="res://Assets/Textures/bomb.png" id="1_u615o"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.gd" id="1_vekqm"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_whkhx"] +bounce = 0.6 + +[sub_resource type="SphereShape3D" id="SphereShape3D_mi0in"] +radius = 0.2 + +[node name="RigidBody3D" type="RigidBody3D"] +collision_layer = 0 +collision_mask = 5 +physics_material_override = SubResource("PhysicsMaterial_whkhx") +max_contacts_reported = 1 +contact_monitor = true +script = ExtResource("1_vekqm") + +[node name="Node3D" type="Sprite3D" parent="."] +transform = Transform3D(1.4, 0, 0, 0, 1.4, 0, 0, 0, 1.4, 0, 0, 0) +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_u615o") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_mi0in") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/PCs/Universal/ClassCards/BombLauncher/bombtower.gd b/PCs/Universal/ClassCards/BombLauncher/bombtower.gd new file mode 100644 index 0000000..e88a867 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bombtower.gd @@ -0,0 +1,30 @@ +extends Tower +class_name BombTower + +@export var bomb_scene: PackedScene +var firing_velocity + +func _ready() -> void: + super._ready() + firing_velocity = sqrt((stats.fire_range * ProjectSettings.get_setting("physics/3d/default_gravity")) / sin(2 * 45)) + + +func shoot(): + var bomb = bomb_scene.instantiate() as Bomb + bomb.position = model.global_position + bomb.damage = stats.damage + get_tree().root.add_child(bomb) + bomb.apply_impulse(-model.global_transform.basis.z * firing_velocity) + + +func aim(): + var pos = Vector2(global_position.x, global_position.z) + var t_pos = Vector2(targeted_enemy.global_position.x, targeted_enemy.global_position.z) + var x = pos.distance_to(t_pos) + var y = targeted_enemy.global_position.y - global_position.y + var v = firing_velocity + var g = ProjectSettings.get_setting("physics/3d/default_gravity") + var v2 = pow(v, 2) + var angle = atan((v2 + sqrt(pow(v, 4) - g * ((g * pow(x, 2)) + (2 * y * v2)))) / (g * x)) + model.look_at(Vector3(t_pos.x, model.global_position.y, t_pos.y)) + model.rotate(model.global_transform.basis.x.normalized(), angle) diff --git a/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd b/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd new file mode 100644 index 0000000..16a4c14 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd @@ -0,0 +1,21 @@ +extends Weapon +class_name BombWeapon + +@export var bomb_scene: PackedScene +var firing_velocity + +func _ready() -> void: + cooldown = 1.0 / stats.fire_rate + firing_velocity = sqrt((stats.fire_range * ProjectSettings.get_setting("physics/3d/default_gravity")) / sin(2 * 45)) + $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) + + +func shoot(): + if other_cooldown <= 0 and stats != null: + other_cooldown = cooldown + $AnimationPlayer.play("shoot") + var bomb = bomb_scene.instantiate() as Bomb + bomb.position = $RayCast3D.global_position + bomb.damage = stats.damage + get_tree().root.add_child(bomb) + bomb.apply_impulse(-global_transform.basis.z * firing_velocity) diff --git a/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres b/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres new file mode 100644 index 0000000..39f742e --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bvpkvmda845o5"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_bscy2"] +[ext_resource type="Texture2D" uid="uid://bwufgga1pjyt" path="res://Assets/TextureAtlases/g_grenade_launcher.tres" id="2_xtrq2"] +[ext_resource type="Resource" uid="uid://crmsk6lvp5i4e" path="res://Resources/TurretStats/bomblauncher.tres" id="3_c1c3t"] +[ext_resource type="PackedScene" uid="uid://6ckryuql3bh8" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn" id="4_iaadg"] +[ext_resource type="PackedScene" uid="uid://cwc8y1nv53btu" path="res://PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn" id="4_ux0v3"] +[ext_resource type="Resource" uid="uid://kbaiy5u6imtu" path="res://Resources/WeaponStats/bomblauncher.tres" id="5_mhhrq"] + +[resource] +script = ExtResource("1_bscy2") +title = "Grenade Launcher" +rarity = 1 +faction = 0 +sprite = ExtResource("2_xtrq2") +turret = ExtResource("4_ux0v3") +weapon = ExtResource("4_iaadg") +weapon_stats = ExtResource("5_mhhrq") +tower_stats = ExtResource("3_c1c3t") diff --git a/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn new file mode 100644 index 0000000..bf5fdb7 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://cwc8y1nv53btu"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bombtower.gd" id="1_u2hyk"] +[ext_resource type="PackedScene" uid="uid://d147iwg2wcqc5" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.tscn" id="2_n307r"] +[ext_resource type="Resource" uid="uid://crmsk6lvp5i4e" path="res://Resources/TurretStats/bomblauncher.tres" id="3_xv5rx"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_u2hyk") +bomb_scene = ExtResource("2_n307r") +stats = ExtResource("3_xv5rx") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.13842, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.65) +size = Vector3(0.596453, 0.632841, 0.539216) diff --git a/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn new file mode 100644 index 0000000..c709062 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn @@ -0,0 +1,59 @@ +[gd_scene load_steps=8 format=3 uid="uid://6ckryuql3bh8"] + +[ext_resource type="Texture2D" uid="uid://bwufgga1pjyt" path="res://Assets/TextureAtlases/g_grenade_launcher.tres" id="1_n7mif"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bombweapon.gd" id="2_4iyo6"] +[ext_resource type="PackedScene" uid="uid://d147iwg2wcqc5" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.tscn" id="3_506dv"] +[ext_resource type="Resource" uid="uid://kbaiy5u6imtu" path="res://Resources/WeaponStats/bomblauncher.tres" id="4_45cu2"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_n7mif") +script = ExtResource("2_4iyo6") +bomb_scene = ExtResource("3_506dv") +stats = ExtResource("4_45cu2") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] diff --git a/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres b/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres new file mode 100644 index 0000000..9d4fd3d --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" script_class="Card" load_steps=5 format=3 uid="uid://1xke2uy2vfuf"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_xmwih"] +[ext_resource type="Resource" uid="uid://5ywipj3632u8" path="res://Resources/TurretStats/flametower.tres" id="2_80w0f"] +[ext_resource type="PackedScene" uid="uid://dvqk2lysu02gf" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn" id="3_yfmjg"] +[ext_resource type="Resource" uid="uid://c4ihsd13o1esd" path="res://Resources/WeaponStats/flamethrower.tres" id="4_rdoaa"] + +[resource] +script = ExtResource("1_xmwih") +title = "Flamethrower" +rarity = 3 +faction = 0 +turret = ExtResource("3_yfmjg") +weapon_stats = ExtResource("4_rdoaa") +tower_stats = ExtResource("2_80w0f") diff --git a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd new file mode 100644 index 0000000..a8a9825 --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd @@ -0,0 +1,30 @@ +extends Tower +class_name FlameyTower + +@export var shapecast : ShapeCast3D +@export var particlesystem : GPUParticles3D +@export var status_stats : StatusStats + + +func _process(delta: float) -> void: + super._process(delta) + if targeted_enemy: + particlesystem.emitting = true + else: + particlesystem.emitting = false + + +func shoot(): + for index in shapecast.get_collision_count(): + var target = shapecast.get_collider(index) as CharacterBody3D + #TODO: its shit the way the enemy and status have to know about each other + var status = StatusOnFire.new() + status.affected = target.get_parent() + status.stats = status_stats + target.get_parent().status_manager.add_effect(status) + target.get_parent().add_child(status) + + +func aim(): + model.look_at(targeted_enemy.global_position) + model.rotation.x = 0.0 diff --git a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn new file mode 100644 index 0000000..ac5f4a7 --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=9 format=3 uid="uid://dvqk2lysu02gf"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd" id="1_6dcsj"] +[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="2_yo2b7"] + +[sub_resource type="Gradient" id="Gradient_kkqms"] +offsets = PackedFloat32Array(0.00591716, 1) +colors = PackedColorArray(0.898039, 0.447059, 0, 1, 1, 0, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_gpquw"] +gradient = SubResource("Gradient_kkqms") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_2nhns"] +direction = Vector3(0, 1, 0) +spread = 20.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 5.0 +initial_velocity_max = 5.0 +damping_min = 4.464 +damping_max = 4.464 +color_ramp = SubResource("GradientTexture1D_gpquw") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2yd7w"] +vertex_color_use_as_albedo = true + +[sub_resource type="BoxMesh" id="BoxMesh_q83y7"] +material = SubResource("StandardMaterial3D_2yd7w") +size = Vector3(0.3, 0.3, 0.3) + +[sub_resource type="BoxShape3D" id="BoxShape3D_vck5q"] +size = Vector3(2.145, 3.125, 2.415) + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("shapecast", "particlesystem", "model")] +script = ExtResource("1_6dcsj") +shapecast = NodePath("Model/Node3D/ShapeCast3D") +particlesystem = NodePath("Model/Node3D/GPUParticles3D") +status_stats = ExtResource("2_yo2b7") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.569646, 0) +size = Vector3(1, 1.78698, 1) + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00567371, -0.274218, -0.514041) +size = Vector3(0.481654, 0.427749, 1.38438) + +[node name="Node3D" type="Node3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -0.301084, -1.2154) + +[node name="GPUParticles3D" type="GPUParticles3D" parent="Model/Node3D"] +amount = 48 +visibility_aabb = AABB(-2.2922, -3.14731, -1.92995, 4.5844, 6.29461, 3.85991) +process_material = SubResource("ParticleProcessMaterial_2nhns") +draw_pass_1 = SubResource("BoxMesh_q83y7") + +[node name="ShapeCast3D" type="ShapeCast3D" parent="Model/Node3D"] +shape = SubResource("BoxShape3D_vck5q") +target_position = Vector3(0, 1.51, 0) +collision_mask = 4 diff --git a/PCs/Universal/ClassCards/Gatling/card_gatling.tres b/PCs/Universal/ClassCards/Gatling/card_gatling.tres new file mode 100644 index 0000000..6e3fcdc --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/card_gatling.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://q23ludhji5p4"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_5html"] +[ext_resource type="Texture2D" uid="uid://d1am28tgvwaa0" path="res://Assets/TextureAtlases/g_accelerator.tres" id="2_a3hso"] +[ext_resource type="Resource" uid="uid://cc20tomywj0jm" path="res://Resources/TurretStats/accelerator.tres" id="3_yj53i"] +[ext_resource type="PackedScene" uid="uid://rcqf3vangjlp" path="res://PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn" id="4_4xp1m"] +[ext_resource type="PackedScene" uid="uid://bwcdgglljbmot" path="res://PCs/Universal/ClassCards/Gatling/tower_gatling.tscn" id="4_maix8"] +[ext_resource type="Resource" uid="uid://ouwge5etb4me" path="res://Resources/WeaponStats/accelerator.tres" id="5_hguan"] + +[resource] +script = ExtResource("1_5html") +title = "Accelerator" +rarity = 0 +faction = 0 +sprite = ExtResource("2_a3hso") +turret = ExtResource("4_maix8") +weapon = ExtResource("4_4xp1m") +weapon_stats = ExtResource("5_hguan") +tower_stats = ExtResource("3_yj53i") diff --git a/PCs/Universal/ClassCards/Gatling/speedytower.gd b/PCs/Universal/ClassCards/Gatling/speedytower.gd new file mode 100644 index 0000000..cf9befc --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/speedytower.gd @@ -0,0 +1,32 @@ +extends Tower +class_name SpeedyTower + +var third_cooldown := 0.0 + +var time_since_firing_started := 0.0 +var time_to_reach_max_speed := 3.0 +var max_speed_multiplier := 2.0 +var destination_multiplier := 0.0 + +func _ready() -> void: + cooldown = 1.0 / stats.fire_rate + destination_multiplier = 1.0 / max_speed_multiplier + + +func _process(delta: float) -> void: + other_cooldown -= delta + if !targeted_enemy: + acquire_target() + else: + if model.global_position.distance_to(targeted_enemy.global_position) > stats.fire_range: + targeted_enemy = null + time_since_firing_started = 0.0 + third_cooldown = cooldown + if targeted_enemy: + time_since_firing_started += delta + var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) + third_cooldown = cooldown * (1.0 - (destination_multiplier * progress)) + aim() + if other_cooldown <= 0: + shoot() + other_cooldown = third_cooldown diff --git a/PCs/Universal/ClassCards/Gatling/speedyweapon.gd b/PCs/Universal/ClassCards/Gatling/speedyweapon.gd new file mode 100644 index 0000000..e12b15e --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/speedyweapon.gd @@ -0,0 +1,60 @@ +extends Weapon +class_name SpeedyWeapon + +var third_cooldown := 0.0 + +var time_since_firing_started := 0.0 +var time_to_reach_max_speed := 3.0 +var max_speed_multiplier := 2.0 +var destination_multiplier := 0.0 + + +func _ready() -> void: + cooldown = 1.0 / stats.fire_rate + destination_multiplier = 1.0 / max_speed_multiplier + $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) + + +func set_raycast_origin(node): + $RayCast3D.global_position = node.global_position + + +func _process(delta: float) -> void: + if stats != null: + other_cooldown -= delta + if trigger_held: + time_since_firing_started += delta + var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) + third_cooldown = cooldown * (1.0 - (destination_multiplier * progress)) + + +func _physics_process(_delta: float) -> void: + if trigger_held: + shoot() + + +func hold_trigger(): + trigger_held = true + + +func release_trigger(): + trigger_held = false + time_since_firing_started = 0.0 + third_cooldown = cooldown + + +func shoot(): + if other_cooldown <= 0 and stats != null: + other_cooldown = third_cooldown + $AnimationPlayer.play("shoot") + if $RayCast3D.is_colliding(): + var target = $RayCast3D.get_collider() + if target != null: + var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) + if target_hitbox is Hitbox: + target_hitbox.damage(stats.damage) + +@rpc +func networked_shoot(): + $AnimationPlayer.play("shoot") + diff --git a/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn b/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn new file mode 100644 index 0000000..8f7b0f9 --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=3 format=3 uid="uid://bwcdgglljbmot"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Gatling/speedytower.gd" id="1_26he3"] +[ext_resource type="Resource" uid="uid://cc20tomywj0jm" path="res://Resources/TurretStats/accelerator.tres" id="2_puwlv"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_26he3") +stats = ExtResource("2_puwlv") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00131059, 0.27342, -0.880753) +size = Vector3(0.177, 0.148, 0.929) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.226066, 0.0918715, -0.880753) +size = Vector3(0.177, 0.148, 0.929) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.227674, -0.174673, -0.880753) +size = Vector3(0.177, 0.148, 0.929) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00246562, -0.314903, -0.880753) +size = Vector3(0.177, 0.148, 0.929) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.259054, -0.125834, -0.880753) +size = Vector3(0.177, 0.148, 0.929) + +[node name="CSGBox3D7" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.26701, 0.102116, -0.880753) +size = Vector3(0.177, 0.148, 0.929) diff --git a/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn b/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn new file mode 100644 index 0000000..e24488a --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=7 format=3 uid="uid://rcqf3vangjlp"] + +[ext_resource type="Texture2D" uid="uid://d1am28tgvwaa0" path="res://Assets/TextureAtlases/g_accelerator.tres" id="1_n3tw0"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Gatling/speedyweapon.gd" id="2_fkecd"] +[ext_resource type="Resource" uid="uid://ouwge5etb4me" path="res://Resources/WeaponStats/accelerator.tres" id="3_nq6wu"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_n3tw0") +script = ExtResource("2_fkecd") +stats = ExtResource("3_nq6wu") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] +collision_mask = 4 diff --git a/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres b/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres new file mode 100644 index 0000000..504d291 --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bhmbk26whdsys"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_4m1rh"] +[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="2_xsq3l"] +[ext_resource type="Resource" uid="uid://dhcukj44khkd7" path="res://Resources/TurretStats/glue.tres" id="3_tb5qj"] +[ext_resource type="PackedScene" uid="uid://d24q8j53oiyd4" path="res://PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn" id="4_0jn1x"] +[ext_resource type="PackedScene" uid="uid://dja1b2ke8clo5" path="res://PCs/Universal/ClassCards/GlueLauncher/tower_glue_launcher.tscn" id="4_1nhoo"] +[ext_resource type="Resource" uid="uid://dnucn65m12dmq" path="res://Resources/WeaponStats/glue.tres" id="5_qk2lw"] + +[resource] +script = ExtResource("1_4m1rh") +title = "Glue Gun" +rarity = 3 +faction = 0 +sprite = ExtResource("2_xsq3l") +turret = ExtResource("4_1nhoo") +weapon = ExtResource("4_0jn1x") +weapon_stats = ExtResource("5_qk2lw") +tower_stats = ExtResource("3_tb5qj") diff --git a/PCs/Universal/ClassCards/GlueLauncher/stickytower.gd b/PCs/Universal/ClassCards/GlueLauncher/stickytower.gd new file mode 100644 index 0000000..83a9247 --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/stickytower.gd @@ -0,0 +1,12 @@ +extends Tower +class_name StickyTower + +@export var status_stats : StatusStats + + +func shoot(): + var status = StatusSticky.new() + status.stats = status_stats + status.affected = targeted_enemy + status.affected.status_manager.add_effect(status) + targeted_enemy.add_child(status) diff --git a/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd b/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd new file mode 100644 index 0000000..14b3b28 --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd @@ -0,0 +1,19 @@ +extends Weapon +class_name StickyWeapon + +@export var status_stats : StatusStats + +func shoot(): + if other_cooldown <= 0 and stats != null: + other_cooldown = cooldown + $AnimationPlayer.play("shoot") + if $RayCast3D.is_colliding(): + var target = $RayCast3D.get_collider() + if target != null: + var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) + if target_hitbox is Hitbox: + var status = StatusSticky.new() + status.stats = status_stats + status.affected = target.get_parent() + status.affected.status_manager.add_effect(status) + target.add_child(status) diff --git a/PCs/Universal/ClassCards/GlueLauncher/tower_glue_launcher.tscn b/PCs/Universal/ClassCards/GlueLauncher/tower_glue_launcher.tscn new file mode 100644 index 0000000..778883d --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/tower_glue_launcher.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=3 uid="uid://dja1b2ke8clo5"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/GlueLauncher/stickytower.gd" id="1_0fo13"] +[ext_resource type="Resource" uid="uid://d0643gfp52x3s" path="res://Resources/StatusEffects/sticky.tres" id="2_f8mxi"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_0fo13") +status_stats = ExtResource("2_f8mxi") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0158235, 0, -0.956956) +size = Vector3(0.481654, 0.427749, 1.38438) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00590318, 0.717947, 0.210929) +size = Vector3(0.329535, 0.622842, 0.319929) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00590295, 0.453314, -0.265725) +size = Vector3(0.329535, 0.622842, 0.319929) diff --git a/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn new file mode 100644 index 0000000..d37c07d --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=7 format=3 uid="uid://d24q8j53oiyd4"] + +[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_pl6t8"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Sniper/scopedweapon.gd" id="2_8m6e6"] +[ext_resource type="Resource" uid="uid://dnucn65m12dmq" path="res://Resources/WeaponStats/glue.tres" id="3_li2dn"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_pl6t8") +script = ExtResource("2_8m6e6") +stats = ExtResource("3_li2dn") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] +collision_mask = 4 diff --git a/PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres b/PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres new file mode 100644 index 0000000..dfbaaaf --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://dh5fjnbp8auw1"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_dg0td"] +[ext_resource type="Texture2D" uid="uid://clr6kfyci5jqb" path="res://Assets/TextureAtlases/g_rocket_launcher.tres" id="2_duef5"] +[ext_resource type="Resource" uid="uid://duofn25nuu84q" path="res://Resources/TurretStats/rocketlauncher.tres" id="3_tj17y"] +[ext_resource type="Resource" uid="uid://dtfgyt85mp1ar" path="res://Resources/WeaponStats/rocketlauncher.tres" id="4_hwkrq"] +[ext_resource type="PackedScene" uid="uid://cbmoi73hquaer" path="res://PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn" id="4_ioexd"] +[ext_resource type="PackedScene" uid="uid://br3bd1jmi235x" path="res://PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn" id="4_mvvp4"] + +[resource] +script = ExtResource("1_dg0td") +title = "Rocket Launcher" +rarity = 2 +faction = 0 +sprite = ExtResource("2_duef5") +turret = ExtResource("4_mvvp4") +weapon = ExtResource("4_ioexd") +weapon_stats = ExtResource("4_hwkrq") +tower_stats = ExtResource("3_tj17y") diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket.gd b/PCs/Universal/ClassCards/RocketLauncher/rocket.gd new file mode 100644 index 0000000..4f67b5d --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/rocket.gd @@ -0,0 +1,33 @@ +extends RigidBody3D +class_name Rocket + +@export var damage := 10.0 +@export var explosion_range := 6.0 +var target : Node3D +var acceleration := 15.0 +var direction +var lifetime := 15.0 +var time_alive := 0.0 + + +func _process(delta: float) -> void: + time_alive += delta + if time_alive >= lifetime: + explode() + + +func _physics_process(_delta: float) -> void: + if is_instance_valid(target): + direction = global_position.direction_to(target.global_position) + apply_central_force(direction * acceleration) + + +func _on_body_entered(_body: Node) -> void: + explode() + + +func explode(): + for enemy in get_tree().get_nodes_in_group("Enemies"): + if global_position.distance_to(enemy.global_position) <= explosion_range: + enemy.damage(damage) + queue_free() diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket.tscn b/PCs/Universal/ClassCards/RocketLauncher/rocket.tscn new file mode 100644 index 0000000..6a41aee --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/rocket.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://hr0dw2533tsl"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket.gd" id="1_7il2o"] +[ext_resource type="Texture2D" uid="uid://b54d5dc4jmlau" path="res://Assets/Textures/bomb.png" id="2_moh5p"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_whkhx"] +bounce = 0.6 + +[sub_resource type="SphereShape3D" id="SphereShape3D_mi0in"] +radius = 0.2 + +[node name="RigidBody3D" type="RigidBody3D"] +collision_layer = 0 +collision_mask = 5 +physics_material_override = SubResource("PhysicsMaterial_whkhx") +gravity_scale = 0.0 +max_contacts_reported = 1 +contact_monitor = true +script = ExtResource("1_7il2o") + +[node name="Node3D" type="Sprite3D" parent="."] +transform = Transform3D(1.4, 0, 0, 0, 1.4, 0, 0, 0, 1.4, 0, 0, 0) +billboard = 1 +texture_filter = 0 +texture = ExtResource("2_moh5p") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_mi0in") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd b/PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd new file mode 100644 index 0000000..c7709a3 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd @@ -0,0 +1,66 @@ +extends Weapon +class_name RocketWeapon + +@export var rocket_scene : PackedScene +@export var target_icon_scene : PackedScene +var rocket_speed = 20.0 +var target_max := 3 +var targets = [] +var target_icons = [] + + +func _ready() -> void: + super._ready() + for x in target_max: + var icon = target_icon_scene.instantiate() + add_child(icon) + icon.set_visible(false) + target_icons.append(icon) + + +func _process(delta: float) -> void: + super._process(delta) + if !trigger_held or other_cooldown > 0: + return + var target_list = targets.duplicate() + for target in target_list: + if !is_instance_valid(target): + targets.erase(target) + continue + for x in target_icons.size(): + if x < targets.size(): + target_icons[x].global_position = targets[x].global_position + target_icons[x].set_visible(true) + else: + target_icons[x].set_visible(false) + $TextureRect.set_visible(true) + $TextureRect.texture.region = Rect2(128 * targets.size(), 0, 128, 128) + if targets.size() < target_max and $RayCast3D.is_colliding() and !targets.has($RayCast3D.get_collider()): + targets.append($RayCast3D.get_collider()) + + +func _physics_process(_delta: float) -> void: + pass + + +func release_trigger(): + if trigger_held: + super.release_trigger() + shoot() + + +func shoot(): + if other_cooldown <= 0 and stats != null: + other_cooldown = cooldown + $AnimationPlayer.play("shoot") + for target in targets: + var rocket = rocket_scene.instantiate() as Rocket + rocket.position = $RayCast3D.global_position + rocket.damage = stats.damage + rocket.target = target + get_tree().root.add_child(rocket) + rocket.apply_central_impulse(Vector3.UP * 3.0) + targets.clear() + $TextureRect.set_visible(false) + for icon in target_icons: + icon.set_visible(false) diff --git a/PCs/Universal/ClassCards/RocketLauncher/rockettower.gd b/PCs/Universal/ClassCards/RocketLauncher/rockettower.gd new file mode 100644 index 0000000..55b1659 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/rockettower.gd @@ -0,0 +1,56 @@ +extends Tower +class_name RocketTower + +var targeted_enemies = [] +@export var rocket_scene : PackedScene +@export var target_max := 3 +var targets = [] + + +func _process(delta: float) -> void: + other_cooldown -= delta + if targets.size() < target_max: + acquire_target() + if targets.size() > 0: + var target_list = targets.duplicate() + for target in target_list: + if !is_instance_valid(target): + targets.erase(target) + continue + if model.global_position.distance_to(target.global_position) > stats.fire_range: + targets.erase(target) + if targets.size() > 0: + targeted_enemy = targets[0] + aim() + if other_cooldown <= 0: + shoot() + other_cooldown = cooldown + + +func shoot(): + for target in targets: + var rocket = rocket_scene.instantiate() as Rocket + rocket.position = model.global_position + rocket.damage = stats.damage + get_tree().root.add_child(rocket) + rocket.target = target + + +func acquire_target(): + var possible_enemies = [] + for enemy in get_tree().get_nodes_in_group("Enemies"): + if model.global_position.distance_to(enemy.global_position) > stats.fire_range: + continue + if !(enemy.stats.target_type & stats.can_target): + continue + if targets.has(enemy): + continue + possible_enemies.append(enemy) + + for x in target_max - targets.size(): + if possible_enemies.size() == 0: + return + var chosen = possible_enemies.pick_random() + possible_enemies.erase(chosen) + targets.append(chosen) + diff --git a/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn new file mode 100644 index 0000000..5f7a568 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=3 uid="uid://br3bd1jmi235x"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/rockettower.gd" id="1_8hb2v"] +[ext_resource type="PackedScene" uid="uid://hr0dw2533tsl" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket.tscn" id="2_by0gu"] +[ext_resource type="Resource" uid="uid://duofn25nuu84q" path="res://Resources/TurretStats/rocketlauncher.tres" id="3_ynh7l"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_8hb2v") +rocket_scene = ExtResource("2_by0gu") +stats = ExtResource("3_ynh7l") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.97939, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.65) +size = Vector3(0.805859, 0.771887, 1.04243) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.20204) +size = Vector3(0.597715, 0.561942, 0.242169) diff --git a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn new file mode 100644 index 0000000..98affaa --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=10 format=3 uid="uid://cbmoi73hquaer"] + +[ext_resource type="Texture2D" uid="uid://clr6kfyci5jqb" path="res://Assets/TextureAtlases/g_rocket_launcher.tres" id="1_67vj1"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd" id="2_rfuq6"] +[ext_resource type="Resource" uid="uid://dtfgyt85mp1ar" path="res://Resources/WeaponStats/rocketlauncher.tres" id="3_7mndo"] +[ext_resource type="PackedScene" uid="uid://hr0dw2533tsl" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket.tscn" id="3_xn783"] +[ext_resource type="PackedScene" uid="uid://csufsbi64asau" path="res://Scenes/target_icon.tscn" id="4_ptwpb"] +[ext_resource type="Texture2D" uid="uid://bgeu8dnqaxq7v" path="res://Assets/TextureAtlases/target_list.tres" id="5_nbrvn"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_67vj1") +script = ExtResource("2_rfuq6") +rocket_scene = ExtResource("3_xn783") +target_icon_scene = ExtResource("4_ptwpb") +stats = ExtResource("3_7mndo") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] +collision_mask = 4 + +[node name="TextureRect" type="TextureRect" parent="."] +visible = false +texture_filter = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("5_nbrvn") diff --git a/PCs/Universal/ClassCards/Sniper/card_sniper.tres b/PCs/Universal/ClassCards/Sniper/card_sniper.tres new file mode 100644 index 0000000..345c409 --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/card_sniper.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://cvf5bxtu6er17"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_5vmtk"] +[ext_resource type="Texture2D" uid="uid://fmqq24n7rwvm" path="res://Assets/TextureAtlases/g_sniper.tres" id="2_skiu7"] +[ext_resource type="Resource" uid="uid://85iany3x0uv2" path="res://Resources/WeaponStats/sniper.tres" id="3_acfmb"] +[ext_resource type="PackedScene" uid="uid://v21rc7vtqp8l" path="res://Scenes/Weapons/scopedweapon.tscn" id="3_i0e3w"] +[ext_resource type="Resource" uid="uid://ddw7pj1ckwmp8" path="res://Resources/TurretStats/sniper.tres" id="3_tfyul"] +[ext_resource type="PackedScene" uid="uid://ryhc48vl36fc" path="res://Scenes/Towers/snipertower.tscn" id="4_kbb6b"] + +[resource] +script = ExtResource("1_5vmtk") +title = "Sniper" +rarity = 4 +faction = 0 +sprite = ExtResource("2_skiu7") +turret = ExtResource("4_kbb6b") +weapon = ExtResource("3_i0e3w") +weapon_stats = ExtResource("3_acfmb") +tower_stats = ExtResource("3_tfyul") diff --git a/PCs/Universal/ClassCards/Sniper/scopedweapon.gd b/PCs/Universal/ClassCards/Sniper/scopedweapon.gd new file mode 100644 index 0000000..955de9e --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/scopedweapon.gd @@ -0,0 +1,15 @@ +extends Weapon +class_name ScopedWeapon + +var scope_mask : Texture + + +func hold_second_trigger(): + super.hold_second_trigger() + $CanvasLayer.set_visible(true) + hero.zoom_factor = 3.0 + + +func release_second_trigger(): + super.release_second_trigger() + $CanvasLayer.set_visible(false) diff --git a/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn b/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn new file mode 100644 index 0000000..4bd0769 --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://ryhc48vl36fc"] + +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/tower.gd" id="1_tmpm5"] +[ext_resource type="Resource" uid="uid://ddw7pj1ckwmp8" path="res://Resources/TurretStats/sniper.tres" id="2_opda8"] + +[node name="Node3D" type="Node3D" node_paths=PackedStringArray("model")] +script = ExtResource("1_tmpm5") +stats = ExtResource("2_opda8") +model = NodePath("Model") + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="Model"] + +[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.776406) +size = Vector3(0.481654, 0.427749, 1.38438) diff --git a/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn b/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn new file mode 100644 index 0000000..4518bbf --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn @@ -0,0 +1,85 @@ +[gd_scene load_steps=8 format=3 uid="uid://v21rc7vtqp8l"] + +[ext_resource type="Texture2D" uid="uid://fmqq24n7rwvm" path="res://Assets/TextureAtlases/g_sniper.tres" id="1_6a01i"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Sniper/scopedweapon.gd" id="2_qemq6"] +[ext_resource type="Resource" uid="uid://85iany3x0uv2" path="res://Resources/WeaponStats/sniper.tres" id="3_3c36k"] +[ext_resource type="Texture2D" uid="uid://bepgxu7wtcl1i" path="res://Assets/Textures/scopetest.png" id="3_pyugo"] + +[sub_resource type="Animation" id="Animation_n8b32"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Rect2(0, 0, 64, 64)] +} + +[sub_resource type="Animation" id="Animation_g0h8q"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture:region") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(0, 0), +"update": 0, +"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] +_data = { +"RESET": SubResource("Animation_n8b32"), +"shoot": SubResource("Animation_g0h8q") +} + +[node name="Weapon" type="Sprite3D"] +layers = 2 +billboard = 1 +texture_filter = 0 +texture = ExtResource("1_6a01i") +script = ExtResource("2_qemq6") +stats = ExtResource("3_3c36k") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_ntl6p") +} + +[node name="RayCast3D" type="RayCast3D" parent="."] +collision_mask = 4 + +[node name="CanvasLayer" type="CanvasLayer" parent="."] +layer = 2 +visible = false + +[node name="TextureRect" type="TextureRect" parent="CanvasLayer"] +clip_children = 1 +visibility_layer = 2 +texture_filter = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("3_pyugo") + +[node name="ColorRect" type="ColorRect" parent="CanvasLayer/TextureRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) diff --git a/PCs/hero.gd b/PCs/hero.gd new file mode 100644 index 0000000..12c5864 --- /dev/null +++ b/PCs/hero.gd @@ -0,0 +1,211 @@ +extends CharacterBody3D +class_name Hero + +signal ready_state_changed(state) +signal spawned +signal died + +@export var hero_class: HeroClass +@export var camera : Camera3D +@export var left_hand : Node3D +@export var right_hand : Node3D +@export var right_hand_animator : AnimationPlayer +@export var edit_tool : EditTool +@export var gauntlet_sprite : Sprite3D +@export var sprite : EightDirectionSprite3D +@export var interaction_raycast : RayCast3D +@export var inventory : Inventory +@export var weapon : Weapon +@export var card : CardInHand +@export var pause_menu_scene : PackedScene +@export var weapon_scene : PackedScene +@export var hud : HUD +@export var movement : PlayerMovement + +var equipped_card : Card +var paused := false +var editing_mode := true +var profile: PlayerProfile +var ready_state := false : + set(value): + ready_state = value + networked_set_ready_state.rpc(ready_state) + ready_state_changed.emit(ready_state) +var currency := 0 : + set(value): + currency = value + hud.set_currency_count(value) + get: + return currency +@export var sprint_zoom_speed := 0.2 + + +func _ready() -> void: + if is_multiplayer_authority(): + right_hand_animator.play("weapon_sway") + right_hand_animator.speed_scale = 0 + hud.set_visible(true) + camera.make_current() + sprite.queue_free() + else: + camera.set_visible(false) + if weapon != null: + weapon.set_raycast_origin(camera) + inventory.contents.append_array(hero_class.deck) + sprite.texture = hero_class.texture + check_left_hand_valid() + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + + +func _physics_process(delta: float) -> void: + if !is_multiplayer_authority() or paused: + return + if movement.input_vector == Vector2.ZERO: + right_hand_animator.speed_scale = 0 + elif movement.sprinting: + right_hand_animator.speed_scale = 1 + else: + right_hand_animator.speed_scale = 0.6 + + +func _process(delta: float) -> void: + if !is_multiplayer_authority() or paused: + return + if !movement.sprinting: + movement.zoom_factor += sprint_zoom_speed * 2.0 * delta + if movement.zoom_factor > 1.0: + movement.zoom_factor = 1.0 + + if editing_mode: + if edit_tool.is_looking_at_tower_base: + card.view_tower() + else: + card.view_weapon() + if Input.is_action_just_pressed("Interact"): + edit_tool.interact() + if interaction_raycast.get_collider() is InteractButton: + var button = interaction_raycast.get_collider() as InteractButton + if currency >= button.press_cost: + button.press() + currency -= button.press_cost + if interaction_raycast.get_collider() is ItemCard: + inventory.add(interaction_raycast.get_collider().pick_up()) + if Input.is_action_just_pressed("Equip In Gauntlet"): + equip_weapon() + if Input.is_action_just_pressed("Select Next Card"): + inventory.increment_selected() + if Input.is_action_just_pressed("Select Previous Card"): + inventory.decrement_selected() + + if Input.is_action_just_pressed("Primary Fire"): + edit_tool.interact_key_held = true + if Input.is_action_just_released("Primary Fire"): + edit_tool.interact_key_held = false + if weapon != null: + weapon.release_trigger() + weapon.release_second_trigger() + else: + if weapon != null and Input.is_action_just_pressed("Primary Fire"): + weapon.hold_trigger() + if weapon != null and Input.is_action_just_released("Primary Fire"): + weapon.release_trigger() + if weapon != null and Input.is_action_pressed("Secondary Fire"): + weapon.hold_second_trigger() + if weapon != null and Input.is_action_just_released("Secondary Fire"): + weapon.release_second_trigger() + if weapon != null and Input.is_action_pressed("Primary Fire"): + movement.can_sprint = false + if weapon != null and Input.is_action_pressed("Secondary Fire"): + movement.can_sprint = false + + if movement.sprinting: + movement.zoom_factor -= sprint_zoom_speed * delta + if movement.zoom_factor <= 1.0 - movement.sprint_zoom_factor: + movement.zoom_factor = 1.0 - movement.sprint_zoom_factor + camera.fov = Data.preferences.hfov * (1.0 / movement.zoom_factor) + + if Input.is_action_just_pressed("View Map"): + hud.maximise_minimap(Game.level) + #Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + if Input.is_action_just_released("View Map"): + hud.minimize_minimap(self) + #Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + check_left_hand_valid() + + +func _unhandled_input(event: InputEvent) -> void: + if !is_multiplayer_authority() or paused: + return + if editing_mode and event.is_action_pressed("Ready"): + edit_tool.interact_key_held = false + ready_state = true + if event.is_action_pressed("Pause"): + var menu = pause_menu_scene.instantiate() as PauseMenu + pause() + menu.closed.connect(unpause) + hud.add_child(menu) + + +func unpause(): + paused = false + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + + +func pause(): + paused = true + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + + +func enter_editing_mode(value): + hud.set_wave_count(value + 1) + editing_mode = true + edit_tool.enabled = true + check_left_hand_valid() + if weapon != null: + weapon.release_trigger() + + +func exit_editing_mode(value): + hud.set_wave_count(value) + edit_tool.enabled = false + left_hand.set_visible(false) + editing_mode = false + + +func check_left_hand_valid(): + if inventory.contents.size() == 0: + left_hand.set_visible(false) + #gauntlet.texture.region = Rect2(64, 0, 64, 64) + else: + left_hand.set_visible(true) + #gauntlet.texture.region = Rect2(0, 0, 64, 64) + card.set_card(inventory.selected_item) + + +func equip_weapon(): + if weapon != null: + unequip_weapon() + return + if inventory.contents.size() > 0: + equipped_card = inventory.remove() + weapon = equipped_card.weapon.instantiate() + right_hand.add_child(weapon) + gauntlet_sprite.set_visible(false) + weapon.set_raycast_origin(camera) + weapon.set_hero(self) + check_left_hand_valid() + + +func unequip_weapon(): + gauntlet_sprite.set_visible(true) + weapon.queue_free() + inventory.add(equipped_card) + equipped_card = null + check_left_hand_valid() + + +#MULTIPLAYER NETWORKED FUNCTIONS +@rpc("reliable") +func networked_set_ready_state(state: bool): + ready_state = state + ready_state_changed.emit(state) diff --git a/PCs/hero.tscn b/PCs/hero.tscn new file mode 100644 index 0000000..9eb2938 --- /dev/null +++ b/PCs/hero.tscn @@ -0,0 +1,425 @@ +[gd_scene load_steps=29 format=3 uid="uid://dxgxbtf68lcv5"] + +[ext_resource type="Script" path="res://PCs/hero.gd" id="1_pihpe"] +[ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://PCs/Red/red.tres" id="2_dbyo0"] +[ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="2_ib0t5"] +[ext_resource type="Texture2D" uid="uid://dkbkam81k355s" path="res://Assets/TextureAtlases/gauntlet.tres" id="3_5myy0"] +[ext_resource type="PackedScene" uid="uid://buvgdem68wtev" path="res://Scenes/Menus/pause_menu.tscn" id="3_avnsx"] +[ext_resource type="PackedScene" uid="uid://d1xe6hsq05110" path="res://PCs/Universal/ClassCards/Assault/weapon_assault.tscn" id="4_b0lpv"] +[ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://Scenes/UI/card_hand.tscn" id="4_mwtvp"] +[ext_resource type="PackedScene" uid="uid://dqt1ggtkpkuhs" path="res://Scenes/gauntlet.tscn" id="5_jlxb3"] +[ext_resource type="Script" path="res://Scripts/inventory.gd" id="6_cf5ap"] +[ext_resource type="Texture2D" uid="uid://hxev3a2ktya" path="res://Assets/TextureAtlases/red.tres" id="6_loffy"] +[ext_resource type="Texture2D" uid="uid://d0btebva6djdl" path="res://Assets/Textures/crosshair.png" id="8_fq3f6"] +[ext_resource type="Script" path="res://Scripts/HUD.gd" id="8_yl6ka"] +[ext_resource type="Script" path="res://Scripts/on_top_camera.gd" id="11_4sdwe"] +[ext_resource type="Script" path="res://Scripts/minimap_cam.gd" id="12_3hpi3"] +[ext_resource type="Texture2D" uid="uid://b6iego7256jf2" path="res://Assets/Textures/wavecounter.png" id="14_l34nu"] +[ext_resource type="PackedScene" uid="uid://24x18qxqhy0i" path="res://Scenes/UI/lives_bar.tscn" id="15_cqpib"] +[ext_resource type="Texture2D" uid="uid://c60fh34ttgcvh" path="res://Assets/Textures/minimap_player.png" id="15_nhlam"] +[ext_resource type="Texture2D" uid="uid://chhmkmlfrobhu" path="res://Assets/Textures/bubble.png" id="15_q3yot"] +[ext_resource type="Texture2D" uid="uid://cqnapc8cscl7i" path="res://Assets/Textures/border.png" id="16_x1xjr"] +[ext_resource type="Script" path="res://PCs/player_movement.gd" id="20_cfhw8"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jbu13"] + +[sub_resource type="Environment" id="Environment_ekmug"] + +[sub_resource type="Animation" id="Animation_2q50p"] +resource_name = "weapon_sway" +length = 0.8 +loop_mode = 1 +tracks/0/type = "position_3d" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = PackedFloat32Array(0, 1, 0.615, -0.275, -1, 0.2, 1, 0.59, -0.255, -1, 0.4, 1, 0.615, -0.275, -1, 0.6, 1, 0.66, -0.255, -1, 0.8, 1, 0.615, -0.275, -1) + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_2wknc"] +_data = { +"weapon_sway": SubResource("Animation_2q50p") +} + +[sub_resource type="ViewportTexture" id="ViewportTexture_8f12g"] +viewport_path = NodePath("SubViewport/Head2/LeftHand/SubViewport") + +[sub_resource type="Environment" id="Environment_cilxe"] +background_mode = 1 +background_color = Color(0.282353, 0.615686, 0.278431, 1) + +[sub_resource type="ViewportTexture" id="ViewportTexture_mk87g"] +viewport_path = NodePath("SubViewport") + +[sub_resource type="ViewportTexture" id="ViewportTexture_574jy"] +viewport_path = NodePath("MiniMapViewport") + +[node name="Character" type="CharacterBody3D" node_paths=PackedStringArray("camera", "left_hand", "right_hand", "right_hand_animator", "edit_tool", "gauntlet_sprite", "sprite", "interaction_raycast", "inventory", "card", "hud", "movement")] +collision_layer = 2 +collision_mask = 37 +script = ExtResource("1_pihpe") +hero_class = ExtResource("2_dbyo0") +camera = NodePath("Head") +left_hand = NodePath("SubViewport/Head2/LeftHand") +right_hand = NodePath("SubViewport/Head2/RightHand") +right_hand_animator = NodePath("SubViewport/Head2/RightHand/AnimationPlayer") +edit_tool = NodePath("Head/EditTool") +gauntlet_sprite = NodePath("SubViewport/Head2/RightHand/Gauntlet") +sprite = NodePath("EightDirectionSprite") +interaction_raycast = NodePath("Head/RayCast3D") +inventory = NodePath("Inventory") +card = NodePath("SubViewport/Head2/LeftHand/SubViewport/Node2D") +pause_menu_scene = ExtResource("3_avnsx") +weapon_scene = ExtResource("4_b0lpv") +hud = NodePath("HUD") +movement = NodePath("PlayerMovement") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_jbu13") + +[node name="Head" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) +keep_aspect = 0 +cull_mask = 1048569 +fov = 100.0 + +[node name="EditTool" parent="Head" node_paths=PackedStringArray("hero", "inventory") instance=ExtResource("5_jlxb3")] +hero = NodePath("../..") +inventory = NodePath("../../Inventory") + +[node name="RayCast3D" type="RayCast3D" parent="Head"] +target_position = Vector3(0, 0, -2) +collision_mask = 24 + +[node name="EightDirectionSprite" parent="." instance=ExtResource("2_ib0t5")] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0.915529, 0) +texture = ExtResource("6_loffy") + +[node name="Inventory" type="Node" parent="."] +script = ExtResource("6_cf5ap") + +[node name="SubViewport" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(1920, 1080) +render_target_update_mode = 4 + +[node name="Head2" type="Camera3D" parent="SubViewport" node_paths=PackedStringArray("clone_camera")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) +cull_mask = 2 +environment = SubResource("Environment_ekmug") +projection = 1 +script = ExtResource("11_4sdwe") +clone_camera = NodePath("../../Head") + +[node name="RightHand" type="Node3D" parent="SubViewport/Head2"] +transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0.66, -0.255, -1) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="SubViewport/Head2/RightHand"] +libraries = { +"": SubResource("AnimationLibrary_2wknc") +} + +[node name="Gauntlet" type="Sprite3D" parent="SubViewport/Head2/RightHand"] +layers = 2 +texture_filter = 0 +texture = ExtResource("3_5myy0") + +[node name="LeftHand" type="Node3D" parent="SubViewport/Head2"] +transform = Transform3D(0.235, 0, 0, 0, 0.235, 0, 0, 0, 0.235, -0.665, -0.275, -1) + +[node name="SubViewport" type="SubViewport" parent="SubViewport/Head2/LeftHand"] +transparent_bg = true +size = Vector2i(192, 192) +render_target_update_mode = 4 + +[node name="Node2D" parent="SubViewport/Head2/LeftHand/SubViewport" instance=ExtResource("4_mwtvp")] + +[node name="Sprite3D" type="Sprite3D" parent="SubViewport/Head2/LeftHand"] +layers = 2 +texture_filter = 0 +texture = SubResource("ViewportTexture_8f12g") + +[node name="MiniMapViewport" type="SubViewport" parent="."] +size = Vector2i(256, 256) +render_target_update_mode = 4 + +[node name="Camera3D" type="Camera3D" parent="MiniMapViewport" node_paths=PackedStringArray("anchor")] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 3.28551, 0) +cull_mask = 4 +environment = SubResource("Environment_cilxe") +projection = 1 +size = 15.0 +script = ExtResource("12_3hpi3") +anchor = NodePath("../..") +face_north = true + +[node name="HUD" type="CanvasLayer" parent="." node_paths=PackedStringArray("wave_count", "lives_count", "enemy_count", "currency_count", "crosshair", "minimap", "minimap_cam", "minimap_viewport", "fps_label", "enemy_sprites", "enemy_counts")] +script = ExtResource("8_yl6ka") +wave_count = NodePath("WaveCount") +lives_count = NodePath("LivesCount") +enemy_count = NodePath("EnemyCount") +currency_count = NodePath("Currency") +crosshair = NodePath("Crosshair") +minimap = NodePath("TextureRect2") +minimap_cam = NodePath("../MiniMapViewport/Camera3D") +minimap_viewport = NodePath("../MiniMapViewport") +fps_label = NodePath("Label") +enemy_sprites = [NodePath("TextureRect4/TextureRect"), NodePath("TextureRect4/TextureRect2"), NodePath("TextureRect4/TextureRect3"), NodePath("TextureRect4/TextureRect4"), NodePath("TextureRect4/TextureRect5")] +enemy_counts = [NodePath("TextureRect4/TextureRect/Label"), NodePath("TextureRect4/TextureRect2/Label2"), NodePath("TextureRect4/TextureRect3/Label3"), NodePath("TextureRect4/TextureRect4/Label4"), NodePath("TextureRect4/TextureRect5/Label5")] + +[node name="TextureRect4" type="TextureRect" parent="HUD"] +texture_filter = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -154.0 +offset_top = 22.0 +offset_right = 154.0 +offset_bottom = 116.0 +grow_horizontal = 2 +mouse_filter = 2 +texture = ExtResource("14_l34nu") + +[node name="TextureRect" type="TextureRect" parent="HUD/TextureRect4"] +visible = false +layout_mode = 0 +offset_right = 64.0 +offset_bottom = 64.0 +texture = ExtResource("15_q3yot") + +[node name="Label" type="Label" parent="HUD/TextureRect4/TextureRect"] +layout_mode = 0 +offset_left = 28.01 +offset_top = 41.81 +offset_right = 68.01 +offset_bottom = 66.8101 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 15 +text = "999" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TextureRect2" type="TextureRect" parent="HUD/TextureRect4"] +visible = false +layout_mode = 0 +offset_left = 61.0 +offset_right = 125.0 +offset_bottom = 64.0 +texture = ExtResource("15_q3yot") + +[node name="Label2" type="Label" parent="HUD/TextureRect4/TextureRect2"] +layout_mode = 0 +offset_left = 28.745 +offset_top = 41.81 +offset_right = 68.7451 +offset_bottom = 66.8101 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 15 +text = "999" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TextureRect3" type="TextureRect" parent="HUD/TextureRect4"] +visible = false +layout_mode = 0 +offset_left = 122.0 +offset_right = 186.0 +offset_bottom = 64.0 +texture = ExtResource("15_q3yot") + +[node name="Label3" type="Label" parent="HUD/TextureRect4/TextureRect3"] +layout_mode = 0 +offset_left = 29.29 +offset_top = 41.81 +offset_right = 69.2901 +offset_bottom = 66.8101 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 15 +text = "999" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TextureRect4" type="TextureRect" parent="HUD/TextureRect4"] +visible = false +layout_mode = 0 +offset_left = 183.0 +offset_right = 247.0 +offset_bottom = 64.0 +texture = ExtResource("15_q3yot") + +[node name="Label4" type="Label" parent="HUD/TextureRect4/TextureRect4"] +layout_mode = 0 +offset_left = 29.0 +offset_top = 41.81 +offset_right = 69.0 +offset_bottom = 66.8101 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 15 +text = "999" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TextureRect5" type="TextureRect" parent="HUD/TextureRect4"] +visible = false +layout_mode = 0 +offset_left = 244.0 +offset_right = 308.0 +offset_bottom = 64.0 +texture = ExtResource("15_q3yot") + +[node name="Label5" type="Label" parent="HUD/TextureRect4/TextureRect5"] +layout_mode = 0 +offset_left = 29.0 +offset_top = 41.81 +offset_right = 69.0 +offset_bottom = 66.8101 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 15 +text = "999" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="WaveCount" type="Label" parent="HUD"] +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -30.0 +offset_top = 83.0 +offset_right = 30.0 +offset_bottom = 26.0 +grow_horizontal = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "1" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="EnemyCount" type="Label" parent="HUD"] +offset_left = 10.0 +offset_top = 80.0 +offset_right = 123.0 +offset_bottom = 106.0 +text = "Enemies left: 0" + +[node name="Crosshair" type="TextureRect" parent="HUD"] +texture_filter = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("8_fq3f6") + +[node name="TextureRect" type="TextureRect" parent="HUD"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = SubResource("ViewportTexture_mk87g") + +[node name="TextureRect2" type="TextureRect" parent="HUD"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -256.0 +offset_top = 40.0 +offset_right = -40.0 +offset_bottom = 256.0 +grow_horizontal = 0 +mouse_filter = 2 +texture = SubResource("ViewportTexture_574jy") + +[node name="Label" type="Label" parent="HUD"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -40.0 +offset_bottom = 26.0 +grow_horizontal = 0 +text = "FPS: " +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="LivesBar" parent="HUD" instance=ExtResource("15_cqpib")] +anchors_preset = 0 +anchor_right = 0.0 +anchor_bottom = 0.0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = 214.0 +offset_bottom = 32.0 +grow_horizontal = 1 +grow_vertical = 1 +scale = Vector2(3, 3) +mouse_filter = 2 + +[node name="LivesCount" type="Label" parent="HUD"] +offset_left = -5.0 +offset_top = 15.0 +offset_right = 100.0 +offset_bottom = 72.0 +theme_override_colors/font_color = Color(0.65098, 0.227451, 0.243137, 1) +theme_override_font_sizes/font_size = 37 +text = "120 +" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TextureRect3" type="TextureRect" parent="HUD"] +texture_filter = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -262.0 +offset_top = 37.0 +offset_right = -37.0 +offset_bottom = 336.0 +grow_horizontal = 0 +mouse_filter = 2 +texture = ExtResource("16_x1xjr") + +[node name="Currency" type="Label" parent="HUD"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -99.0 +offset_top = 298.0 +offset_right = -57.0 +offset_bottom = 352.0 +grow_horizontal = 0 +theme_override_colors/font_color = Color(0.988235, 0.909804, 0.65098, 1) +theme_override_font_sizes/font_size = 37 +text = "20" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="MinimapIcon" type="Sprite3D" parent="."] +transform = Transform3D(4, 0, 0, 0, 0.0698095, 3.99939, 0, -3.99939, 0.0698095, 0, 2.86288, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("15_nhlam") + +[node name="PlayerMovement" type="Node" parent="." node_paths=PackedStringArray("player", "head")] +script = ExtResource("20_cfhw8") +player = NodePath("..") +head = NodePath("../Head") diff --git a/PCs/player_movement.gd b/PCs/player_movement.gd new file mode 100644 index 0000000..bf22275 --- /dev/null +++ b/PCs/player_movement.gd @@ -0,0 +1,69 @@ +extends Node +class_name PlayerMovement + +@export var player : CharacterBody3D +@export var head : Camera3D +@export var movement_speed := 3.5 +@export var sprint_boost := 0.1 +@export var acceleration := 0.8 +@export var friction_percentage := 0.15 +var zoom_factor := 1.0 +var input_vector : Vector2 +var can_sprint := true +var sprint_zoom_factor := 0.08 +var sprinting := false +var head_angle := 0.0 +var look_sens : float : + set(value): + return + get: + return Data.preferences.mouse_sens / 40000.0 + + +func _physics_process(delta: float) -> void: + var accel = acceleration + if sprinting: + accel = acceleration + sprint_boost + var result_vector = input_vector * accel + var down_velocity = player.velocity.y + player.velocity = player.velocity.limit_length(player.velocity.length() * (1.0 - friction_percentage)) + player.velocity += ((player.transform.basis.z * result_vector.y) + (player.transform.basis.x * result_vector.x)) + player.velocity.y = down_velocity + player.velocity += Vector3.DOWN * 9.81 * delta + player.move_and_slide() + sync_position.rpc(player.position) + sync_rotation.rpc(player.rotation) + + +func _process(delta: float) -> void: + can_sprint = true + input_vector = Input.get_vector("Move Left", "Move Right", "Move Forward", "Move Backward") + if input_vector.y >= 0: + can_sprint = false + if Data.preferences.toggle_sprint: + if Input.is_action_just_pressed("Sprint"): + sprinting = !sprinting + else: + sprinting = Input.is_action_pressed("Sprint") + if !can_sprint: + sprinting = false + if Input.is_action_just_pressed("Jump") and player.is_on_floor(): + player.velocity.y += 4.5 + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: + player.rotation.y -= event.relative.x * (look_sens / zoom_factor) * (-1 if Data.preferences.invert_lookX else 1) + head_angle -= event.relative.y * (look_sens / zoom_factor) * (-1 if Data.preferences.invert_lookY else 1) + head_angle = clamp(head_angle, -1.5, 1.5) + head.rotation.x = head_angle + + +@rpc +func sync_position(vec): + player.position = vec + + +@rpc +func sync_rotation(rot): + player.rotation = rot diff --git a/Resources/Keymaps/azerty.tres b/Resources/Keymaps/azerty.tres new file mode 100644 index 0000000..3b90fa5 --- /dev/null +++ b/Resources/Keymaps/azerty.tres @@ -0,0 +1,75 @@ +[gd_resource type="Resource" script_class="PlayerKeymap" load_steps=14 format=3 uid="uid://24x6dxeyp6q"] + +[ext_resource type="Script" path="res://Scripts/Resources/player_keymap.gd" id="1_mq1d3"] + +[sub_resource type="InputEventKey" id="InputEventKey_x2tr7"] +device = -1 +keycode = 65 +unicode = 97 + +[sub_resource type="InputEventKey" id="InputEventKey_km24n"] +device = -1 +keycode = 69 +unicode = 101 + +[sub_resource type="InputEventKey" id="InputEventKey_k7imb"] +device = -1 +keycode = 32 +unicode = 32 + +[sub_resource type="InputEventKey" id="InputEventKey_bkkdp"] +device = -1 +keycode = 83 +unicode = 115 + +[sub_resource type="InputEventKey" id="InputEventKey_sflgv"] +device = -1 +keycode = 90 +unicode = 122 + +[sub_resource type="InputEventKey" id="InputEventKey_gpfw7"] +device = -1 +keycode = 81 +unicode = 113 + +[sub_resource type="InputEventKey" id="InputEventKey_h2ivp"] +device = -1 +keycode = 68 +unicode = 100 + +[sub_resource type="InputEventKey" id="InputEventKey_tghoj"] +device = -1 +keycode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_wow3c"] +device = -1 +keycode = 4194305 + +[sub_resource type="InputEventKey" id="InputEventKey_wge4x"] +device = -1 +keycode = 70 +unicode = 102 + +[sub_resource type="InputEventKey" id="InputEventKey_08u8b"] +device = -1 +keycode = 4194325 + +[sub_resource type="InputEventKey" id="InputEventKey_jtv7p"] +device = -1 +keycode = 4194306 + +[resource] +script = ExtResource("1_mq1d3") +title = "AZERTY" +move_forward = SubResource("InputEventKey_sflgv") +move_backward = SubResource("InputEventKey_bkkdp") +move_left = SubResource("InputEventKey_gpfw7") +move_right = SubResource("InputEventKey_h2ivp") +jump = SubResource("InputEventKey_k7imb") +sprint = SubResource("InputEventKey_08u8b") +interact = SubResource("InputEventKey_km24n") +open_text_chat = SubResource("InputEventKey_tghoj") +ready = SubResource("InputEventKey_wge4x") +pause = SubResource("InputEventKey_wow3c") +equip_card_in_gauntlet = SubResource("InputEventKey_x2tr7") +view_map = SubResource("InputEventKey_jtv7p") diff --git a/Resources/Keymaps/colemak.tres b/Resources/Keymaps/colemak.tres new file mode 100644 index 0000000..a7da277 --- /dev/null +++ b/Resources/Keymaps/colemak.tres @@ -0,0 +1,75 @@ +[gd_resource type="Resource" script_class="PlayerKeymap" load_steps=14 format=3 uid="uid://bimicdfsvbsfe"] + +[ext_resource type="Script" path="res://Scripts/Resources/player_keymap.gd" id="1_ea4lr"] + +[sub_resource type="InputEventKey" id="InputEventKey_vtcll"] +device = -1 +keycode = 81 +unicode = 113 + +[sub_resource type="InputEventKey" id="InputEventKey_43xjm"] +device = -1 +keycode = 70 +unicode = 102 + +[sub_resource type="InputEventKey" id="InputEventKey_yuctl"] +device = -1 +keycode = 32 +unicode = 32 + +[sub_resource type="InputEventKey" id="InputEventKey_73pxv"] +device = -1 +keycode = 82 +unicode = 114 + +[sub_resource type="InputEventKey" id="InputEventKey_nvtcc"] +device = -1 +keycode = 87 +unicode = 119 + +[sub_resource type="InputEventKey" id="InputEventKey_h2yjp"] +device = -1 +keycode = 65 +unicode = 97 + +[sub_resource type="InputEventKey" id="InputEventKey_xvv7x"] +device = -1 +keycode = 83 +unicode = 115 + +[sub_resource type="InputEventKey" id="InputEventKey_ksd1d"] +device = -1 +keycode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_7ynrb"] +device = -1 +keycode = 4194305 + +[sub_resource type="InputEventKey" id="InputEventKey_0pbgp"] +device = -1 +keycode = 84 +unicode = 116 + +[sub_resource type="InputEventKey" id="InputEventKey_opngu"] +device = -1 +keycode = 4194325 + +[sub_resource type="InputEventKey" id="InputEventKey_f1w6s"] +device = -1 +keycode = 4194306 + +[resource] +script = ExtResource("1_ea4lr") +title = "COLEMAK" +move_forward = SubResource("InputEventKey_nvtcc") +move_backward = SubResource("InputEventKey_73pxv") +move_left = SubResource("InputEventKey_h2yjp") +move_right = SubResource("InputEventKey_xvv7x") +jump = SubResource("InputEventKey_yuctl") +sprint = SubResource("InputEventKey_opngu") +interact = SubResource("InputEventKey_43xjm") +open_text_chat = SubResource("InputEventKey_ksd1d") +ready = SubResource("InputEventKey_0pbgp") +pause = SubResource("InputEventKey_7ynrb") +equip_card_in_gauntlet = SubResource("InputEventKey_vtcll") +view_map = SubResource("InputEventKey_f1w6s") diff --git a/Resources/Keymaps/dvorak.tres b/Resources/Keymaps/dvorak.tres new file mode 100644 index 0000000..d5077bc --- /dev/null +++ b/Resources/Keymaps/dvorak.tres @@ -0,0 +1,75 @@ +[gd_resource type="Resource" script_class="PlayerKeymap" load_steps=14 format=3 uid="uid://qgpkrp08tx5l"] + +[ext_resource type="Script" path="res://Scripts/Resources/player_keymap.gd" id="1_e3tjt"] + +[sub_resource type="InputEventKey" id="InputEventKey_62tdh"] +device = -1 +keycode = 39 +unicode = 39 + +[sub_resource type="InputEventKey" id="InputEventKey_x2isa"] +device = -1 +keycode = 46 +unicode = 46 + +[sub_resource type="InputEventKey" id="InputEventKey_sjxn8"] +device = -1 +keycode = 32 +unicode = 32 + +[sub_resource type="InputEventKey" id="InputEventKey_kjw4x"] +device = -1 +keycode = 79 +unicode = 111 + +[sub_resource type="InputEventKey" id="InputEventKey_61m8q"] +device = -1 +keycode = 44 +unicode = 44 + +[sub_resource type="InputEventKey" id="InputEventKey_tdkec"] +device = -1 +keycode = 65 +unicode = 97 + +[sub_resource type="InputEventKey" id="InputEventKey_flmuc"] +device = -1 +keycode = 69 +unicode = 101 + +[sub_resource type="InputEventKey" id="InputEventKey_8xqt1"] +device = -1 +keycode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_itl5r"] +device = -1 +keycode = 4194305 + +[sub_resource type="InputEventKey" id="InputEventKey_drnpm"] +device = -1 +keycode = 85 +unicode = 117 + +[sub_resource type="InputEventKey" id="InputEventKey_3m66q"] +device = -1 +keycode = 4194325 + +[sub_resource type="InputEventKey" id="InputEventKey_docp6"] +device = -1 +keycode = 4194306 + +[resource] +script = ExtResource("1_e3tjt") +title = "DVORAK" +move_forward = SubResource("InputEventKey_61m8q") +move_backward = SubResource("InputEventKey_kjw4x") +move_left = SubResource("InputEventKey_tdkec") +move_right = SubResource("InputEventKey_flmuc") +jump = SubResource("InputEventKey_sjxn8") +sprint = SubResource("InputEventKey_3m66q") +interact = SubResource("InputEventKey_x2isa") +open_text_chat = SubResource("InputEventKey_8xqt1") +ready = SubResource("InputEventKey_drnpm") +pause = SubResource("InputEventKey_itl5r") +equip_card_in_gauntlet = SubResource("InputEventKey_62tdh") +view_map = SubResource("InputEventKey_docp6") diff --git a/Resources/Keymaps/qwerty.tres b/Resources/Keymaps/qwerty.tres new file mode 100644 index 0000000..b65c85e --- /dev/null +++ b/Resources/Keymaps/qwerty.tres @@ -0,0 +1,75 @@ +[gd_resource type="Resource" script_class="PlayerKeymap" load_steps=14 format=3 uid="uid://dml3iwhpttdat"] + +[ext_resource type="Script" path="res://Scripts/Resources/player_keymap.gd" id="1_6xs82"] + +[sub_resource type="InputEventKey" id="InputEventKey_g7iw8"] +device = -1 +keycode = 81 +unicode = 113 + +[sub_resource type="InputEventKey" id="InputEventKey_brup3"] +device = -1 +keycode = 69 +unicode = 101 + +[sub_resource type="InputEventKey" id="InputEventKey_p6g50"] +device = -1 +keycode = 32 +unicode = 32 + +[sub_resource type="InputEventKey" id="InputEventKey_cavx6"] +device = -1 +keycode = 83 +unicode = 115 + +[sub_resource type="InputEventKey" id="InputEventKey_e7m41"] +device = -1 +keycode = 87 +unicode = 119 + +[sub_resource type="InputEventKey" id="InputEventKey_5ut3l"] +device = -1 +keycode = 65 +unicode = 97 + +[sub_resource type="InputEventKey" id="InputEventKey_3uioy"] +device = -1 +keycode = 68 +unicode = 100 + +[sub_resource type="InputEventKey" id="InputEventKey_6mykw"] +device = -1 +keycode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_ujdbv"] +device = -1 +keycode = 4194305 + +[sub_resource type="InputEventKey" id="InputEventKey_kiqcj"] +device = -1 +keycode = 70 +unicode = 102 + +[sub_resource type="InputEventKey" id="InputEventKey_tmf7l"] +device = -1 +keycode = 4194325 + +[sub_resource type="InputEventKey" id="InputEventKey_a3okn"] +device = -1 +keycode = 4194306 + +[resource] +script = ExtResource("1_6xs82") +title = "QWERTY" +move_forward = SubResource("InputEventKey_e7m41") +move_backward = SubResource("InputEventKey_cavx6") +move_left = SubResource("InputEventKey_5ut3l") +move_right = SubResource("InputEventKey_3uioy") +jump = SubResource("InputEventKey_p6g50") +sprint = SubResource("InputEventKey_tmf7l") +interact = SubResource("InputEventKey_brup3") +open_text_chat = SubResource("InputEventKey_6mykw") +ready = SubResource("InputEventKey_kiqcj") +pause = SubResource("InputEventKey_ujdbv") +equip_card_in_gauntlet = SubResource("InputEventKey_g7iw8") +view_map = SubResource("InputEventKey_a3okn") diff --git a/Resources/Keymaps/workman.tres b/Resources/Keymaps/workman.tres new file mode 100644 index 0000000..ea29c8c --- /dev/null +++ b/Resources/Keymaps/workman.tres @@ -0,0 +1,75 @@ +[gd_resource type="Resource" script_class="PlayerKeymap" load_steps=14 format=3 uid="uid://g02ll7a7urwl"] + +[ext_resource type="Script" path="res://Scripts/Resources/player_keymap.gd" id="1_pf0gk"] + +[sub_resource type="InputEventKey" id="InputEventKey_ikcft"] +device = -1 +keycode = 81 +unicode = 113 + +[sub_resource type="InputEventKey" id="InputEventKey_bg51j"] +device = -1 +keycode = 82 +unicode = 114 + +[sub_resource type="InputEventKey" id="InputEventKey_2hgt5"] +device = -1 +keycode = 32 +unicode = 32 + +[sub_resource type="InputEventKey" id="InputEventKey_lc0ss"] +device = -1 +keycode = 83 +unicode = 115 + +[sub_resource type="InputEventKey" id="InputEventKey_lei27"] +device = -1 +keycode = 68 +unicode = 100 + +[sub_resource type="InputEventKey" id="InputEventKey_7juwk"] +device = -1 +keycode = 65 +unicode = 97 + +[sub_resource type="InputEventKey" id="InputEventKey_qfke7"] +device = -1 +keycode = 72 +unicode = 104 + +[sub_resource type="InputEventKey" id="InputEventKey_tbuvp"] +device = -1 +keycode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_tm5f1"] +device = -1 +keycode = 4194305 + +[sub_resource type="InputEventKey" id="InputEventKey_krad3"] +device = -1 +keycode = 84 +unicode = 116 + +[sub_resource type="InputEventKey" id="InputEventKey_bnnig"] +device = -1 +keycode = 4194325 + +[sub_resource type="InputEventKey" id="InputEventKey_tajfr"] +device = -1 +keycode = 4194306 + +[resource] +script = ExtResource("1_pf0gk") +title = "WORKMAN" +move_forward = SubResource("InputEventKey_lei27") +move_backward = SubResource("InputEventKey_lc0ss") +move_left = SubResource("InputEventKey_7juwk") +move_right = SubResource("InputEventKey_qfke7") +jump = SubResource("InputEventKey_2hgt5") +sprint = SubResource("InputEventKey_bnnig") +interact = SubResource("InputEventKey_bg51j") +open_text_chat = SubResource("InputEventKey_tbuvp") +ready = SubResource("InputEventKey_krad3") +pause = SubResource("InputEventKey_tm5f1") +equip_card_in_gauntlet = SubResource("InputEventKey_ikcft") +view_map = SubResource("InputEventKey_tajfr") diff --git a/Resources/StatusEffects/on_fire.tres b/Resources/StatusEffects/on_fire.tres new file mode 100644 index 0000000..87ed2e0 --- /dev/null +++ b/Resources/StatusEffects/on_fire.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="StatusStats" load_steps=3 format=3 uid="uid://dbanx8taicddm"] + +[ext_resource type="Texture2D" uid="uid://c0h8yi1xe4ru5" path="res://Assets/Textures/on_fire_icon.png" id="1_ebohu"] +[ext_resource type="Script" path="res://Scripts/Resources/status_stats.gd" id="1_ogrf4"] + +[resource] +script = ExtResource("1_ogrf4") +unique = false +proc_frequency = 1.0 +duration = 3.0 +potency = 2.0 +icon = ExtResource("1_ebohu") diff --git a/Resources/StatusEffects/sticky.tres b/Resources/StatusEffects/sticky.tres new file mode 100644 index 0000000..cdec76f --- /dev/null +++ b/Resources/StatusEffects/sticky.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="StatusStats" load_steps=3 format=3 uid="uid://d0643gfp52x3s"] + +[ext_resource type="Script" path="res://Scripts/Resources/status_stats.gd" id="1_57gd1"] +[ext_resource type="Texture2D" uid="uid://bpixdxdjnr5tw" path="res://Assets/Textures/glue_icon.png" id="1_b1meh"] + +[resource] +script = ExtResource("1_57gd1") +unique = true +proc_frequency = 0.0 +duration = 5.0 +potency = 0.3 +icon = ExtResource("1_b1meh") diff --git a/Resources/TurretStats/accelerator.tres b/Resources/TurretStats/accelerator.tres new file mode 100644 index 0000000..73af902 --- /dev/null +++ b/Resources/TurretStats/accelerator.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://cc20tomywj0jm"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_jhska"] + +[resource] +script = ExtResource("1_jhska") +can_target = 1 +damage = 1.0 +fire_range = 15.0 +fire_rate = 4.0 diff --git a/Resources/TurretStats/assault.tres b/Resources/TurretStats/assault.tres new file mode 100644 index 0000000..bd2b538 --- /dev/null +++ b/Resources/TurretStats/assault.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://cktq4o3yuxgsa"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_ujduk"] + +[resource] +script = ExtResource("1_ujduk") +can_target = 1 +damage = 1.0 +fire_range = 15.0 +fire_rate = 5.0 diff --git a/Resources/TurretStats/bomblauncher.tres b/Resources/TurretStats/bomblauncher.tres new file mode 100644 index 0000000..213f30f --- /dev/null +++ b/Resources/TurretStats/bomblauncher.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://crmsk6lvp5i4e"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_2a4i2"] + +[resource] +script = ExtResource("1_2a4i2") +can_target = 1 +damage = 30.0 +fire_range = 10.0 +fire_rate = 0.2 diff --git a/Resources/TurretStats/flametower.tres b/Resources/TurretStats/flametower.tres new file mode 100644 index 0000000..526877b --- /dev/null +++ b/Resources/TurretStats/flametower.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://5ywipj3632u8"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_h37p4"] + +[resource] +script = ExtResource("1_h37p4") +can_target = 1 +damage = 0.0 +fire_range = 4.0 +fire_rate = 1.0 diff --git a/Resources/TurretStats/glue.tres b/Resources/TurretStats/glue.tres new file mode 100644 index 0000000..ba435d6 --- /dev/null +++ b/Resources/TurretStats/glue.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://dhcukj44khkd7"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_ntl50"] + +[resource] +script = ExtResource("1_ntl50") +can_target = 1 +damage = 0.0 +fire_range = 20.0 +fire_rate = 1.0 diff --git a/Resources/TurretStats/rocketlauncher.tres b/Resources/TurretStats/rocketlauncher.tres new file mode 100644 index 0000000..e1d1c24 --- /dev/null +++ b/Resources/TurretStats/rocketlauncher.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://duofn25nuu84q"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_g11ny"] + +[resource] +script = ExtResource("1_g11ny") +can_target = 2 +damage = 6.0 +fire_range = 20.0 +fire_rate = 0.15 diff --git a/Resources/TurretStats/sniper.tres b/Resources/TurretStats/sniper.tres new file mode 100644 index 0000000..2cc921c --- /dev/null +++ b/Resources/TurretStats/sniper.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://ddw7pj1ckwmp8"] + +[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_xsq5r"] + +[resource] +script = ExtResource("1_xsq5r") +can_target = 3 +damage = 20.0 +fire_range = 20.0 +fire_rate = 0.6 diff --git a/Resources/WeaponStats/accelerator.tres b/Resources/WeaponStats/accelerator.tres new file mode 100644 index 0000000..4cb4e70 --- /dev/null +++ b/Resources/WeaponStats/accelerator.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://ouwge5etb4me"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_lgw1t"] + +[resource] +script = ExtResource("1_lgw1t") +damage = 1 +fire_rate = 12.0 +fire_range = 25.0 diff --git a/Resources/WeaponStats/assault.tres b/Resources/WeaponStats/assault.tres new file mode 100644 index 0000000..fbb9b22 --- /dev/null +++ b/Resources/WeaponStats/assault.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://w15ojqyxd72q"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_ttw2m"] + +[resource] +script = ExtResource("1_ttw2m") +damage = 3 +fire_rate = 10.0 +fire_range = 25.0 diff --git a/Resources/WeaponStats/bomblauncher.tres b/Resources/WeaponStats/bomblauncher.tres new file mode 100644 index 0000000..c86aec3 --- /dev/null +++ b/Resources/WeaponStats/bomblauncher.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://kbaiy5u6imtu"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_xiddx"] + +[resource] +script = ExtResource("1_xiddx") +damage = 10 +fire_rate = 1.0 +fire_range = 6.0 diff --git a/Resources/WeaponStats/flamethrower.tres b/Resources/WeaponStats/flamethrower.tres new file mode 100644 index 0000000..5f00316 --- /dev/null +++ b/Resources/WeaponStats/flamethrower.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://c4ihsd13o1esd"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_kt5ga"] + +[resource] +script = ExtResource("1_kt5ga") +damage = 0 +fire_rate = 0.0 +fire_range = 0.0 diff --git a/Resources/WeaponStats/glue.tres b/Resources/WeaponStats/glue.tres new file mode 100644 index 0000000..22d1e79 --- /dev/null +++ b/Resources/WeaponStats/glue.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dnucn65m12dmq"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_s171y"] + +[resource] +script = ExtResource("1_s171y") +damage = 0 +fire_rate = 2.0 +fire_range = 20.0 diff --git a/Resources/WeaponStats/rocketlauncher.tres b/Resources/WeaponStats/rocketlauncher.tres new file mode 100644 index 0000000..e6672c0 --- /dev/null +++ b/Resources/WeaponStats/rocketlauncher.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dtfgyt85mp1ar"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_sg2a6"] + +[resource] +script = ExtResource("1_sg2a6") +damage = 8 +fire_rate = 0.5 +fire_range = 40.0 diff --git a/Resources/WeaponStats/sniper.tres b/Resources/WeaponStats/sniper.tres new file mode 100644 index 0000000..9a29f13 --- /dev/null +++ b/Resources/WeaponStats/sniper.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://85iany3x0uv2"] + +[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_idnx0"] + +[resource] +script = ExtResource("1_idnx0") +damage = 30 +fire_rate = 1.2 +fire_range = 80.0 diff --git a/Scenes/8_direction_sprite.tscn b/Scenes/8_direction_sprite.tscn new file mode 100644 index 0000000..7b9f564 --- /dev/null +++ b/Scenes/8_direction_sprite.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://ri8r03wqy80t"] + +[ext_resource type="Script" path="res://Scripts/eight_direction_sprite.gd" id="1_ipfb5"] +[ext_resource type="Texture2D" uid="uid://bf3gkg7f2oyg7" path="res://Assets/TextureAtlases/player.tres" id="2_kkoy2"] + +[node name="EightDirectionSprite" type="Sprite3D"] +billboard = 2 +texture_filter = 0 +texture = ExtResource("2_kkoy2") +script = ExtResource("1_ipfb5") diff --git a/Scenes/Menus/LoadoutEditor.tscn b/Scenes/Menus/LoadoutEditor.tscn new file mode 100644 index 0000000..31f0a41 --- /dev/null +++ b/Scenes/Menus/LoadoutEditor.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=2 format=3 uid="uid://3kcl30sump8c"] + +[ext_resource type="Script" path="res://Scripts/loadout_editor.gd" id="1_y0cit"] + +[node name="Panel" type="Panel"] +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 90.0 +offset_top = -142.5 +offset_right = 545.0 +offset_bottom = 142.5 +grow_vertical = 2 +script = ExtResource("1_y0cit") + +[node name="HBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="HBoxContainer"] +layout_mode = 2 +text = "Choose Character" diff --git a/Scenes/Menus/alert_popup.tscn b/Scenes/Menus/alert_popup.tscn new file mode 100644 index 0000000..6c01c05 --- /dev/null +++ b/Scenes/Menus/alert_popup.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=3 uid="uid://6a277g802os0"] + +[ext_resource type="Script" path="res://Scripts/alert_popup.gd" id="1_cac03"] + +[node name="Control" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_cac03") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Unable to connect to server" + +[node name="Button" type="Button" parent="VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "OK" + +[connection signal="pressed" from="VBoxContainer/Button" to="." method="_on_button_pressed"] diff --git a/Scenes/Menus/confirmation_popup.tscn b/Scenes/Menus/confirmation_popup.tscn new file mode 100644 index 0000000..8711ca4 --- /dev/null +++ b/Scenes/Menus/confirmation_popup.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=3 uid="uid://f46qh73hrk4y"] + +[ext_resource type="Script" path="res://Scripts/confirmation_popup.gd" id="1_x7akt"] + +[node name="ConfirmationPopup" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -67.5 +offset_top = -30.5 +offset_right = 67.5 +offset_bottom = 30.5 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_x7akt") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Some Text?" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Confirm" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Confirm" + +[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Cancel" + +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Confirm" to="." method="_on_confirm_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_pressed"] diff --git a/Scenes/Menus/lost_game_screen.tscn b/Scenes/Menus/lost_game_screen.tscn new file mode 100644 index 0000000..b456805 --- /dev/null +++ b/Scenes/Menus/lost_game_screen.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://dsydnch32qh2h"] + +[ext_resource type="Script" path="res://Scripts/lost_game_screen.gd" id="1_1pne8"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_1pne8") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -33.5 +offset_top = 145.0 +offset_right = 33.5 +offset_bottom = 26.0 +grow_horizontal = 2 +text = "You Lost" + +[node name="RestartButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -44.0 +offset_top = 270.0 +offset_right = -161.0 +offset_bottom = 31.0 +grow_horizontal = 2 +text = "Play Again" + +[node name="QuitButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = 264.0 +offset_top = 270.0 +offset_right = 21.0 +offset_bottom = 31.0 +grow_horizontal = 2 +text = "Quit" + +[connection signal="pressed" from="RestartButton" to="." method="_on_restart_button_pressed"] +[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/Scenes/Menus/main_menu.tscn b/Scenes/Menus/main_menu.tscn new file mode 100644 index 0000000..265dd6e --- /dev/null +++ b/Scenes/Menus/main_menu.tscn @@ -0,0 +1,104 @@ +[gd_scene load_steps=3 format=3 uid="uid://8yv7excojcg0"] + +[ext_resource type="Theme" uid="uid://b6a0ip4p72tgx" path="res://new_theme.tres" id="1_p1cib"] +[ext_resource type="Script" path="res://Scripts/main_menu.gd" id="2_ivytu"] + +[node name="MainMenu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_p1cib") +script = ExtResource("2_ivytu") + +[node name="Title" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -559.5 +offset_top = 25.0 +offset_right = 559.5 +offset_bottom = 88.0 +grow_horizontal = 2 + +[node name="Label" type="Label" parent="Title"] +layout_mode = 2 +text = "MULTIPLAYER TOWER DEFENSE CARD GAME ROGUELIKE !!!" +horizontal_alignment = 1 + +[node name="MainControls" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -71.0 +offset_top = -81.0 +offset_right = 71.0 +offset_bottom = 81.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MainControls"] +layout_mode = 2 + +[node name="PlayButton" type="Button" parent="MainControls/VBoxContainer"] +layout_mode = 2 +text = "Play" + +[node name="MultiplayerButton" type="Button" parent="MainControls/VBoxContainer"] +layout_mode = 2 +text = "Multiplayer" + +[node name="OptionsButton" type="Button" parent="MainControls/VBoxContainer"] +layout_mode = 2 +text = "Options +" + +[node name="QuitButton" type="Button" parent="MainControls/VBoxContainer"] +layout_mode = 2 +text = "Quit +" + +[node name="ProfileEditor" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -181.5 +offset_top = -140.0 +offset_right = 181.5 +offset_bottom = -30.0 +grow_horizontal = 2 +grow_vertical = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="ProfileEditor"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ProfileEditor/VBoxContainer"] +layout_mode = 2 +text = "Display Name +" + +[node name="HBoxContainer" type="HBoxContainer" parent="ProfileEditor/VBoxContainer"] +layout_mode = 2 + +[node name="DisplayName" type="Label" parent="ProfileEditor/VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Dummy Name" + +[node name="DisplayNameEdit" type="Button" parent="ProfileEditor/VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Change" + +[connection signal="pressed" from="MainControls/VBoxContainer/PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="pressed" from="MainControls/VBoxContainer/MultiplayerButton" to="." method="_on_multiplayer_button_pressed"] +[connection signal="pressed" from="MainControls/VBoxContainer/OptionsButton" to="." method="_on_options_button_pressed"] +[connection signal="pressed" from="MainControls/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"] +[connection signal="pressed" from="ProfileEditor/VBoxContainer/HBoxContainer/DisplayNameEdit" to="." method="_on_display_name_edit_pressed"] diff --git a/Scenes/Menus/multiplayer_lobby.tscn b/Scenes/Menus/multiplayer_lobby.tscn new file mode 100644 index 0000000..2f74cc8 --- /dev/null +++ b/Scenes/Menus/multiplayer_lobby.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=7 format=3 uid="uid://cwvprrvk4l2k0"] + +[ext_resource type="Theme" uid="uid://b6a0ip4p72tgx" path="res://new_theme.tres" id="1_l1spu"] +[ext_resource type="Script" path="res://Scripts/multiplayer_lobby.gd" id="2_nb860"] +[ext_resource type="PackedScene" uid="uid://dpt3kpixawyby" path="res://Scenes/UI/scoreboard.tscn" id="3_f6bia"] +[ext_resource type="PackedScene" uid="uid://3kcl30sump8c" path="res://Scenes/Menus/LoadoutEditor.tscn" id="4_bmg55"] +[ext_resource type="PackedScene" uid="uid://bvfit0sy2tnw4" path="res://Scenes/Menus/server_form.tscn" id="5_bqbwv"] +[ext_resource type="PackedScene" uid="uid://ddmg342ff2qaq" path="res://Scenes/UI/chatbox.tscn" id="6_wtqwd"] + +[node name="multiplayer_lobby" type="Control" node_paths=PackedStringArray("server_form", "scoreboard", "loadout_editor", "chatbox")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme = ExtResource("1_l1spu") +script = ExtResource("2_nb860") +server_form = NodePath("ServerForm") +scoreboard = NodePath("Scoreboard") +loadout_editor = NodePath("Panel") +chatbox = NodePath("Chatbox") + +[node name="ServerForm" parent="." instance=ExtResource("5_bqbwv")] +layout_mode = 1 +offset_left = -151.0 +offset_top = -112.0 +offset_right = 151.0 +offset_bottom = 112.0 + +[node name="Scoreboard" parent="." instance=ExtResource("3_f6bia")] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -472.0 +offset_right = -50.0 +grow_horizontal = 0 + +[node name="Panel" parent="." instance=ExtResource("4_bmg55")] +visible = false +layout_mode = 1 +anchors_preset = -1 +offset_left = 50.0 +offset_right = 455.0 + +[node name="ReadyButton" type="Button" parent="."] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -81.0 +offset_top = 311.0 +offset_right = -240.0 +offset_bottom = 19.0 +grow_horizontal = 0 +grow_vertical = 2 +text = "Ready" + +[node name="Chatbox" parent="." instance=ExtResource("6_wtqwd")] +layout_mode = 1 +offset_bottom = -507.0 + +[connection signal="player_connected" from="." to="Scoreboard" method="add_player"] +[connection signal="player_disconnected" from="." to="Scoreboard" method="remove_player"] +[connection signal="connect_button_pressed" from="ServerForm" to="." method="connect_to_server"] +[connection signal="connect_button_pressed" from="ServerForm" to="ServerForm" method="set_visible" binds= [false]] +[connection signal="host_button_pressed" from="ServerForm" to="." method="create_server"] +[connection signal="host_button_pressed" from="ServerForm" to="ServerForm" method="set_visible" binds= [false]] +[connection signal="pressed" from="ReadyButton" to="." method="ready_player"] +[connection signal="pressed" from="ReadyButton" to="ReadyButton" method="set_visible" binds= [false]] diff --git a/Scenes/Menus/options_menu.tscn b/Scenes/Menus/options_menu.tscn new file mode 100644 index 0000000..839667c --- /dev/null +++ b/Scenes/Menus/options_menu.tscn @@ -0,0 +1,268 @@ +[gd_scene load_steps=3 format=3 uid="uid://clulh7v8c7h85"] + +[ext_resource type="Script" path="res://Scripts/options_menu.gd" id="1_bievw"] + +[sub_resource type="ImageTexture" id="ImageTexture_03x6q"] + +[node name="OptionsMenu" type="PanelContainer" node_paths=PackedStringArray("look_sens_slider", "look_sens_input", "toggle_sprint_checkbox", "vsync_dropdown", "aa_dropdown", "window_dropdown", "invert_lookY", "invert_lookX", "fov_input", "fov_slider")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 30.0 +offset_top = 30.0 +offset_right = -30.0 +offset_bottom = -30.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_bievw") +look_sens_slider = NodePath("VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/HSlider") +look_sens_input = NodePath("VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/SpinBox") +toggle_sprint_checkbox = NodePath("VBoxContainer/TabContainer/Gameplay/ToggleSprint/CenterContainer/CheckButton") +vsync_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/VSync/OptionButton") +aa_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/AntiAliasing/OptionButton") +window_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/Windowed/OptionButton") +invert_lookY = NodePath("VBoxContainer/TabContainer/Gameplay/InvertMouseY/CenterContainer/CheckButton") +invert_lookX = NodePath("VBoxContainer/TabContainer/Gameplay/InvertMouseX/CenterContainer/CheckButton") +fov_input = NodePath("VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/SpinBox") +fov_slider = NodePath("VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/HSlider") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Gameplay" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +layout_mode = 2 + +[node name="MouseSens" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/MouseSens"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Look Sensitivity" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay/MouseSens"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer"] +layout_mode = 2 +theme_override_icons/updown = SubResource("ImageTexture_03x6q") +step = 0.01 +alignment = 1 +update_on_text_changed = true + +[node name="HSlider" type="HSlider" parent="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +step = 0.01 +scrollable = false + +[node name="ToggleSprint" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Toggle Sprint" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InvertMouseY" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Invert Look Y" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InvertMouseX" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Invert Look X" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Graphics" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +layout_mode = 2 + +[node name="FOV" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Field Of View" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer"] +layout_mode = 2 +theme_override_icons/updown = SubResource("ImageTexture_03x6q") +min_value = 40.0 +max_value = 160.0 +value = 100.0 +allow_greater = true +allow_lesser = true +alignment = 1 +update_on_text_changed = true + +[node name="HSlider" type="HSlider" parent="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +min_value = 40.0 +max_value = 160.0 +value = 100.0 +scrollable = false + +[node name="VSync" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/VSync"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "V-Sync" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/VSync"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 4 +selected = 1 +popup/item_0/text = "Off" +popup/item_0/id = 0 +popup/item_1/text = "On" +popup/item_1/id = 1 +popup/item_2/text = "Adaptive" +popup/item_2/id = 2 +popup/item_3/text = "Triple Buffered" +popup/item_3/id = 3 + +[node name="AntiAliasing" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/AntiAliasing"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Anti-Aliasing +" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/AntiAliasing"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 3 +selected = 0 +popup/item_0/text = "Off" +popup/item_0/id = 0 +popup/item_1/text = "FXAA" +popup/item_1/id = 1 +popup/item_2/text = "TAA" +popup/item_2/id = 2 + +[node name="Windowed" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/Windowed"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Window Mode" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/Windowed"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 3 +selected = 0 +popup/item_0/text = "Windowed" +popup/item_0/id = 0 +popup/item_1/text = "Borderless Windowed" +popup/item_1/id = 1 +popup/item_2/text = "Fullscreen" +popup/item_2/id = 2 + +[node name="Keybinds" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Keybinds"] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/TabContainer/Keybinds"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Keybinds/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Audio" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +alignment = 2 + +[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Discard" + +[node name="Confirm" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Confirm" + +[connection signal="value_changed" from="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/HSlider" to="." method="_on_mouse_sens_h_slider_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/SpinBox" to="." method="_on_fov_spin_box_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/HSlider" to="." method="_on_fov_h_slider_value_changed"] +[connection signal="item_selected" from="VBoxContainer/TabContainer/Graphics/VSync/OptionButton" to="." method="_on_vsync_option_button_item_selected"] +[connection signal="item_selected" from="VBoxContainer/TabContainer/Graphics/AntiAliasing/OptionButton" to="." method="_on_AA_option_button_item_selected"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Confirm" to="." method="_on_confirm_pressed"] diff --git a/Scenes/Menus/pause_menu.tscn b/Scenes/Menus/pause_menu.tscn new file mode 100644 index 0000000..defcd5c --- /dev/null +++ b/Scenes/Menus/pause_menu.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=3 format=3 uid="uid://buvgdem68wtev"] + +[ext_resource type="Theme" uid="uid://b6a0ip4p72tgx" path="res://new_theme.tres" id="1_gaupv"] +[ext_resource type="Script" path="res://Scripts/pause_menu.gd" id="2_4pn2l"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_gaupv") +script = ExtResource("2_4pn2l") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.278431, 0.278431, 0.278431, 0.545098) + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +layout_mode = 2 + +[node name="Resume" type="Button" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Resume" + +[node name="Options" type="Button" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Options" + +[node name="QuitToMainMenu" type="Button" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Quit to main menu" + +[node name="QuitToDesktop" type="Button" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Quit to desktop" + +[connection signal="pressed" from="PanelContainer/VBoxContainer/Resume" to="." method="_on_resume_pressed"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Options" to="." method="_on_options_pressed"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/QuitToMainMenu" to="." method="_on_quit_to_main_menu_pressed"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/QuitToDesktop" to="." method="_on_quit_to_desktop_pressed"] diff --git a/Scenes/Menus/server_form.tscn b/Scenes/Menus/server_form.tscn new file mode 100644 index 0000000..9262d7f --- /dev/null +++ b/Scenes/Menus/server_form.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=2 format=3 uid="uid://bvfit0sy2tnw4"] + +[ext_resource type="Script" path="res://Scripts/server_form.gd" id="1_43oaq"] + +[node name="ServerForm" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -81.0 +offset_top = -85.5 +offset_right = 81.0 +offset_bottom = 85.5 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_43oaq") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Server IP:" + +[node name="ServerIP" type="LineEdit" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "localhost" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 +text = "Server Port:" + +[node name="ServerPort" type="LineEdit" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "default" + +[node name="Connect" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Connect" + +[node name="Host" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Host" + +[connection signal="pressed" from="VBoxContainer/Connect" to="." method="_on_connect_pressed"] +[connection signal="pressed" from="VBoxContainer/Host" to="." method="_on_host_pressed"] diff --git a/Scenes/Menus/singleplayer_lobby.tscn b/Scenes/Menus/singleplayer_lobby.tscn new file mode 100644 index 0000000..a79f77e --- /dev/null +++ b/Scenes/Menus/singleplayer_lobby.tscn @@ -0,0 +1,62 @@ +[gd_scene load_steps=6 format=3 uid="uid://176c6fuhg5ic"] + +[ext_resource type="Theme" uid="uid://b6a0ip4p72tgx" path="res://new_theme.tres" id="1_2aur6"] +[ext_resource type="PackedScene" uid="uid://dpt3kpixawyby" path="res://Scenes/UI/scoreboard.tscn" id="1_423py"] +[ext_resource type="Script" path="res://Scripts/singleplayer_lobby.gd" id="1_nd17k"] +[ext_resource type="PackedScene" uid="uid://3kcl30sump8c" path="res://Scenes/Menus/LoadoutEditor.tscn" id="2_wpyw5"] +[ext_resource type="PackedScene" uid="uid://ddmg342ff2qaq" path="res://Scenes/UI/chatbox.tscn" id="3_l8xy3"] + +[node name="singleplayer_lobby" type="Control" node_paths=PackedStringArray("scoreboard", "loadout_editor", "chatbox")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme = ExtResource("1_2aur6") +script = ExtResource("1_nd17k") +scoreboard = NodePath("Scoreboard") +loadout_editor = NodePath("Panel") +chatbox = NodePath("Chatbox") + +[node name="Scoreboard" parent="." instance=ExtResource("1_423py")] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -472.0 +offset_right = -50.0 +grow_horizontal = 0 + +[node name="Panel" parent="." instance=ExtResource("2_wpyw5")] +visible = false +layout_mode = 1 +anchors_preset = -1 +offset_left = 50.0 +offset_right = 455.0 + +[node name="ReadyButton" type="Button" parent="."] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -81.0 +offset_top = 311.0 +offset_right = -240.0 +offset_bottom = 19.0 +grow_horizontal = 0 +grow_vertical = 2 +text = "Ready" + +[node name="Chatbox" parent="." instance=ExtResource("3_l8xy3")] +visible = false +layout_mode = 1 +offset_bottom = -507.0 + +[connection signal="pressed" from="ReadyButton" to="Scoreboard" method="set_player_ready_state" binds= [1, true]] +[connection signal="pressed" from="ReadyButton" to="ReadyButton" method="set_visible" binds= [false]] diff --git a/Scenes/Menus/text_input_popup.tscn b/Scenes/Menus/text_input_popup.tscn new file mode 100644 index 0000000..320aa34 --- /dev/null +++ b/Scenes/Menus/text_input_popup.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=2 format=3 uid="uid://dccsyymk4uko6"] + +[ext_resource type="Script" path="res://Scripts/text_input_popup.gd" id="1_ve6eb"] + +[node name="TextInputPopup" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -90.0 +offset_top = -35.0 +offset_right = 90.0 +offset_bottom = 35.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ve6eb") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +layout_mode = 2 +placeholder_text = "Dummy Text" + +[node name="Button" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Confirm +" + +[connection signal="pressed" from="VBoxContainer/Button" to="." method="_on_button_pressed"] diff --git a/Scenes/Menus/won_game_screen.tscn b/Scenes/Menus/won_game_screen.tscn new file mode 100644 index 0000000..d7641e2 --- /dev/null +++ b/Scenes/Menus/won_game_screen.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://ce0m8vbjbng6o"] + +[ext_resource type="Script" path="res://Scripts/won_game_screen.gd" id="1_oa7nq"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_oa7nq") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.486275) + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -20.0 +offset_top = 260.0 +offset_right = 20.0 +offset_bottom = 23.0 +grow_horizontal = 2 +text = "You WIN :3" + +[node name="PlayButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -52.5 +offset_top = 300.0 +offset_right = -173.0 +offset_bottom = 31.0 +grow_horizontal = 2 +text = "play again :3" + +[node name="QuitButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = 348.0 +offset_top = 300.0 +offset_right = -173.0 +offset_bottom = 31.0 +grow_horizontal = 2 +text = "quit to main menu :<" + +[connection signal="pressed" from="PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/Scenes/UI/card_hand.tscn b/Scenes/UI/card_hand.tscn new file mode 100644 index 0000000..0eb253b --- /dev/null +++ b/Scenes/UI/card_hand.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=4 format=3 uid="uid://dixtx38u4jhd7"] + +[ext_resource type="Script" path="res://Scripts/card_hand.gd" id="1_2cfmh"] +[ext_resource type="Texture2D" uid="uid://dlqnhs8or4ik2" path="res://Assets/Textures/cardhand.png" id="1_d5oo3"] +[ext_resource type="Texture2D" uid="uid://buf8t5gc7iw3a" path="res://Assets/TextureAtlases/rarityborders.tres" id="3_pclfx"] + +[node name="Node2D" type="Node2D" node_paths=PackedStringArray("rarity_sprite", "title_text", "damage_text_text", "damage_text", "fire_rate_text_text", "fire_rate_text", "range_text_text", "range_text")] +script = ExtResource("1_2cfmh") +rarity_sprite = NodePath("Sprite2D2") +title_text = NodePath("Title") +damage_text_text = NodePath("DamageText") +damage_text = NodePath("Damage") +fire_rate_text_text = NodePath("FireRateText") +fire_rate_text = NodePath("FireRate") +range_text_text = NodePath("RangeText") +range_text = NodePath("Range") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture_filter = 1 +position = Vector2(96, 96) +scale = Vector2(3, 3) +texture = ExtResource("1_d5oo3") + +[node name="Sprite2D2" type="Sprite2D" parent="."] +texture_filter = 1 +position = Vector2(96, 96) +scale = Vector2(3, 3) +texture = ExtResource("3_pclfx") +region_enabled = true +region_rect = Rect2(0, 0, 64, 64) + +[node name="Title" type="Label" parent="."] +offset_left = 48.0 +offset_top = 20.0 +offset_right = 150.0 +offset_bottom = 46.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "spider queen" +horizontal_alignment = 1 + +[node name="DamageText" type="Label" parent="."] +offset_left = 30.0 +offset_top = 65.0 +offset_right = 132.0 +offset_bottom = 91.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Damage: " +horizontal_alignment = 1 + +[node name="Damage" type="Label" parent="."] +offset_left = 78.0 +offset_top = 65.0 +offset_right = 180.0 +offset_bottom = 91.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "45" +horizontal_alignment = 1 + +[node name="FireRateText" type="Label" parent="."] +offset_left = 31.0 +offset_top = 89.0 +offset_right = 133.0 +offset_bottom = 115.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Fire Rate: " +horizontal_alignment = 1 + +[node name="FireRate" type="Label" parent="."] +offset_left = 77.0 +offset_top = 90.0 +offset_right = 179.0 +offset_bottom = 116.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "3" +horizontal_alignment = 1 + +[node name="RangeText" type="Label" parent="."] +offset_left = 44.0 +offset_top = 111.0 +offset_right = 146.0 +offset_bottom = 137.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Range: " +horizontal_alignment = 1 + +[node name="Range" type="Label" parent="."] +offset_left = 87.0 +offset_top = 111.0 +offset_right = 189.0 +offset_bottom = 137.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "55" +horizontal_alignment = 1 diff --git a/Scenes/UI/chatbox.tscn b/Scenes/UI/chatbox.tscn new file mode 100644 index 0000000..a1b1ee7 --- /dev/null +++ b/Scenes/UI/chatbox.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=2 format=3 uid="uid://ddmg342ff2qaq"] + +[ext_resource type="Script" path="res://Scripts/chatbox.gd" id="1_k3g22"] + +[node name="Chatbox" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_k3g22") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 15.0 +offset_top = -210.0 +offset_right = 350.0 +offset_bottom = -10.0 +grow_vertical = 0 +mouse_filter = 2 +alignment = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 +scroll_following = true + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +visible = false +layout_mode = 2 +mouse_filter = 2 +context_menu_enabled = false +selecting_enabled = false diff --git a/Scenes/UI/lifebar_segment.tscn b/Scenes/UI/lifebar_segment.tscn new file mode 100644 index 0000000..947060c --- /dev/null +++ b/Scenes/UI/lifebar_segment.tscn @@ -0,0 +1,558 @@ +[gd_scene load_steps=11 format=3 uid="uid://dko38egcaxubd"] + +[ext_resource type="Script" path="res://Scripts/lifebar_segment.gd" id="1_dvlcq"] +[ext_resource type="Texture2D" uid="uid://0ey8r48lgjw1" path="res://Assets/Textures/lifebar_pip.png" id="1_pianw"] + +[sub_resource type="Animation" id="Animation_i18y2"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect6:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 4)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect6:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect6:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("TextureRect4:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("TextureRect4:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("TextureRect4:modulate") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("TextureRect5:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, 4)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("TextureRect5:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("TextureRect5:modulate") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("TextureRect2:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -4)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("TextureRect2:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("TextureRect2:modulate") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("TextureRect3:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, 0)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("TextureRect3:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("TextureRect3:modulate") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("TextureRect:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -4)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("TextureRect:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("TextureRect:modulate") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} + +[sub_resource type="Animation" id="Animation_a6tv4"] +resource_name = "lose1" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect6:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, 4), Vector2(4.76837e-07, 9)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect6:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.567662] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect6:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_t2ym0"] +resource_name = "lose2" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect4:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(2, 6)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect4:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -0.933911] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect4:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_ueyfw"] +resource_name = "lose3" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect5:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-4, 4), Vector2(-3, 9)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect5:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -1.1286] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect5:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_r4h4h"] +resource_name = "lose4" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect2:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, -4), Vector2(4, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect2:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.582677] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect2:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_defuy"] +resource_name = "lose5" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect3:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-4, 0), Vector2(-1, 4)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect3:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -0.909425] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect3:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_rctjq"] +resource_name = "lose6" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("TextureRect:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-4, -4), Vector2(1, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("TextureRect:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -1.01031] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("TextureRect:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_1s8yp"] +_data = { +"RESET": SubResource("Animation_i18y2"), +"lose1": SubResource("Animation_a6tv4"), +"lose2": SubResource("Animation_t2ym0"), +"lose3": SubResource("Animation_ueyfw"), +"lose4": SubResource("Animation_r4h4h"), +"lose5": SubResource("Animation_defuy"), +"lose6": SubResource("Animation_rctjq") +} + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_dvlcq") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="AnimationPlayer2" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="AnimationPlayer3" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="AnimationPlayer4" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="AnimationPlayer5" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="AnimationPlayer6" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1s8yp") +} + +[node name="TextureRect" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = -4.0 +offset_right = -1.0 +offset_bottom = -1.0 +texture = ExtResource("1_pianw") + +[node name="TextureRect2" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_top = -4.0 +offset_right = 3.0 +offset_bottom = -1.0 +texture = ExtResource("1_pianw") + +[node name="TextureRect3" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_right = -1.0 +offset_bottom = 3.0 +texture = ExtResource("1_pianw") + +[node name="TextureRect4" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_right = 3.0 +offset_bottom = 3.0 +texture = ExtResource("1_pianw") + +[node name="TextureRect5" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 4.0 +offset_right = -1.0 +offset_bottom = 7.0 +texture = ExtResource("1_pianw") + +[node name="TextureRect6" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_top = 4.0 +offset_right = 3.0 +offset_bottom = 7.00004 +texture = ExtResource("1_pianw") diff --git a/Scenes/UI/lives_bar.tscn b/Scenes/UI/lives_bar.tscn new file mode 100644 index 0000000..1db9219 --- /dev/null +++ b/Scenes/UI/lives_bar.tscn @@ -0,0 +1,137 @@ +[gd_scene load_steps=4 format=3 uid="uid://24x18qxqhy0i"] + +[ext_resource type="Texture2D" uid="uid://dvy2lvtotaxb3" path="res://Assets/Textures/lifebar_bg.png" id="1_x27cx"] +[ext_resource type="Script" path="res://Scripts/lives_bar.gd" id="2_lqe7s"] +[ext_resource type="PackedScene" uid="uid://dko38egcaxubd" path="res://Scenes/UI/lifebar_segment.tscn" id="3_6hp86"] + +[node name="LivesBar" type="TextureRect" node_paths=PackedStringArray("segments")] +texture_filter = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_x27cx") +stretch_mode = 2 +script = ExtResource("2_lqe7s") +segments = [NodePath("Control"), NodePath("Control2"), NodePath("Control3"), NodePath("Control4"), NodePath("Control5"), NodePath("Control6"), NodePath("Control7"), NodePath("Control8"), NodePath("Control9"), NodePath("Control10"), NodePath("Control11"), NodePath("Control12"), NodePath("Control13"), NodePath("Control14"), NodePath("Control15"), NodePath("Control16"), NodePath("Control17"), NodePath("Control18"), NodePath("Control19"), NodePath("Control20")] + +[node name="Control" parent="." instance=ExtResource("3_6hp86")] +offset_left = 28.0 +offset_top = 10.0 +offset_right = 28.0 +offset_bottom = 10.0 + +[node name="Control2" parent="." instance=ExtResource("3_6hp86")] +offset_left = 37.0 +offset_top = 10.0 +offset_right = 37.0 +offset_bottom = 10.0 + +[node name="Control3" parent="." instance=ExtResource("3_6hp86")] +offset_left = 46.0 +offset_top = 10.0 +offset_right = 46.0 +offset_bottom = 10.0 + +[node name="Control4" parent="." instance=ExtResource("3_6hp86")] +offset_left = 55.0 +offset_top = 10.0 +offset_right = 55.0 +offset_bottom = 10.0 + +[node name="Control5" parent="." instance=ExtResource("3_6hp86")] +offset_left = 64.0 +offset_top = 10.0 +offset_right = 64.0 +offset_bottom = 10.0 + +[node name="Control6" parent="." instance=ExtResource("3_6hp86")] +offset_left = 73.0 +offset_top = 10.0 +offset_right = 73.0 +offset_bottom = 10.0 + +[node name="Control7" parent="." instance=ExtResource("3_6hp86")] +offset_left = 82.0 +offset_top = 10.0 +offset_right = 82.0 +offset_bottom = 10.0 + +[node name="Control8" parent="." instance=ExtResource("3_6hp86")] +offset_left = 91.0 +offset_top = 10.0 +offset_right = 91.0 +offset_bottom = 10.0 + +[node name="Control9" parent="." instance=ExtResource("3_6hp86")] +offset_left = 100.0 +offset_top = 10.0 +offset_right = 100.0 +offset_bottom = 10.0 + +[node name="Control10" parent="." instance=ExtResource("3_6hp86")] +offset_left = 109.0 +offset_top = 10.0 +offset_right = 109.0 +offset_bottom = 10.0 + +[node name="Control11" parent="." instance=ExtResource("3_6hp86")] +offset_left = 118.0 +offset_top = 10.0 +offset_right = 118.0 +offset_bottom = 10.0 + +[node name="Control12" parent="." instance=ExtResource("3_6hp86")] +offset_left = 127.0 +offset_top = 10.0 +offset_right = 127.0 +offset_bottom = 10.0 + +[node name="Control13" parent="." instance=ExtResource("3_6hp86")] +offset_left = 136.0 +offset_top = 10.0 +offset_right = 136.0 +offset_bottom = 10.0 + +[node name="Control14" parent="." instance=ExtResource("3_6hp86")] +offset_left = 145.0 +offset_top = 10.0 +offset_right = 145.0 +offset_bottom = 10.0 + +[node name="Control15" parent="." instance=ExtResource("3_6hp86")] +offset_left = 154.0 +offset_top = 10.0 +offset_right = 154.0 +offset_bottom = 10.0 + +[node name="Control16" parent="." instance=ExtResource("3_6hp86")] +offset_left = 163.0 +offset_top = 10.0 +offset_right = 163.0 +offset_bottom = 10.0 + +[node name="Control17" parent="." instance=ExtResource("3_6hp86")] +offset_left = 172.0 +offset_top = 10.0 +offset_right = 172.0 +offset_bottom = 10.0 + +[node name="Control18" parent="." instance=ExtResource("3_6hp86")] +offset_left = 181.0 +offset_top = 10.0 +offset_right = 181.0 +offset_bottom = 10.0 + +[node name="Control19" parent="." instance=ExtResource("3_6hp86")] +offset_left = 190.0 +offset_top = 10.0 +offset_right = 190.0 +offset_bottom = 10.0 + +[node name="Control20" parent="." instance=ExtResource("3_6hp86")] +offset_left = 199.0 +offset_top = 10.0 +offset_right = 199.0 +offset_bottom = 10.0 diff --git a/Scenes/UI/scoreboard.tscn b/Scenes/UI/scoreboard.tscn new file mode 100644 index 0000000..06300e6 --- /dev/null +++ b/Scenes/UI/scoreboard.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=3 format=3 uid="uid://dpt3kpixawyby"] + +[ext_resource type="Script" path="res://Scripts/scoreboard.gd" id="1_b5vdp"] +[ext_resource type="PackedScene" uid="uid://bhri8mqjbme2t" path="res://Scenes/UI/scoreboard_entry.tscn" id="2_uer0b"] + +[node name="Scoreboard" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -157.5 +offset_top = -125.0 +offset_right = 157.5 +offset_bottom = 125.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_b5vdp") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +alignment = 1 + +[node name="DummyEntry1" parent="VBoxContainer" instance=ExtResource("2_uer0b")] +layout_mode = 2 + +[node name="DummyEntry2" parent="VBoxContainer" instance=ExtResource("2_uer0b")] +layout_mode = 2 + +[node name="DummyEntry3" parent="VBoxContainer" instance=ExtResource("2_uer0b")] +layout_mode = 2 diff --git a/Scenes/UI/scoreboard_entry.tscn b/Scenes/UI/scoreboard_entry.tscn new file mode 100644 index 0000000..5235c6b --- /dev/null +++ b/Scenes/UI/scoreboard_entry.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=4 format=3 uid="uid://bhri8mqjbme2t"] + +[ext_resource type="Script" path="res://Scripts/scoreboard_entry.gd" id="1_5xryr"] +[ext_resource type="Texture2D" uid="uid://m4ehy5bahsup" path="res://Assets/Textures/ready.png" id="2_yxtr2"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_qhkn8"] +resource_local_to_scene = true +atlas = ExtResource("2_yxtr2") +region = Rect2(0, 0, 32, 32) + +[node name="PlayerListEntry" type="HBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_5xryr") + +[node name="DisplayName" type="Label" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Dummy Player" +horizontal_alignment = 1 + +[node name="CharacterName" type="Label" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Character" +horizontal_alignment = 1 + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 2 +size_flags_horizontal = 8 +texture = SubResource("AtlasTexture_qhkn8") +stretch_mode = 3 diff --git a/Scenes/card_constructor.tscn b/Scenes/card_constructor.tscn new file mode 100644 index 0000000..d125f5d --- /dev/null +++ b/Scenes/card_constructor.tscn @@ -0,0 +1,133 @@ +[gd_scene load_steps=12 format=3 uid="uid://1b2ikdanl66b"] + +[ext_resource type="Script" path="res://Scripts/card_printer.gd" id="1_7rhtj"] +[ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://Scenes/UI/card_hand.tscn" id="2_7ouw1"] +[ext_resource type="PackedScene" uid="uid://dsasunnk47n8o" path="res://Scenes/item_card.tscn" id="2_356ip"] +[ext_resource type="Script" path="res://Scripts/interact_button.gd" id="3_iia6u"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_s02au"] +albedo_color = Color(0.203922, 0.592157, 0.592157, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_0ebt5"] +size = Vector3(2.672, 1.75, 1) + +[sub_resource type="ViewportTexture" id="ViewportTexture_yf4je"] +viewport_path = NodePath("SubViewport") + +[sub_resource type="ViewportTexture" id="ViewportTexture_3q3h0"] +viewport_path = NodePath("SubViewport2") + +[sub_resource type="ViewportTexture" id="ViewportTexture_vyyy4"] +viewport_path = NodePath("SubViewport3") + +[sub_resource type="BoxShape3D" id="BoxShape3D_ikdwj"] +size = Vector3(1.29447, 0.342125, 0.277604) + +[sub_resource type="BoxShape3D" id="BoxShape3D_gv3t5"] +size = Vector3(0.763889, 0.773027, 0.0570252) + +[node name="CardPrinter" type="StaticBody3D" node_paths=PackedStringArray("cards", "button_collider", "button_box", "choice_colliders")] +script = ExtResource("1_7rhtj") +cards = [NodePath("SubViewport/Node2D"), NodePath("SubViewport2/Node2D"), NodePath("SubViewport3/Node2D")] +item_card_scene = ExtResource("2_356ip") +button_collider = NodePath("StaticBody3D/CollisionShape3D2") +button_box = NodePath("StaticBody3D/CollisionShape3D2/CSGBox3D") +choice_colliders = [NodePath("StaticBody3D2/CollisionShape3D2"), NodePath("StaticBody3D3/CollisionShape3D2"), NodePath("StaticBody3D4/CollisionShape3D2")] + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.875, 0) +size = Vector3(2.672, 1.75, 1) +material = SubResource("StandardMaterial3D_s02au") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.875, 0) +shape = SubResource("BoxShape3D_0ebt5") + +[node name="SubViewport" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(192, 192) +render_target_update_mode = 4 + +[node name="Node2D" parent="SubViewport" instance=ExtResource("2_7ouw1")] + +[node name="SubViewport2" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(192, 192) +render_target_update_mode = 4 + +[node name="Node2D" parent="SubViewport2" instance=ExtResource("2_7ouw1")] + +[node name="SubViewport3" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(192, 192) +render_target_update_mode = 4 + +[node name="Node2D" parent="SubViewport3" instance=ExtResource("2_7ouw1")] + +[node name="Node3D" type="Node3D" parent="."] +visible = false + +[node name="Sprite3D" type="Sprite3D" parent="Node3D"] +transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, -0.805106, 1.12938, 0.500052) +texture_filter = 0 +texture = SubResource("ViewportTexture_yf4je") + +[node name="Sprite3D2" type="Sprite3D" parent="Node3D"] +transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0.0180808, 1.12938, 0.500052) +texture_filter = 0 +texture = SubResource("ViewportTexture_3q3h0") + +[node name="Sprite3D3" type="Sprite3D" parent="Node3D"] +transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0.843507, 1.12938, 0.500052) +texture_filter = 0 +texture = SubResource("ViewportTexture_vyyy4") + +[node name="StaticBody3D" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.444448, 0.610684) +collision_layer = 16 +collision_mask = 0 +script = ExtResource("3_iia6u") +press_cost = 10 + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D"] +shape = SubResource("BoxShape3D_ikdwj") + +[node name="CSGBox3D" type="CSGBox3D" parent="StaticBody3D/CollisionShape3D2"] +size = Vector3(1.29447, 0.342125, 0.277604) + +[node name="StaticBody3D2" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.756734, 1.15772, 0.610684) +collision_layer = 16 +collision_mask = 0 +script = ExtResource("3_iia6u") + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) +shape = SubResource("BoxShape3D_gv3t5") + +[node name="StaticBody3D3" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0672475, 1.15772, 0.610684) +collision_layer = 16 +collision_mask = 0 +script = ExtResource("3_iia6u") +button_press_value = 1 + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D3"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) +shape = SubResource("BoxShape3D_gv3t5") + +[node name="StaticBody3D4" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.883877, 1.15772, 0.610684) +collision_layer = 16 +collision_mask = 0 +script = ExtResource("3_iia6u") +button_press_value = 2 + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) +shape = SubResource("BoxShape3D_gv3t5") + +[connection signal="button_interacted" from="StaticBody3D" to="." method="_on_static_body_3d_button_interacted"] +[connection signal="button_interacted" from="StaticBody3D2" to="." method="retrieve_card"] +[connection signal="button_interacted" from="StaticBody3D3" to="." method="retrieve_card"] +[connection signal="button_interacted" from="StaticBody3D4" to="." method="retrieve_card"] diff --git a/Scenes/damage_particle.tscn b/Scenes/damage_particle.tscn new file mode 100644 index 0000000..654a082 --- /dev/null +++ b/Scenes/damage_particle.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=3 format=3 uid="uid://cqtew0t8sttpm"] + +[ext_resource type="Script" path="res://Scripts/damage_particle.gd" id="1_lgvaq"] + +[sub_resource type="ViewportTexture" id="ViewportTexture_ppqlh"] +viewport_path = NodePath("SubViewport") + +[node name="Node3D" type="Sprite3D"] +pixel_size = 0.0006 +billboard = 1 +fixed_size = true +render_priority = 1 +texture = SubResource("ViewportTexture_ppqlh") +script = ExtResource("1_lgvaq") + +[node name="SubViewport" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(172, 57) +render_target_update_mode = 4 + +[node name="Label" type="Label" parent="SubViewport"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_font_sizes/font_size = 60 +text = "12345" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/Scenes/enemy_spawner.tscn b/Scenes/enemy_spawner.tscn new file mode 100644 index 0000000..5d15890 --- /dev/null +++ b/Scenes/enemy_spawner.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://d2yv447trxkwt"] + +[ext_resource type="Script" path="res://Scripts/enemy_spawner.gd" id="1_23wuv"] +[ext_resource type="PackedScene" uid="uid://b0nady5xm88bo" path="res://Worlds/GreenPlanet/Enemies/land_enemy.tscn" id="2_muaoj"] + +[node name="Node3D" type="Node3D"] +script = ExtResource("1_23wuv") +land_enemy_scene = ExtResource("2_muaoj") + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) diff --git a/Scenes/gauntlet.tscn b/Scenes/gauntlet.tscn new file mode 100644 index 0000000..a656729 --- /dev/null +++ b/Scenes/gauntlet.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=5 format=3 uid="uid://dqt1ggtkpkuhs"] + +[ext_resource type="Script" path="res://Scripts/edit_tool.gd" id="1_yf8lt"] +[ext_resource type="PackedScene" uid="uid://ddbbwx0yy16lh" path="res://Scenes/tower_base.tscn" id="2_r3632"] +[ext_resource type="Texture2D" uid="uid://gh4yvnerf1f5" path="res://Assets/Textures/radial.png" id="3_a323w"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_36ot1"] +transparency = 1 + +[node name="EditTool" type="Node3D" node_paths=PackedStringArray("ray", "wall_preview", "progress_bar")] +script = ExtResource("1_yf8lt") +ray = NodePath("RayCast3D") +wall_preview = NodePath("WallPreview") +build_preview_material = SubResource("StandardMaterial3D_36ot1") +progress_bar = NodePath("ProgressBar") + +[node name="RayCast3D" type="RayCast3D" parent="."] +target_position = Vector3(0, 0, -20) +collision_mask = 25 + +[node name="WallPreview" parent="." instance=ExtResource("2_r3632")] +visible = false + +[node name="ProgressBar" type="TextureProgressBar" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -90.0 +offset_top = -90.0 +offset_right = 90.0 +offset_bottom = 90.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(0.5, 0.5) +pivot_offset = Vector2(90, 90) +step = 0.0 +fill_mode = 4 +texture_progress = ExtResource("3_a323w") diff --git a/Scenes/item_card.tscn b/Scenes/item_card.tscn new file mode 100644 index 0000000..66bff77 --- /dev/null +++ b/Scenes/item_card.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://dsasunnk47n8o"] + +[ext_resource type="Script" path="res://Scripts/item_card.gd" id="1_f3ek5"] +[ext_resource type="Script" path="res://Scripts/float_and_spin.gd" id="2_yfdc3"] + +[sub_resource type="Curve" id="Curve_qb7ge"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.5, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bf4ou"] +height = 1.0 + +[node name="Node3D" type="StaticBody3D"] +collision_layer = 8 +collision_mask = 0 +script = ExtResource("1_f3ek5") + +[node name="model" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.7, 0) +target_position = Vector3(0, -10, 0) +script = ExtResource("2_yfdc3") +float_height = 0.7 +curve = SubResource("Curve_qb7ge") + +[node name="CSGSphere3D" type="CSGSphere3D" parent="model"] +radius = 0.1 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.7, 0) +shape = SubResource("CapsuleShape3D_bf4ou") diff --git a/Scenes/path_visual_thing.tscn b/Scenes/path_visual_thing.tscn new file mode 100644 index 0000000..7fa94d6 --- /dev/null +++ b/Scenes/path_visual_thing.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=3 uid="uid://clbw3osqy2ww2"] + +[ext_resource type="Script" path="res://Scripts/path_visual_thing.gd" id="1_pgun7"] +[ext_resource type="Texture2D" uid="uid://cy786nrpcdr5o" path="res://Assets/Textures/minimap_path_visual.png" id="2_0gsds"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lutld"] +albedo_color = Color(0.0509804, 0.337255, 0.709804, 1) + +[node name="PathFollow3D" type="PathFollow3D" node_paths=PackedStringArray("world_model", "minimap_model")] +use_model_front = true +script = ExtResource("1_pgun7") +world_model = NodePath("CSGSphere3D") +minimap_model = NodePath("Sprite3D") + +[node name="CSGSphere3D" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0) +radius = 0.05 +material = SubResource("StandardMaterial3D_lutld") + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.385229, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("2_0gsds") diff --git a/Scenes/status_icon.tscn b/Scenes/status_icon.tscn new file mode 100644 index 0000000..77344da --- /dev/null +++ b/Scenes/status_icon.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=3 uid="uid://dp45xkbsslr0k"] + +[ext_resource type="Texture2D" uid="uid://bpixdxdjnr5tw" path="res://Assets/Textures/glue_icon.png" id="1_d3stl"] + +[node name="StatusIcon" type="TextureRect"] +texture_filter = 1 +texture = ExtResource("1_d3stl") diff --git a/Scenes/target_icon.tscn b/Scenes/target_icon.tscn new file mode 100644 index 0000000..fd6d151 --- /dev/null +++ b/Scenes/target_icon.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://csufsbi64asau"] + +[ext_resource type="Texture2D" uid="uid://hnfa76d6tdi" path="res://Assets/Textures/target_icon.png" id="1_r4a3f"] + +[node name="Node3D" type="Sprite3D"] +sorting_offset = 20.0 +pixel_size = 0.003 +billboard = 1 +no_depth_test = true +fixed_size = true +texture_filter = 0 +texture = ExtResource("1_r4a3f") diff --git a/Scenes/tower_base.tscn b/Scenes/tower_base.tscn new file mode 100644 index 0000000..aaf4606 --- /dev/null +++ b/Scenes/tower_base.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=5 format=3 uid="uid://ddbbwx0yy16lh"] + +[ext_resource type="Script" path="res://Scripts/tower_base.gd" id="1_tghvd"] +[ext_resource type="Script" path="res://Scripts/inventory.gd" id="2_p5c7g"] +[ext_resource type="Texture2D" uid="uid://ba85u6i558x4w" path="res://Assets/Textures/minimap_node.png" id="3_01hk3"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_lc72v"] + +[node name="Node3D" type="StaticBody3D" node_paths=PackedStringArray("inventory", "block", "collider", "minimap_icon")] +collision_layer = 17 +script = ExtResource("1_tghvd") +inventory = NodePath("Inventory") +block = NodePath("CSGBox3D") +collider = NodePath("CollisionShape3D") +minimap_icon = NodePath("Sprite3D") + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) + +[node name="Inventory" type="Node" parent="."] +script = ExtResource("2_p5c7g") +max_size = 1 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +shape = SubResource("BoxShape3D_lc72v") + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(3.5, 0, 0, 0, -1.5299e-07, 3.5, 0, -3.5, -1.5299e-07, 0, 3.09462, 0) +layers = 4 +modulate = Color(0, 1, 0, 1) +texture_filter = 0 +texture = ExtResource("3_01hk3") diff --git a/Scenes/tower_frame.tscn b/Scenes/tower_frame.tscn new file mode 100644 index 0000000..33b991c --- /dev/null +++ b/Scenes/tower_frame.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=6 format=3 uid="uid://c2cpc8f0l7soh"] + +[ext_resource type="Texture2D" uid="uid://ba85u6i558x4w" path="res://Assets/Textures/minimap_node.png" id="1_phew5"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xt3aj"] +albedo_color = Color(0.0980392, 0.309804, 0.180392, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gbm1j"] +albedo_color = Color(0.0980392, 0.309804, 0.180392, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_18qg8"] +albedo_color = Color(0.0980392, 0.309804, 0.180392, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ip8b2"] +albedo_color = Color(0.0980392, 0.309804, 0.180392, 1) + +[node name="Node3D" type="Node3D"] + +[node name="CSGBox3D2" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, 0.525) +size = Vector3(1, 0.04, 0.05) +material = SubResource("StandardMaterial3D_xt3aj") + +[node name="CSGBox3D3" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, -0.525) +size = Vector3(1, 0.04, 0.05) +material = SubResource("StandardMaterial3D_gbm1j") + +[node name="CSGBox3D4" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.525, 0.02, 0) +size = Vector3(0.05, 0.04, 1.1) +material = SubResource("StandardMaterial3D_18qg8") + +[node name="CSGBox3D5" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.525, 0.02, 0) +size = Vector3(0.05, 0.04, 1.1) +material = SubResource("StandardMaterial3D_ip8b2") + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(3.5, 0, 0, 0, -1.5299e-07, 3.5, 0, -3.5, -1.5299e-07, 0, 0, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("1_phew5") diff --git a/Scenes/visual_path.tscn b/Scenes/visual_path.tscn new file mode 100644 index 0000000..fb06e92 --- /dev/null +++ b/Scenes/visual_path.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://dtfw0tefhb6qq"] + +[ext_resource type="Script" path="res://Scripts/visualized_path.gd" id="1_34oex"] + +[sub_resource type="Curve3D" id="Curve3D_tcut2"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -0.894202, 0.687927, -2.77275, 0, 0, -2), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[node name="Node3D" type="Path3D"] +curve = SubResource("Curve3D_tcut2") +script = ExtResource("1_34oex") diff --git a/Scripts/AStarGraph3D.gd b/Scripts/AStarGraph3D.gd new file mode 100644 index 0000000..7d5a9c8 --- /dev/null +++ b/Scripts/AStarGraph3D.gd @@ -0,0 +1,97 @@ +extends Node3D +class_name AStarGraph3D + +@export var grid_size := Vector2(21, 13) +@export var point_gap := 1.2 +var non_build_locations = [] +var astar := AStar3D.new() + +#TODO generalize this better +@export var start : Node3D +@export var end : Node3D +@export var spawner : EnemySpawner +@export var visualized_path : VisualizedPath +var tower_base_scene = load("res://Scenes/tower_base.tscn") +var tower_frame_scene = load("res://Scenes/tower_frame.tscn") +var tower_bases = [] + + +func toggle_point(point_id): + networked_toggle_point.rpc(point_id) + + +func point_is_build_location(point_id): + return !non_build_locations.has(point_id) + + +func test_path_if_point_toggled(point_id): + if astar.is_point_disabled(point_id): + astar.set_point_disabled(point_id, false) + else: + astar.set_point_disabled(point_id, true) + var result = find_path() + if astar.is_point_disabled(point_id): + astar.set_point_disabled(point_id, false) + else: + astar.set_point_disabled(point_id, true) + return result + + +@rpc("reliable", "any_peer", "call_local") +func networked_toggle_point(point_id): + if astar.is_point_disabled(point_id): + astar.set_point_disabled(point_id, false) + else: + astar.set_point_disabled(point_id, true) + var base = tower_base_scene.instantiate() + base.position = astar.get_point_position(point_id) + tower_bases.append(base) + add_child(base) + find_path() + + +func find_path() -> bool: + var path = astar.get_point_path(astar.get_point_count() - 2, astar.get_point_count() - 1) + if !path.is_empty(): + var curve = Curve3D.new() + for point in path: + curve.add_point(point) + spawner.path.curve = curve + spawner.path.spawn_visualizer_points() + return true + return false + + +func make_grid(): + for x in grid_size.x: + for y in grid_size.y: + var point_position = Vector3((x - floori(grid_size.x / 2)) * point_gap, 0.5, (y - floori(grid_size.y / 2)) * point_gap) + astar.add_point(int(x * grid_size.y + y), point_position) + var frame = tower_frame_scene.instantiate() + frame.position = point_position + add_child(frame) + + for x in grid_size.x: + for y in grid_size.y: + var point_id = grid_size.y * x + y + if x > 0: + var north_point_id = grid_size.y * (x - 1) + y + astar.connect_points(point_id, north_point_id, false) + if x < grid_size.x - 1: + var south_point_id = grid_size.y * (x + 1) + y + astar.connect_points(point_id, south_point_id, false) + if y > 0: + var east_point_id = grid_size.y * x + (y - 1) + astar.connect_points(point_id, east_point_id, false) + if y < grid_size.y - 1: + var west_point_id = grid_size.y * x + (y + 1) + astar.connect_points(point_id, west_point_id, false) + + non_build_locations.append(astar.get_point_count()) + astar.add_point(astar.get_point_count(), start.global_position) + for x in grid_size.y: + astar.connect_points(int(astar.get_point_count() - 1), x) + non_build_locations.append(astar.get_point_count()) + astar.add_point(astar.get_point_count(), end.global_position) + for x in grid_size.y: + astar.connect_points(astar.get_point_count() - 1, int(grid_size.y * (grid_size.x - 1) + x)) diff --git a/Scripts/DebugMesh.gd b/Scripts/DebugMesh.gd new file mode 100644 index 0000000..6a9e7a2 --- /dev/null +++ b/Scripts/DebugMesh.gd @@ -0,0 +1,42 @@ +@tool +extends MeshInstance3D +class_name DebugMesh + + +func _ready(): + var mat = StandardMaterial3D.new() + mesh = ImmediateMesh.new() + mat.no_depth_test = true + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.vertex_color_use_as_albedo = true + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + set_material_override(mat) + + +func clear(): + mesh.clear_surfaces() + + +func draw_line(begin_pos: Vector3, end_pos: Vector3, color: Color = Color.RED) -> void: + mesh.surface_begin(Mesh.PRIMITIVE_LINES) + mesh.surface_set_color(color) + mesh.surface_add_vertex(begin_pos) + mesh.surface_add_vertex(end_pos) + mesh.surface_end() + + +func draw_sphere(center: Vector3, radius: float = 1.0, color: Color = Color.RED) -> void: + var step: int = 30 + var sppi: float = 2 * PI / step + var axes = [ + [Vector3.UP, Vector3.RIGHT], + [Vector3.RIGHT, Vector3.FORWARD], + [Vector3.FORWARD, Vector3.UP] + ] + for axis in axes: + mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP) + mesh.surface_set_color(color) + for i in range(step + 1): + mesh.surface_add_vertex(center + (axis[0] * radius) + .rotated(axis[1], sppi * (i % step))) + mesh.surface_end() diff --git a/Scripts/HUD.gd b/Scripts/HUD.gd new file mode 100644 index 0000000..9ed98e2 --- /dev/null +++ b/Scripts/HUD.gd @@ -0,0 +1,78 @@ +extends CanvasLayer +class_name HUD + +var last_lives_count = 120 +@export var wave_count : Label +@export var lives_count : Label +@export var enemy_count : Label +@export var currency_count : Label +@export var crosshair : TextureRect +@export var minimap : TextureRect +@export var minimap_cam : MinimapCamera3D +@export var minimap_viewport : SubViewport +@export var fps_label : Label +var minimap_anchor : Node3D +@export var enemy_sprites : Array[TextureRect] +@export var enemy_counts : Array[Label] + + +func _process(_delta: float) -> void: + fps_label.text = "FPS: " + str(Engine.get_frames_per_second()) + + +func set_wave_count(value): + wave_count.text = str(value) + + +func set_lives_count(value): + lives_count.text = str(value) + for x in last_lives_count - value: + $LivesBar.take_life() + last_lives_count = value + + +func set_enemy_count(value): + enemy_count.text = "Enemies Remaining: " + str(value) + + +func set_upcoming_wave(value): + var frame_count = 0 + for x in enemy_sprites.size(): + enemy_sprites[x].set_visible(false) + enemy_counts[x].set_visible(false) + for enemy in value: + enemy_sprites[frame_count].texture = enemy.icon + enemy_counts[frame_count].text = str(value[enemy]) + enemy_sprites[frame_count].set_visible(true) + enemy_counts[frame_count].set_visible(true) + frame_count += 1 + + +func set_currency_count(value): + currency_count.text = str(value) + + +func set_crosshair_visible(value : bool): + crosshair.set_visible(value) + + +func maximise_minimap(anchor): + minimap_cam.anchor = anchor + minimap.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + minimap.offset_bottom = -40 + minimap.offset_top = 40 + minimap.offset_left = 40 + minimap.offset_right = -40 + minimap_viewport.size = Vector2(1840, 1000) + minimap_cam.size = 30 + + +func minimize_minimap(anchor): + minimap_cam.anchor = anchor + minimap.set_anchors_and_offsets_preset(Control.PRESET_TOP_RIGHT) + minimap.offset_right = -40 + minimap.offset_top = 40 + minimap.offset_left = -256 + minimap.offset_bottom = 256 + minimap_viewport.size = Vector2(256, 256) + minimap_cam.size = 15 diff --git a/Scripts/Resources/TowerStats.gd b/Scripts/Resources/TowerStats.gd new file mode 100644 index 0000000..93d0a47 --- /dev/null +++ b/Scripts/Resources/TowerStats.gd @@ -0,0 +1,7 @@ +extends Resource +class_name TowerStats + +@export var can_target : Data.TargetType +@export var damage := 10.0 +@export var fire_range := 20.0 +@export var fire_rate := 1.0 diff --git a/Scripts/Resources/WeaponStats.gd b/Scripts/Resources/WeaponStats.gd new file mode 100644 index 0000000..53835b0 --- /dev/null +++ b/Scripts/Resources/WeaponStats.gd @@ -0,0 +1,6 @@ +extends Resource +class_name WeaponStats + +@export var damage : int +@export var fire_rate : float +@export var fire_range : float diff --git a/Scripts/Resources/card.gd b/Scripts/Resources/card.gd new file mode 100644 index 0000000..26d9ffc --- /dev/null +++ b/Scripts/Resources/card.gd @@ -0,0 +1,13 @@ +extends Resource +class_name Card + +enum Faction {GENERIC} + +@export var title : String +@export var rarity : Data.Rarity +@export var faction : Faction +@export var sprite : AtlasTexture +@export var turret : PackedScene +@export var weapon : PackedScene +@export var weapon_stats : WeaponStats +@export var tower_stats : TowerStats diff --git a/Scripts/Resources/enemy.gd b/Scripts/Resources/enemy.gd new file mode 100644 index 0000000..62992d5 --- /dev/null +++ b/Scripts/Resources/enemy.gd @@ -0,0 +1,12 @@ +extends Resource +class_name Enemy + +@export var title = "dog" +@export var target_type : Data.EnemyType +@export var icon : Texture +@export var sprite : AtlasTexture +@export var spawn_power := 10 +@export var health = 100 +@export var penalty = 10 +@export var movement_speed = 0.5 +@export var spawn_cooldown = 1.0 diff --git a/Scripts/Resources/hero_class.gd b/Scripts/Resources/hero_class.gd new file mode 100644 index 0000000..6b7d451 --- /dev/null +++ b/Scripts/Resources/hero_class.gd @@ -0,0 +1,6 @@ +extends Resource +class_name HeroClass + +@export var hero_name : String = "Default" +@export var texture : AtlasTexture +@export var deck : Array[Card] diff --git a/Scripts/Resources/player_keymap.gd b/Scripts/Resources/player_keymap.gd new file mode 100644 index 0000000..c49562f --- /dev/null +++ b/Scripts/Resources/player_keymap.gd @@ -0,0 +1,63 @@ +extends Resource +class_name PlayerKeymap + +const SAVE_PATH := "user://keymap.tres" + +@export var title : String + +@export var move_forward : InputEventKey +@export var move_backward : InputEventKey +@export var move_left : InputEventKey +@export var move_right : InputEventKey +@export var jump : InputEventKey +@export var sprint : InputEventKey +@export var interact : InputEventKey +@export var open_text_chat : InputEventKey +@export var ready : InputEventKey +@export var pause : InputEventKey +@export var equip_card_in_gauntlet : InputEventKey +@export var view_map : InputEventKey + + +func apply(): + replace_action_event("Move Forward", move_forward) + replace_action_event("Move Backward", move_backward) + replace_action_event("Move Left", move_left) + replace_action_event("Move Right", move_right) + replace_action_event("Jump", jump) + replace_action_event("Sprint", sprint) + replace_action_event("Interact", interact) + replace_action_event("Open Text Chat", open_text_chat) + replace_action_event("Ready", ready) + replace_action_event("Pause", pause) + replace_action_event("Equip In Gauntlet", equip_card_in_gauntlet) + replace_action_event("View Map", view_map) + + +func replace_action_event(action_string, event): + InputMap.action_erase_events(action_string) + InputMap.action_add_event(action_string, event) + + +func get_current_input_map(): + move_forward = InputMap.action_get_events("Move Forward")[0] + move_backward = InputMap.action_get_events("Move Backward")[0] + move_left = InputMap.action_get_events("Move Left")[0] + move_right = InputMap.action_get_events("Move Right")[0] + jump = InputMap.action_get_events("Jump")[0] + sprint = InputMap.action_get_events("Sprint")[0] + interact = InputMap.action_get_events("Interact")[0] + open_text_chat = InputMap.action_get_events("Open Text Chat")[0] + ready = InputMap.action_get_events("Ready")[0] + pause = InputMap.action_get_events("Pause")[0] + equip_card_in_gauntlet = InputMap.action_get_events("Equip In Gauntlet")[0] + view_map = InputMap.action_get_events("View Map")[0] + + +func save_profile_to_disk(): + get_current_input_map() + ResourceSaver.save(self, SAVE_PATH) +static func load_profile_from_disk() -> PlayerKeymap: + if ResourceLoader.exists(SAVE_PATH): + return ResourceLoader.load(SAVE_PATH) + return Data.keymaps[0] diff --git a/Scripts/Resources/player_preferences.gd b/Scripts/Resources/player_preferences.gd new file mode 100644 index 0000000..27f21ce --- /dev/null +++ b/Scripts/Resources/player_preferences.gd @@ -0,0 +1,42 @@ +extends Resource +class_name PlayerPreferences + +const SAVE_PATH := "user://preferences.tres" + +@export var mouse_sens := 28.0 +@export var invert_lookY := false +@export var invert_lookX := false +@export var toggle_sprint := false +@export var vsync_mode := 1 +@export var aa_mode := 0 +@export var windowed_mode := 0 +@export var hfov := 100.0 + + +func apply_graphical_settings(viewport): + DisplayServer.window_set_vsync_mode(vsync_mode) + match aa_mode: + 0: + viewport.use_taa = false + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED + 1: + viewport.use_taa = false + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA + 2: + viewport.use_taa = true + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED + match windowed_mode: + 0: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + 1: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + 2: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN) + + +func save_profile_to_disk(): + ResourceSaver.save(self, SAVE_PATH) +static func load_profile_from_disk() -> PlayerPreferences: + if ResourceLoader.exists(SAVE_PATH): + return ResourceLoader.load(SAVE_PATH) + return PlayerPreferences.new() diff --git a/Scripts/Resources/player_profile.gd b/Scripts/Resources/player_profile.gd new file mode 100644 index 0000000..93f84c1 --- /dev/null +++ b/Scripts/Resources/player_profile.gd @@ -0,0 +1,47 @@ +extends Resource +class_name PlayerProfile + +signal display_name_changed(old_name, new_name) +signal preferred_class_changed(old_class, new_class) + +const SAVE_PATH := "user://profile.tres" + +@export var display_name := "Charlie" +@export var preferred_class := 0 + +func to_dict() -> Dictionary: + var dict = {} + dict["display_name"] = display_name + dict["preferred_class"] = preferred_class + return dict +static func from_dict(dict) -> PlayerProfile: + var output = PlayerProfile.new() + output.display_name = dict["display_name"] + output.preferred_class = dict["preferred_class"] + return output + +func set_display_name(new_display_name): + if new_display_name == display_name: + return + var old_name = display_name + display_name = new_display_name + save_profile_to_disk() + display_name_changed.emit(old_name, display_name) +func get_display_name() -> String: + return display_name + +func set_preferred_class(new_preferred_class): + if new_preferred_class == preferred_class: + return + var old_class = preferred_class + preferred_class = new_preferred_class + preferred_class_changed.emit(old_class, preferred_class) +func get_preferred_class() -> int: + return preferred_class + +func save_profile_to_disk(): + ResourceSaver.save(self, SAVE_PATH) +static func load_profile_from_disk() -> PlayerProfile: + if ResourceLoader.exists(SAVE_PATH): + return ResourceLoader.load(SAVE_PATH) + return PlayerProfile.new() diff --git a/Scripts/Resources/status_stats.gd b/Scripts/Resources/status_stats.gd new file mode 100644 index 0000000..e0e6efa --- /dev/null +++ b/Scripts/Resources/status_stats.gd @@ -0,0 +1,8 @@ +extends Resource +class_name StatusStats + +@export var unique := false +@export var proc_frequency := 0.0 +@export var duration := 1.0 +@export var potency := 1.0 +@export var icon : Texture diff --git a/Scripts/StatusEffector.gd b/Scripts/StatusEffector.gd new file mode 100644 index 0000000..438f030 --- /dev/null +++ b/Scripts/StatusEffector.gd @@ -0,0 +1,36 @@ +extends Node3D +class_name StatusEffector + +@export var hbox : HBoxContainer + +var icon_scene = preload("res://Scenes/status_icon.tscn") +var effects : Array[StatusEffect] +var icons : Array[TextureRect] + + +func add_effect(new_effect : StatusEffect): + var icon_present = false + for effect in effects: + if effect.stats == new_effect.stats: + icon_present = true + new_effect.expired.connect(remove_effect) + effects.append(new_effect) + if !icon_present: + var icon = icon_scene.instantiate() + icon.texture = new_effect.stats.icon + icons.append(icon) + hbox.add_child(icon) + + +func remove_effect(expiring_effect : StatusEffect): + effects.erase(expiring_effect) + var has_remaining_stack = false + for effect in effects: + if effect.stats == expiring_effect.stats: + has_remaining_stack = true + if !has_remaining_stack: + for icon in icons: + if icon.texture == expiring_effect.stats.icon: + icons.erase(icon) + icon.queue_free() + break diff --git a/Scripts/StatusEffects/StatusOnFire.gd b/Scripts/StatusEffects/StatusOnFire.gd new file mode 100644 index 0000000..8ab11ba --- /dev/null +++ b/Scripts/StatusEffects/StatusOnFire.gd @@ -0,0 +1,6 @@ +extends StatusEffect +class_name StatusOnFire + + +func proc(): + affected.damage(stats.potency) diff --git a/Scripts/StatusEffects/status_effect.gd b/Scripts/StatusEffects/status_effect.gd new file mode 100644 index 0000000..4bb354a --- /dev/null +++ b/Scripts/StatusEffects/status_effect.gd @@ -0,0 +1,44 @@ +extends Node +class_name StatusEffect + +signal expired(effect : StatusEffect) + +var stats : StatusStats + +var affected : + set(value): + affected = value + on_attached() +var cooldown := 0.0 +var other_cooldown := 0.0 +var time_existed := 0.0 + + +func on_attached(): + pass + + +func on_removed(): + expired.emit(self) + + +func proc(): + pass + + +func _ready(): + other_cooldown = 1.0 / stats.proc_frequency + + +func _process(delta: float) -> void: + time_existed += delta + if time_existed >= stats.duration: + on_removed() + queue_free() + return + if stats.proc_frequency > 0.0: + cooldown += delta + if cooldown >= other_cooldown: + cooldown -= other_cooldown + proc() + diff --git a/Scripts/StatusEffects/status_sticky.gd b/Scripts/StatusEffects/status_sticky.gd new file mode 100644 index 0000000..97ed73a --- /dev/null +++ b/Scripts/StatusEffects/status_sticky.gd @@ -0,0 +1,18 @@ +extends StatusEffect +class_name StatusSticky + + +func on_attached(): + super.on_attached() + affected.movement_speed = affected.stats.movement_speed * (1.0 - stats.potency) + + +func on_removed(): + super.on_removed() + var siblings = get_parent().get_children() + var stickies = 0 + for node in siblings: + if node is StatusSticky: + stickies += 1 + if stickies == 1: + affected.movement_speed = affected.stats.movement_speed diff --git a/Scripts/alert_popup.gd b/Scripts/alert_popup.gd new file mode 100644 index 0000000..c9789d5 --- /dev/null +++ b/Scripts/alert_popup.gd @@ -0,0 +1,13 @@ +extends PanelContainer +class_name AlertPopup + +signal completed + +func set_popup(prompt_text, dismiss_text): + $VBoxContainer/Label.text = prompt_text + $VBoxContainer/Button.text = dismiss_text + + +func _on_button_pressed() -> void: + completed.emit() + queue_free() diff --git a/Scripts/card_hand.gd b/Scripts/card_hand.gd new file mode 100644 index 0000000..1147189 --- /dev/null +++ b/Scripts/card_hand.gd @@ -0,0 +1,30 @@ +extends Node2D +class_name CardInHand + +var stats : Card +@export var rarity_sprite : Sprite2D +@export var title_text: Label +@export var damage_text_text: Label +@export var damage_text: Label +@export var fire_rate_text_text: Label +@export var fire_rate_text: Label +@export var range_text_text: Label +@export var range_text: Label + +func set_card(value): + stats = value + title_text.text = stats.title + rarity_sprite.region_rect = Rect2(64 * stats.rarity, 0, 64, 64) + view_weapon() + + +func view_weapon(): + damage_text.text = str(stats.weapon_stats.damage) + fire_rate_text.text = str(stats.weapon_stats.fire_rate) + range_text.text = str(stats.weapon_stats.fire_rate) + + +func view_tower(): + damage_text.text = str(stats.tower_stats.damage) + fire_rate_text.text = str(stats.tower_stats.fire_rate) + range_text.text = str(stats.tower_stats.fire_rate) diff --git a/Scripts/card_printer.gd b/Scripts/card_printer.gd new file mode 100644 index 0000000..9dfa5d5 --- /dev/null +++ b/Scripts/card_printer.gd @@ -0,0 +1,59 @@ +extends StaticBody3D +class_name CardPrinter + +@export var cards : Array[CardInHand] +@export var item_card_scene : PackedScene +var card_available = false +@export var button_collider : CollisionShape3D +@export var button_box : Node3D +@export var choice_colliders : Array[CollisionShape3D] + + +func randomize_cards(): + var weight_total = 0 + for rarity in Data.Rarity: + weight_total += Data.rarity_weights[rarity] + + var generated_rarity = randi_range(0, weight_total) + var decided_rarity := 0 + + for rarity in Data.Rarity: + weight_total -= Data.rarity_weights[rarity] + if generated_rarity >= weight_total: + decided_rarity = Data.Rarity[rarity] + break + + var card_array = [] + for x in Data.cards: + if x.rarity == decided_rarity: + card_array.append(x) + var card + for x in cards: + if card_array.size() > 0: + card = card_array.pick_random() + card_array.erase(card) + x.set_card(card) + $Node3D.set_visible(true) + for x in choice_colliders: + x.disabled = false + card_available = true + + +func retrieve_card(i): + $Node3D.set_visible(false) + for x in choice_colliders: + x.disabled = true + if card_available: + var card = cards[i].stats + var item = item_card_scene.instantiate() as ItemCard + item.card = card + add_child(item) + item.position += -transform.basis.z * 2 + button_collider.disabled = false + button_box.position = Vector3(0,0,0) + + +func _on_static_body_3d_button_interacted(_value) -> void: + button_collider.disabled = true + button_box.position = Vector3(0,0,-0.2) + randomize_cards() diff --git a/Scripts/chatbox.gd b/Scripts/chatbox.gd new file mode 100644 index 0000000..822cd7c --- /dev/null +++ b/Scripts/chatbox.gd @@ -0,0 +1,36 @@ +extends Control +class_name Chatbox + +signal opened +signal closed + +var text_selected := false +var username := "default" + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("Open Text Chat"): + if text_selected: + closed.emit() + $VBoxContainer/LineEdit.deselect() + $VBoxContainer/LineEdit.visible = false + text_selected = false + if $VBoxContainer/LineEdit.text.length() != 0: + if $VBoxContainer/LineEdit.text.begins_with("/"): + Game.parse_command($VBoxContainer/LineEdit.text, multiplayer.get_unique_id()) + else: + rpc("append_message", username, $VBoxContainer/LineEdit.text) + $VBoxContainer/LineEdit.clear() + else: + opened.emit() + $VBoxContainer/LineEdit.visible = true + $VBoxContainer/LineEdit.grab_focus() + text_selected = true + + +func change_username(old_name, new_name): + append_message("server", old_name + " has changed their display name to " + new_name) + + +@rpc("reliable","call_local","any_peer") +func append_message(user, content): + $VBoxContainer/RichTextLabel.append_text("[" + user + "] " + content + "\n") diff --git a/Scripts/confirmation_popup.gd b/Scripts/confirmation_popup.gd new file mode 100644 index 0000000..d4ee903 --- /dev/null +++ b/Scripts/confirmation_popup.gd @@ -0,0 +1,19 @@ +extends PanelContainer +class_name ConfirmationPopup + +signal completed(outcome) + +func set_popup(prompt_text, confirm_text, cancel_text): + $VBoxContainer/Label.text = prompt_text + $VBoxContainer/HBoxContainer/Confirm.text = confirm_text + $VBoxContainer/HBoxContainer/Cancel.text = cancel_text + + +func _on_confirm_pressed() -> void: + completed.emit(true) + queue_free() + + +func _on_cancel_pressed() -> void: + completed.emit(false) + queue_free() diff --git a/Scripts/damage_particle.gd b/Scripts/damage_particle.gd new file mode 100644 index 0000000..5033cf9 --- /dev/null +++ b/Scripts/damage_particle.gd @@ -0,0 +1,23 @@ +extends Sprite3D + +@onready var label: Label = $SubViewport/Label +var time_alive := 0.0 +var movement_speed := 1.0 +var movement_vector : Vector3 + +func _ready(): + var theta = deg_to_rad(40) + var z = randf_range(cos(theta), 1) + var phi = randf_range(0, 2 * PI) + var vector = Vector3(sqrt(1 - pow(z, 2)) * cos(phi), z, sqrt(1 - pow(z, 2)) * sin(phi)) + movement_vector = vector.normalized() + +func set_number(num): + label.text = str(num) + + +func _process(delta: float) -> void: + time_alive += delta + position += movement_vector * movement_speed * delta + if time_alive >= 1.0: + queue_free() diff --git a/Scripts/data.gd b/Scripts/data.gd new file mode 100644 index 0000000..d07ffa7 --- /dev/null +++ b/Scripts/data.gd @@ -0,0 +1,53 @@ +extends Node + +var characters : Array[HeroClass] +var cards : Array[Card] +var enemies : Array[Enemy] +var keymaps : Array[PlayerKeymap] +var preferences : PlayerPreferences +var player_profile : PlayerProfile +var player_keymap : PlayerKeymap + +var wall_cost := 4 +var printer_cost := 10 +enum TargetType {LAND = 1, AIR = 2, BOTH = 3} +enum EnemyType {LAND = 1, AIR = 2} +enum Rarity {COMMON, UNCOMMON, RARE, EPIC, LEGENDARY} +var rarity_weights = { + "COMMON" = 100, + "UNCOMMON" = 60, + "RARE" = 20, + "EPIC" = 8, + "LEGENDARY" = 1 +} + +func _ready() -> void: + player_profile = PlayerProfile.load_profile_from_disk() + preferences = PlayerPreferences.load_profile_from_disk() + player_keymap = PlayerKeymap.load_profile_from_disk() + preferences.apply_graphical_settings(get_viewport()) + player_keymap.apply() + + characters.append(preload("res://PCs/Red/red.tres")) + characters.append(preload("res://PCs/Green/green.tres")) + characters.append(preload("res://PCs/Blue/blue.tres")) + + cards.append(preload("res://PCs/Universal/ClassCards/Assault/card_assault.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/Gatling/card_gatling.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres")) + + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog.tres")) + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog_fast.tres")) + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog_heavy.tres")) + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog_boss.tres")) + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/airenemy.tres")) + enemies.append(preload("res://Worlds/GreenPlanet/Enemies/airenemy2.tres")) + + keymaps.append(preload("res://Resources/Keymaps/qwerty.tres")) + keymaps.append(preload("res://Resources/Keymaps/azerty.tres")) + keymaps.append(preload("res://Resources/Keymaps/dvorak.tres")) + keymaps.append(preload("res://Resources/Keymaps/colemak.tres")) + keymaps.append(preload("res://Resources/Keymaps/workman.tres")) diff --git a/Scripts/edit_tool.gd b/Scripts/edit_tool.gd new file mode 100644 index 0000000..1af9b65 --- /dev/null +++ b/Scripts/edit_tool.gd @@ -0,0 +1,103 @@ +extends Node3D +class_name EditTool + +@export var hero : Hero +@export var inventory : Inventory +@export var ray : RayCast3D +@export var wall_preview : TowerBase +@export var build_preview_material : StandardMaterial3D +@export var progress_bar : TextureProgressBar + +var enabled := true +var point_id := -1 +var obstacle_last_point : int +var valid_point := false +var is_looking_at_tower_base := false +var ray_collider +var ray_point + +var interact_key_held := false +var interacted_once := false +var interact_held_time := 0.0 +var interact_hold_time := 0.5 + + +func _ready() -> void: + wall_preview.set_material(build_preview_material) + wall_preview.toggle_collision() + + +func _process(delta: float) -> void: + if !enabled: + ray_collider = null + ray_point = null + wall_preview.set_visible(false) + return + + if interact_key_held and !interacted_once and valid_point and hero.currency >= Data.wall_cost and ray.is_colliding() and Game.level.a_star_graph_3d.point_is_build_location(point_id): + interact_held_time += delta + set_progress_percent(interact_held_time / interact_hold_time) + if interact_held_time >= interact_hold_time: + set_progress_percent(0) + interacted_once = true + build_wall() + if !interact_key_held: + interact_held_time = 0.0 + interacted_once = false + set_progress_percent(0) + + point_id = -1 + if ray.is_colliding(): + if !interact_key_held: + wall_preview.set_visible(true) + ray_collider = ray.get_collider() + ray_point = ray.get_collision_point() + + is_looking_at_tower_base = ray_collider is TowerBase + if Game.level: + point_id = Game.level.a_star_graph_3d.astar.get_closest_point(ray_point) + if !Game.level.a_star_graph_3d.point_is_build_location(point_id) or hero.currency < Data.wall_cost: + wall_preview.set_visible(false) + else: + var point_position = Game.level.a_star_graph_3d.astar.get_point_position(point_id) + wall_preview.global_position = point_position + wall_preview.global_rotation = Vector3.ZERO + if obstacle_last_point != point_id: + obstacle_last_point = point_id + if Game.level.a_star_graph_3d.test_path_if_point_toggled(point_id): + build_preview_material.albedo_color = Color.GREEN + build_preview_material.albedo_color.a = 0.8 + valid_point = true + else: + build_preview_material.albedo_color = Color.RED + build_preview_material.albedo_color.a = 0.8 + valid_point = false + else: + ray_collider = null + ray_point = null + is_looking_at_tower_base = false + wall_preview.set_visible(false) + + +func interact(): + if ray_collider is TowerBase: + var tower_base = ray_collider as TowerBase + put_card_in_tower_base(tower_base) + + +func build_wall(): + if point_id >= 0 and valid_point and hero.currency >= Data.wall_cost: + hero.currency -= Data.wall_cost + Game.level.a_star_graph_3d.toggle_point(point_id) + wall_preview.set_visible(false) + + +func put_card_in_tower_base(tower_base: TowerBase): + if tower_base.has_card: + inventory.add(tower_base.remove_card()) + else: + tower_base.add_card(inventory.remove()) + + +func set_progress_percent(value: float): + progress_bar.value = progress_bar.max_value * value diff --git a/Scripts/eight_direction_sprite.gd b/Scripts/eight_direction_sprite.gd new file mode 100644 index 0000000..1fca9bf --- /dev/null +++ b/Scripts/eight_direction_sprite.gd @@ -0,0 +1,36 @@ +extends Sprite3D +class_name EightDirectionSprite3D + + +func _process(_delta: float) -> void: + var cam = get_viewport().get_camera_3d() + if !cam: + return + var tile_size = texture.region.size.x + + #stupid algorithm for dummy game developers + var camera_look_dir_3D = cam.global_position.direction_to(global_position).normalized() + var a = Vector2(global_transform.basis.z.x, global_transform.basis.z.z).normalized() + var b = Vector2(camera_look_dir_3D.x, camera_look_dir_3D.z).normalized() + var dot = a.x * b.x + a.y * b.y + var det = a.x * b.y - a.y * b.x + var final = rad_to_deg(atan2(det, dot)) + 180 + + var t = texture.region + if final > 337.5 or final < 22.5: + t = Rect2(tile_size * 4, t.position.y, tile_size, tile_size) + elif final > 22.5 and final < 67.5: + t = Rect2(tile_size * 5, t.position.y, tile_size, tile_size) + elif final > 67.5 and final < 112.5: + t = Rect2(tile_size * 6, t.position.y, tile_size, tile_size) + elif final > 112.5 and final < 157.5: + t = Rect2(tile_size * 7, t.position.y, tile_size, tile_size) + elif final > 157.5 and final < 202.5: + t = Rect2(0, t.position.y, tile_size, tile_size) + elif final > 202.5 and final < 247.5: + t = Rect2(tile_size * 1, t.position.y, tile_size, tile_size) + elif final > 247.5 and final < 292.5: + t = Rect2(tile_size * 2, t.position.y, tile_size, tile_size) + elif final > 292.5 and final < 337.5: + t = Rect2(tile_size * 3, t.position.y, tile_size, tile_size) + texture.region = t diff --git a/Scripts/enemy_spawner.gd b/Scripts/enemy_spawner.gd new file mode 100644 index 0000000..759786f --- /dev/null +++ b/Scripts/enemy_spawner.gd @@ -0,0 +1,66 @@ +extends Node3D +class_name EnemySpawner + +@export var path : VisualizedPath +@export var type : Data.EnemyType +@export var dest : Node3D + +var signal_for_after_enemy_died +var signal_for_after_enemy_reached_goal +signal signal_for_when_enemy_spawns + +var current_wave +var enemy_spawn_timers = {} +var enemies_spawned = {} +var enemies_to_spawn := 0 +var done_spawning = true + +@export var land_enemy_scene : PackedScene +@export var air_enemy_scene : PackedScene + + +func _process(delta: float) -> void: + if enemies_to_spawn == 0: + done_spawning = true + return + + for x in enemy_spawn_timers: + if enemies_spawned[x] == current_wave[x]: + continue + var enemy_stats = x + enemy_spawn_timers[x] += delta + if enemy_spawn_timers[x] >= enemy_stats.spawn_cooldown: + if type == Data.EnemyType.LAND: + var enemy = land_enemy_scene.instantiate() as EnemyController + enemy.stats = enemy_stats + enemy.died.connect(signal_for_after_enemy_died) + enemy.reached_goal.connect(signal_for_after_enemy_reached_goal) + path.add_child(enemy) + enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown + signal_for_when_enemy_spawns.emit() + if type == Data.EnemyType.AIR: + var enemy = air_enemy_scene.instantiate() as AirEnemyController + enemy.stats = enemy_stats + enemy.destination = dest + enemy.died.connect(signal_for_after_enemy_died) + enemy.reached_goal.connect(signal_for_after_enemy_reached_goal) + add_child(enemy) + enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown + signal_for_when_enemy_spawns.emit() + enemies_spawned[x] += 1 + enemies_to_spawn -= 1 + + +func spawn_wave(value): + var relevant_enemies = {} + for x in value: + if x.target_type == type: + relevant_enemies[x] = value[x] + current_wave = relevant_enemies + enemies_to_spawn = 0 + enemy_spawn_timers = {} + for x in current_wave: + enemies_to_spawn += current_wave[x] + enemy_spawn_timers[x] = 0.0 + enemies_spawned[x] = 0 + done_spawning = false diff --git a/Scripts/float_and_spin.gd b/Scripts/float_and_spin.gd new file mode 100644 index 0000000..c91c045 --- /dev/null +++ b/Scripts/float_and_spin.gd @@ -0,0 +1,35 @@ +extends RayCast3D + +@export_range(0.0, 3.0) var float_height := 1.5 +@export_range(0.0, 2.0) var bounce_dist := 0.5 +@export_range(0.0, 2.0) var bounce_speed := 0.4 +@export_range(0.0, 4.0) var spin_speed := 0.5 +@export var curve: Curve + +var start_height = 0.0 +var dest_height = 0.0 +var t = 0.0 + +func _ready(): + start_height = position.y + + #raycast downwards and position the item at a set height above the ground that the raycast + #presumably hits + + #Now I know what you're thinking: "if the item is placed on the ground in the editor anyway, we can put + #the item at the correct height by simply adding the height to the existing y value that the item will have + #anyway when the game starts" but what you're not considering is that for ease of placement the model will probably + #always be given an offset from the root nodes position so as youre placing it in the editor its not clipping through + #the ground, and some items might be given more or less of this vertical offset, if we do it at runtime by actually + #checking where the ground is, you dont need to fuck around with this offset at the scene level, you just adjust + #the script variable and the item can figure itself out, yeah its fancy but its also a nice creature comfort. + if is_colliding(): + start_height = get_collision_point().y + (1 * float_height) - (bounce_dist / 2.0) + dest_height = start_height + (bounce_dist / 2.0) + +func _process(delta): + t += bounce_speed * delta + position.y = start_height + (dest_height - start_height) * curve.sample(t) + if t >= 1.0: + t = 0.0 + rotation.y += spin_speed * delta diff --git a/Scripts/game.gd b/Scripts/game.gd new file mode 100644 index 0000000..1e1a09e --- /dev/null +++ b/Scripts/game.gd @@ -0,0 +1,211 @@ +extends Node + +signal wave_started(wave_number) +signal wave_finished(wave_number) +signal base_took_damage(remaining_health) +signal game_started +signal game_restarted +signal lost_game +signal won_game +signal enemy_number_changed(number_of_enemies) + +var level_scene = load("res://Worlds/GreenPlanet/Levels/first_level.tscn") +var player_scene = load("res://PCs/hero.tscn") +var main_menu_scene_path = "res://Scenes/Menus/main_menu.tscn" +var multiplayer_lobby_scene_path = "res://Scenes/Menus/multiplayer_lobby.tscn" +var singleplayer_lobby_scene_path = "res://Scenes/Menus/singleplayer_lobby.tscn" +var won_game_scene = load("res://Scenes/Menus/won_game_screen.tscn") +var lose_game_scene = load("res://Scenes/Menus/lost_game_screen.tscn") +var connected_players_nodes = {} +var game_active := false +var level : Level +var enemies := 0 +var objective_health := 120 +var wave := 0 +var upcoming_wave +var pot : int + + +func parse_command(text : String, peer_id : int): + if text.substr(1, 4) == "give": + var gift_name = text.substr(6) as String + var gift = Data.cards[0] + for x in Data.cards: + if x.title == gift_name: + gift = x + connected_players_nodes[peer_id].inventory.add(gift) + + +func spawn_level(): + level = level_scene.instantiate() as Level + for x in level.enemy_spawns: + #x.path = level.a_star_graph_3d.visualized_path + x.signal_for_after_enemy_died = enemy_died + x.signal_for_after_enemy_reached_goal = damage_goal + x.signal_for_when_enemy_spawns.connect(increase_enemy_count) + add_child(level) + + +func spawn_players(player_array, player_profiles, chatbox_open_signal, chatbox_closed_signal): + var p_i = 0 + player_array.sort() + for peer_id in player_array: + var player = player_scene.instantiate() as Hero + player.name = str(peer_id) + player.position = level.player_spawns[p_i].global_position + player.profile = player_profiles[peer_id] + player.hero_class = Data.characters[player_profiles[peer_id].preferred_class] + player.ready_state_changed.connect(ready_player) + if peer_id == multiplayer.get_unique_id(): + chatbox_open_signal.connect(player.pause) + chatbox_closed_signal.connect(player.unpause) + player.set_multiplayer_authority(peer_id) + connected_players_nodes[peer_id] = player + wave_started.connect(player.exit_editing_mode) + wave_finished.connect(player.enter_editing_mode) + base_took_damage.connect(player.hud.set_lives_count) + enemy_number_changed.connect(player.hud.set_enemy_count) + add_child(player) + p_i += 1 + start_game() + + +func ready_player(_value): + for key in connected_players_nodes: + if connected_players_nodes[key].ready_state == false: + return + for key in connected_players_nodes: + connected_players_nodes[key].ready_state = false + spawn_enemy_wave() + + +func spawn_enemy_wave(): + wave += 1 + level.a_star_graph_3d.find_path() + level.a_star_graph_3d.visualized_path.disable_visualization() + for spawn in level.enemy_spawns: + spawn.spawn_wave(upcoming_wave) + wave_started.emit(wave) + + +func set_upcoming_wave(): + var spawn_power = WaveManager.calculate_spawn_power(wave + 1, connected_players_nodes.size()) + upcoming_wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) + pot = 6 + (spawn_power / 100) + + +func increase_enemy_count(): + enemies += 1 + enemy_number_changed.emit(enemies) + + +func enemy_died(): + enemies -= 1 + enemy_number_changed.emit(enemies) + for x in level.enemy_spawns: + if !x.done_spawning: + return + if enemies == 0: + end_wave() + if wave >= 20: + win_game() + + +func damage_goal(penalty): + enemies -= 1 + enemy_number_changed.emit(enemies) + objective_health -= penalty + base_took_damage.emit(objective_health) + if objective_health <= 0: + lose_game() + elif enemies == 0: + end_wave() + if wave >= 20: + win_game() + + +func end_wave(): + for peer_id in connected_players_nodes: + connected_players_nodes[peer_id].currency += pot / connected_players_nodes.size() + level.a_star_graph_3d.visualized_path.enable_visualization() + wave_finished.emit(wave) + set_upcoming_wave() + if wave < 20: + for key in connected_players_nodes: + connected_players_nodes[key].hud.set_upcoming_wave(upcoming_wave) + + +func remove_player(peer_id): + connected_players_nodes[peer_id].queue_free() + connected_players_nodes.erase(peer_id) + + +func start_game(): + game_active = true + level.a_star_graph_3d.make_grid() + level.a_star_graph_3d.find_path() + set_upcoming_wave() + for peer_id in connected_players_nodes: + connected_players_nodes[peer_id].currency = 20 + connected_players_nodes[peer_id].hud.set_upcoming_wave(upcoming_wave) + game_started.emit() + + +func restart_game(): + #implement game reloading system + for peer_id in connected_players_nodes: + connected_players_nodes[peer_id].queue_free() + connected_players_nodes.clear() + level.queue_free() + enemies = 0 + objective_health = 100 + wave = 0 + spawn_level() + game_restarted.emit() + pass + + +func lose_game(): + if game_active == false: + return + game_active = false + var menu = lose_game_scene.instantiate() + add_child(menu) + lost_game.emit() + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + for peer_id in connected_players_nodes: + connected_players_nodes[peer_id].pause() + + +func win_game(): + if game_active == false: + return + game_active = false + var menu = won_game_scene.instantiate() + add_child(menu) + won_game.emit() + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + for peer_id in connected_players_nodes: + connected_players_nodes[peer_id].pause() + + +func quit_to_desktop(): + multiplayer.multiplayer_peer.close() + multiplayer.multiplayer_peer = null + get_tree().quit() + + +func scene_switch_main_menu(): + multiplayer.multiplayer_peer.close() + multiplayer.multiplayer_peer = null + for node in get_children(): + node.queue_free() + get_tree().change_scene_to_file(main_menu_scene_path) + + +func scene_switch_to_multiplayer_lobby(): + get_tree().change_scene_to_file(multiplayer_lobby_scene_path) + + +func scene_switch_to_singleplayer_lobby(): + get_tree().change_scene_to_file(singleplayer_lobby_scene_path) diff --git a/Scripts/ground_enemy_controller.gd b/Scripts/ground_enemy_controller.gd new file mode 100644 index 0000000..5ac802d --- /dev/null +++ b/Scripts/ground_enemy_controller.gd @@ -0,0 +1,2 @@ +extends Node3D +class_name GroundEnemyController diff --git a/Scripts/health.gd b/Scripts/health.gd new file mode 100644 index 0000000..e5942b6 --- /dev/null +++ b/Scripts/health.gd @@ -0,0 +1,27 @@ +extends Node +class_name Health + +signal health_depleted +signal health_changed(health) + +@export var damage_particle_scene : PackedScene + +@export var max_health := 10 +var current_health + +func take_damage(damage): + var marker = damage_particle_scene.instantiate() + get_tree().root.add_child(marker) + marker.set_number(damage) + marker.position = get_parent().global_position + Vector3.UP + + current_health -= damage + health_changed.emit(current_health) + if current_health <= 0: + health_depleted.emit() + + +func heal_damage(healing): + current_health += healing + if current_health > max_health: + current_health = max_health diff --git a/Scripts/hitbox.gd b/Scripts/hitbox.gd new file mode 100644 index 0000000..a13f098 --- /dev/null +++ b/Scripts/hitbox.gd @@ -0,0 +1,13 @@ +extends CollisionShape3D +class_name Hitbox + +signal took_damage(amount) + + +func damage(amount): + networked_damage.rpc(amount) + + +@rpc("any_peer","call_local") +func networked_damage(amount): + took_damage.emit(amount) diff --git a/Scripts/interact_button.gd b/Scripts/interact_button.gd new file mode 100644 index 0000000..3c3dd63 --- /dev/null +++ b/Scripts/interact_button.gd @@ -0,0 +1,10 @@ +extends StaticBody3D +class_name InteractButton + +signal button_interacted(value) + +@export var button_press_value := 0 +@export var press_cost := 0 + +func press(): + button_interacted.emit(button_press_value) diff --git a/Scripts/inventory.gd b/Scripts/inventory.gd new file mode 100644 index 0000000..8b00c69 --- /dev/null +++ b/Scripts/inventory.gd @@ -0,0 +1,66 @@ +extends Node +class_name Inventory + +signal item_added(item) +signal item_removed(item) + +@export var max_size := 0 +var contents : Array[Card] = [] +var selected_index := 0 +var selected_item : Card : + get: + return contents[selected_index] + set(_value): + return + + +func add(card : Card) -> bool: + if card != null and contents.size() < max_size or max_size == 0: + contents.append(card) + item_added.emit(card) + networked_add.rpc(Data.cards.find(card)) + return true + return false + + +func remove_at(index : int) -> Card: + if contents.size() <= 0: + return null + var card = contents[index] + contents.remove_at(index) + if selected_index >= contents.size() and selected_index > 0: + selected_index -= 1 + item_removed.emit(card) + networked_remove_at.rpc(index) + return card + + +func remove() -> Card: + return remove_at(selected_index) + + +func increment_selected(): + if contents.size() > 0: + selected_index += 1 + if selected_index >= contents.size(): + selected_index = 0 + + +func decrement_selected(): + if contents.size() > 0: + selected_index -= 1 + if selected_index < 0: + selected_index = contents.size() - 1 + + +@rpc("reliable") +func networked_add(value): + contents.append(Data.cards[value]) + item_added.emit(Data.cards[value]) + + +@rpc("reliable") +func networked_remove_at(value): + var item = contents[value] + contents.remove_at(value) + item_removed.emit(item) diff --git a/Scripts/item_card.gd b/Scripts/item_card.gd new file mode 100644 index 0000000..79482fa --- /dev/null +++ b/Scripts/item_card.gd @@ -0,0 +1,14 @@ +extends StaticBody3D +class_name ItemCard + +@export var card : Card + + +func pick_up() -> Card: + queue_free() + networked_pick_up.rpc() + return card + + +@rpc func networked_pick_up(): + queue_free() diff --git a/Scripts/level.gd b/Scripts/level.gd new file mode 100644 index 0000000..26cdd9b --- /dev/null +++ b/Scripts/level.gd @@ -0,0 +1,8 @@ +extends GridMap +class_name Level + +@export var enemy_pool : Array[Enemy] +@export var player_spawns : Array[Node3D] = [] +@export var enemy_spawns : Array[Node3D] = [] +@export var enemy_goals : Array[Node3D] = [] +@export var a_star_graph_3d : AStarGraph3D diff --git a/Scripts/lifebar_segment.gd b/Scripts/lifebar_segment.gd new file mode 100644 index 0000000..ced206d --- /dev/null +++ b/Scripts/lifebar_segment.gd @@ -0,0 +1,20 @@ +extends Control +class_name LivesBarSegment + +var lives_left := 6 + +func take_life(value : int): + for x in value: + lives_left -= 1 + if lives_left == 5: + $AnimationPlayer.play("lose1") + if lives_left == 4: + $AnimationPlayer2.play("lose2") + if lives_left == 3: + $AnimationPlayer3.play("lose3") + if lives_left == 2: + $AnimationPlayer4.play("lose4") + if lives_left == 1: + $AnimationPlayer5.play("lose5") + if lives_left == 0: + $AnimationPlayer6.play("lose6") diff --git a/Scripts/lives_bar.gd b/Scripts/lives_bar.gd new file mode 100644 index 0000000..fb91ce2 --- /dev/null +++ b/Scripts/lives_bar.gd @@ -0,0 +1,10 @@ +extends TextureRect + +@export var segments : Array[LivesBarSegment] +var lives := 120.0 + + +func take_life(): + var segment_to_animate = ceil(lives / 6.0) - 1 + lives -= 1 + segments[segment_to_animate].take_life(1) diff --git a/Scripts/loadout_editor.gd b/Scripts/loadout_editor.gd new file mode 100644 index 0000000..3a4145f --- /dev/null +++ b/Scripts/loadout_editor.gd @@ -0,0 +1,15 @@ +extends Panel +class_name LoadoutEditor + +signal character_selected(character) + +func _ready() -> void: + for i in Data.characters.size(): + var button = Button.new() + button.text = Data.characters[i].hero_name + button.pressed.connect(set_character.bind(i)) + $HBoxContainer.add_child(button) + + +func set_character(i: int): + character_selected.emit(i) diff --git a/Scripts/lost_game_screen.gd b/Scripts/lost_game_screen.gd new file mode 100644 index 0000000..f1d7034 --- /dev/null +++ b/Scripts/lost_game_screen.gd @@ -0,0 +1,10 @@ +extends Control + + +func _on_quit_button_pressed() -> void: + Game.quit_to_desktop() + + +func _on_restart_button_pressed() -> void: + Game.restart_game() + queue_free() diff --git a/Scripts/main_menu.gd b/Scripts/main_menu.gd new file mode 100644 index 0000000..325723a --- /dev/null +++ b/Scripts/main_menu.gd @@ -0,0 +1,46 @@ +extends Control + +var confirmation_popup_scene = preload("res://Scenes/Menus/confirmation_popup.tscn") +var text_input_popup_scene = preload("res://Scenes/Menus/text_input_popup.tscn") +var multiplayer_lobby_scene_path = "res://Scenes/multiplayer_lobby.tscn" +var options_menu_scene = preload("res://Scenes/Menus/options_menu.tscn") + +func _ready() -> void: + $ProfileEditor/VBoxContainer/HBoxContainer/DisplayName.text = Data.player_profile.display_name + + +func _on_display_name_edit_pressed() -> void: + var popup = text_input_popup_scene.instantiate() as TextInputPopup + popup.set_popup(Data.player_profile.display_name, "Display Name", "Confirm") + popup.completed.connect(change_profile_display_name) + add_child(popup) + + +func change_profile_display_name(display_name): + $ProfileEditor/VBoxContainer/HBoxContainer/DisplayName.text = display_name + Data.player_profile.set_display_name(display_name) + + +func _on_quit_button_pressed() -> void: + var popup = confirmation_popup_scene.instantiate() as ConfirmationPopup + popup.set_popup("Are you sure you want to quit?", "Yes", "No") + popup.completed.connect(quit_game) + add_child(popup) + + +func quit_game(confirmation): + if confirmation: + get_tree().quit() + + +func _on_play_button_pressed() -> void: + Game.scene_switch_to_singleplayer_lobby() + + +func _on_options_button_pressed() -> void: + var menu = options_menu_scene.instantiate() + add_child(menu) + + +func _on_multiplayer_button_pressed() -> void: + Game.scene_switch_to_multiplayer_lobby() diff --git a/Scripts/minimap_cam.gd b/Scripts/minimap_cam.gd new file mode 100644 index 0000000..819f46a --- /dev/null +++ b/Scripts/minimap_cam.gd @@ -0,0 +1,10 @@ +extends Camera3D +class_name MinimapCamera3D + +@export var anchor : Node3D +@export var face_north : bool + +func _process(_delta: float) -> void: + global_position = anchor.global_position + (Vector3.UP * 100) + if face_north: + rotation.y = anchor.rotation.y diff --git a/Scripts/multiplayer_lobby.gd b/Scripts/multiplayer_lobby.gd new file mode 100644 index 0000000..b6b952b --- /dev/null +++ b/Scripts/multiplayer_lobby.gd @@ -0,0 +1,124 @@ +extends Control +class_name MultiplayerLobby + +signal player_connected(peer_id, player_profile) +signal player_disconnected(peer_id) +signal disconnected_from_server + +const SERVER_PORT := 58008 +const MAX_PLAYERS := 4 + +var enet_peer = ENetMultiplayerPeer.new() + +@export var server_form : ServerForm +@export var scoreboard : Scoreboard +@export var loadout_editor : LoadoutEditor +@export var chatbox : Chatbox +var alert_popup_scene = preload("res://Scenes/Menus/alert_popup.tscn") +var connected_players_profiles = {} + + +func _ready(): + multiplayer.peer_connected.connect(_on_player_connected) + multiplayer.peer_disconnected.connect(_on_player_disconnected) + multiplayer.connected_to_server.connect(_on_connection_succeeded) + multiplayer.connection_failed.connect(_on_connection_failed) + multiplayer.server_disconnected.connect(_on_server_disconnected) + + +func _on_player_connected(peer_id): + add_player.rpc_id(peer_id, Data.player_profile.to_dict()) + if multiplayer.get_unique_id() == 1: + print("Player connected with id: " + str(peer_id)) + + +func _on_player_disconnected(peer_id): + connected_players_profiles.erase(peer_id) + player_disconnected.emit(peer_id) + + +func _on_connection_succeeded(): + setup_game(multiplayer.get_unique_id()) + + +func _on_connection_failed(): + multiplayer.multiplayer_peer = null + var popup = alert_popup_scene.instantiate() as AlertPopup + popup.set_popup("Unable to connect to server", "OK") + add_child(popup) + + +func _on_server_disconnected(): + multiplayer.multiplayer_peer = null + disconnected_from_server.emit() + + +func create_server() -> void: + enet_peer.create_server(SERVER_PORT, MAX_PLAYERS) + multiplayer.multiplayer_peer = enet_peer + setup_game(1) + + +func setup_game(peer_id): + player_disconnected.connect(Game.remove_player) + Game.spawn_level() + scoreboard.all_players_ready.connect(start_game) + Game.game_restarted.connect(setup_the_ui) + setup_the_ui() + chatbox.username = Data.player_profile.display_name + Data.player_profile.display_name_changed.connect(chatbox.change_username) + loadout_editor.character_selected.connect(Data.player_profile.set_preferred_class) + loadout_editor.character_selected.connect(edit_player_profile) + connected_players_profiles[peer_id] = Data.player_profile + player_connected.emit(peer_id, Data.player_profile) + + +func setup_the_ui(): + scoreboard.unready_all_players() + scoreboard.set_visible(true) + loadout_editor.set_visible(true) + $ReadyButton.set_visible(true) + chatbox.set_visible(true) + + +func connect_to_server() -> void: + var ip = server_form.get_server_ip() if server_form.get_server_ip() else "localhost" + var port = server_form.get_server_port() if server_form.get_server_port() else str(SERVER_PORT) + enet_peer.create_client(ip, int(port)) + multiplayer.multiplayer_peer = enet_peer + + +func ready_player(): + var peer_id = multiplayer.get_unique_id() + networked_ready_player.rpc(peer_id) + + +func start_game(): + enet_peer.refuse_new_connections = true + Game.spawn_players(connected_players_profiles.keys(), connected_players_profiles, chatbox.opened, chatbox.closed) + scoreboard.set_visible(false) + loadout_editor.set_visible(false) + + +func edit_player_profile(_argument): + var profile_dict = Data.player_profile.to_dict() + networked_edit_player_profile.rpc(multiplayer.get_unique_id(), profile_dict) + + +@rpc("any_peer", "reliable", "call_local") +func networked_edit_player_profile(peer_id, new_profile_dict): + connected_players_profiles[peer_id].set_display_name(new_profile_dict["display_name"]) + connected_players_profiles[peer_id].set_preferred_class(new_profile_dict["preferred_class"]) + + +@rpc("any_peer","reliable") +func add_player(new_player_profile_dict): + var new_player_peer_id = multiplayer.get_remote_sender_id() + var new_player_profile = PlayerProfile.from_dict(new_player_profile_dict) + connected_players_profiles[new_player_peer_id] = new_player_profile + player_connected.emit(new_player_peer_id, new_player_profile) + + +@rpc("any_peer", "reliable", "call_local") +func networked_ready_player(peer_id): + scoreboard.set_player_ready_state(peer_id, true) diff --git a/Scripts/on_top_camera.gd b/Scripts/on_top_camera.gd new file mode 100644 index 0000000..c77a5c5 --- /dev/null +++ b/Scripts/on_top_camera.gd @@ -0,0 +1,7 @@ +extends Camera3D + +@export var clone_camera : Node3D + +func _process(_delta: float) -> void: + global_position = clone_camera.global_position + global_rotation = clone_camera.global_rotation diff --git a/Scripts/options_menu.gd b/Scripts/options_menu.gd new file mode 100644 index 0000000..aaf22c4 --- /dev/null +++ b/Scripts/options_menu.gd @@ -0,0 +1,123 @@ +extends Control +class_name OptionsMenu + +@export var look_sens_slider : HSlider +@export var look_sens_input : SpinBox +@export var toggle_sprint_checkbox : CheckButton +@export var vsync_dropdown : OptionButton +@export var aa_dropdown : OptionButton +@export var window_dropdown : OptionButton +@export var invert_lookY : CheckButton +@export var invert_lookX : CheckButton +@export var fov_input : SpinBox +@export var fov_slider : HSlider +var keybind_boxes = [] +var keybind_buttons = {} +var key_event +var selected_button +var selected_button_button +var listening_for_key := false + +func _ready(): + look_sens_slider.value = Data.preferences.mouse_sens + look_sens_input.value = Data.preferences.mouse_sens + toggle_sprint_checkbox.button_pressed = Data.preferences.toggle_sprint + vsync_dropdown.selected = Data.preferences.vsync_mode + aa_dropdown.selected = Data.preferences.aa_mode + invert_lookY.button_pressed = Data.preferences.invert_lookY + invert_lookX.button_pressed = Data.preferences.invert_lookX + fov_input.value = Data.preferences.hfov + fov_slider.value = Data.preferences.hfov + + for index in Data.keymaps.size(): + var map = Data.keymaps[index] + var button = Button.new() + button.text = map.title + button.pressed.connect(set_keymap.bind(index)) + $VBoxContainer/TabContainer/Keybinds/HBoxContainer.add_child(button) + load_keybind_labels() + + +func set_keymap(keymap_index): + Data.player_keymap = Data.keymaps[keymap_index] + Data.player_keymap.apply() + load_keybind_labels() + + +func load_keybind_labels(): + for box in keybind_boxes: + box.queue_free() + keybind_boxes.clear() + for action in InputMap.get_actions(): + if !action.begins_with("ui_"): + var box = HBoxContainer.new() + var alabel = Label.new() + var elabel = Button.new() + alabel.text = action + if InputMap.action_get_events(action).size() > 0: + elabel.text = InputMap.action_get_events(action)[0].as_text() + elabel.size_flags_horizontal += Control.SIZE_EXPAND + alabel.size_flags_horizontal += Control.SIZE_EXPAND + alabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + alabel.size_flags_stretch_ratio = 2.0 + #elabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + box.add_child(alabel) + box.add_child(elabel) + elabel.pressed.connect(_on_keybind_button_pressed.bind(elabel)) + keybind_buttons[elabel] = action + $VBoxContainer/TabContainer/Keybinds/ScrollContainer/VBoxContainer.add_child(box) + keybind_boxes.append(box) + + +func _on_cancel_pressed() -> void: + queue_free() + + +func _on_confirm_pressed() -> void: + Data.preferences.mouse_sens = look_sens_slider.value + Data.preferences.toggle_sprint = toggle_sprint_checkbox.button_pressed + Data.preferences.vsync_mode = vsync_dropdown.selected + Data.preferences.aa_mode = aa_dropdown.selected + Data.preferences.windowed_mode = window_dropdown.selected + Data.preferences.invert_lookY = invert_lookY.button_pressed + Data.preferences.invert_lookX = invert_lookX.button_pressed + Data.preferences.apply_graphical_settings(get_viewport()) + Data.preferences.save_profile_to_disk() + Data.player_keymap.save_profile_to_disk() + queue_free() + + +func _on_mouse_sens_spin_box_value_changed(value: float) -> void: + look_sens_slider.value = value + + +func _on_mouse_sens_h_slider_value_changed(value: float) -> void: + look_sens_input.value = value + + +func _on_fov_spin_box_value_changed(value: float) -> void: + if value < 40.0: + value = 40.0 + if value > 160.0: + value = 160.0 + fov_slider.value = value + Data.preferences.hfov = value + + +func _on_fov_h_slider_value_changed(value: float) -> void: + fov_input.value = value + Data.preferences.hfov = value + + +func _on_keybind_button_pressed(value: Button) -> void: + selected_button = keybind_buttons[value] + selected_button_button = value + listening_for_key = true + + +func _input(event: InputEvent) -> void: + if listening_for_key and (event is InputEventKey or event is InputEventMouseButton or event is InputEventJoypadButton): + key_event = event + listening_for_key = false + Data.player_keymap.replace_action_event(selected_button, key_event) + selected_button_button.text = key_event.as_text() diff --git a/Scripts/path_visual_thing.gd b/Scripts/path_visual_thing.gd new file mode 100644 index 0000000..ea6eac7 --- /dev/null +++ b/Scripts/path_visual_thing.gd @@ -0,0 +1,16 @@ +extends PathFollow3D + +@export var speed = 0.5 +@export var world_model : Node3D +@export var minimap_model : Node3D + +func _process(delta: float) -> void: + progress += speed * delta + + +func set_world_visible(value: bool): + world_model.set_visible(value) + + +func set_minimap_visible(value: bool): + minimap_model.set_visible(value) diff --git a/Scripts/pause_menu.gd b/Scripts/pause_menu.gd new file mode 100644 index 0000000..8b61f95 --- /dev/null +++ b/Scripts/pause_menu.gd @@ -0,0 +1,46 @@ +extends Control +class_name PauseMenu + +signal closed + +var options_menu_scene = preload("res://Scenes/Menus/options_menu.tscn") +var confirmation_popup_scene = preload("res://Scenes/Menus/confirmation_popup.tscn") + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("Pause"): + accept_event() + _on_resume_pressed() + + +func _on_resume_pressed() -> void: + closed.emit() + queue_free() + + +func _on_options_pressed() -> void: + var menu = options_menu_scene.instantiate() + add_child(menu) + + +func _on_quit_to_main_menu_pressed() -> void: + var popup = confirmation_popup_scene.instantiate() as ConfirmationPopup + popup.set_popup("Are you sure you want to quit and return to main menu?", "Yes", "No") + popup.completed.connect(return_to_menu) + add_child(popup) + + +func return_to_menu(confirmation): + if confirmation: + Game.scene_switch_main_menu() + + +func _on_quit_to_desktop_pressed() -> void: + var popup = confirmation_popup_scene.instantiate() as ConfirmationPopup + popup.set_popup("Are you sure you want to quit?", "Yes", "No") + popup.completed.connect(quit_game) + add_child(popup) + + +func quit_game(confirmation): + if confirmation: + Game.quit_to_desktop() diff --git a/Scripts/scoreboard.gd b/Scripts/scoreboard.gd new file mode 100644 index 0000000..266eac7 --- /dev/null +++ b/Scripts/scoreboard.gd @@ -0,0 +1,46 @@ +extends PanelContainer +class_name Scoreboard + +signal all_players_ready + +var entry_scene = preload("res://Scenes/UI/scoreboard_entry.tscn") +var entries = {} + +func _ready() -> void: + $VBoxContainer/DummyEntry1.queue_free() + $VBoxContainer/DummyEntry2.queue_free() + $VBoxContainer/DummyEntry3.queue_free() + + +func get_player_entry(peer_id) -> ScoreboardEntry: + return entries[peer_id] + + +func set_player_ready_state(peer_id: int, state: bool): + entries[peer_id].set_ready_state(state) + for id in entries: + if !entries[id].get_ready_state(): + return + all_players_ready.emit() + unready_all_players() + + +func unready_all_players(): + for peer_id in entries: + entries[peer_id].set_ready_state(false) + + +func add_player(peer_id: int, player_profile: PlayerProfile): + var entry = entry_scene.instantiate() as ScoreboardEntry + entry.name = str(peer_id) + entry.set_display_name("", player_profile.get_display_name()) + entry.set_character(0, player_profile.get_preferred_class()) + player_profile.display_name_changed.connect(entry.set_display_name) + player_profile.preferred_class_changed.connect(entry.set_character) + entries[peer_id] = entry + $VBoxContainer.add_child(entry) + + +func remove_player(peer_id: int): + entries[peer_id].queue_free() + entries.erase(peer_id) diff --git a/Scripts/scoreboard_entry.gd b/Scripts/scoreboard_entry.gd new file mode 100644 index 0000000..7a27956 --- /dev/null +++ b/Scripts/scoreboard_entry.gd @@ -0,0 +1,28 @@ +extends HBoxContainer +class_name ScoreboardEntry + +var display_name: String +var character: int +var ready_state: bool + + +func set_display_name(_old_name: String, new_name: String): + display_name = new_name + $DisplayName.text = new_name +func get_display_name() -> String: + return display_name + +func set_character(_old_class: int, new_class: int): + character = new_class + $CharacterName.text = Data.characters[new_class].hero_name +func get_character() -> int: + return character + +func set_ready_state(state: bool): + ready_state = state + if state: + $TextureRect.texture.region = Rect2(32, 0, 32, 32) + else: + $TextureRect.texture.region = Rect2(0, 0, 32, 32) +func get_ready_state() -> bool: + return ready_state diff --git a/Scripts/server_form.gd b/Scripts/server_form.gd new file mode 100644 index 0000000..6998f97 --- /dev/null +++ b/Scripts/server_form.gd @@ -0,0 +1,18 @@ +extends PanelContainer +class_name ServerForm + +signal connect_button_pressed +signal host_button_pressed + + +func _on_host_pressed() -> void: + host_button_pressed.emit() + queue_free() +func _on_connect_pressed() -> void: + connect_button_pressed.emit() + queue_free() + +func get_server_ip() -> String: + return $VBoxContainer/HBoxContainer/ServerIP.text +func get_server_port() -> String: + return $VBoxContainer/HBoxContainer2/ServerPort.text diff --git a/Scripts/singleplayer_lobby.gd b/Scripts/singleplayer_lobby.gd new file mode 100644 index 0000000..0ad81c2 --- /dev/null +++ b/Scripts/singleplayer_lobby.gd @@ -0,0 +1,41 @@ +extends Control + +@export var scoreboard : Scoreboard +@export var loadout_editor : LoadoutEditor +@export var chatbox : Chatbox +var connected_players_profiles = {} + + +func _ready() -> void: + setup_game() + + +func setup_game(): + Game.spawn_level() + scoreboard.add_player(1, Data.player_profile) + scoreboard.all_players_ready.connect(start_game) + Game.game_restarted.connect(setup_the_ui) + setup_the_ui() + chatbox.username = Data.player_profile.display_name + Data.player_profile.display_name_changed.connect(chatbox.change_username) + loadout_editor.character_selected.connect(Data.player_profile.set_preferred_class) + loadout_editor.character_selected.connect(edit_player_profile) + connected_players_profiles[1] = Data.player_profile + + +func edit_player_profile(_argument): + var profile_dict = Data.player_profile.to_dict() + + +func start_game(): + Game.spawn_players(connected_players_profiles.keys(), connected_players_profiles, chatbox.opened, chatbox.closed) + scoreboard.set_visible(false) + loadout_editor.set_visible(false) + + +func setup_the_ui(): + scoreboard.unready_all_players() + scoreboard.set_visible(true) + loadout_editor.set_visible(true) + $ReadyButton.set_visible(true) + chatbox.set_visible(true) diff --git a/Scripts/target_dummy.gd b/Scripts/target_dummy.gd new file mode 100644 index 0000000..bb94697 --- /dev/null +++ b/Scripts/target_dummy.gd @@ -0,0 +1,14 @@ +extends EnemyController +class_name Dummy + +func _on_health_health_depleted() -> void: + $Dog/Health.max_health = stats.health + $Dog/Health.current_health = stats.health + $Dog/SubViewport/ProgressBar.max_value = stats.health + $Dog/SubViewport/ProgressBar.value = stats.health + + +func _physics_process(delta: float) -> void: + progress += movement_speed * delta + if progress_ratio >= 1: + progress_ratio = 0 diff --git a/Scripts/text_input_popup.gd b/Scripts/text_input_popup.gd new file mode 100644 index 0000000..85e2a52 --- /dev/null +++ b/Scripts/text_input_popup.gd @@ -0,0 +1,14 @@ +extends PanelContainer +class_name TextInputPopup + +signal completed(outcome) + +func set_popup(prompt_text, placeholder_text, confirm_text): + $VBoxContainer/LineEdit.text = prompt_text + $VBoxContainer/LineEdit.placeholder_text = placeholder_text + $VBoxContainer/Button.text = confirm_text + + +func _on_button_pressed() -> void: + completed.emit($VBoxContainer/LineEdit.text) + queue_free() diff --git a/Scripts/tower_base.gd b/Scripts/tower_base.gd new file mode 100644 index 0000000..586a398 --- /dev/null +++ b/Scripts/tower_base.gd @@ -0,0 +1,39 @@ +extends StaticBody3D +class_name TowerBase + +@export var inventory : Inventory +@export var block : CSGBox3D +@export var collider : CollisionShape3D +@export var minimap_icon : Sprite3D + +var tower = null +var has_card : bool : + set(_value): + return + get: + return inventory.contents.size() != 0 + + +func add_card(card: Card) -> bool: + var result = inventory.add(card) + if result: + tower = card.turret.instantiate() as Tower + tower.stats = card.tower_stats + minimap_icon.modulate = Color.RED + add_child(tower) + return result + + +func remove_card() -> Card: + tower.queue_free() + tower = null + minimap_icon.modulate = Color.GREEN + return inventory.remove() + + +func set_material(value: StandardMaterial3D): + block.material = value + + +func toggle_collision(): + collider.disabled = !collider.disabled diff --git a/Scripts/visualized_path.gd b/Scripts/visualized_path.gd new file mode 100644 index 0000000..ecf2a80 --- /dev/null +++ b/Scripts/visualized_path.gd @@ -0,0 +1,26 @@ +extends Path3D +class_name VisualizedPath + +var visual_scene = preload("res://Scenes/path_visual_thing.tscn") +var length := 0.0 +var visualizer_points = [] + +func spawn_visualizer_points() -> void: + var new_length = curve.get_baked_length() + for x in new_length - length: + var point = visual_scene.instantiate() + visualizer_points.append(point) + add_child(point) + length = new_length + for x in visualizer_points.size(): + visualizer_points[x].progress_ratio = float(x) / visualizer_points.size() + + +func disable_visualization(): + for x in visualizer_points: + x.set_world_visible(false) + + +func enable_visualization(): + for x in visualizer_points: + x.set_world_visible(true) diff --git a/Scripts/wave_manager.gd b/Scripts/wave_manager.gd new file mode 100644 index 0000000..5705622 --- /dev/null +++ b/Scripts/wave_manager.gd @@ -0,0 +1,21 @@ +extends Node + + +func calculate_spawn_power(wave_number : int, number_of_players : int) -> int: + return 20 + (50 * number_of_players) + (30 * wave_number) + + +func generate_wave(spawn_power : int, spawn_pool : Array[Enemy]) -> Dictionary: + var wave = {} + #var sp_used = 0 + var enemy_types = randi_range(1, 5) + var enemy_choices = spawn_pool.duplicate() + var sp_allotment = spawn_power / enemy_types + for x in enemy_types: + var choice = enemy_choices.pick_random() + enemy_choices.erase(choice) + if sp_allotment / choice.spawn_power > 0: + wave[choice] = sp_allotment / choice.spawn_power + #sp_used += wave[choice] * choice.spawn_power + #print("tried to generate wave with " + str(spawn_power) + " spawn power, used " + str(sp_used)) + return wave diff --git a/Scripts/won_game_screen.gd b/Scripts/won_game_screen.gd new file mode 100644 index 0000000..e364d61 --- /dev/null +++ b/Scripts/won_game_screen.gd @@ -0,0 +1,10 @@ +extends Control + + +func _on_quit_button_pressed() -> void: + Game.quit_to_desktop() + + +func _on_play_button_pressed() -> void: + Game.restart_game() + queue_free() diff --git a/Worlds/GreenPlanet/Decorations/tree.tscn b/Worlds/GreenPlanet/Decorations/tree.tscn new file mode 100644 index 0000000..26bd3a4 --- /dev/null +++ b/Worlds/GreenPlanet/Decorations/tree.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=3 uid="uid://iohlxrso4bl8"] + +[ext_resource type="Texture2D" uid="uid://dy2ukmg6koun1" path="res://Assets/Textures/tree.png" id="1_sisdp"] +[ext_resource type="Texture2D" uid="uid://dg47vgt0uccw1" path="res://Assets/Textures/minimap_tree.png" id="2_85nm0"] + +[node name="Tree" type="Node3D"] + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.15464, 0) +pixel_size = 0.05 +alpha_cut = 1 +texture_filter = 0 +texture = ExtResource("1_sisdp") + +[node name="Sprite3D2" type="Sprite3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 2.15464, 0) +pixel_size = 0.05 +alpha_cut = 1 +texture_filter = 0 +texture = ExtResource("1_sisdp") + +[node name="Sprite3D3" type="Sprite3D" parent="."] +transform = Transform3D(7.5, 0, 0, 0, -3.27835e-07, 7.5, 0, -7.5, -3.27835e-07, 0, 5.98547, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("2_85nm0") diff --git a/Worlds/GreenPlanet/Enemies/air_enemy.tscn b/Worlds/GreenPlanet/Enemies/air_enemy.tscn new file mode 100644 index 0000000..74ff08c --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/air_enemy.tscn @@ -0,0 +1,85 @@ +[gd_scene load_steps=12 format=3 uid="uid://bjo2q6vca5qlv"] + +[ext_resource type="Script" path="res://Worlds/GreenPlanet/Enemies/air_enemy_controller.gd" id="1_lyo1o"] +[ext_resource type="Resource" uid="uid://dsgkwh3opyqtx" path="res://Worlds/GreenPlanet/Enemies/airenemy.tres" id="2_6qx4a"] +[ext_resource type="Script" path="res://Scripts/health.gd" id="3_wiose"] +[ext_resource type="PackedScene" uid="uid://cqtew0t8sttpm" path="res://Scenes/damage_particle.tscn" id="4_mhq3m"] +[ext_resource type="Script" path="res://Scripts/hitbox.gd" id="5_433ie"] +[ext_resource type="Texture2D" uid="uid://chhmkmlfrobhu" path="res://Assets/Textures/bubble.png" id="6_ke2c8"] +[ext_resource type="Texture2D" uid="uid://r202vo47jw1q" path="res://Assets/Textures/enemyhealth.png" id="8_77uyi"] +[ext_resource type="Script" path="res://Scripts/StatusEffector.gd" id="9_7hati"] +[ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="9_7yfyh"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_21dgw"] + +[sub_resource type="ViewportTexture" id="ViewportTexture_ss5ir"] +viewport_path = NodePath("SubViewport") + +[node name="Dog" type="CharacterBody3D" node_paths=PackedStringArray("status_manager") groups=["Enemies"]] +collision_layer = 4 +collision_mask = 3 +motion_mode = 1 +script = ExtResource("1_lyo1o") +stats = ExtResource("2_6qx4a") +status_manager = NodePath("StatusEffector") + +[node name="Health" type="Node" parent="."] +script = ExtResource("3_wiose") +damage_particle_scene = ExtResource("4_mhq3m") + +[node name="Hitbox" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.527022, 0) +shape = SubResource("SphereShape3D_21dgw") +script = ExtResource("5_433ie") + +[node name="Sprite3D3" type="Sprite3D" parent="."] +transform = Transform3D(1.56, 0, 0, 0, 1.56, 0, 0, 0, 1.56, 0, 0.546419, 0) +billboard = 1 +texture_filter = 0 +texture = ExtResource("6_ke2c8") + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 1.15918, 0) +pixel_size = 0.02 +billboard = 1 +texture_filter = 0 +texture = SubResource("ViewportTexture_ss5ir") + +[node name="Sprite3D2" type="Sprite3D" parent="."] +transform = Transform3D(2, 0, 0, 0, -8.74228e-08, 2, 0, -2, -8.74228e-08, 0, 1.40824, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("9_7yfyh") + +[node name="StatusEffector" type="Node3D" parent="." node_paths=PackedStringArray("hbox")] +script = ExtResource("9_7hati") +hbox = NodePath("../SubViewport/HBoxContainer") + +[node name="SubViewport" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(200, 55) +render_target_update_mode = 4 + +[node name="HBoxContainer" type="HBoxContainer" parent="SubViewport"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 32.0 +grow_horizontal = 2 +alignment = 1 + +[node name="ProgressBar" type="TextureProgressBar" parent="SubViewport"] +visible = false +offset_top = 36.0 +offset_right = 200.0 +offset_bottom = 236.0 +grow_horizontal = 2 +grow_vertical = 2 +step = 0.0 +value = 100.0 +fill_mode = 6 +texture_progress = ExtResource("8_77uyi") +tint_progress = Color(0, 1, 0, 1) + +[connection signal="health_changed" from="Health" to="." method="_on_health_health_changed"] +[connection signal="health_depleted" from="Health" to="." method="_on_health_health_depleted"] +[connection signal="took_damage" from="Hitbox" to="Health" method="take_damage"] diff --git a/Worlds/GreenPlanet/Enemies/air_enemy_controller.gd b/Worlds/GreenPlanet/Enemies/air_enemy_controller.gd new file mode 100644 index 0000000..a61f7eb --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/air_enemy_controller.gd @@ -0,0 +1,54 @@ +extends CharacterBody3D +class_name AirEnemyController + +signal reached_goal(penalty) +signal died + +var alive = true + +@export var stats : Enemy +@export var status_manager : StatusEffector + +var movement_speed +var progress := 0.0 +var progress_ratio := 0.0 +var destination : Node3D + +func _ready() -> void: + $Health.max_health = stats.health + $Health.current_health = stats.health + $SubViewport/ProgressBar.max_value = stats.health + $SubViewport/ProgressBar.value = stats.health + $Sprite3D3.texture = stats.sprite.duplicate() + movement_speed = stats.movement_speed + + +func damage(amount): + $Hitbox.damage(amount) + + +func _physics_process(delta: float) -> void: + progress += movement_speed * delta + velocity = global_position.direction_to(destination.global_position) * movement_speed + move_and_slide() + if global_position.distance_to(destination.global_position) <= 1.0: + reached_goal.emit(stats.penalty) + queue_free() + + +func die(): + died.emit() + queue_free() + + +func _on_health_health_depleted() -> void: + if alive: + alive = false + die() + + +func _on_health_health_changed(health) -> void: + $SubViewport/ProgressBar.value = health + var percent = float($Health.current_health) / float($Health.max_health) + $SubViewport/ProgressBar.tint_progress = Color(1 - percent, percent, 0.0) + $SubViewport/ProgressBar.set_visible(true) diff --git a/Worlds/GreenPlanet/Enemies/airenemy.tres b/Worlds/GreenPlanet/Enemies/airenemy.tres new file mode 100644 index 0000000..a68fe35 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/airenemy.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=4 format=3 uid="uid://dsgkwh3opyqtx"] + +[ext_resource type="Texture2D" uid="uid://chhmkmlfrobhu" path="res://Assets/Textures/bubble.png" id="1_57rr1"] +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_wjbfx"] +[ext_resource type="Texture2D" uid="uid://d0vafwv4lhjji" path="res://Assets/TextureAtlases/bubble.tres" id="3_homny"] + +[resource] +script = ExtResource("1_wjbfx") +title = "bubble" +target_type = 2 +icon = ExtResource("1_57rr1") +sprite = ExtResource("3_homny") +spawn_power = 4 +health = 40 +penalty = 4 +movement_speed = 1.5 +spawn_cooldown = 1.0 diff --git a/Worlds/GreenPlanet/Enemies/airenemy2.tres b/Worlds/GreenPlanet/Enemies/airenemy2.tres new file mode 100644 index 0000000..e9c19ea --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/airenemy2.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=4 format=3 uid="uid://bffhb5krs5elm"] + +[ext_resource type="Texture2D" uid="uid://duywsy7jmh4u" path="res://Assets/Textures/spike.png" id="1_22o7e"] +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_q5r05"] +[ext_resource type="Texture2D" uid="uid://sybn6bjbj5fh" path="res://Assets/TextureAtlases/spike.tres" id="3_tbb38"] + +[resource] +script = ExtResource("1_q5r05") +title = "spike" +target_type = 2 +icon = ExtResource("1_22o7e") +sprite = ExtResource("3_tbb38") +spawn_power = 8 +health = 100 +penalty = 7 +movement_speed = 1.0 +spawn_cooldown = 1.0 diff --git a/Worlds/GreenPlanet/Enemies/dog.tres b/Worlds/GreenPlanet/Enemies/dog.tres new file mode 100644 index 0000000..a5cb129 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/dog.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=5 format=3 uid="uid://8eba45hql7bo"] + +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_2lqbg"] +[ext_resource type="Texture2D" uid="uid://g00wwrlxxdc5" path="res://Assets/Textures/icon_eye_dog.png" id="1_es0ht"] +[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="2_vgx18"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_n6kdu"] +resource_local_to_scene = true +atlas = ExtResource("2_vgx18") +region = Rect2(0, 0, 32, 32) + +[resource] +resource_local_to_scene = true +script = ExtResource("1_2lqbg") +title = "dog" +target_type = 1 +icon = ExtResource("1_es0ht") +sprite = SubResource("AtlasTexture_n6kdu") +spawn_power = 10 +health = 200 +penalty = 10 +movement_speed = 1.2 +spawn_cooldown = 1.2 diff --git a/Worlds/GreenPlanet/Enemies/dog_boss.tres b/Worlds/GreenPlanet/Enemies/dog_boss.tres new file mode 100644 index 0000000..f3660c3 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/dog_boss.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=4 format=3 uid="uid://boik1gnpl4v0a"] + +[ext_resource type="Texture2D" uid="uid://cde0voyrwnqkl" path="res://Assets/Textures/icon_eye_dog_boss.png" id="1_2o720"] +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_euaab"] +[ext_resource type="Texture2D" uid="uid://ff3cys53p37j" path="res://Assets/TextureAtlases/dog_fast_boss.tres" id="2_1m62w"] + +[resource] +script = ExtResource("1_euaab") +title = "boss dog" +target_type = 1 +icon = ExtResource("1_2o720") +sprite = ExtResource("2_1m62w") +spawn_power = 100 +health = 1000 +penalty = 40 +movement_speed = 1.0 +spawn_cooldown = 1.0 diff --git a/Worlds/GreenPlanet/Enemies/dog_fast.tres b/Worlds/GreenPlanet/Enemies/dog_fast.tres new file mode 100644 index 0000000..f244db7 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/dog_fast.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=4 format=3 uid="uid://cvehqh4tt28g7"] + +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_k5sd1"] +[ext_resource type="Texture2D" uid="uid://cv5p03aw78vwd" path="res://Assets/Textures/icon_eye_dog_fast.png" id="1_xgen5"] +[ext_resource type="Texture2D" uid="uid://dd212gh03wloa" path="res://Assets/TextureAtlases/dog_fast.tres" id="2_mkbm6"] + +[resource] +script = ExtResource("1_k5sd1") +title = "fast dog" +target_type = 1 +icon = ExtResource("1_xgen5") +sprite = ExtResource("2_mkbm6") +spawn_power = 16 +health = 100 +penalty = 4 +movement_speed = 3.5 +spawn_cooldown = 0.7 diff --git a/Worlds/GreenPlanet/Enemies/dog_heavy.tres b/Worlds/GreenPlanet/Enemies/dog_heavy.tres new file mode 100644 index 0000000..ec06072 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/dog_heavy.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=4 format=3 uid="uid://dxi17xvdlhkvc"] + +[ext_resource type="Texture2D" uid="uid://08n5jvq5tptf" path="res://Assets/Textures/icon_eye_dog_heavy.png" id="1_lck53"] +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_q48il"] +[ext_resource type="Texture2D" uid="uid://c0543ucoalwmi" path="res://Assets/TextureAtlases/dog_fast_heavy.tres" id="2_7nc4x"] + +[resource] +script = ExtResource("1_q48il") +title = "heavy dog" +target_type = 1 +icon = ExtResource("1_lck53") +sprite = ExtResource("2_7nc4x") +spawn_power = 14 +health = 400 +penalty = 10 +movement_speed = 0.8 +spawn_cooldown = 2.0 diff --git a/Worlds/GreenPlanet/Enemies/enemy_controller.gd b/Worlds/GreenPlanet/Enemies/enemy_controller.gd new file mode 100644 index 0000000..76b24aa --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/enemy_controller.gd @@ -0,0 +1,48 @@ +extends PathFollow3D +class_name EnemyController + +signal reached_goal(penalty) +signal died + +var alive = true + +@export var stats : Enemy +@export var status_manager : StatusEffector +var movement_speed + +func _ready() -> void: + $Dog/Health.max_health = stats.health + $Dog/Health.current_health = stats.health + $Dog/SubViewport/ProgressBar.max_value = stats.health + $Dog/SubViewport/ProgressBar.value = stats.health + $Dog/DirectionSprite.texture = stats.sprite.duplicate() + movement_speed = stats.movement_speed + + +func damage(amount): + $Dog/Hitbox.damage(amount) + + +func _physics_process(delta: float) -> void: + progress += movement_speed * delta + if progress_ratio >= 1: + reached_goal.emit(stats.penalty) + queue_free() + + +func die(): + died.emit() + queue_free() + + +func _on_health_health_depleted() -> void: + if alive: + alive = false + die() + + +func _on_health_health_changed(health) -> void: + $Dog/SubViewport/ProgressBar.value = health + var percent = float($Dog/Health.current_health) / float($Dog/Health.max_health) + $Dog/SubViewport/ProgressBar.tint_progress = Color(1 - percent, percent, 0.0) + $Dog/SubViewport/ProgressBar.set_visible(true) diff --git a/Worlds/GreenPlanet/Enemies/land_enemy.tscn b/Worlds/GreenPlanet/Enemies/land_enemy.tscn new file mode 100644 index 0000000..2b01464 --- /dev/null +++ b/Worlds/GreenPlanet/Enemies/land_enemy.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=14 format=3 uid="uid://b0nady5xm88bo"] + +[ext_resource type="Script" path="res://Worlds/GreenPlanet/Enemies/enemy_controller.gd" id="1_fwsjt"] +[ext_resource type="Script" path="res://Scripts/hitbox.gd" id="2_j8yin"] +[ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="2_o7jmg"] +[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Worlds/GreenPlanet/Enemies/dog.tres" id="2_sswqn"] +[ext_resource type="Script" path="res://Scripts/health.gd" id="2_swu53"] +[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="3_naknq"] +[ext_resource type="PackedScene" uid="uid://cqtew0t8sttpm" path="res://Scenes/damage_particle.tscn" id="4_tn1tu"] +[ext_resource type="Texture2D" uid="uid://r202vo47jw1q" path="res://Assets/Textures/enemyhealth.png" id="8_5ba7s"] +[ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="9_f8btv"] +[ext_resource type="Script" path="res://Scripts/StatusEffector.gd" id="10_txouh"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_21dgw"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_75ly7"] +resource_local_to_scene = true +atlas = ExtResource("3_naknq") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="ViewportTexture" id="ViewportTexture_4tj6k"] +viewport_path = NodePath("Dog/SubViewport") + +[node name="PathFollow3D" type="PathFollow3D" node_paths=PackedStringArray("status_manager") groups=["Enemies"]] +loop = false +script = ExtResource("1_fwsjt") +stats = ExtResource("2_sswqn") +status_manager = NodePath("Dog/StatusEffector") + +[node name="Dog" type="CharacterBody3D" parent="."] +collision_layer = 4 +collision_mask = 3 + +[node name="Health" type="Node" parent="Dog"] +script = ExtResource("2_swu53") +damage_particle_scene = ExtResource("4_tn1tu") + +[node name="Hitbox" type="CollisionShape3D" parent="Dog"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.527022, 0) +shape = SubResource("SphereShape3D_21dgw") +script = ExtResource("2_j8yin") + +[node name="DirectionSprite" parent="Dog" instance=ExtResource("2_o7jmg")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.642479, 0) +pixel_size = 0.04 +texture = SubResource("AtlasTexture_75ly7") + +[node name="Sprite3D" type="Sprite3D" parent="Dog"] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 1.20821, 0) +pixel_size = 0.02 +billboard = 1 +texture_filter = 0 +texture = SubResource("ViewportTexture_4tj6k") + +[node name="Sprite3D2" type="Sprite3D" parent="Dog"] +transform = Transform3D(2, 0, 0, 0, -8.74228e-08, 2, 0, -2, -8.74228e-08, 0, 1.40824, 0) +layers = 4 +texture_filter = 0 +texture = ExtResource("9_f8btv") + +[node name="StatusEffector" type="Node3D" parent="Dog" node_paths=PackedStringArray("hbox")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.18114, 0) +script = ExtResource("10_txouh") +hbox = NodePath("../SubViewport/HBoxContainer") + +[node name="SubViewport" type="SubViewport" parent="Dog"] +transparent_bg = true +size = Vector2i(200, 55) +render_target_update_mode = 4 + +[node name="HBoxContainer" type="HBoxContainer" parent="Dog/SubViewport"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 32.0 +grow_horizontal = 2 +alignment = 1 + +[node name="ProgressBar" type="TextureProgressBar" parent="Dog/SubViewport"] +visible = false +offset_top = 36.0 +offset_right = 200.0 +offset_bottom = 236.0 +grow_horizontal = 2 +grow_vertical = 2 +step = 0.0 +value = 100.0 +fill_mode = 6 +texture_progress = ExtResource("8_5ba7s") +tint_progress = Color(0, 1, 0, 1) + +[connection signal="health_changed" from="Dog/Health" to="." method="_on_health_health_changed"] +[connection signal="health_depleted" from="Dog/Health" to="." method="_on_health_health_depleted"] +[connection signal="took_damage" from="Dog/Hitbox" to="Dog/Health" method="take_damage"] diff --git a/Worlds/GreenPlanet/Levels/first_level.tscn b/Worlds/GreenPlanet/Levels/first_level.tscn new file mode 100644 index 0000000..6926547 --- /dev/null +++ b/Worlds/GreenPlanet/Levels/first_level.tscn @@ -0,0 +1,566 @@ +[gd_scene load_steps=20 format=3 uid="uid://y1qa1g3ic8sp"] + +[ext_resource type="Script" path="res://Scripts/level.gd" id="1_ws6nn"] +[ext_resource type="PackedScene" uid="uid://d2yv447trxkwt" path="res://Scenes/enemy_spawner.tscn" id="3_5imwp"] +[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Worlds/GreenPlanet/Enemies/dog.tres" id="3_l3ehn"] +[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Worlds/GreenPlanet/Enemies/dog_fast.tres" id="4_0gtw5"] +[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Worlds/GreenPlanet/Enemies/dog_heavy.tres" id="5_hppyg"] +[ext_resource type="Resource" uid="uid://boik1gnpl4v0a" path="res://Worlds/GreenPlanet/Enemies/dog_boss.tres" id="6_oty0h"] +[ext_resource type="Resource" uid="uid://dsgkwh3opyqtx" path="res://Worlds/GreenPlanet/Enemies/airenemy.tres" id="7_07st7"] +[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Worlds/GreenPlanet/Enemies/airenemy2.tres" id="8_sf1ao"] +[ext_resource type="PackedScene" uid="uid://1b2ikdanl66b" path="res://Scenes/card_constructor.tscn" id="9_r25gu"] +[ext_resource type="PackedScene" uid="uid://iohlxrso4bl8" path="res://Worlds/GreenPlanet/Decorations/tree.tscn" id="10_7v1co"] +[ext_resource type="Script" path="res://Scripts/AStarGraph3D.gd" id="11_07ukk"] +[ext_resource type="Script" path="res://Scripts/visualized_path.gd" id="11_d7ofl"] +[ext_resource type="PackedScene" uid="uid://bjo2q6vca5qlv" path="res://Worlds/GreenPlanet/Enemies/air_enemy.tscn" id="12_tqi5x"] +[ext_resource type="MeshLibrary" uid="uid://jfr8j8kycfa5" path="res://Worlds/GreenPlanet/tilemap.tres" id="12_ywwug"] + +[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_h1csw"] +energy_multiplier = 3.0 + +[sub_resource type="Sky" id="Sky_t42h5"] +sky_material = SubResource("PhysicalSkyMaterial_h1csw") + +[sub_resource type="Environment" id="Environment_l41d0"] +background_mode = 2 +sky = SubResource("Sky_t42h5") + +[sub_resource type="Curve3D" id="Curve3D_suxqu"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_kkwvm"] +size = Vector3(58.5693, 9.50003, 1) + +[node name="GridMap" type="GridMap" node_paths=PackedStringArray("player_spawns", "enemy_spawns", "enemy_goals", "a_star_graph_3d")] +mesh_library = ExtResource("12_ywwug") +cell_size = Vector3(1, 1, 1) +data = { +"cells": PackedInt32Array(65490, 65504, 0, 65490, 65505, 0, 65490, 65506, 0, 65490, 65507, 0, 65490, 65508, 0, 65490, 65509, 0, 65490, 65510, 0, 65490, 65511, 0, 65490, 65512, 0, 65490, 65513, 0, 65490, 65514, 0, 65490, 65515, 0, 65490, 65516, 0, 65490, 65517, 0, 65490, 65518, 0, 65490, 65519, 0, 65490, 65520, 0, 65490, 65521, 0, 65490, 65522, 0, 65490, 65523, 0, 65490, 65524, 0, 65490, 65525, 0, 65490, 65526, 0, 65490, 65527, 0, 65490, 65528, 0, 65490, 65529, 0, 65490, 65530, 0, 65490, 65531, 0, 65490, 65532, 0, 65490, 65533, 0, 65490, 65534, 0, 65490, 65535, 0, 65490, 0, 0, 65490, 1, 0, 65490, 2, 0, 65490, 3, 0, 65490, 4, 0, 65490, 5, 0, 65490, 6, 0, 65490, 7, 0, 65490, 8, 0, 65490, 9, 0, 65490, 10, 0, 65490, 11, 0, 65490, 12, 0, 65490, 13, 0, 65490, 14, 0, 65490, 15, 0, 65490, 16, 0, 65490, 17, 0, 65490, 18, 0, 65490, 19, 0, 65490, 20, 0, 65490, 21, 0, 65490, 22, 0, 65490, 23, 0, 65490, 24, 0, 65490, 25, 0, 65490, 26, 0, 65490, 27, 0, 65490, 28, 0, 65490, 29, 0, 65490, 30, 0, 65490, 31, 0, 65490, 32, 0, 65490, 33, 0, 65490, 34, 0, 65490, 35, 0, 65491, 65504, 0, 65491, 65505, 0, 65491, 65506, 0, 65491, 65507, 0, 65491, 65508, 0, 65491, 65509, 0, 65491, 65510, 0, 65491, 65511, 0, 65491, 65512, 0, 65491, 65513, 0, 65491, 65514, 0, 65491, 65515, 0, 65491, 65516, 0, 65491, 65517, 0, 65491, 65518, 0, 65491, 65519, 0, 65491, 65520, 0, 65491, 65521, 0, 65491, 65522, 0, 65491, 65523, 0, 65491, 65524, 0, 65491, 65525, 0, 65491, 65526, 0, 65491, 65527, 0, 65491, 65528, 0, 65491, 65529, 0, 65491, 65530, 0, 65491, 65531, 0, 65491, 65532, 0, 65491, 65533, 0, 65491, 65534, 0, 65491, 65535, 0, 65491, 0, 0, 65491, 1, 0, 65491, 2, 0, 65491, 3, 0, 65491, 4, 0, 65491, 5, 0, 65491, 6, 0, 65491, 7, 0, 65491, 8, 0, 65491, 9, 0, 65491, 10, 0, 65491, 11, 0, 65491, 12, 0, 65491, 13, 0, 65491, 14, 0, 65491, 15, 0, 65491, 16, 0, 65491, 17, 0, 65491, 18, 0, 65491, 19, 0, 65491, 20, 0, 65491, 21, 0, 65491, 22, 0, 65491, 23, 0, 65491, 24, 0, 65491, 25, 0, 65491, 26, 0, 65491, 27, 0, 65491, 28, 0, 65491, 29, 0, 65491, 30, 0, 65491, 31, 0, 65491, 32, 0, 65491, 33, 0, 65491, 34, 0, 65491, 35, 0, 65492, 65504, 0, 65492, 65505, 0, 65492, 65506, 0, 65492, 65507, 0, 65492, 65508, 0, 65492, 65509, 0, 65492, 65510, 0, 65492, 65511, 0, 65492, 65512, 0, 65492, 65513, 0, 65492, 65514, 0, 65492, 65515, 0, 65492, 65516, 0, 65492, 65517, 0, 65492, 65518, 0, 65492, 65519, 0, 65492, 65520, 0, 65492, 65521, 0, 65492, 65522, 0, 65492, 65523, 0, 65492, 65524, 0, 65492, 65525, 0, 65492, 65526, 0, 65492, 65527, 0, 65492, 65528, 0, 65492, 65529, 0, 65492, 65530, 0, 65492, 65531, 0, 65492, 65532, 0, 65492, 65533, 0, 65492, 65534, 0, 65492, 65535, 0, 65492, 0, 0, 65492, 1, 0, 65492, 2, 0, 65492, 3, 0, 65492, 4, 0, 65492, 5, 0, 65492, 6, 0, 65492, 7, 0, 65492, 8, 0, 65492, 9, 0, 65492, 10, 0, 65492, 11, 0, 65492, 12, 0, 65492, 13, 0, 65492, 14, 0, 65492, 15, 0, 65492, 16, 0, 65492, 17, 0, 65492, 18, 0, 65492, 19, 0, 65492, 20, 0, 65492, 21, 0, 65492, 22, 0, 65492, 23, 0, 65492, 24, 0, 65492, 25, 0, 65492, 26, 0, 65492, 27, 0, 65492, 28, 0, 65492, 29, 0, 65492, 30, 0, 65492, 31, 0, 65492, 32, 0, 65492, 33, 0, 65492, 34, 0, 65492, 35, 0, 65493, 65504, 0, 65493, 65505, 0, 65493, 65506, 0, 65493, 65507, 0, 65493, 65508, 0, 65493, 65509, 0, 65493, 65510, 0, 65493, 65511, 0, 65493, 65512, 0, 65493, 65513, 0, 65493, 65514, 0, 65493, 65515, 0, 65493, 65516, 0, 65493, 65517, 0, 65493, 65518, 0, 65493, 65519, 0, 65493, 65520, 0, 65493, 65521, 0, 65493, 65522, 0, 65493, 65523, 0, 65493, 65524, 0, 65493, 65525, 0, 65493, 65526, 0, 65493, 65527, 0, 65493, 65528, 0, 65493, 65529, 0, 65493, 65530, 0, 65493, 65531, 0, 65493, 65532, 0, 65493, 65533, 0, 65493, 65534, 0, 65493, 65535, 0, 65493, 0, 0, 65493, 1, 0, 65493, 2, 0, 65493, 3, 0, 65493, 4, 0, 65493, 5, 0, 65493, 6, 0, 65493, 7, 0, 65493, 8, 0, 65493, 9, 0, 65493, 10, 0, 65493, 11, 0, 65493, 12, 0, 65493, 13, 0, 65493, 14, 0, 65493, 15, 0, 65493, 16, 0, 65493, 17, 0, 65493, 18, 0, 65493, 19, 0, 65493, 20, 0, 65493, 21, 0, 65493, 22, 0, 65493, 23, 0, 65493, 24, 0, 65493, 25, 0, 65493, 26, 0, 65493, 27, 0, 65493, 28, 0, 65493, 29, 0, 65493, 30, 0, 65493, 31, 0, 65493, 32, 0, 65493, 33, 0, 65493, 34, 0, 65493, 35, 0, 65494, 65504, 0, 65494, 65505, 0, 65494, 65506, 0, 65494, 65507, 0, 65494, 65508, 0, 65494, 65509, 0, 65494, 65510, 0, 65494, 65511, 0, 65494, 65512, 0, 65494, 65513, 0, 65494, 65514, 0, 65494, 65515, 0, 65494, 65516, 0, 65494, 65517, 0, 65494, 65518, 0, 65494, 65519, 0, 65494, 65520, 0, 65494, 65521, 0, 65494, 65522, 0, 65494, 65523, 0, 65494, 65524, 0, 65494, 65525, 0, 65494, 65526, 0, 65494, 65527, 0, 65494, 65528, 0, 65494, 65529, 0, 65494, 65530, 0, 65494, 65531, 0, 65494, 65532, 0, 65494, 65533, 0, 65494, 65534, 0, 65494, 65535, 0, 65494, 0, 0, 65494, 1, 0, 65494, 2, 0, 65494, 3, 0, 65494, 4, 0, 65494, 5, 0, 65494, 6, 0, 65494, 7, 0, 65494, 8, 0, 65494, 9, 0, 65494, 10, 0, 65494, 11, 0, 65494, 12, 0, 65494, 13, 0, 65494, 14, 0, 65494, 15, 0, 65494, 16, 0, 65494, 17, 0, 65494, 18, 0, 65494, 19, 0, 65494, 20, 0, 65494, 21, 0, 65494, 22, 0, 65494, 23, 0, 65494, 24, 0, 65494, 25, 0, 65494, 26, 0, 65494, 27, 0, 65494, 28, 0, 65494, 29, 0, 65494, 30, 0, 65494, 31, 0, 65494, 32, 0, 65494, 33, 0, 65494, 34, 0, 65494, 35, 0, 65495, 65504, 0, 65495, 65505, 0, 65495, 65506, 0, 65495, 65507, 0, 65495, 65508, 0, 65495, 65509, 0, 65495, 65510, 0, 65495, 65511, 0, 65495, 65512, 0, 65495, 65513, 0, 65495, 65514, 0, 65495, 65515, 0, 65495, 65516, 0, 65495, 65517, 0, 65495, 65518, 0, 65495, 65519, 0, 65495, 65520, 0, 65495, 65521, 0, 65495, 65522, 0, 65495, 65523, 0, 65495, 65524, 0, 65495, 65525, 0, 65495, 65526, 0, 65495, 65527, 0, 65495, 65528, 0, 65495, 65529, 0, 65495, 65530, 0, 65495, 65531, 0, 65495, 65532, 0, 65495, 65533, 0, 65495, 65534, 0, 65495, 65535, 0, 65495, 0, 0, 65495, 1, 0, 65495, 2, 0, 65495, 3, 0, 65495, 4, 0, 65495, 5, 0, 65495, 6, 0, 65495, 7, 0, 65495, 8, 0, 65495, 9, 0, 65495, 10, 0, 65495, 11, 0, 65495, 12, 0, 65495, 13, 0, 65495, 14, 0, 65495, 15, 0, 65495, 16, 0, 65495, 17, 0, 65495, 18, 0, 65495, 19, 0, 65495, 20, 0, 65495, 21, 0, 65495, 22, 0, 65495, 23, 0, 65495, 24, 0, 65495, 25, 0, 65495, 26, 0, 65495, 27, 0, 65495, 28, 0, 65495, 29, 0, 65495, 30, 0, 65495, 31, 0, 65495, 32, 0, 65495, 33, 0, 65495, 34, 0, 65495, 35, 0, 65496, 65504, 0, 65496, 65505, 0, 65496, 65506, 0, 65496, 65507, 0, 65496, 65508, 0, 65496, 65509, 0, 65496, 65510, 0, 65496, 65511, 0, 65496, 65512, 0, 65496, 65513, 0, 65496, 65514, 0, 65496, 65515, 0, 65496, 65516, 0, 65496, 65517, 0, 65496, 65518, 0, 65496, 65519, 0, 65496, 65520, 0, 65496, 65521, 0, 65496, 65522, 0, 65496, 65523, 0, 65496, 65524, 0, 65496, 65525, 0, 65496, 65526, 0, 65496, 65527, 0, 65496, 65528, 0, 65496, 65529, 0, 65496, 65530, 0, 65496, 65531, 0, 65496, 65532, 0, 65496, 65533, 0, 65496, 65534, 0, 65496, 65535, 0, 65496, 0, 0, 65496, 1, 0, 65496, 2, 0, 65496, 3, 0, 65496, 4, 0, 65496, 5, 0, 65496, 6, 0, 65496, 7, 0, 65496, 8, 0, 65496, 9, 0, 65496, 10, 0, 65496, 11, 0, 65496, 12, 0, 65496, 13, 0, 65496, 14, 0, 65496, 15, 0, 65496, 16, 0, 65496, 17, 0, 65496, 18, 0, 65496, 19, 0, 65496, 20, 0, 65496, 21, 0, 65496, 22, 0, 65496, 23, 0, 65496, 24, 0, 65496, 25, 0, 65496, 26, 0, 65496, 27, 0, 65496, 28, 0, 65496, 29, 0, 65496, 30, 0, 65496, 31, 0, 65496, 32, 0, 65496, 33, 0, 65496, 34, 0, 65496, 35, 0, 65497, 65504, 0, 65497, 65505, 0, 65497, 65506, 0, 65497, 65507, 0, 65497, 65508, 0, 65497, 65509, 0, 65497, 65510, 0, 65497, 65511, 0, 65497, 65512, 0, 65497, 65513, 0, 65497, 65514, 0, 65497, 65515, 0, 65497, 65516, 0, 65497, 65517, 0, 65497, 65518, 0, 65497, 65519, 0, 65497, 65520, 0, 65497, 65521, 0, 65497, 65522, 0, 65497, 65523, 0, 65497, 65524, 0, 65497, 65525, 0, 65497, 65526, 0, 65497, 65527, 0, 65497, 65528, 0, 65497, 65529, 0, 65497, 65530, 0, 65497, 65531, 0, 65497, 65532, 0, 65497, 65533, 0, 65497, 65534, 0, 65497, 65535, 0, 65497, 0, 0, 65497, 1, 0, 65497, 2, 0, 65497, 3, 0, 65497, 4, 0, 65497, 5, 0, 65497, 6, 0, 65497, 7, 0, 65497, 8, 0, 65497, 9, 0, 65497, 10, 0, 65497, 11, 0, 65497, 12, 0, 65497, 13, 0, 65497, 14, 0, 65497, 15, 0, 65497, 16, 0, 65497, 17, 0, 65497, 18, 0, 65497, 19, 0, 65497, 20, 0, 65497, 21, 0, 65497, 22, 0, 65497, 23, 0, 65497, 24, 0, 65497, 25, 0, 65497, 26, 0, 65497, 27, 0, 65497, 28, 0, 65497, 29, 0, 65497, 30, 0, 65497, 31, 0, 65497, 32, 0, 65497, 33, 0, 65497, 34, 0, 65497, 35, 0, 65498, 65504, 0, 65498, 65505, 0, 65498, 65506, 0, 65498, 65507, 0, 65498, 65508, 0, 65498, 65509, 0, 65498, 65510, 0, 65498, 65511, 0, 65498, 65512, 0, 65498, 65513, 0, 65498, 65514, 0, 65498, 65515, 0, 65498, 65516, 0, 65498, 65517, 0, 65498, 65518, 0, 65498, 65519, 0, 65498, 65520, 0, 65498, 65521, 0, 65498, 65522, 0, 65498, 65523, 0, 65498, 65524, 0, 65498, 65525, 0, 65498, 65526, 0, 65498, 65527, 0, 65498, 65528, 0, 65498, 65529, 0, 65498, 65530, 0, 65498, 65531, 0, 65498, 65532, 0, 65498, 65533, 0, 65498, 65534, 0, 65498, 65535, 0, 65498, 0, 0, 65498, 1, 0, 65498, 2, 0, 65498, 3, 0, 65498, 4, 0, 65498, 5, 0, 65498, 6, 0, 65498, 7, 0, 65498, 8, 0, 65498, 9, 0, 65498, 10, 0, 65498, 11, 0, 65498, 12, 0, 65498, 13, 0, 65498, 14, 0, 65498, 15, 0, 65498, 16, 0, 65498, 17, 0, 65498, 18, 0, 65498, 19, 0, 65498, 20, 0, 65498, 21, 0, 65498, 22, 0, 65498, 23, 0, 65498, 24, 0, 65498, 25, 0, 65498, 26, 0, 65498, 27, 0, 65498, 28, 0, 65498, 29, 0, 65498, 30, 0, 65498, 31, 0, 65498, 32, 0, 65498, 33, 0, 65498, 34, 0, 65498, 35, 0, 65499, 65504, 0, 65499, 65505, 0, 65499, 65506, 0, 65499, 65507, 0, 65499, 65508, 0, 65499, 65509, 0, 65499, 65510, 0, 65499, 65511, 0, 65499, 65512, 0, 65499, 65513, 0, 65499, 65514, 0, 65499, 65515, 0, 65499, 65516, 0, 65499, 65517, 0, 65499, 65518, 0, 65499, 65519, 0, 65499, 65520, 0, 65499, 65521, 0, 65499, 65522, 0, 65499, 65523, 0, 65499, 65524, 0, 65499, 65525, 0, 65499, 65526, 0, 65499, 65527, 0, 65499, 65528, 0, 65499, 65529, 0, 65499, 65530, 0, 65499, 65531, 0, 65499, 65532, 0, 65499, 65533, 0, 65499, 65534, 0, 65499, 65535, 0, 65499, 0, 0, 65499, 1, 0, 65499, 2, 0, 65499, 3, 0, 65499, 4, 0, 65499, 5, 0, 65499, 6, 0, 65499, 7, 0, 65499, 8, 0, 65499, 9, 0, 65499, 10, 0, 65499, 11, 0, 65499, 12, 0, 65499, 13, 0, 65499, 14, 0, 65499, 15, 0, 65499, 16, 0, 65499, 17, 0, 65499, 18, 0, 65499, 19, 0, 65499, 20, 0, 65499, 21, 0, 65499, 22, 0, 65499, 23, 0, 65499, 24, 0, 65499, 25, 0, 65499, 26, 0, 65499, 27, 0, 65499, 28, 0, 65499, 29, 0, 65499, 30, 0, 65499, 31, 0, 65499, 32, 0, 65499, 33, 0, 65499, 34, 0, 65499, 35, 0, 65500, 65504, 0, 65500, 65505, 0, 65500, 65506, 0, 65500, 65507, 0, 65500, 65508, 0, 65500, 65509, 0, 65500, 65510, 0, 65500, 65511, 0, 65500, 65512, 0, 65500, 65513, 0, 65500, 65514, 0, 65500, 65515, 0, 65500, 65516, 0, 65500, 65517, 0, 65500, 65518, 0, 65500, 65519, 0, 65500, 65520, 0, 65500, 65521, 0, 65500, 65522, 0, 65500, 65523, 0, 65500, 65524, 0, 65500, 65525, 0, 65500, 65526, 0, 65500, 65527, 0, 65500, 65528, 0, 65500, 65529, 0, 65500, 65530, 0, 65500, 65531, 0, 65500, 65532, 0, 65500, 65533, 0, 65500, 65534, 0, 65500, 65535, 0, 65500, 0, 0, 65500, 1, 0, 65500, 2, 0, 65500, 3, 0, 65500, 4, 0, 65500, 5, 0, 65500, 6, 0, 65500, 7, 0, 65500, 8, 0, 65500, 9, 0, 65500, 10, 0, 65500, 11, 0, 65500, 12, 0, 65500, 13, 0, 65500, 14, 0, 65500, 15, 0, 65500, 16, 0, 65500, 17, 0, 65500, 18, 0, 65500, 19, 0, 65500, 20, 0, 65500, 21, 0, 65500, 22, 0, 65500, 23, 0, 65500, 24, 0, 65500, 25, 0, 65500, 26, 0, 65500, 27, 0, 65500, 28, 0, 65500, 29, 0, 65500, 30, 0, 65500, 31, 0, 65500, 32, 0, 65500, 33, 0, 65500, 34, 0, 65500, 35, 0, 65501, 65504, 0, 65501, 65505, 0, 65501, 65506, 0, 65501, 65507, 0, 65501, 65508, 0, 65501, 65509, 0, 65501, 65510, 0, 65501, 65511, 0, 65501, 65512, 0, 65501, 65513, 0, 65501, 65514, 0, 65501, 65515, 0, 65501, 65516, 0, 65501, 65517, 0, 65501, 65518, 0, 65501, 65519, 0, 65501, 65520, 0, 65501, 65521, 0, 65501, 65522, 0, 65501, 65523, 0, 65501, 65524, 0, 65501, 65525, 0, 65501, 65526, 0, 65501, 65527, 0, 65501, 65528, 0, 65501, 65529, 0, 65501, 65530, 0, 65501, 65531, 0, 65501, 65532, 0, 65501, 65533, 0, 65501, 65534, 0, 65501, 65535, 0, 65501, 0, 0, 65501, 1, 0, 65501, 2, 0, 65501, 3, 0, 65501, 4, 0, 65501, 5, 0, 65501, 6, 0, 65501, 7, 0, 65501, 8, 0, 65501, 9, 0, 65501, 10, 0, 65501, 11, 0, 65501, 12, 0, 65501, 13, 0, 65501, 14, 0, 65501, 15, 0, 65501, 16, 0, 65501, 17, 0, 65501, 18, 0, 65501, 19, 0, 65501, 20, 0, 65501, 21, 0, 65501, 22, 0, 65501, 23, 0, 65501, 24, 0, 65501, 25, 0, 65501, 26, 0, 65501, 27, 0, 65501, 28, 0, 65501, 29, 0, 65501, 30, 0, 65501, 31, 0, 65501, 32, 0, 65501, 33, 0, 65501, 34, 0, 65501, 35, 0, 65502, 65504, 0, 65502, 65505, 0, 65502, 65506, 0, 65502, 65507, 0, 65502, 65508, 0, 65502, 65509, 0, 65502, 65510, 0, 65502, 65511, 0, 65502, 65512, 0, 65502, 65513, 0, 65502, 65514, 0, 65502, 65515, 0, 65502, 65516, 0, 65502, 65517, 0, 65502, 65518, 0, 65502, 65519, 0, 65502, 65520, 0, 65502, 65521, 0, 65502, 65522, 0, 65502, 65523, 0, 65502, 65524, 0, 65502, 65525, 0, 65502, 65526, 0, 65502, 65527, 0, 65502, 65528, 0, 65502, 65529, 0, 65502, 65530, 0, 65502, 65531, 0, 65502, 65532, 0, 65502, 65533, 0, 65502, 65534, 0, 65502, 65535, 0, 65502, 0, 0, 65502, 1, 0, 65502, 2, 0, 65502, 3, 0, 65502, 4, 0, 65502, 5, 0, 65502, 6, 0, 65502, 7, 0, 65502, 8, 0, 65502, 9, 0, 65502, 10, 0, 65502, 11, 0, 65502, 12, 0, 65502, 13, 0, 65502, 14, 0, 65502, 15, 0, 65502, 16, 0, 65502, 17, 0, 65502, 18, 0, 65502, 19, 0, 65502, 20, 0, 65502, 21, 0, 65502, 22, 0, 65502, 23, 0, 65502, 24, 0, 65502, 25, 0, 65502, 26, 0, 65502, 27, 0, 65502, 28, 0, 65502, 29, 0, 65502, 30, 0, 65502, 31, 0, 65502, 32, 0, 65502, 33, 0, 65502, 34, 0, 65502, 35, 0, 65503, 65504, 0, 65503, 65505, 0, 65503, 65506, 0, 65503, 65507, 0, 65503, 65508, 0, 65503, 65509, 0, 65503, 65510, 0, 65503, 65511, 0, 65503, 65512, 0, 65503, 65513, 0, 65503, 65514, 0, 65503, 65515, 0, 65503, 65516, 0, 65503, 65517, 0, 65503, 65518, 0, 65503, 65519, 0, 65503, 65520, 0, 65503, 65521, 0, 65503, 65522, 0, 65503, 65523, 0, 65503, 65524, 0, 65503, 65525, 0, 65503, 65526, 0, 65503, 65527, 0, 65503, 65528, 0, 65503, 65529, 0, 65503, 65530, 0, 65503, 65531, 0, 65503, 65532, 0, 65503, 65533, 0, 65503, 65534, 0, 65503, 65535, 0, 65503, 0, 0, 65503, 1, 0, 65503, 2, 0, 65503, 3, 0, 65503, 4, 0, 65503, 5, 0, 65503, 6, 0, 65503, 7, 0, 65503, 8, 0, 65503, 9, 0, 65503, 10, 0, 65503, 11, 0, 65503, 12, 0, 65503, 13, 0, 65503, 14, 0, 65503, 15, 0, 65503, 16, 0, 65503, 17, 0, 65503, 18, 0, 65503, 19, 0, 65503, 20, 0, 65503, 21, 0, 65503, 22, 0, 65503, 23, 0, 65503, 24, 0, 65503, 25, 0, 65503, 26, 0, 65503, 27, 0, 65503, 28, 0, 65503, 29, 0, 65503, 30, 0, 65503, 31, 0, 65503, 32, 0, 65503, 33, 0, 65503, 34, 0, 65503, 35, 0, 65504, 65504, 0, 65504, 65505, 0, 65504, 65506, 0, 65504, 65507, 0, 65504, 65508, 0, 65504, 65509, 0, 65504, 65510, 0, 65504, 65511, 0, 65504, 65512, 0, 65504, 65513, 0, 65504, 65514, 0, 65504, 65515, 0, 65504, 65516, 0, 65504, 65517, 0, 65504, 65518, 0, 65504, 65519, 0, 65504, 65520, 0, 65504, 65521, 0, 65504, 65522, 0, 65504, 65523, 0, 65504, 65524, 0, 65504, 65525, 0, 65504, 65526, 0, 65504, 65527, 0, 65504, 65528, 0, 65504, 65529, 0, 65504, 65530, 0, 65504, 65531, 0, 65504, 65532, 0, 65504, 65533, 0, 65504, 65534, 0, 65504, 65535, 0, 65504, 0, 0, 65504, 1, 0, 65504, 2, 0, 65504, 3, 0, 65504, 4, 0, 65504, 5, 0, 65504, 6, 0, 65504, 7, 0, 65504, 8, 0, 65504, 9, 0, 65504, 10, 0, 65504, 11, 0, 65504, 12, 0, 65504, 13, 0, 65504, 14, 0, 65504, 15, 0, 65504, 16, 0, 65504, 17, 0, 65504, 18, 0, 65504, 19, 0, 65504, 20, 0, 65504, 21, 0, 65504, 22, 0, 65504, 23, 0, 65504, 24, 0, 65504, 25, 0, 65504, 26, 0, 65504, 27, 0, 65504, 28, 0, 65504, 29, 0, 65504, 30, 0, 65504, 31, 0, 65504, 32, 0, 65504, 33, 0, 65504, 34, 0, 65504, 35, 0, 65505, 65504, 0, 65505, 65505, 0, 65505, 65506, 0, 65505, 65507, 0, 65505, 65508, 0, 65505, 65509, 0, 65505, 65510, 0, 65505, 65511, 0, 65505, 65512, 0, 65505, 65513, 0, 65505, 65514, 0, 65505, 65515, 0, 65505, 65516, 0, 65505, 65517, 0, 65505, 65518, 0, 65505, 65519, 0, 65505, 65520, 0, 65505, 65521, 0, 65505, 65522, 0, 65505, 65523, 0, 65505, 65524, 0, 65505, 65525, 0, 65505, 65526, 0, 65505, 65527, 0, 65505, 65528, 0, 65505, 65529, 0, 65505, 65530, 0, 65505, 65531, 0, 65505, 65532, 0, 65505, 65533, 0, 65505, 65534, 0, 65505, 65535, 0, 65505, 0, 0, 65505, 1, 0, 65505, 2, 0, 65505, 3, 0, 65505, 4, 0, 65505, 5, 0, 65505, 6, 0, 65505, 7, 0, 65505, 8, 0, 65505, 9, 0, 65505, 10, 0, 65505, 11, 0, 65505, 12, 0, 65505, 13, 0, 65505, 14, 0, 65505, 15, 0, 65505, 16, 0, 65505, 17, 0, 65505, 18, 0, 65505, 19, 0, 65505, 20, 0, 65505, 21, 0, 65505, 22, 0, 65505, 23, 0, 65505, 24, 0, 65505, 25, 0, 65505, 26, 0, 65505, 27, 0, 65505, 28, 0, 65505, 29, 0, 65505, 30, 0, 65505, 31, 0, 65505, 32, 0, 65505, 33, 0, 65505, 34, 0, 65505, 35, 0, 65506, 65504, 0, 65506, 65505, 0, 65506, 65506, 0, 65506, 65507, 0, 65506, 65508, 0, 65506, 65509, 0, 65506, 65510, 0, 65506, 65511, 0, 65506, 65512, 0, 65506, 65513, 0, 65506, 65514, 0, 65506, 65515, 0, 65506, 65516, 0, 65506, 65517, 0, 65506, 65518, 0, 65506, 65519, 0, 65506, 65520, 0, 65506, 65521, 0, 65506, 65522, 0, 65506, 65523, 0, 65506, 65524, 0, 65506, 65525, 0, 65506, 65526, 0, 65506, 65527, 0, 65506, 65528, 0, 65506, 65529, 0, 65506, 65530, 0, 65506, 65531, 0, 65506, 65532, 0, 65506, 65533, 0, 65506, 65534, 0, 65506, 65535, 0, 65506, 0, 0, 65506, 1, 0, 65506, 2, 0, 65506, 3, 0, 65506, 4, 0, 65506, 5, 0, 65506, 6, 0, 65506, 7, 0, 65506, 8, 0, 65506, 9, 0, 65506, 10, 0, 65506, 11, 0, 65506, 12, 0, 65506, 13, 0, 65506, 14, 0, 65506, 15, 0, 65506, 16, 0, 65506, 17, 0, 65506, 18, 0, 65506, 19, 0, 65506, 20, 0, 65506, 21, 0, 65506, 22, 0, 65506, 23, 0, 65506, 24, 0, 65506, 25, 0, 65506, 26, 0, 65506, 27, 0, 65506, 28, 0, 65506, 29, 0, 65506, 30, 0, 65506, 31, 0, 65506, 32, 0, 65506, 33, 0, 65506, 34, 0, 65506, 35, 0, 65507, 65504, 0, 65507, 65505, 0, 65507, 65506, 0, 65507, 65507, 0, 65507, 65508, 0, 65507, 65509, 0, 65507, 65510, 0, 65507, 65511, 0, 65507, 65512, 0, 65507, 65513, 0, 65507, 65514, 0, 65507, 65515, 0, 65507, 65516, 0, 65507, 65517, 0, 65507, 65518, 0, 65507, 65519, 0, 65507, 65520, 0, 65507, 65521, 0, 65507, 65522, 0, 65507, 65523, 0, 65507, 65524, 0, 65507, 65525, 0, 65507, 65526, 0, 65507, 65527, 0, 65507, 65528, 0, 65507, 65529, 0, 65507, 65530, 0, 65507, 65531, 0, 65507, 65532, 0, 65507, 65533, 0, 65507, 65534, 0, 65507, 65535, 0, 65507, 0, 0, 65507, 1, 0, 65507, 2, 0, 65507, 3, 0, 65507, 4, 0, 65507, 5, 0, 65507, 6, 0, 65507, 7, 0, 65507, 8, 0, 65507, 9, 0, 65507, 10, 0, 65507, 11, 0, 65507, 12, 0, 65507, 13, 0, 65507, 14, 0, 65507, 15, 0, 65507, 16, 0, 65507, 17, 0, 65507, 18, 0, 65507, 19, 0, 65507, 20, 0, 65507, 21, 0, 65507, 22, 0, 65507, 23, 0, 65507, 24, 0, 65507, 25, 0, 65507, 26, 0, 65507, 27, 0, 65507, 28, 0, 65507, 29, 0, 65507, 30, 0, 65507, 31, 0, 65507, 32, 0, 65507, 33, 0, 65507, 34, 0, 65507, 35, 0, 65508, 65504, 0, 65508, 65505, 0, 65508, 65506, 0, 65508, 65507, 0, 65508, 65508, 0, 65508, 65509, 0, 65508, 65510, 0, 65508, 65511, 0, 65508, 65512, 0, 65508, 65513, 0, 65508, 65514, 0, 65508, 65515, 0, 65508, 65516, 0, 65508, 65517, 0, 65508, 65518, 0, 65508, 65519, 0, 65508, 65520, 0, 65508, 65521, 0, 65508, 65522, 0, 65508, 65523, 0, 65508, 65524, 0, 65508, 65525, 0, 65508, 65526, 0, 65508, 65527, 0, 65508, 65528, 0, 65508, 65529, 0, 65508, 65530, 0, 65508, 65531, 0, 65508, 65532, 0, 65508, 65533, 0, 65508, 65534, 0, 65508, 65535, 0, 65508, 0, 0, 65508, 1, 0, 65508, 2, 0, 65508, 3, 0, 65508, 4, 0, 65508, 5, 0, 65508, 6, 0, 65508, 7, 0, 65508, 8, 0, 65508, 9, 0, 65508, 10, 0, 65508, 11, 0, 65508, 12, 0, 65508, 13, 0, 65508, 14, 0, 65508, 15, 0, 65508, 16, 0, 65508, 17, 0, 65508, 18, 0, 65508, 19, 0, 65508, 20, 0, 65508, 21, 0, 65508, 22, 0, 65508, 23, 0, 65508, 24, 0, 65508, 25, 0, 65508, 26, 0, 65508, 27, 0, 65508, 28, 0, 65508, 29, 0, 65508, 30, 0, 65508, 31, 0, 65508, 32, 0, 65508, 33, 0, 65508, 34, 0, 65508, 35, 0, 65509, 65504, 0, 65509, 65505, 0, 65509, 65506, 0, 65509, 65507, 0, 65509, 65508, 0, 65509, 65509, 0, 65509, 65510, 0, 65509, 65511, 0, 65509, 65512, 0, 65509, 65513, 0, 65509, 65514, 0, 65509, 65515, 0, 65509, 65516, 0, 65509, 65517, 0, 65509, 65518, 0, 65509, 65519, 0, 65509, 65520, 0, 65509, 65521, 0, 65509, 65522, 0, 65509, 65523, 0, 65509, 65524, 0, 65509, 65525, 0, 65509, 65526, 0, 65509, 65527, 0, 65509, 65528, 0, 65509, 65529, 0, 65509, 65530, 0, 65509, 65531, 0, 65509, 65532, 0, 65509, 65533, 0, 65509, 65534, 0, 65509, 65535, 0, 65509, 0, 0, 65509, 1, 0, 65509, 2, 0, 65509, 3, 0, 65509, 4, 0, 65509, 5, 0, 65509, 6, 0, 65509, 7, 0, 65509, 8, 0, 65509, 9, 0, 65509, 10, 0, 65509, 11, 0, 65509, 12, 0, 65509, 13, 0, 65509, 14, 0, 65509, 15, 0, 65509, 16, 0, 65509, 17, 0, 65509, 18, 0, 65509, 19, 0, 65509, 20, 0, 65509, 21, 0, 65509, 22, 0, 65509, 23, 0, 65509, 24, 0, 65509, 25, 0, 65509, 26, 0, 65509, 27, 0, 65509, 28, 0, 65509, 29, 0, 65509, 30, 0, 65509, 31, 0, 65509, 32, 0, 65509, 33, 0, 65509, 34, 0, 65509, 35, 0, 65510, 65504, 0, 65510, 65505, 0, 65510, 65506, 0, 65510, 65507, 0, 65510, 65508, 0, 65510, 65509, 0, 65510, 65510, 0, 65510, 65511, 0, 65510, 65512, 0, 65510, 65513, 0, 65510, 65514, 0, 65510, 65515, 0, 65510, 65516, 0, 65510, 65517, 0, 65510, 65518, 0, 65510, 65519, 0, 65510, 65520, 0, 65510, 65521, 0, 65510, 65522, 0, 65510, 65523, 0, 65510, 65524, 0, 65510, 65525, 0, 65510, 65526, 0, 65510, 65527, 0, 65510, 65528, 0, 65510, 65529, 0, 65510, 65530, 0, 65510, 65531, 0, 65510, 65532, 0, 65510, 65533, 0, 65510, 65534, 0, 65510, 65535, 0, 65510, 0, 0, 65510, 1, 0, 65510, 2, 0, 65510, 3, 0, 65510, 4, 0, 65510, 5, 0, 65510, 6, 0, 65510, 7, 0, 65510, 8, 0, 65510, 9, 0, 65510, 10, 0, 65510, 11, 0, 65510, 12, 0, 65510, 13, 0, 65510, 14, 0, 65510, 15, 0, 65510, 16, 0, 65510, 17, 0, 65510, 18, 0, 65510, 19, 0, 65510, 20, 0, 65510, 21, 0, 65510, 22, 0, 65510, 23, 0, 65510, 24, 0, 65510, 25, 0, 65510, 26, 0, 65510, 27, 0, 65510, 28, 0, 65510, 29, 0, 65510, 30, 0, 65510, 31, 0, 65510, 32, 0, 65510, 33, 0, 65510, 34, 0, 65510, 35, 0, 65511, 65504, 0, 65511, 65505, 0, 65511, 65506, 0, 65511, 65507, 0, 65511, 65508, 0, 65511, 65509, 0, 65511, 65510, 0, 65511, 65511, 0, 65511, 65512, 0, 65511, 65513, 0, 65511, 65514, 0, 65511, 65515, 0, 65511, 65516, 0, 65511, 65517, 0, 65511, 65518, 0, 65511, 65519, 0, 65511, 65520, 0, 65511, 65521, 0, 65511, 65522, 0, 65511, 65523, 0, 65511, 65524, 0, 65511, 65525, 0, 65511, 65526, 0, 65511, 65527, 0, 65511, 65528, 0, 65511, 65529, 0, 65511, 65530, 0, 65511, 65531, 0, 65511, 65532, 0, 65511, 65533, 0, 65511, 65534, 0, 65511, 65535, 0, 65511, 0, 0, 65511, 1, 0, 65511, 2, 0, 65511, 3, 0, 65511, 4, 0, 65511, 5, 0, 65511, 6, 0, 65511, 7, 0, 65511, 8, 0, 65511, 9, 0, 65511, 10, 0, 65511, 11, 0, 65511, 12, 0, 65511, 13, 0, 65511, 14, 0, 65511, 15, 0, 65511, 16, 0, 65511, 17, 0, 65511, 18, 0, 65511, 19, 0, 65511, 20, 0, 65511, 21, 0, 65511, 22, 0, 65511, 23, 0, 65511, 24, 0, 65511, 25, 0, 65511, 26, 0, 65511, 27, 0, 65511, 28, 0, 65511, 29, 0, 65511, 30, 0, 65511, 31, 0, 65511, 32, 0, 65511, 33, 0, 65511, 34, 0, 65511, 35, 0, 65512, 65504, 0, 65512, 65505, 0, 65512, 65506, 0, 65512, 65507, 0, 65512, 65508, 0, 65512, 65509, 0, 65512, 65510, 0, 65512, 65511, 0, 65512, 65512, 0, 65512, 65513, 0, 65512, 65514, 0, 65512, 65515, 0, 65512, 65516, 0, 65512, 65517, 0, 65512, 65518, 0, 65512, 65519, 0, 65512, 65520, 0, 65512, 65521, 0, 65512, 65522, 0, 65512, 65523, 0, 65512, 65524, 0, 65512, 65525, 0, 65512, 65526, 0, 65512, 65527, 0, 65512, 65528, 0, 65512, 65529, 0, 65512, 65530, 0, 65512, 65531, 0, 65512, 65532, 0, 65512, 65533, 0, 65512, 65534, 0, 65512, 65535, 0, 65512, 0, 0, 65512, 1, 0, 65512, 2, 0, 65512, 3, 0, 65512, 4, 0, 65512, 5, 0, 65512, 6, 0, 65512, 7, 0, 65512, 8, 0, 65512, 9, 0, 65512, 10, 0, 65512, 11, 0, 65512, 12, 0, 65512, 13, 0, 65512, 14, 0, 65512, 15, 0, 65512, 16, 0, 65512, 17, 0, 65512, 18, 0, 65512, 19, 0, 65512, 20, 0, 65512, 21, 0, 65512, 22, 0, 65512, 23, 0, 65512, 24, 0, 65512, 25, 0, 65512, 26, 0, 65512, 27, 0, 65512, 28, 0, 65512, 29, 0, 65512, 30, 0, 65512, 31, 0, 65512, 32, 0, 65512, 33, 0, 65512, 34, 0, 65512, 35, 0, 65513, 65504, 0, 65513, 65505, 0, 65513, 65506, 0, 65513, 65507, 0, 65513, 65508, 0, 65513, 65509, 0, 65513, 65510, 0, 65513, 65511, 0, 65513, 65512, 0, 65513, 65513, 0, 65513, 65514, 0, 65513, 65515, 0, 65513, 65516, 0, 65513, 65517, 0, 65513, 65518, 0, 65513, 65519, 0, 65513, 65520, 0, 65513, 65521, 0, 65513, 65522, 0, 65513, 65523, 0, 65513, 65524, 0, 65513, 65525, 0, 65513, 65526, 0, 65513, 65527, 0, 65513, 65528, 0, 65513, 65529, 0, 65513, 65530, 0, 65513, 65531, 0, 65513, 65532, 0, 65513, 65533, 0, 65513, 65534, 0, 65513, 65535, 0, 65513, 0, 0, 65513, 1, 0, 65513, 2, 0, 65513, 3, 0, 65513, 4, 0, 65513, 5, 0, 65513, 6, 0, 65513, 7, 0, 65513, 8, 0, 65513, 9, 0, 65513, 10, 0, 65513, 11, 0, 65513, 12, 0, 65513, 13, 0, 65513, 14, 0, 65513, 15, 0, 65513, 16, 0, 65513, 17, 0, 65513, 18, 0, 65513, 19, 0, 65513, 20, 0, 65513, 21, 0, 65513, 22, 0, 65513, 23, 0, 65513, 24, 0, 65513, 25, 0, 65513, 26, 0, 65513, 27, 0, 65513, 28, 0, 65513, 29, 0, 65513, 30, 0, 65513, 31, 0, 65513, 32, 0, 65513, 33, 0, 65513, 34, 0, 65513, 35, 0, 65514, 65504, 0, 65514, 65505, 0, 65514, 65506, 0, 65514, 65507, 0, 65514, 65508, 0, 65514, 65509, 0, 65514, 65510, 0, 65514, 65511, 0, 65514, 65512, 0, 65514, 65513, 0, 65514, 65514, 0, 65514, 65515, 0, 65514, 65516, 0, 65514, 65517, 0, 65514, 65518, 0, 65514, 65519, 0, 65514, 65520, 0, 65514, 65521, 0, 65514, 65522, 0, 65514, 65523, 0, 65514, 65524, 0, 65514, 65525, 0, 65514, 65526, 0, 65514, 65527, 0, 65514, 65528, 0, 65514, 65529, 0, 65514, 65530, 0, 65514, 65531, 0, 65514, 65532, 0, 65514, 65533, 0, 65514, 65534, 0, 65514, 65535, 0, 65514, 0, 0, 65514, 1, 0, 65514, 2, 0, 65514, 3, 0, 65514, 4, 0, 65514, 5, 0, 65514, 6, 0, 65514, 7, 0, 65514, 8, 0, 65514, 9, 0, 65514, 10, 0, 65514, 11, 0, 65514, 12, 0, 65514, 13, 0, 65514, 14, 0, 65514, 15, 0, 65514, 16, 0, 65514, 17, 0, 65514, 18, 0, 65514, 19, 0, 65514, 20, 0, 65514, 21, 0, 65514, 22, 0, 65514, 23, 0, 65514, 24, 0, 65514, 25, 0, 65514, 26, 0, 65514, 27, 0, 65514, 28, 0, 65514, 29, 0, 65514, 30, 0, 65514, 31, 0, 65514, 32, 0, 65514, 33, 0, 65514, 34, 0, 65514, 35, 0, 65515, 65504, 0, 65515, 65505, 0, 65515, 65506, 0, 65515, 65507, 0, 65515, 65508, 0, 65515, 65509, 0, 65515, 65510, 0, 65515, 65511, 0, 65515, 65512, 0, 65515, 65513, 0, 65515, 65514, 0, 65515, 65515, 0, 65515, 65516, 0, 65515, 65517, 0, 65515, 65518, 0, 65515, 65519, 0, 65515, 65520, 0, 65515, 65521, 0, 65515, 65522, 0, 65515, 65523, 0, 65515, 65524, 0, 65515, 65525, 0, 65515, 65526, 0, 65515, 65527, 0, 65515, 65528, 0, 65515, 65529, 0, 65515, 65530, 0, 65515, 65531, 0, 65515, 65532, 0, 65515, 65533, 0, 65515, 65534, 0, 65515, 65535, 0, 65515, 0, 0, 65515, 1, 0, 65515, 2, 0, 65515, 3, 0, 65515, 4, 0, 65515, 5, 0, 65515, 6, 0, 65515, 7, 0, 65515, 8, 0, 65515, 9, 0, 65515, 10, 0, 65515, 11, 0, 65515, 12, 0, 65515, 13, 0, 65515, 14, 0, 65515, 15, 0, 65515, 16, 0, 65515, 17, 0, 65515, 18, 0, 65515, 19, 0, 65515, 20, 0, 65515, 21, 0, 65515, 22, 0, 65515, 23, 0, 65515, 24, 0, 65515, 25, 0, 65515, 26, 0, 65515, 27, 0, 65515, 28, 0, 65515, 29, 0, 65515, 30, 0, 65515, 31, 0, 65515, 32, 0, 65515, 33, 0, 65515, 34, 0, 65515, 35, 0, 65516, 65504, 0, 65516, 65505, 0, 65516, 65506, 0, 65516, 65507, 0, 65516, 65508, 0, 65516, 65509, 0, 65516, 65510, 0, 65516, 65511, 0, 65516, 65512, 0, 65516, 65513, 0, 65516, 65514, 0, 65516, 65515, 0, 65516, 65516, 0, 65516, 65517, 0, 65516, 65518, 0, 65516, 65519, 0, 65516, 65520, 0, 65516, 65521, 0, 65516, 65522, 0, 65516, 65523, 0, 65516, 65524, 0, 65516, 65525, 0, 65516, 65526, 0, 65516, 65527, 0, 65516, 65528, 0, 65516, 65529, 0, 65516, 65530, 0, 65516, 65531, 0, 65516, 65532, 0, 65516, 65533, 0, 65516, 65534, 0, 65516, 65535, 0, 65516, 0, 0, 65516, 1, 0, 65516, 2, 0, 65516, 3, 0, 65516, 4, 0, 65516, 5, 0, 65516, 6, 0, 65516, 7, 0, 65516, 8, 0, 65516, 9, 0, 65516, 10, 0, 65516, 11, 0, 65516, 12, 0, 65516, 13, 0, 65516, 14, 0, 65516, 15, 0, 65516, 16, 0, 65516, 17, 0, 65516, 18, 0, 65516, 19, 0, 65516, 20, 0, 65516, 21, 0, 65516, 22, 0, 65516, 23, 0, 65516, 24, 0, 65516, 25, 0, 65516, 26, 0, 65516, 27, 0, 65516, 28, 0, 65516, 29, 0, 65516, 30, 0, 65516, 31, 0, 65516, 32, 0, 65516, 33, 0, 65516, 34, 0, 65516, 35, 0, 65517, 65504, 0, 65517, 65505, 0, 65517, 65506, 0, 65517, 65507, 0, 65517, 65508, 0, 65517, 65509, 0, 65517, 65510, 0, 65517, 65511, 0, 65517, 65512, 0, 65517, 65513, 0, 65517, 65514, 0, 65517, 65515, 0, 65517, 65516, 0, 65517, 65517, 0, 65517, 65518, 0, 65517, 65519, 0, 65517, 65520, 0, 65517, 65521, 0, 65517, 65522, 0, 65517, 65523, 0, 65517, 65524, 0, 65517, 65525, 0, 65517, 65526, 0, 65517, 65527, 0, 65517, 65528, 0, 65517, 65529, 0, 65517, 65530, 0, 65517, 65531, 0, 65517, 65532, 0, 65517, 65533, 0, 65517, 65534, 0, 65517, 65535, 0, 65517, 0, 0, 65517, 1, 0, 65517, 2, 0, 65517, 3, 0, 65517, 4, 0, 65517, 5, 0, 65517, 6, 0, 65517, 7, 0, 65517, 8, 0, 65517, 9, 0, 65517, 10, 0, 65517, 11, 0, 65517, 12, 0, 65517, 13, 0, 65517, 14, 0, 65517, 15, 0, 65517, 16, 0, 65517, 17, 0, 65517, 18, 0, 65517, 19, 0, 65517, 20, 0, 65517, 21, 0, 65517, 22, 0, 65517, 23, 0, 65517, 24, 0, 65517, 25, 0, 65517, 26, 0, 65517, 27, 0, 65517, 28, 0, 65517, 29, 0, 65517, 30, 0, 65517, 31, 0, 65517, 32, 0, 65517, 33, 0, 65517, 34, 0, 65517, 35, 0, 65518, 65504, 0, 65518, 65505, 0, 65518, 65506, 0, 65518, 65507, 0, 65518, 65508, 0, 65518, 65509, 0, 65518, 65510, 0, 65518, 65511, 0, 65518, 65512, 0, 65518, 65513, 0, 65518, 65514, 0, 65518, 65515, 0, 65518, 65516, 0, 65518, 65517, 0, 65518, 65518, 0, 65518, 65519, 0, 65518, 65520, 0, 65518, 65521, 0, 65518, 65522, 0, 65518, 65523, 0, 65518, 65524, 0, 65518, 65525, 0, 65518, 65526, 0, 65518, 65527, 0, 65518, 65528, 0, 65518, 65529, 0, 65518, 65530, 0, 65518, 65531, 0, 65518, 65532, 0, 65518, 65533, 0, 65518, 65534, 0, 65518, 65535, 0, 65518, 0, 0, 65518, 1, 0, 65518, 2, 0, 65518, 3, 0, 65518, 4, 0, 65518, 5, 0, 65518, 6, 0, 65518, 7, 0, 65518, 8, 0, 65518, 9, 0, 65518, 10, 0, 65518, 11, 0, 65518, 12, 0, 65518, 13, 0, 65518, 14, 0, 65518, 15, 0, 65518, 16, 0, 65518, 17, 0, 65518, 18, 0, 65518, 19, 0, 65518, 20, 0, 65518, 21, 0, 65518, 22, 0, 65518, 23, 0, 65518, 24, 0, 65518, 25, 0, 65518, 26, 0, 65518, 27, 0, 65518, 28, 0, 65518, 29, 0, 65518, 30, 0, 65518, 31, 0, 65518, 32, 0, 65518, 33, 0, 65518, 34, 0, 65518, 35, 0, 65519, 65504, 0, 65519, 65505, 0, 65519, 65506, 0, 65519, 65507, 0, 65519, 65508, 0, 65519, 65509, 0, 65519, 65510, 0, 65519, 65511, 0, 65519, 65512, 0, 65519, 65513, 0, 65519, 65514, 0, 65519, 65515, 0, 65519, 65516, 0, 65519, 65517, 0, 65519, 65518, 0, 65519, 65519, 0, 65519, 65520, 0, 65519, 65521, 0, 65519, 65522, 0, 65519, 65523, 0, 65519, 65524, 0, 65519, 65525, 0, 65519, 65526, 0, 65519, 65527, 0, 65519, 65528, 0, 65519, 65529, 0, 65519, 65530, 0, 65519, 65531, 0, 65519, 65532, 0, 65519, 65533, 0, 65519, 65534, 0, 65519, 65535, 0, 65519, 0, 0, 65519, 1, 0, 65519, 2, 0, 65519, 3, 0, 65519, 4, 0, 65519, 5, 0, 65519, 6, 0, 65519, 7, 0, 65519, 8, 0, 65519, 9, 0, 65519, 10, 0, 65519, 11, 0, 65519, 12, 0, 65519, 13, 0, 65519, 14, 0, 65519, 15, 0, 65519, 16, 0, 65519, 17, 0, 65519, 18, 0, 65519, 19, 0, 65519, 20, 0, 65519, 21, 0, 65519, 22, 0, 65519, 23, 0, 65519, 24, 0, 65519, 25, 0, 65519, 26, 0, 65519, 27, 0, 65519, 28, 0, 65519, 29, 0, 65519, 30, 0, 65519, 31, 0, 65519, 32, 0, 65519, 33, 0, 65519, 34, 0, 65519, 35, 0, 65520, 65504, 0, 65520, 65505, 0, 65520, 65506, 0, 65520, 65507, 0, 65520, 65508, 0, 65520, 65509, 0, 65520, 65510, 0, 65520, 65511, 0, 65520, 65512, 0, 65520, 65513, 0, 65520, 65514, 0, 65520, 65515, 0, 65520, 65516, 0, 65520, 65517, 0, 65520, 65518, 0, 65520, 65519, 0, 65520, 65520, 0, 65520, 65521, 0, 65520, 65522, 0, 65520, 65523, 0, 65520, 65524, 0, 65520, 65525, 0, 65520, 65526, 0, 65520, 65527, 0, 65520, 65528, 0, 65520, 65529, 0, 65520, 65530, 0, 65520, 65531, 0, 65520, 65532, 0, 65520, 65533, 0, 65520, 65534, 0, 65520, 65535, 0, 65520, 0, 0, 65520, 1, 0, 65520, 2, 0, 65520, 3, 0, 65520, 4, 0, 65520, 5, 0, 65520, 6, 0, 65520, 7, 0, 65520, 8, 0, 65520, 9, 0, 65520, 10, 0, 65520, 11, 0, 65520, 12, 0, 65520, 13, 0, 65520, 14, 0, 65520, 15, 0, 65520, 16, 0, 65520, 17, 0, 65520, 18, 0, 65520, 19, 0, 65520, 20, 0, 65520, 21, 0, 65520, 22, 0, 65520, 23, 0, 65520, 24, 0, 65520, 25, 0, 65520, 26, 0, 65520, 27, 0, 65520, 28, 0, 65520, 29, 0, 65520, 30, 0, 65520, 31, 0, 65520, 32, 0, 65520, 33, 0, 65520, 34, 0, 65520, 35, 0, 65521, 65504, 0, 65521, 65505, 0, 65521, 65506, 0, 65521, 65507, 0, 65521, 65508, 0, 65521, 65509, 0, 65521, 65510, 0, 65521, 65511, 0, 65521, 65512, 0, 65521, 65513, 0, 65521, 65514, 0, 65521, 65515, 0, 65521, 65516, 0, 65521, 65517, 0, 65521, 65518, 0, 65521, 65519, 0, 65521, 65520, 0, 65521, 65521, 0, 65521, 65522, 0, 65521, 65523, 0, 65521, 65524, 0, 65521, 65525, 0, 65521, 65526, 0, 65521, 65527, 0, 65521, 65528, 0, 65521, 65529, 0, 65521, 65530, 0, 65521, 65531, 0, 65521, 65532, 0, 65521, 65533, 0, 65521, 65534, 0, 65521, 65535, 0, 65521, 0, 0, 65521, 1, 0, 65521, 2, 0, 65521, 3, 0, 65521, 4, 0, 65521, 5, 0, 65521, 6, 0, 65521, 7, 0, 65521, 8, 0, 65521, 9, 0, 65521, 10, 0, 65521, 11, 0, 65521, 12, 0, 65521, 13, 0, 65521, 14, 0, 65521, 15, 0, 65521, 16, 0, 65521, 17, 0, 65521, 18, 0, 65521, 19, 0, 65521, 20, 0, 65521, 21, 0, 65521, 22, 0, 65521, 23, 0, 65521, 24, 0, 65521, 25, 0, 65521, 26, 0, 65521, 27, 0, 65521, 28, 0, 65521, 29, 0, 65521, 30, 0, 65521, 31, 0, 65521, 32, 0, 65521, 33, 0, 65521, 34, 0, 65521, 35, 0, 65522, 65504, 0, 65522, 65505, 0, 65522, 65506, 0, 65522, 65507, 0, 65522, 65508, 0, 65522, 65509, 0, 65522, 65510, 0, 65522, 65511, 0, 65522, 65512, 0, 65522, 65513, 0, 65522, 65514, 0, 65522, 65515, 0, 65522, 65516, 0, 65522, 65517, 0, 65522, 65518, 0, 65522, 65519, 0, 65522, 65520, 0, 65522, 65521, 0, 65522, 65522, 0, 65522, 65523, 0, 65522, 65524, 0, 65522, 65525, 0, 65522, 65526, 0, 65522, 65527, 0, 65522, 65528, 0, 65522, 65529, 0, 65522, 65530, 0, 65522, 65531, 0, 65522, 65532, 0, 65522, 65533, 0, 65522, 65534, 0, 65522, 65535, 0, 65522, 0, 0, 65522, 1, 0, 65522, 2, 0, 65522, 3, 0, 65522, 4, 0, 65522, 5, 0, 65522, 6, 0, 65522, 7, 0, 65522, 8, 0, 65522, 9, 0, 65522, 10, 0, 65522, 11, 0, 65522, 12, 0, 65522, 13, 0, 65522, 14, 0, 65522, 15, 0, 65522, 16, 0, 65522, 17, 0, 65522, 18, 0, 65522, 19, 0, 65522, 20, 0, 65522, 21, 0, 65522, 22, 0, 65522, 23, 0, 65522, 24, 0, 65522, 25, 0, 65522, 26, 0, 65522, 27, 0, 65522, 28, 0, 65522, 29, 0, 65522, 30, 0, 65522, 31, 0, 65522, 32, 0, 65522, 33, 0, 65522, 34, 0, 65522, 35, 0, 65523, 65504, 0, 65523, 65505, 0, 65523, 65506, 0, 65523, 65507, 0, 65523, 65508, 0, 65523, 65509, 0, 65523, 65510, 0, 65523, 65511, 0, 65523, 65512, 0, 65523, 65513, 0, 65523, 65514, 0, 65523, 65515, 0, 65523, 65516, 0, 65523, 65517, 0, 65523, 65518, 0, 65523, 65519, 0, 65523, 65520, 0, 65523, 65521, 0, 65523, 65522, 0, 65523, 65523, 0, 65523, 65524, 0, 65523, 65525, 0, 65523, 65526, 0, 65523, 65527, 0, 65523, 65528, 0, 65523, 65529, 0, 65523, 65530, 0, 65523, 65531, 0, 65523, 65532, 0, 65523, 65533, 0, 65523, 65534, 0, 65523, 65535, 0, 65523, 0, 0, 65523, 1, 0, 65523, 2, 0, 65523, 3, 0, 65523, 4, 0, 65523, 5, 0, 65523, 6, 0, 65523, 7, 0, 65523, 8, 0, 65523, 9, 0, 65523, 10, 0, 65523, 11, 0, 65523, 12, 0, 65523, 13, 0, 65523, 14, 0, 65523, 15, 0, 65523, 16, 0, 65523, 17, 0, 65523, 18, 0, 65523, 19, 0, 65523, 20, 0, 65523, 21, 0, 65523, 22, 0, 65523, 23, 0, 65523, 24, 0, 65523, 25, 0, 65523, 26, 0, 65523, 27, 0, 65523, 28, 0, 65523, 29, 0, 65523, 30, 0, 65523, 31, 0, 65523, 32, 0, 65523, 33, 0, 65523, 34, 0, 65523, 35, 0, 65524, 65504, 0, 65524, 65505, 0, 65524, 65506, 0, 65524, 65507, 0, 65524, 65508, 0, 65524, 65509, 0, 65524, 65510, 0, 65524, 65511, 0, 65524, 65512, 0, 65524, 65513, 0, 65524, 65514, 0, 65524, 65515, 0, 65524, 65516, 0, 65524, 65517, 0, 65524, 65518, 0, 65524, 65519, 0, 65524, 65520, 0, 65524, 65521, 0, 65524, 65522, 0, 65524, 65523, 0, 65524, 65524, 0, 65524, 65525, 0, 65524, 65526, 0, 65524, 65527, 0, 65524, 65528, 0, 65524, 65529, 0, 65524, 65530, 0, 65524, 65531, 0, 65524, 65532, 0, 65524, 65533, 0, 65524, 65534, 0, 65524, 65535, 0, 65524, 0, 0, 65524, 1, 0, 65524, 2, 0, 65524, 3, 0, 65524, 4, 0, 65524, 5, 0, 65524, 6, 0, 65524, 7, 0, 65524, 8, 0, 65524, 9, 0, 65524, 10, 0, 65524, 11, 0, 65524, 12, 0, 65524, 13, 0, 65524, 14, 0, 65524, 15, 0, 65524, 16, 0, 65524, 17, 0, 65524, 18, 0, 65524, 19, 0, 65524, 20, 0, 65524, 21, 0, 65524, 22, 0, 65524, 23, 0, 65524, 24, 0, 65524, 25, 0, 65524, 26, 0, 65524, 27, 0, 65524, 28, 0, 65524, 29, 0, 65524, 30, 0, 65524, 31, 0, 65524, 32, 0, 65524, 33, 0, 65524, 34, 0, 65524, 35, 0, 65525, 65504, 0, 65525, 65505, 0, 65525, 65506, 0, 65525, 65507, 0, 65525, 65508, 0, 65525, 65509, 0, 65525, 65510, 0, 65525, 65511, 0, 65525, 65512, 0, 65525, 65513, 0, 65525, 65514, 0, 65525, 65515, 0, 65525, 65516, 0, 65525, 65517, 0, 65525, 65518, 0, 65525, 65519, 0, 65525, 65520, 0, 65525, 65521, 0, 65525, 65522, 0, 65525, 65523, 0, 65525, 65524, 0, 65525, 65525, 0, 65525, 65526, 0, 65525, 65527, 0, 65525, 65528, 0, 65525, 65529, 0, 65525, 65530, 0, 65525, 65531, 0, 65525, 65532, 0, 65525, 65533, 0, 65525, 65534, 0, 65525, 65535, 0, 65525, 0, 0, 65525, 1, 0, 65525, 2, 0, 65525, 3, 0, 65525, 4, 0, 65525, 5, 0, 65525, 6, 0, 65525, 7, 0, 65525, 8, 0, 65525, 9, 0, 65525, 10, 0, 65525, 11, 0, 65525, 12, 0, 65525, 13, 0, 65525, 14, 0, 65525, 15, 0, 65525, 16, 0, 65525, 17, 0, 65525, 18, 0, 65525, 19, 0, 65525, 20, 0, 65525, 21, 0, 65525, 22, 0, 65525, 23, 0, 65525, 24, 0, 65525, 25, 0, 65525, 26, 0, 65525, 27, 0, 65525, 28, 0, 65525, 29, 0, 65525, 30, 0, 65525, 31, 0, 65525, 32, 0, 65525, 33, 0, 65525, 34, 0, 65525, 35, 0, 65526, 65504, 0, 65526, 65505, 0, 65526, 65506, 0, 65526, 65507, 0, 65526, 65508, 0, 65526, 65509, 0, 65526, 65510, 0, 65526, 65511, 0, 65526, 65512, 0, 65526, 65513, 0, 65526, 65514, 0, 65526, 65515, 0, 65526, 65516, 0, 65526, 65517, 0, 65526, 65518, 0, 65526, 65519, 0, 65526, 65520, 0, 65526, 65521, 0, 65526, 65522, 0, 65526, 65523, 0, 65526, 65524, 0, 65526, 65525, 0, 65526, 65526, 0, 65526, 65527, 0, 65526, 65528, 0, 65526, 65529, 0, 65526, 65530, 0, 65526, 65531, 0, 65526, 65532, 0, 65526, 65533, 0, 65526, 65534, 0, 65526, 65535, 0, 65526, 0, 0, 65526, 1, 0, 65526, 2, 0, 65526, 3, 0, 65526, 4, 0, 65526, 5, 0, 65526, 6, 0, 65526, 7, 0, 65526, 8, 0, 65526, 9, 0, 65526, 10, 0, 65526, 11, 0, 65526, 12, 0, 65526, 13, 0, 65526, 14, 0, 65526, 15, 0, 65526, 16, 0, 65526, 17, 0, 65526, 18, 0, 65526, 19, 0, 65526, 20, 0, 65526, 21, 0, 65526, 22, 0, 65526, 23, 0, 65526, 24, 0, 65526, 25, 0, 65526, 26, 0, 65526, 27, 0, 65526, 28, 0, 65526, 29, 0, 65526, 30, 0, 65526, 31, 0, 65526, 32, 0, 65526, 33, 0, 65526, 34, 0, 65526, 35, 0, 65527, 65504, 0, 65527, 65505, 0, 65527, 65506, 0, 65527, 65507, 0, 65527, 65508, 0, 65527, 65509, 0, 65527, 65510, 0, 65527, 65511, 0, 65527, 65512, 0, 65527, 65513, 0, 65527, 65514, 0, 65527, 65515, 0, 65527, 65516, 0, 65527, 65517, 0, 65527, 65518, 0, 65527, 65519, 0, 65527, 65520, 0, 65527, 65521, 0, 65527, 65522, 0, 65527, 65523, 0, 65527, 65524, 0, 65527, 65525, 0, 65527, 65526, 0, 65527, 65527, 0, 65527, 65528, 0, 65527, 65529, 0, 65527, 65530, 0, 65527, 65531, 0, 65527, 65532, 0, 65527, 65533, 0, 65527, 65534, 0, 65527, 65535, 0, 65527, 0, 0, 65527, 1, 0, 65527, 2, 0, 65527, 3, 0, 65527, 4, 0, 65527, 5, 0, 65527, 6, 0, 65527, 7, 0, 65527, 8, 0, 65527, 9, 0, 65527, 10, 0, 65527, 11, 0, 65527, 12, 0, 65527, 13, 0, 65527, 14, 0, 65527, 15, 0, 65527, 16, 0, 65527, 17, 0, 65527, 18, 0, 65527, 19, 0, 65527, 20, 0, 65527, 21, 0, 65527, 22, 0, 65527, 23, 0, 65527, 24, 0, 65527, 25, 0, 65527, 26, 0, 65527, 27, 0, 65527, 28, 0, 65527, 29, 0, 65527, 30, 0, 65527, 31, 0, 65527, 32, 0, 65527, 33, 0, 65527, 34, 0, 65527, 35, 0, 65528, 65504, 0, 65528, 65505, 0, 65528, 65506, 0, 65528, 65507, 0, 65528, 65508, 0, 65528, 65509, 0, 65528, 65510, 0, 65528, 65511, 0, 65528, 65512, 0, 65528, 65513, 0, 65528, 65514, 0, 65528, 65515, 0, 65528, 65516, 0, 65528, 65517, 0, 65528, 65518, 0, 65528, 65519, 0, 65528, 65520, 0, 65528, 65521, 0, 65528, 65522, 0, 65528, 65523, 0, 65528, 65524, 0, 65528, 65525, 0, 65528, 65526, 0, 65528, 65527, 0, 65528, 65528, 0, 65528, 65529, 0, 65528, 65530, 0, 65528, 65531, 0, 65528, 65532, 0, 65528, 65533, 0, 65528, 65534, 0, 65528, 65535, 0, 65528, 0, 0, 65528, 1, 0, 65528, 2, 0, 65528, 3, 0, 65528, 4, 0, 65528, 5, 0, 65528, 6, 0, 65528, 7, 0, 65528, 8, 0, 65528, 9, 0, 65528, 10, 0, 65528, 11, 0, 65528, 12, 0, 65528, 13, 0, 65528, 14, 0, 65528, 15, 0, 65528, 16, 0, 65528, 17, 0, 65528, 18, 0, 65528, 19, 0, 65528, 20, 0, 65528, 21, 0, 65528, 22, 0, 65528, 23, 0, 65528, 24, 0, 65528, 25, 0, 65528, 26, 0, 65528, 27, 0, 65528, 28, 0, 65528, 29, 0, 65528, 30, 0, 65528, 31, 0, 65528, 32, 0, 65528, 33, 0, 65528, 34, 0, 65528, 35, 0, 65529, 65504, 0, 65529, 65505, 0, 65529, 65506, 0, 65529, 65507, 0, 65529, 65508, 0, 65529, 65509, 0, 65529, 65510, 0, 65529, 65511, 0, 65529, 65512, 0, 65529, 65513, 0, 65529, 65514, 0, 65529, 65515, 0, 65529, 65516, 0, 65529, 65517, 0, 65529, 65518, 0, 65529, 65519, 0, 65529, 65520, 0, 65529, 65521, 0, 65529, 65522, 0, 65529, 65523, 0, 65529, 65524, 0, 65529, 65525, 0, 65529, 65526, 0, 65529, 65527, 0, 65529, 65528, 0, 65529, 65529, 0, 65529, 65530, 0, 65529, 65531, 0, 65529, 65532, 0, 65529, 65533, 0, 65529, 65534, 0, 65529, 65535, 0, 65529, 0, 0, 65529, 1, 0, 65529, 2, 0, 65529, 3, 0, 65529, 4, 0, 65529, 5, 0, 65529, 6, 0, 65529, 7, 0, 65529, 8, 0, 65529, 9, 0, 65529, 10, 0, 65529, 11, 0, 65529, 12, 0, 65529, 13, 0, 65529, 14, 0, 65529, 15, 0, 65529, 16, 0, 65529, 17, 0, 65529, 18, 0, 65529, 19, 0, 65529, 20, 0, 65529, 21, 0, 65529, 22, 0, 65529, 23, 0, 65529, 24, 0, 65529, 25, 0, 65529, 26, 0, 65529, 27, 0, 65529, 28, 0, 65529, 29, 0, 65529, 30, 0, 65529, 31, 0, 65529, 32, 0, 65529, 33, 0, 65529, 34, 0, 65529, 35, 0, 65530, 65504, 0, 65530, 65505, 0, 65530, 65506, 0, 65530, 65507, 0, 65530, 65508, 0, 65530, 65509, 0, 65530, 65510, 0, 65530, 65511, 0, 65530, 65512, 0, 65530, 65513, 0, 65530, 65514, 0, 65530, 65515, 0, 65530, 65516, 0, 65530, 65517, 0, 65530, 65518, 0, 65530, 65519, 0, 65530, 65520, 0, 65530, 65521, 0, 65530, 65522, 0, 65530, 65523, 0, 65530, 65524, 0, 65530, 65525, 0, 65530, 65526, 0, 65530, 65527, 0, 65530, 65528, 0, 65530, 65529, 0, 65530, 65530, 0, 65530, 65531, 0, 65530, 65532, 0, 65530, 65533, 0, 65530, 65534, 0, 65530, 65535, 0, 65530, 0, 0, 65530, 1, 0, 65530, 2, 0, 65530, 3, 0, 65530, 4, 0, 65530, 5, 0, 65530, 6, 0, 65530, 7, 0, 65530, 8, 0, 65530, 9, 0, 65530, 10, 0, 65530, 11, 0, 65530, 12, 0, 65530, 13, 0, 65530, 14, 0, 65530, 15, 0, 65530, 16, 0, 65530, 17, 0, 65530, 18, 0, 65530, 19, 0, 65530, 20, 0, 65530, 21, 0, 65530, 22, 0, 65530, 23, 0, 65530, 24, 0, 65530, 25, 0, 65530, 26, 0, 65530, 27, 0, 65530, 28, 0, 65530, 29, 0, 65530, 30, 0, 65530, 31, 0, 65530, 32, 0, 65530, 33, 0, 65530, 34, 0, 65530, 35, 0, 65531, 65504, 0, 65531, 65505, 0, 65531, 65506, 0, 65531, 65507, 0, 65531, 65508, 0, 65531, 65509, 0, 65531, 65510, 0, 65531, 65511, 0, 65531, 65512, 0, 65531, 65513, 0, 65531, 65514, 0, 65531, 65515, 0, 65531, 65516, 0, 65531, 65517, 0, 65531, 65518, 0, 65531, 65519, 0, 65531, 65520, 0, 65531, 65521, 0, 65531, 65522, 0, 65531, 65523, 0, 65531, 65524, 0, 65531, 65525, 0, 65531, 65526, 0, 65531, 65527, 0, 65531, 65528, 0, 65531, 65529, 0, 65531, 65530, 0, 65531, 65531, 0, 65531, 65532, 0, 65531, 65533, 0, 65531, 65534, 0, 65531, 65535, 0, 65531, 0, 0, 65531, 1, 0, 65531, 2, 0, 65531, 3, 0, 65531, 4, 0, 65531, 5, 0, 65531, 6, 0, 65531, 7, 0, 65531, 8, 0, 65531, 9, 0, 65531, 10, 0, 65531, 11, 0, 65531, 12, 0, 65531, 13, 0, 65531, 14, 0, 65531, 15, 0, 65531, 16, 0, 65531, 17, 0, 65531, 18, 0, 65531, 19, 0, 65531, 20, 0, 65531, 21, 0, 65531, 22, 0, 65531, 23, 0, 65531, 24, 0, 65531, 25, 0, 65531, 26, 0, 65531, 27, 0, 65531, 28, 0, 65531, 29, 0, 65531, 30, 0, 65531, 31, 0, 65531, 32, 0, 65531, 33, 0, 65531, 34, 0, 65531, 35, 0, 65532, 65504, 0, 65532, 65505, 0, 65532, 65506, 0, 65532, 65507, 0, 65532, 65508, 0, 65532, 65509, 0, 65532, 65510, 0, 65532, 65511, 0, 65532, 65512, 0, 65532, 65513, 0, 65532, 65514, 0, 65532, 65515, 0, 65532, 65516, 0, 65532, 65517, 0, 65532, 65518, 0, 65532, 65519, 0, 65532, 65520, 0, 65532, 65521, 0, 65532, 65522, 0, 65532, 65523, 0, 65532, 65524, 0, 65532, 65525, 0, 65532, 65526, 0, 65532, 65527, 0, 65532, 65528, 0, 65532, 65529, 0, 65532, 65530, 0, 65532, 65531, 0, 65532, 65532, 0, 65532, 65533, 0, 65532, 65534, 0, 65532, 65535, 0, 65532, 0, 0, 65532, 1, 0, 65532, 2, 0, 65532, 3, 0, 65532, 4, 0, 65532, 5, 0, 65532, 6, 0, 65532, 7, 0, 65532, 8, 0, 65532, 9, 0, 65532, 10, 0, 65532, 11, 0, 65532, 12, 0, 65532, 13, 0, 65532, 14, 0, 65532, 15, 0, 65532, 16, 0, 65532, 17, 0, 65532, 18, 0, 65532, 19, 0, 65532, 20, 0, 65532, 21, 0, 65532, 22, 0, 65532, 23, 0, 65532, 24, 0, 65532, 25, 0, 65532, 26, 0, 65532, 27, 0, 65532, 28, 0, 65532, 29, 0, 65532, 30, 0, 65532, 31, 0, 65532, 32, 0, 65532, 33, 0, 65532, 34, 0, 65532, 35, 0, 65533, 65504, 0, 65533, 65505, 0, 65533, 65506, 0, 65533, 65507, 0, 65533, 65508, 0, 65533, 65509, 0, 65533, 65510, 0, 65533, 65511, 0, 65533, 65512, 0, 65533, 65513, 0, 65533, 65514, 0, 65533, 65515, 0, 65533, 65516, 0, 65533, 65517, 0, 65533, 65518, 0, 65533, 65519, 0, 65533, 65520, 0, 65533, 65521, 0, 65533, 65522, 0, 65533, 65523, 0, 65533, 65524, 0, 65533, 65525, 0, 65533, 65526, 0, 65533, 65527, 0, 65533, 65528, 0, 65533, 65529, 0, 65533, 65530, 0, 65533, 65531, 0, 65533, 65532, 0, 65533, 65533, 0, 65533, 65534, 0, 65533, 65535, 0, 65533, 0, 0, 65533, 1, 0, 65533, 2, 0, 65533, 3, 0, 65533, 4, 0, 65533, 5, 0, 65533, 6, 0, 65533, 7, 0, 65533, 8, 0, 65533, 9, 0, 65533, 10, 0, 65533, 11, 0, 65533, 12, 0, 65533, 13, 0, 65533, 14, 0, 65533, 15, 0, 65533, 16, 0, 65533, 17, 0, 65533, 18, 0, 65533, 19, 0, 65533, 20, 0, 65533, 21, 0, 65533, 22, 0, 65533, 23, 0, 65533, 24, 0, 65533, 25, 0, 65533, 26, 0, 65533, 27, 0, 65533, 28, 0, 65533, 29, 0, 65533, 30, 0, 65533, 31, 0, 65533, 32, 0, 65533, 33, 0, 65533, 34, 0, 65533, 35, 0, 65534, 65504, 0, 65534, 65505, 0, 65534, 65506, 0, 65534, 65507, 0, 65534, 65508, 0, 65534, 65509, 0, 65534, 65510, 0, 65534, 65511, 0, 65534, 65512, 0, 65534, 65513, 0, 65534, 65514, 0, 65534, 65515, 0, 65534, 65516, 0, 65534, 65517, 0, 65534, 65518, 0, 65534, 65519, 0, 65534, 65520, 0, 65534, 65521, 0, 65534, 65522, 0, 65534, 65523, 0, 65534, 65524, 0, 65534, 65525, 0, 65534, 65526, 0, 65534, 65527, 0, 65534, 65528, 0, 65534, 65529, 0, 65534, 65530, 0, 65534, 65531, 0, 65534, 65532, 0, 65534, 65533, 0, 65534, 65534, 0, 65534, 65535, 0, 65534, 0, 0, 65534, 1, 0, 65534, 2, 0, 65534, 3, 0, 65534, 4, 0, 65534, 5, 0, 65534, 6, 0, 65534, 7, 0, 65534, 8, 0, 65534, 9, 0, 65534, 10, 0, 65534, 11, 0, 65534, 12, 0, 65534, 13, 0, 65534, 14, 0, 65534, 15, 0, 65534, 16, 0, 65534, 17, 0, 65534, 18, 0, 65534, 19, 0, 65534, 20, 0, 65534, 21, 0, 65534, 22, 0, 65534, 23, 0, 65534, 24, 0, 65534, 25, 0, 65534, 26, 0, 65534, 27, 0, 65534, 28, 0, 65534, 29, 0, 65534, 30, 0, 65534, 31, 0, 65534, 32, 0, 65534, 33, 0, 65534, 34, 0, 65534, 35, 0, 65535, 65504, 0, 65535, 65505, 0, 65535, 65506, 0, 65535, 65507, 0, 65535, 65508, 0, 65535, 65509, 0, 65535, 65510, 0, 65535, 65511, 0, 65535, 65512, 0, 65535, 65513, 0, 65535, 65514, 0, 65535, 65515, 0, 65535, 65516, 0, 65535, 65517, 0, 65535, 65518, 0, 65535, 65519, 0, 65535, 65520, 0, 65535, 65521, 0, 65535, 65522, 0, 65535, 65523, 0, 65535, 65524, 0, 65535, 65525, 0, 65535, 65526, 0, 65535, 65527, 0, 65535, 65528, 0, 65535, 65529, 0, 65535, 65530, 0, 65535, 65531, 0, 65535, 65532, 0, 65535, 65533, 0, 65535, 65534, 0, 65535, 65535, 0, 65535, 0, 0, 65535, 1, 0, 65535, 2, 0, 65535, 3, 0, 65535, 4, 0, 65535, 5, 0, 65535, 6, 0, 65535, 7, 0, 65535, 8, 0, 65535, 9, 0, 65535, 10, 0, 65535, 11, 0, 65535, 12, 0, 65535, 13, 0, 65535, 14, 0, 65535, 15, 0, 65535, 16, 0, 65535, 17, 0, 65535, 18, 0, 65535, 19, 0, 65535, 20, 0, 65535, 21, 0, 65535, 22, 0, 65535, 23, 0, 65535, 24, 0, 65535, 25, 0, 65535, 26, 0, 65535, 27, 0, 65535, 28, 0, 65535, 29, 0, 65535, 30, 0, 65535, 31, 0, 65535, 32, 0, 65535, 33, 0, 65535, 34, 0, 65535, 35, 0, 0, 65504, 0, 0, 65505, 0, 0, 65506, 0, 0, 65507, 0, 0, 65508, 0, 0, 65509, 0, 0, 65510, 0, 0, 65511, 0, 0, 65512, 0, 0, 65513, 0, 0, 65514, 0, 0, 65515, 0, 0, 65516, 0, 0, 65517, 0, 0, 65518, 0, 0, 65519, 0, 0, 65520, 0, 0, 65521, 0, 0, 65522, 0, 0, 65523, 0, 0, 65524, 0, 0, 65525, 0, 0, 65526, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 0, 0, 65533, 0, 0, 65534, 0, 0, 65535, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 1, 65504, 0, 1, 65505, 0, 1, 65506, 0, 1, 65507, 0, 1, 65508, 0, 1, 65509, 0, 1, 65510, 0, 1, 65511, 0, 1, 65512, 0, 1, 65513, 0, 1, 65514, 0, 1, 65515, 0, 1, 65516, 0, 1, 65517, 0, 1, 65518, 0, 1, 65519, 0, 1, 65520, 0, 1, 65521, 0, 1, 65522, 0, 1, 65523, 0, 1, 65524, 0, 1, 65525, 0, 1, 65526, 0, 1, 65527, 0, 1, 65528, 0, 1, 65529, 0, 1, 65530, 0, 1, 65531, 0, 1, 65532, 0, 1, 65533, 0, 1, 65534, 0, 1, 65535, 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 4, 0, 1, 5, 0, 1, 6, 0, 1, 7, 0, 1, 8, 0, 1, 9, 0, 1, 10, 0, 1, 11, 0, 1, 12, 0, 1, 13, 0, 1, 14, 0, 1, 15, 0, 1, 16, 0, 1, 17, 0, 1, 18, 0, 1, 19, 0, 1, 20, 0, 1, 21, 0, 1, 22, 0, 1, 23, 0, 1, 24, 0, 1, 25, 0, 1, 26, 0, 1, 27, 0, 1, 28, 0, 1, 29, 0, 1, 30, 0, 1, 31, 0, 1, 32, 0, 1, 33, 0, 1, 34, 0, 1, 35, 0, 2, 65504, 0, 2, 65505, 0, 2, 65506, 0, 2, 65507, 0, 2, 65508, 0, 2, 65509, 0, 2, 65510, 0, 2, 65511, 0, 2, 65512, 0, 2, 65513, 0, 2, 65514, 0, 2, 65515, 0, 2, 65516, 0, 2, 65517, 0, 2, 65518, 0, 2, 65519, 0, 2, 65520, 0, 2, 65521, 0, 2, 65522, 0, 2, 65523, 0, 2, 65524, 0, 2, 65525, 0, 2, 65526, 0, 2, 65527, 0, 2, 65528, 0, 2, 65529, 0, 2, 65530, 0, 2, 65531, 0, 2, 65532, 0, 2, 65533, 0, 2, 65535, 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 2, 3, 0, 2, 4, 0, 2, 5, 0, 2, 6, 0, 2, 7, 0, 2, 8, 0, 2, 9, 0, 2, 10, 0, 2, 11, 0, 2, 12, 0, 2, 13, 0, 2, 14, 0, 2, 15, 0, 2, 16, 0, 2, 17, 0, 2, 18, 0, 2, 19, 0, 2, 20, 0, 2, 21, 0, 2, 22, 0, 2, 23, 0, 2, 24, 0, 2, 25, 0, 2, 26, 0, 2, 27, 0, 2, 28, 0, 2, 29, 0, 2, 30, 0, 2, 31, 0, 2, 32, 0, 2, 33, 0, 2, 34, 0, 2, 35, 0, 3, 65504, 0, 3, 65505, 0, 3, 65506, 0, 3, 65507, 0, 3, 65508, 0, 3, 65509, 0, 3, 65510, 0, 3, 65511, 0, 3, 65512, 0, 3, 65513, 0, 3, 65514, 0, 3, 65515, 0, 3, 65516, 0, 3, 65517, 0, 3, 65518, 0, 3, 65519, 0, 3, 65520, 0, 3, 65521, 0, 3, 65522, 0, 3, 65523, 0, 3, 65524, 0, 3, 65525, 0, 3, 65526, 0, 3, 65527, 0, 3, 65528, 0, 3, 65529, 0, 3, 65530, 0, 3, 65531, 0, 3, 65533, 0, 3, 65534, 0, 3, 65535, 0, 3, 0, 0, 3, 1, 0, 3, 2, 0, 3, 3, 0, 3, 4, 0, 3, 5, 0, 3, 6, 0, 3, 7, 0, 3, 8, 0, 3, 9, 0, 3, 10, 0, 3, 11, 0, 3, 12, 0, 3, 13, 0, 3, 14, 0, 3, 15, 0, 3, 16, 0, 3, 17, 0, 3, 18, 0, 3, 19, 0, 3, 20, 0, 3, 21, 0, 3, 22, 0, 3, 23, 0, 3, 24, 0, 3, 25, 0, 3, 26, 0, 3, 27, 0, 3, 28, 0, 3, 29, 0, 3, 30, 0, 3, 31, 0, 3, 32, 0, 3, 33, 0, 3, 34, 0, 3, 35, 0, 4, 65504, 0, 4, 65505, 0, 4, 65506, 0, 4, 65507, 0, 4, 65508, 0, 4, 65509, 0, 4, 65510, 0, 4, 65511, 0, 4, 65512, 0, 4, 65513, 0, 4, 65514, 0, 4, 65515, 0, 4, 65516, 0, 4, 65517, 0, 4, 65518, 0, 4, 65519, 0, 4, 65520, 0, 4, 65521, 0, 4, 65522, 0, 4, 65523, 0, 4, 65524, 0, 4, 65525, 0, 4, 65526, 0, 4, 65527, 0, 4, 65528, 0, 4, 65529, 0, 4, 65530, 0, 4, 65531, 0, 4, 65532, 0, 4, 65533, 0, 4, 65534, 0, 4, 65535, 0, 4, 0, 0, 4, 1, 0, 4, 2, 0, 4, 3, 0, 4, 4, 0, 4, 5, 0, 4, 6, 0, 4, 7, 0, 4, 8, 0, 4, 9, 0, 4, 10, 0, 4, 11, 0, 4, 12, 0, 4, 13, 0, 4, 14, 0, 4, 15, 0, 4, 16, 0, 4, 17, 0, 4, 18, 0, 4, 19, 0, 4, 20, 0, 4, 21, 0, 4, 22, 0, 4, 23, 0, 4, 24, 0, 4, 25, 0, 4, 26, 0, 4, 27, 0, 4, 28, 0, 4, 29, 0, 4, 30, 0, 4, 31, 0, 4, 32, 0, 4, 33, 0, 4, 34, 0, 4, 35, 0, 5, 65504, 0, 5, 65505, 0, 5, 65506, 0, 5, 65507, 0, 5, 65508, 0, 5, 65509, 0, 5, 65510, 0, 5, 65511, 0, 5, 65512, 0, 5, 65513, 0, 5, 65514, 0, 5, 65515, 0, 5, 65516, 0, 5, 65517, 0, 5, 65518, 0, 5, 65519, 0, 5, 65520, 0, 5, 65521, 0, 5, 65522, 0, 5, 65523, 0, 5, 65524, 0, 5, 65525, 0, 5, 65526, 0, 5, 65527, 0, 5, 65528, 0, 5, 65529, 0, 5, 65530, 0, 5, 65531, 0, 5, 65532, 0, 5, 65533, 0, 5, 2, 0, 5, 3, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 12, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 5, 18, 0, 5, 19, 0, 5, 20, 0, 5, 21, 0, 5, 22, 0, 5, 23, 0, 5, 24, 0, 5, 25, 0, 5, 26, 0, 5, 27, 0, 5, 28, 0, 5, 29, 0, 5, 30, 0, 5, 31, 0, 5, 32, 0, 5, 33, 0, 5, 34, 0, 5, 35, 0, 6, 65504, 0, 6, 65505, 0, 6, 65506, 0, 6, 65507, 0, 6, 65508, 0, 6, 65509, 0, 6, 65510, 0, 6, 65511, 0, 6, 65512, 0, 6, 65513, 0, 6, 65514, 0, 6, 65515, 0, 6, 65516, 0, 6, 65517, 0, 6, 65518, 0, 6, 65519, 0, 6, 65520, 0, 6, 65521, 0, 6, 65522, 0, 6, 65523, 0, 6, 65524, 0, 6, 65525, 0, 6, 65526, 0, 6, 65527, 0, 6, 65528, 0, 6, 65529, 0, 6, 65530, 0, 6, 65531, 0, 6, 65532, 0, 6, 65533, 0, 6, 65534, 0, 6, 65535, 0, 6, 0, 0, 6, 1, 0, 6, 2, 0, 6, 3, 0, 6, 4, 0, 6, 5, 0, 6, 6, 0, 6, 7, 0, 6, 8, 0, 6, 9, 0, 6, 10, 0, 6, 11, 0, 6, 12, 0, 6, 13, 0, 6, 14, 0, 6, 15, 0, 6, 16, 0, 6, 17, 0, 6, 18, 0, 6, 19, 0, 6, 20, 0, 6, 21, 0, 6, 22, 0, 6, 23, 0, 6, 24, 0, 6, 25, 0, 6, 26, 0, 6, 27, 0, 6, 28, 0, 6, 29, 0, 6, 30, 0, 6, 31, 0, 6, 32, 0, 6, 33, 0, 6, 34, 0, 6, 35, 0, 7, 65504, 0, 7, 65505, 0, 7, 65506, 0, 7, 65507, 0, 7, 65508, 0, 7, 65509, 0, 7, 65510, 0, 7, 65511, 0, 7, 65512, 0, 7, 65513, 0, 7, 65514, 0, 7, 65515, 0, 7, 65516, 0, 7, 65517, 0, 7, 65518, 0, 7, 65519, 0, 7, 65520, 0, 7, 65521, 0, 7, 65522, 0, 7, 65523, 0, 7, 65524, 0, 7, 65525, 0, 7, 65526, 0, 7, 65527, 0, 7, 65528, 0, 7, 65529, 0, 7, 65530, 0, 7, 65531, 0, 7, 65532, 0, 7, 65533, 0, 7, 65534, 0, 7, 65535, 0, 7, 0, 0, 7, 1, 0, 7, 2, 0, 7, 3, 0, 7, 4, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 9, 0, 7, 10, 0, 7, 11, 0, 7, 12, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 7, 24, 0, 7, 25, 0, 7, 26, 0, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 35, 0, 8, 65504, 0, 8, 65505, 0, 8, 65506, 0, 8, 65507, 0, 8, 65508, 0, 8, 65509, 0, 8, 65510, 0, 8, 65511, 0, 8, 65512, 0, 8, 65513, 0, 8, 65514, 0, 8, 65515, 0, 8, 65516, 0, 8, 65517, 0, 8, 65518, 0, 8, 65519, 0, 8, 65520, 0, 8, 65521, 0, 8, 65522, 0, 8, 65523, 0, 8, 65524, 0, 8, 65525, 0, 8, 65526, 0, 8, 65527, 0, 8, 65528, 0, 8, 65529, 0, 8, 65530, 0, 8, 65531, 0, 8, 65532, 0, 8, 65533, 0, 8, 65534, 0, 8, 65535, 0, 8, 0, 0, 8, 1, 0, 8, 2, 0, 8, 3, 0, 8, 4, 0, 8, 5, 0, 8, 6, 0, 8, 7, 0, 8, 8, 0, 8, 9, 0, 8, 10, 0, 8, 11, 0, 8, 12, 0, 8, 13, 0, 8, 14, 0, 8, 15, 0, 8, 16, 0, 8, 17, 0, 8, 18, 0, 8, 19, 0, 8, 20, 0, 8, 21, 0, 8, 22, 0, 8, 23, 0, 8, 24, 0, 8, 25, 0, 8, 26, 0, 8, 27, 0, 8, 28, 0, 8, 29, 0, 8, 30, 0, 8, 31, 0, 8, 32, 0, 8, 33, 0, 8, 34, 0, 8, 35, 0, 9, 65504, 0, 9, 65505, 0, 9, 65506, 0, 9, 65507, 0, 9, 65508, 0, 9, 65509, 0, 9, 65510, 0, 9, 65511, 0, 9, 65512, 0, 9, 65513, 0, 9, 65514, 0, 9, 65515, 0, 9, 65516, 0, 9, 65517, 0, 9, 65518, 0, 9, 65519, 0, 9, 65520, 0, 9, 65521, 0, 9, 65522, 0, 9, 65523, 0, 9, 65524, 0, 9, 65525, 0, 9, 65526, 0, 9, 65527, 0, 9, 65528, 0, 9, 65529, 0, 9, 65530, 0, 9, 65531, 0, 9, 65532, 0, 9, 65533, 0, 9, 65534, 0, 9, 65535, 0, 9, 0, 0, 9, 1, 0, 9, 2, 0, 9, 3, 0, 9, 4, 0, 9, 5, 0, 9, 6, 0, 9, 7, 0, 9, 8, 0, 9, 9, 0, 9, 10, 0, 9, 11, 0, 9, 12, 0, 9, 13, 0, 9, 14, 0, 9, 15, 0, 9, 16, 0, 9, 17, 0, 9, 18, 0, 9, 19, 0, 9, 20, 0, 9, 21, 0, 9, 22, 0, 9, 23, 0, 9, 24, 0, 9, 25, 0, 9, 26, 0, 9, 27, 0, 9, 28, 0, 9, 29, 0, 9, 30, 0, 9, 31, 0, 9, 32, 0, 9, 33, 0, 9, 34, 0, 9, 35, 0, 10, 65504, 0, 10, 65505, 0, 10, 65506, 0, 10, 65507, 0, 10, 65508, 0, 10, 65509, 0, 10, 65510, 0, 10, 65511, 0, 10, 65512, 0, 10, 65513, 0, 10, 65514, 0, 10, 65515, 0, 10, 65516, 0, 10, 65517, 0, 10, 65518, 0, 10, 65519, 0, 10, 65520, 0, 10, 65521, 0, 10, 65522, 0, 10, 65523, 0, 10, 65524, 0, 10, 65525, 0, 10, 65526, 0, 10, 65527, 0, 10, 65528, 0, 10, 65529, 0, 10, 65530, 0, 10, 65531, 0, 10, 65532, 0, 10, 65533, 0, 10, 65534, 0, 10, 65535, 0, 10, 0, 0, 10, 1, 0, 10, 2, 0, 10, 3, 0, 10, 4, 0, 10, 5, 0, 10, 6, 0, 10, 7, 0, 10, 8, 0, 10, 9, 0, 10, 10, 0, 10, 11, 0, 10, 12, 0, 10, 13, 0, 10, 14, 0, 10, 15, 0, 10, 16, 0, 10, 17, 0, 10, 18, 0, 10, 19, 0, 10, 20, 0, 10, 21, 0, 10, 22, 0, 10, 23, 0, 10, 24, 0, 10, 25, 0, 10, 26, 0, 10, 27, 0, 10, 28, 0, 10, 29, 0, 10, 30, 0, 10, 31, 0, 10, 32, 0, 10, 33, 0, 10, 34, 0, 10, 35, 0, 11, 65504, 0, 11, 65505, 0, 11, 65506, 0, 11, 65507, 0, 11, 65508, 0, 11, 65509, 0, 11, 65510, 0, 11, 65511, 0, 11, 65512, 0, 11, 65513, 0, 11, 65514, 0, 11, 65515, 0, 11, 65516, 0, 11, 65517, 0, 11, 65518, 0, 11, 65519, 0, 11, 65520, 0, 11, 65521, 0, 11, 65522, 0, 11, 65523, 0, 11, 65524, 0, 11, 65525, 0, 11, 65526, 0, 11, 65527, 0, 11, 65528, 0, 11, 65529, 0, 11, 65530, 0, 11, 65531, 0, 11, 65532, 0, 11, 65533, 0, 11, 65534, 0, 11, 65535, 0, 11, 0, 0, 11, 1, 0, 11, 2, 0, 11, 3, 0, 11, 4, 0, 11, 5, 0, 11, 6, 0, 11, 7, 0, 11, 8, 0, 11, 9, 0, 11, 10, 0, 11, 11, 0, 11, 12, 0, 11, 13, 0, 11, 14, 0, 11, 15, 0, 11, 16, 0, 11, 17, 0, 11, 18, 0, 11, 19, 0, 11, 20, 0, 11, 21, 0, 11, 22, 0, 11, 23, 0, 11, 24, 0, 11, 25, 0, 11, 26, 0, 11, 27, 0, 11, 28, 0, 11, 29, 0, 11, 30, 0, 11, 31, 0, 11, 32, 0, 11, 33, 0, 11, 34, 0, 11, 35, 0, 12, 65504, 0, 12, 65505, 0, 12, 65506, 0, 12, 65507, 0, 12, 65508, 0, 12, 65509, 0, 12, 65510, 0, 12, 65511, 0, 12, 65512, 0, 12, 65513, 0, 12, 65514, 0, 12, 65515, 0, 12, 65516, 0, 12, 65517, 0, 12, 65518, 0, 12, 65519, 0, 12, 65520, 0, 12, 65521, 0, 12, 65522, 0, 12, 65523, 0, 12, 65524, 0, 12, 65525, 0, 12, 65526, 0, 12, 65527, 0, 12, 65528, 0, 12, 65529, 0, 12, 65530, 0, 12, 65531, 0, 12, 65532, 0, 12, 65533, 0, 12, 65534, 0, 12, 65535, 0, 12, 0, 0, 12, 1, 0, 12, 2, 0, 12, 3, 0, 12, 4, 0, 12, 5, 0, 12, 6, 0, 12, 7, 0, 12, 8, 0, 12, 9, 0, 12, 10, 0, 12, 11, 0, 12, 12, 0, 12, 13, 0, 12, 14, 0, 12, 15, 0, 12, 16, 0, 12, 17, 0, 12, 18, 0, 12, 19, 0, 12, 20, 0, 12, 21, 0, 12, 22, 0, 12, 23, 0, 12, 24, 0, 12, 25, 0, 12, 26, 0, 12, 27, 0, 12, 28, 0, 12, 29, 0, 12, 30, 0, 12, 31, 0, 12, 32, 0, 12, 33, 0, 12, 34, 0, 12, 35, 0, 13, 65504, 0, 13, 65505, 0, 13, 65506, 0, 13, 65507, 0, 13, 65508, 0, 13, 65509, 0, 13, 65510, 0, 13, 65511, 0, 13, 65512, 0, 13, 65513, 0, 13, 65514, 0, 13, 65515, 0, 13, 65516, 0, 13, 65517, 0, 13, 65518, 0, 13, 65519, 0, 13, 65520, 0, 13, 65521, 0, 13, 65522, 0, 13, 65523, 0, 13, 65524, 0, 13, 65525, 0, 13, 65526, 0, 13, 65527, 0, 13, 65528, 0, 13, 65529, 0, 13, 65530, 0, 13, 65531, 0, 13, 65532, 0, 13, 65533, 0, 13, 65534, 0, 13, 65535, 0, 13, 0, 0, 13, 1, 0, 13, 2, 0, 13, 3, 0, 13, 4, 0, 13, 5, 0, 13, 6, 0, 13, 7, 0, 13, 8, 0, 13, 9, 0, 13, 10, 0, 13, 11, 0, 13, 12, 0, 13, 13, 0, 13, 14, 0, 13, 15, 0, 13, 16, 0, 13, 17, 0, 13, 18, 0, 13, 19, 0, 13, 20, 0, 13, 21, 0, 13, 22, 0, 13, 23, 0, 13, 24, 0, 13, 25, 0, 13, 26, 0, 13, 27, 0, 13, 28, 0, 13, 29, 0, 13, 30, 0, 13, 31, 0, 13, 32, 0, 13, 33, 0, 13, 34, 0, 13, 35, 0, 14, 65504, 0, 14, 65505, 0, 14, 65506, 0, 14, 65507, 0, 14, 65508, 0, 14, 65509, 0, 14, 65510, 0, 14, 65511, 0, 14, 65512, 0, 14, 65513, 0, 14, 65514, 0, 14, 65515, 0, 14, 65516, 0, 14, 65517, 0, 14, 65518, 0, 14, 65519, 0, 14, 65520, 0, 14, 65521, 0, 14, 65522, 0, 14, 65523, 0, 14, 65524, 0, 14, 65525, 0, 14, 65526, 0, 14, 65527, 0, 14, 65528, 0, 14, 65529, 0, 14, 65530, 0, 14, 65531, 0, 14, 65532, 0, 14, 65533, 0, 14, 65534, 0, 14, 65535, 0, 14, 0, 0, 14, 1, 0, 14, 2, 0, 14, 3, 0, 14, 4, 0, 14, 5, 0, 14, 6, 0, 14, 7, 0, 14, 8, 0, 14, 9, 0, 14, 10, 0, 14, 11, 0, 14, 12, 0, 14, 13, 0, 14, 14, 0, 14, 15, 0, 14, 16, 0, 14, 17, 0, 14, 18, 0, 14, 19, 0, 14, 20, 0, 14, 21, 0, 14, 22, 0, 14, 23, 0, 14, 24, 0, 14, 25, 0, 14, 26, 0, 14, 27, 0, 14, 28, 0, 14, 29, 0, 14, 30, 0, 14, 31, 0, 14, 32, 0, 14, 33, 0, 14, 34, 0, 14, 35, 0, 15, 65504, 0, 15, 65505, 0, 15, 65506, 0, 15, 65507, 0, 15, 65508, 0, 15, 65509, 0, 15, 65510, 0, 15, 65511, 0, 15, 65512, 0, 15, 65513, 0, 15, 65514, 0, 15, 65515, 0, 15, 65516, 0, 15, 65517, 0, 15, 65518, 0, 15, 65519, 0, 15, 65520, 0, 15, 65521, 0, 15, 65522, 0, 15, 65523, 0, 15, 65524, 0, 15, 65525, 0, 15, 65526, 0, 15, 65527, 0, 15, 65528, 0, 15, 65529, 0, 15, 65530, 0, 15, 65531, 0, 15, 65532, 0, 15, 65533, 0, 15, 65534, 0, 15, 65535, 0, 15, 0, 0, 15, 1, 0, 15, 2, 0, 15, 3, 0, 15, 4, 0, 15, 5, 0, 15, 6, 0, 15, 7, 0, 15, 8, 0, 15, 9, 0, 15, 10, 0, 15, 11, 0, 15, 12, 0, 15, 13, 0, 15, 14, 0, 15, 15, 0, 15, 16, 0, 15, 17, 0, 15, 18, 0, 15, 19, 0, 15, 20, 0, 15, 21, 0, 15, 22, 0, 15, 23, 0, 15, 24, 0, 15, 25, 0, 15, 26, 0, 15, 27, 0, 15, 28, 0, 15, 29, 0, 15, 30, 0, 15, 31, 0, 15, 32, 0, 15, 33, 0, 15, 34, 0, 15, 35, 0, 16, 65504, 0, 16, 65505, 0, 16, 65506, 0, 16, 65507, 0, 16, 65508, 0, 16, 65509, 0, 16, 65510, 0, 16, 65511, 0, 16, 65512, 0, 16, 65513, 0, 16, 65514, 0, 16, 65515, 0, 16, 65516, 0, 16, 65517, 0, 16, 65518, 0, 16, 65519, 0, 16, 65520, 0, 16, 65521, 0, 16, 65522, 0, 16, 65523, 0, 16, 65524, 0, 16, 65525, 0, 16, 65526, 0, 16, 65527, 0, 16, 65528, 0, 16, 65529, 0, 16, 65530, 0, 16, 65531, 0, 16, 65532, 0, 16, 65533, 0, 16, 65534, 0, 16, 65535, 0, 16, 0, 0, 16, 1, 0, 16, 2, 0, 16, 3, 0, 16, 4, 0, 16, 5, 0, 16, 6, 0, 16, 7, 0, 16, 8, 0, 16, 9, 0, 16, 10, 0, 16, 11, 0, 16, 12, 0, 16, 13, 0, 16, 14, 0, 16, 15, 0, 16, 16, 0, 16, 17, 0, 16, 18, 0, 16, 19, 0, 16, 20, 0, 16, 21, 0, 16, 22, 0, 16, 23, 0, 16, 24, 0, 16, 25, 0, 16, 26, 0, 16, 27, 0, 16, 28, 0, 16, 29, 0, 16, 30, 0, 16, 31, 0, 16, 32, 0, 16, 33, 0, 16, 34, 0, 16, 35, 0, 17, 65504, 0, 17, 65505, 0, 17, 65506, 0, 17, 65507, 0, 17, 65508, 0, 17, 65509, 0, 17, 65510, 0, 17, 65511, 0, 17, 65512, 0, 17, 65513, 0, 17, 65514, 0, 17, 65515, 0, 17, 65516, 0, 17, 65517, 0, 17, 65518, 0, 17, 65519, 0, 17, 65520, 0, 17, 65521, 0, 17, 65522, 0, 17, 65523, 0, 17, 65524, 0, 17, 65525, 0, 17, 65526, 0, 17, 65527, 0, 17, 65528, 0, 17, 65529, 0, 17, 65530, 0, 17, 65531, 0, 17, 65532, 0, 17, 65533, 0, 17, 65534, 0, 17, 65535, 0, 17, 0, 0, 17, 1, 0, 17, 2, 0, 17, 3, 0, 17, 4, 0, 17, 5, 0, 17, 6, 0, 17, 7, 0, 17, 8, 0, 17, 9, 0, 17, 10, 0, 17, 11, 0, 17, 12, 0, 17, 13, 0, 17, 14, 0, 17, 15, 0, 17, 16, 0, 17, 17, 0, 17, 18, 0, 17, 19, 0, 17, 20, 0, 17, 21, 0, 17, 22, 0, 17, 23, 0, 17, 24, 0, 17, 25, 0, 17, 26, 0, 17, 27, 0, 17, 28, 0, 17, 29, 0, 17, 30, 0, 17, 31, 0, 17, 32, 0, 17, 33, 0, 17, 34, 0, 17, 35, 0, 18, 65504, 0, 18, 65505, 0, 18, 65506, 0, 18, 65507, 0, 18, 65508, 0, 18, 65509, 0, 18, 65510, 0, 18, 65511, 0, 18, 65512, 0, 18, 65513, 0, 18, 65514, 0, 18, 65515, 0, 18, 65516, 0, 18, 65517, 0, 18, 65518, 0, 18, 65519, 0, 18, 65520, 0, 18, 65521, 0, 18, 65522, 0, 18, 65523, 0, 18, 65524, 0, 18, 65525, 0, 18, 65526, 0, 18, 65527, 0, 18, 65528, 0, 18, 65529, 0, 18, 65530, 0, 18, 65531, 0, 18, 65532, 0, 18, 65533, 0, 18, 65534, 0, 18, 65535, 0, 18, 0, 0, 18, 1, 0, 18, 2, 0, 18, 3, 0, 18, 4, 0, 18, 5, 0, 18, 6, 0, 18, 7, 0, 18, 8, 0, 18, 9, 0, 18, 10, 0, 18, 11, 0, 18, 12, 0, 18, 13, 0, 18, 14, 0, 18, 15, 0, 18, 16, 0, 18, 17, 0, 18, 18, 0, 18, 19, 0, 18, 20, 0, 18, 21, 0, 18, 22, 0, 18, 23, 0, 18, 24, 0, 18, 25, 0, 18, 26, 0, 18, 27, 0, 18, 28, 0, 18, 29, 0, 18, 30, 0, 18, 31, 0, 18, 32, 0, 18, 33, 0, 18, 34, 0, 18, 35, 0, 19, 65504, 0, 19, 65505, 0, 19, 65506, 0, 19, 65507, 0, 19, 65508, 0, 19, 65509, 0, 19, 65510, 0, 19, 65511, 0, 19, 65512, 0, 19, 65513, 0, 19, 65514, 0, 19, 65515, 0, 19, 65516, 0, 19, 65517, 0, 19, 65518, 0, 19, 65519, 0, 19, 65520, 0, 19, 65521, 0, 19, 65522, 0, 19, 65523, 0, 19, 65524, 0, 19, 65525, 0, 19, 65526, 0, 19, 65527, 0, 19, 65528, 0, 19, 65529, 0, 19, 65530, 0, 19, 65531, 0, 19, 65532, 0, 19, 65533, 0, 19, 65534, 0, 19, 65535, 0, 19, 0, 0, 19, 1, 0, 19, 2, 0, 19, 3, 0, 19, 4, 0, 19, 5, 0, 19, 6, 0, 19, 7, 0, 19, 8, 0, 19, 9, 0, 19, 10, 0, 19, 11, 0, 19, 12, 0, 19, 13, 0, 19, 14, 0, 19, 15, 0, 19, 16, 0, 19, 17, 0, 19, 18, 0, 19, 19, 0, 19, 20, 0, 19, 21, 0, 19, 22, 0, 19, 23, 0, 19, 24, 0, 19, 25, 0, 19, 26, 0, 19, 27, 0, 19, 28, 0, 19, 29, 0, 19, 30, 0, 19, 31, 0, 19, 32, 0, 19, 33, 0, 19, 34, 0, 19, 35, 0, 20, 65504, 0, 20, 65505, 0, 20, 65506, 0, 20, 65507, 0, 20, 65508, 0, 20, 65509, 0, 20, 65510, 0, 20, 65511, 0, 20, 65512, 0, 20, 65513, 0, 20, 65514, 0, 20, 65515, 0, 20, 65516, 0, 20, 65517, 0, 20, 65518, 0, 20, 65519, 0, 20, 65520, 0, 20, 65521, 0, 20, 65522, 0, 20, 65523, 0, 20, 65524, 0, 20, 65525, 0, 20, 65526, 0, 20, 65527, 0, 20, 65528, 0, 20, 65529, 0, 20, 65530, 0, 20, 65531, 0, 20, 65532, 0, 20, 65533, 0, 20, 65534, 0, 20, 65535, 0, 20, 0, 0, 20, 1, 0, 20, 2, 0, 20, 3, 0, 20, 4, 0, 20, 5, 0, 20, 6, 0, 20, 7, 0, 20, 8, 0, 20, 9, 0, 20, 10, 0, 20, 11, 0, 20, 12, 0, 20, 13, 0, 20, 14, 0, 20, 15, 0, 20, 16, 0, 20, 17, 0, 20, 18, 0, 20, 19, 0, 20, 20, 0, 20, 21, 0, 20, 22, 0, 20, 23, 0, 20, 24, 0, 20, 25, 0, 20, 26, 0, 20, 27, 0, 20, 28, 0, 20, 29, 0, 20, 30, 0, 20, 31, 0, 20, 32, 0, 20, 33, 0, 20, 34, 0, 20, 35, 0, 21, 65504, 0, 21, 65505, 0, 21, 65506, 0, 21, 65507, 0, 21, 65508, 0, 21, 65509, 0, 21, 65510, 0, 21, 65511, 0, 21, 65512, 0, 21, 65513, 0, 21, 65514, 0, 21, 65515, 0, 21, 65516, 0, 21, 65517, 0, 21, 65518, 0, 21, 65519, 0, 21, 65520, 0, 21, 65521, 0, 21, 65522, 0, 21, 65523, 0, 21, 65524, 0, 21, 65525, 0, 21, 65526, 0, 21, 65527, 0, 21, 65528, 0, 21, 65529, 0, 21, 65530, 0, 21, 65531, 0, 21, 65532, 0, 21, 65533, 0, 21, 65534, 0, 21, 65535, 0, 21, 0, 0, 21, 1, 0, 21, 2, 0, 21, 3, 0, 21, 4, 0, 21, 5, 0, 21, 6, 0, 21, 7, 0, 21, 8, 0, 21, 9, 0, 21, 10, 0, 21, 11, 0, 21, 12, 0, 21, 13, 0, 21, 14, 0, 21, 15, 0, 21, 16, 0, 21, 17, 0, 21, 18, 0, 21, 19, 0, 21, 20, 0, 21, 21, 0, 21, 22, 0, 21, 23, 0, 21, 24, 0, 21, 25, 0, 21, 26, 0, 21, 27, 0, 21, 28, 0, 21, 29, 0, 21, 30, 0, 21, 31, 0, 21, 32, 0, 21, 33, 0, 21, 34, 0, 21, 35, 0, 22, 65504, 0, 22, 65505, 0, 22, 65506, 0, 22, 65507, 0, 22, 65508, 0, 22, 65509, 0, 22, 65510, 0, 22, 65511, 0, 22, 65512, 0, 22, 65513, 0, 22, 65514, 0, 22, 65515, 0, 22, 65516, 0, 22, 65517, 0, 22, 65518, 0, 22, 65519, 0, 22, 65520, 0, 22, 65521, 0, 22, 65522, 0, 22, 65523, 0, 22, 65524, 0, 22, 65525, 0, 22, 65526, 0, 22, 65527, 0, 22, 65528, 0, 22, 65529, 0, 22, 65530, 0, 22, 65531, 0, 22, 65532, 0, 22, 65533, 0, 22, 65534, 0, 22, 65535, 0, 22, 0, 0, 22, 1, 0, 22, 2, 0, 22, 3, 0, 22, 4, 0, 22, 5, 0, 22, 6, 0, 22, 7, 0, 22, 8, 0, 22, 9, 0, 22, 10, 0, 22, 11, 0, 22, 12, 0, 22, 13, 0, 22, 14, 0, 22, 15, 0, 22, 16, 0, 22, 17, 0, 22, 18, 0, 22, 19, 0, 22, 20, 0, 22, 21, 0, 22, 22, 0, 22, 23, 0, 22, 24, 0, 22, 25, 0, 22, 26, 0, 22, 27, 0, 22, 28, 0, 22, 29, 0, 22, 30, 0, 22, 31, 0, 22, 32, 0, 22, 33, 0, 22, 34, 0, 22, 35, 0, 23, 65504, 0, 23, 65505, 0, 23, 65506, 0, 23, 65507, 0, 23, 65508, 0, 23, 65509, 0, 23, 65510, 0, 23, 65511, 0, 23, 65512, 0, 23, 65513, 0, 23, 65514, 0, 23, 65515, 0, 23, 65516, 0, 23, 65517, 0, 23, 65518, 0, 23, 65519, 0, 23, 65520, 0, 23, 65521, 0, 23, 65522, 0, 23, 65523, 0, 23, 65524, 0, 23, 65525, 0, 23, 65526, 0, 23, 65527, 0, 23, 65528, 0, 23, 65529, 0, 23, 65530, 0, 23, 65531, 0, 23, 65532, 0, 23, 65533, 0, 23, 65534, 0, 23, 65535, 0, 23, 0, 0, 23, 1, 0, 23, 2, 0, 23, 3, 0, 23, 4, 0, 23, 5, 0, 23, 6, 0, 23, 7, 0, 23, 8, 0, 23, 9, 0, 23, 10, 0, 23, 11, 0, 23, 12, 0, 23, 13, 0, 23, 14, 0, 23, 15, 0, 23, 16, 0, 23, 17, 0, 23, 18, 0, 23, 19, 0, 23, 20, 0, 23, 21, 0, 23, 22, 0, 23, 23, 0, 23, 24, 0, 23, 25, 0, 23, 26, 0, 23, 27, 0, 23, 28, 0, 23, 29, 0, 23, 30, 0, 23, 31, 0, 23, 32, 0, 23, 33, 0, 23, 34, 0, 23, 35, 0, 24, 65504, 0, 24, 65505, 0, 24, 65506, 0, 24, 65507, 0, 24, 65508, 0, 24, 65509, 0, 24, 65510, 0, 24, 65511, 0, 24, 65512, 0, 24, 65513, 0, 24, 65514, 0, 24, 65515, 0, 24, 65516, 0, 24, 65517, 0, 24, 65518, 0, 24, 65519, 0, 24, 65520, 0, 24, 65521, 0, 24, 65522, 0, 24, 65523, 0, 24, 65524, 0, 24, 65525, 0, 24, 65526, 0, 24, 65527, 0, 24, 65528, 0, 24, 65529, 0, 24, 65530, 0, 24, 65531, 0, 24, 65532, 0, 24, 65533, 0, 24, 65534, 0, 24, 65535, 0, 24, 0, 0, 24, 1, 0, 24, 2, 0, 24, 3, 0, 24, 4, 0, 24, 5, 0, 24, 6, 0, 24, 7, 0, 24, 8, 0, 24, 9, 0, 24, 10, 0, 24, 11, 0, 24, 12, 0, 24, 13, 0, 24, 14, 0, 24, 15, 0, 24, 16, 0, 24, 17, 0, 24, 18, 0, 24, 19, 0, 24, 20, 0, 24, 21, 0, 24, 22, 0, 24, 23, 0, 24, 24, 0, 24, 25, 0, 24, 26, 0, 24, 27, 0, 24, 28, 0, 24, 29, 0, 24, 30, 0, 24, 31, 0, 24, 32, 0, 24, 33, 0, 24, 34, 0, 24, 35, 0, 25, 65504, 0, 25, 65505, 0, 25, 65506, 0, 25, 65507, 0, 25, 65508, 0, 25, 65509, 0, 25, 65510, 0, 25, 65511, 0, 25, 65512, 0, 25, 65513, 0, 25, 65514, 0, 25, 65515, 0, 25, 65516, 0, 25, 65517, 0, 25, 65518, 0, 25, 65519, 0, 25, 65520, 0, 25, 65521, 0, 25, 65522, 0, 25, 65523, 0, 25, 65524, 0, 25, 65525, 0, 25, 65526, 0, 25, 65527, 0, 25, 65528, 0, 25, 65529, 0, 25, 65530, 0, 25, 65531, 0, 25, 65532, 0, 25, 65533, 0, 25, 65534, 0, 25, 65535, 0, 25, 0, 0, 25, 1, 0, 25, 2, 0, 25, 3, 0, 25, 4, 0, 25, 5, 0, 25, 6, 0, 25, 7, 0, 25, 8, 0, 25, 9, 0, 25, 10, 0, 25, 11, 0, 25, 12, 0, 25, 13, 0, 25, 14, 0, 25, 15, 0, 25, 16, 0, 25, 17, 0, 25, 18, 0, 25, 19, 0, 25, 20, 0, 25, 21, 0, 25, 22, 0, 25, 23, 0, 25, 24, 0, 25, 25, 0, 25, 26, 0, 25, 27, 0, 25, 28, 0, 25, 29, 0, 25, 30, 0, 25, 31, 0, 25, 32, 0, 25, 33, 0, 25, 34, 0, 25, 35, 0, 26, 65504, 0, 26, 65505, 0, 26, 65506, 0, 26, 65507, 0, 26, 65508, 0, 26, 65509, 0, 26, 65510, 0, 26, 65511, 0, 26, 65512, 0, 26, 65513, 0, 26, 65514, 0, 26, 65515, 0, 26, 65516, 0, 26, 65517, 0, 26, 65518, 0, 26, 65519, 0, 26, 65520, 0, 26, 65521, 0, 26, 65522, 0, 26, 65523, 0, 26, 65524, 0, 26, 65525, 0, 26, 65526, 0, 26, 65527, 0, 26, 65528, 0, 26, 65529, 0, 26, 65530, 0, 26, 65531, 0, 26, 65532, 0, 26, 65533, 0, 26, 65534, 0, 26, 65535, 0, 26, 0, 0, 26, 1, 0, 26, 2, 0, 26, 3, 0, 26, 4, 0, 26, 5, 0, 26, 6, 0, 26, 7, 0, 26, 8, 0, 26, 9, 0, 26, 10, 0, 26, 11, 0, 26, 12, 0, 26, 13, 0, 26, 14, 0, 26, 15, 0, 26, 16, 0, 26, 17, 0, 26, 18, 0, 26, 19, 0, 26, 20, 0, 26, 21, 0, 26, 22, 0, 26, 23, 0, 26, 24, 0, 26, 25, 0, 26, 26, 0, 26, 27, 0, 26, 28, 0, 26, 29, 0, 26, 30, 0, 26, 31, 0, 26, 32, 0, 26, 33, 0, 26, 34, 0, 26, 35, 0, 27, 65504, 0, 27, 65505, 0, 27, 65506, 0, 27, 65507, 0, 27, 65508, 0, 27, 65509, 0, 27, 65510, 0, 27, 65511, 0, 27, 65512, 0, 27, 65513, 0, 27, 65514, 0, 27, 65515, 0, 27, 65516, 0, 27, 65517, 0, 27, 65518, 0, 27, 65519, 0, 27, 65520, 0, 27, 65521, 0, 27, 65522, 0, 27, 65523, 0, 27, 65524, 0, 27, 65525, 0, 27, 65526, 0, 27, 65527, 0, 27, 65528, 0, 27, 65529, 0, 27, 65530, 0, 27, 65531, 0, 27, 65532, 0, 27, 65533, 0, 27, 65534, 0, 27, 65535, 0, 27, 0, 0, 27, 1, 0, 27, 2, 0, 27, 3, 0, 27, 4, 0, 27, 5, 0, 27, 6, 0, 27, 7, 0, 27, 8, 0, 27, 9, 0, 27, 10, 0, 27, 11, 0, 27, 12, 0, 27, 13, 0, 27, 14, 0, 27, 15, 0, 27, 16, 0, 27, 17, 0, 27, 18, 0, 27, 19, 0, 27, 20, 0, 27, 21, 0, 27, 22, 0, 27, 23, 0, 27, 24, 0, 27, 25, 0, 27, 26, 0, 27, 27, 0, 27, 28, 0, 27, 29, 0, 27, 30, 0, 27, 31, 0, 27, 32, 0, 27, 33, 0, 27, 34, 0, 27, 35, 0, 28, 65504, 0, 28, 65505, 0, 28, 65506, 0, 28, 65507, 0, 28, 65508, 0, 28, 65509, 0, 28, 65510, 0, 28, 65511, 0, 28, 65512, 0, 28, 65513, 0, 28, 65514, 0, 28, 65515, 0, 28, 65516, 0, 28, 65517, 0, 28, 65518, 0, 28, 65519, 0, 28, 65520, 0, 28, 65521, 0, 28, 65522, 0, 28, 65523, 0, 28, 65524, 0, 28, 65525, 0, 28, 65526, 0, 28, 65527, 0, 28, 65528, 0, 28, 65529, 0, 28, 65530, 0, 28, 65531, 0, 28, 65532, 0, 28, 65533, 0, 28, 65534, 0, 28, 65535, 0, 28, 0, 0, 28, 1, 0, 28, 2, 0, 28, 3, 0, 28, 4, 0, 28, 5, 0, 28, 6, 0, 28, 7, 0, 28, 8, 0, 28, 9, 0, 28, 10, 0, 28, 11, 0, 28, 12, 0, 28, 13, 0, 28, 14, 0, 28, 15, 0, 28, 16, 0, 28, 17, 0, 28, 18, 0, 28, 19, 0, 28, 20, 0, 28, 21, 0, 28, 22, 0, 28, 23, 0, 28, 24, 0, 28, 25, 0, 28, 26, 0, 28, 27, 0, 28, 28, 0, 28, 29, 0, 28, 30, 0, 28, 31, 0, 28, 32, 0, 28, 33, 0, 28, 34, 0, 28, 35, 0, 29, 65504, 0, 29, 65505, 0, 29, 65506, 0, 29, 65507, 0, 29, 65508, 0, 29, 65509, 0, 29, 65510, 0, 29, 65511, 0, 29, 65512, 0, 29, 65513, 0, 29, 65514, 0, 29, 65515, 0, 29, 65516, 0, 29, 65517, 0, 29, 65518, 0, 29, 65519, 0, 29, 65520, 0, 29, 65521, 0, 29, 65522, 0, 29, 65523, 0, 29, 65524, 0, 29, 65525, 0, 29, 65526, 0, 29, 65527, 0, 29, 65528, 0, 29, 65529, 0, 29, 65530, 0, 29, 65531, 0, 29, 65532, 0, 29, 65533, 0, 29, 65534, 0, 29, 65535, 0, 29, 0, 0, 29, 1, 0, 29, 2, 0, 29, 3, 0, 29, 4, 0, 29, 5, 0, 29, 6, 0, 29, 7, 0, 29, 8, 0, 29, 9, 0, 29, 10, 0, 29, 11, 0, 29, 12, 0, 29, 13, 0, 29, 14, 0, 29, 15, 0, 29, 16, 0, 29, 17, 0, 29, 18, 0, 29, 19, 0, 29, 20, 0, 29, 21, 0, 29, 22, 0, 29, 23, 0, 29, 24, 0, 29, 25, 0, 29, 26, 0, 29, 27, 0, 29, 28, 0, 29, 29, 0, 29, 30, 0, 29, 31, 0, 29, 32, 0, 29, 33, 0, 29, 34, 0, 29, 35, 0, 30, 65504, 0, 30, 65505, 0, 30, 65506, 0, 30, 65507, 0, 30, 65508, 0, 30, 65509, 0, 30, 65510, 0, 30, 65511, 0, 30, 65512, 0, 30, 65513, 0, 30, 65514, 0, 30, 65515, 0, 30, 65516, 0, 30, 65517, 0, 30, 65518, 0, 30, 65519, 0, 30, 65520, 0, 30, 65521, 0, 30, 65522, 0, 30, 65523, 0, 30, 65524, 0, 30, 65525, 0, 30, 65526, 0, 30, 65527, 0, 30, 65528, 0, 30, 65529, 0, 30, 65530, 0, 30, 65531, 0, 30, 65532, 0, 30, 65533, 0, 30, 65534, 0, 30, 65535, 0, 30, 0, 0, 30, 1, 0, 30, 2, 0, 30, 3, 0, 30, 4, 0, 30, 5, 0, 30, 6, 0, 30, 7, 0, 30, 8, 0, 30, 9, 0, 30, 10, 0, 30, 11, 0, 30, 12, 0, 30, 13, 0, 30, 14, 0, 30, 15, 0, 30, 16, 0, 30, 17, 0, 30, 18, 0, 30, 19, 0, 30, 20, 0, 30, 21, 0, 30, 22, 0, 30, 23, 0, 30, 24, 0, 30, 25, 0, 30, 26, 0, 30, 27, 0, 30, 28, 0, 30, 29, 0, 30, 30, 0, 30, 31, 0, 30, 32, 0, 30, 33, 0, 30, 34, 0, 30, 35, 0, 31, 65504, 0, 31, 65505, 0, 31, 65506, 0, 31, 65507, 0, 31, 65508, 0, 31, 65509, 0, 31, 65510, 0, 31, 65511, 0, 31, 65512, 0, 31, 65513, 0, 31, 65514, 0, 31, 65515, 0, 31, 65516, 0, 31, 65517, 0, 31, 65518, 0, 31, 65519, 0, 31, 65520, 0, 31, 65521, 0, 31, 65522, 0, 31, 65523, 0, 31, 65524, 0, 31, 65525, 0, 31, 65526, 0, 31, 65527, 0, 31, 65528, 0, 31, 65529, 0, 31, 65530, 0, 31, 65531, 0, 31, 65532, 0, 31, 65533, 0, 31, 65534, 0, 31, 65535, 0, 31, 0, 0, 31, 1, 0, 31, 2, 0, 31, 3, 0, 31, 4, 0, 31, 5, 0, 31, 6, 0, 31, 7, 0, 31, 8, 0, 31, 9, 0, 31, 10, 0, 31, 11, 0, 31, 12, 0, 31, 13, 0, 31, 14, 0, 31, 15, 0, 31, 16, 0, 31, 17, 0, 31, 18, 0, 31, 19, 0, 31, 20, 0, 31, 21, 0, 31, 22, 0, 31, 23, 0, 31, 24, 0, 31, 25, 0, 31, 26, 0, 31, 27, 0, 31, 28, 0, 31, 29, 0, 31, 30, 0, 31, 31, 0, 31, 32, 0, 31, 33, 0, 31, 34, 0, 31, 35, 0, 32, 65504, 0, 32, 65505, 0, 32, 65506, 0, 32, 65507, 0, 32, 65508, 0, 32, 65509, 0, 32, 65510, 0, 32, 65511, 0, 32, 65512, 0, 32, 65513, 0, 32, 65514, 0, 32, 65515, 0, 32, 65516, 0, 32, 65517, 0, 32, 65518, 0, 32, 65519, 0, 32, 65520, 0, 32, 65521, 0, 32, 65522, 0, 32, 65523, 0, 32, 65524, 0, 32, 65525, 0, 32, 65526, 0, 32, 65527, 0, 32, 65528, 0, 32, 65529, 0, 32, 65530, 0, 32, 65531, 0, 32, 65532, 0, 32, 65533, 0, 32, 65534, 0, 32, 65535, 0, 32, 0, 0, 32, 1, 0, 32, 2, 0, 32, 3, 0, 32, 4, 0, 32, 5, 0, 32, 6, 0, 32, 7, 0, 32, 8, 0, 32, 9, 0, 32, 10, 0, 32, 11, 0, 32, 12, 0, 32, 13, 0, 32, 14, 0, 32, 15, 0, 32, 16, 0, 32, 17, 0, 32, 18, 0, 32, 19, 0, 32, 20, 0, 32, 21, 0, 32, 22, 0, 32, 23, 0, 32, 24, 0, 32, 25, 0, 32, 26, 0, 32, 27, 0, 32, 28, 0, 32, 29, 0, 32, 30, 0, 32, 31, 0, 32, 32, 0, 32, 33, 0, 32, 34, 0, 32, 35, 0, 33, 65504, 0, 33, 65505, 0, 33, 65506, 0, 33, 65507, 0, 33, 65508, 0, 33, 65509, 0, 33, 65510, 0, 33, 65511, 0, 33, 65512, 0, 33, 65513, 0, 33, 65514, 0, 33, 65515, 0, 33, 65516, 0, 33, 65517, 0, 33, 65518, 0, 33, 65519, 0, 33, 65520, 0, 33, 65521, 0, 33, 65522, 0, 33, 65523, 0, 33, 65524, 0, 33, 65525, 0, 33, 65526, 0, 33, 65527, 0, 33, 65528, 0, 33, 65529, 0, 33, 65530, 0, 33, 65531, 0, 33, 65532, 0, 33, 65533, 0, 33, 65534, 0, 33, 65535, 0, 33, 0, 0, 33, 1, 0, 33, 2, 0, 33, 3, 0, 33, 4, 0, 33, 5, 0, 33, 6, 0, 33, 7, 0, 33, 8, 0, 33, 9, 0, 33, 10, 0, 33, 11, 0, 33, 12, 0, 33, 13, 0, 33, 14, 0, 33, 15, 0, 33, 16, 0, 33, 17, 0, 33, 18, 0, 33, 19, 0, 33, 20, 0, 33, 21, 0, 33, 22, 0, 33, 23, 0, 33, 24, 0, 33, 25, 0, 33, 26, 0, 33, 27, 0, 33, 28, 0, 33, 29, 0, 33, 30, 0, 33, 31, 0, 33, 32, 0, 33, 33, 0, 33, 34, 0, 33, 35, 0, 34, 65504, 0, 34, 65505, 0, 34, 65506, 0, 34, 65507, 0, 34, 65508, 0, 34, 65509, 0, 34, 65510, 0, 34, 65511, 0, 34, 65512, 0, 34, 65513, 0, 34, 65514, 0, 34, 65515, 0, 34, 65516, 0, 34, 65517, 0, 34, 65518, 0, 34, 65519, 0, 34, 65520, 0, 34, 65521, 0, 34, 65522, 0, 34, 65523, 0, 34, 65524, 0, 34, 65525, 0, 34, 65526, 0, 34, 65527, 0, 34, 65528, 0, 34, 65529, 0, 34, 65530, 0, 34, 65531, 0, 34, 65532, 0, 34, 65533, 0, 34, 65534, 0, 34, 65535, 0, 34, 0, 0, 34, 1, 0, 34, 2, 0, 34, 3, 0, 34, 4, 0, 34, 5, 0, 34, 6, 0, 34, 7, 0, 34, 8, 0, 34, 9, 0, 34, 10, 0, 34, 11, 0, 34, 12, 0, 34, 13, 0, 34, 14, 0, 34, 15, 0, 34, 16, 0, 34, 17, 0, 34, 18, 0, 34, 19, 0, 34, 20, 0, 34, 21, 0, 34, 22, 0, 34, 23, 0, 34, 24, 0, 34, 25, 0, 34, 26, 0, 34, 27, 0, 34, 28, 0, 34, 29, 0, 34, 30, 0, 34, 31, 0, 34, 32, 0, 34, 33, 0, 34, 34, 0, 34, 35, 0, 35, 65504, 0, 35, 65505, 0, 35, 65506, 0, 35, 65507, 0, 35, 65508, 0, 35, 65509, 0, 35, 65510, 0, 35, 65511, 0, 35, 65512, 0, 35, 65513, 0, 35, 65514, 0, 35, 65515, 0, 35, 65516, 0, 35, 65517, 0, 35, 65518, 0, 35, 65519, 0, 35, 65520, 0, 35, 65521, 0, 35, 65522, 0, 35, 65523, 0, 35, 65524, 0, 35, 65525, 0, 35, 65526, 0, 35, 65527, 0, 35, 65528, 0, 35, 65529, 0, 35, 65530, 0, 35, 65531, 0, 35, 65532, 0, 35, 65533, 0, 35, 65534, 0, 35, 65535, 0, 35, 0, 0, 35, 1, 0, 35, 2, 0, 35, 3, 0, 35, 4, 0, 35, 5, 0, 35, 6, 0, 35, 7, 0, 35, 8, 0, 35, 9, 0, 35, 10, 0, 35, 11, 0, 35, 12, 0, 35, 13, 0, 35, 14, 0, 35, 15, 0, 35, 16, 0, 35, 17, 0, 35, 18, 0, 35, 19, 0, 35, 20, 0, 35, 21, 0, 35, 22, 0, 35, 23, 0, 35, 24, 0, 35, 25, 0, 35, 26, 0, 35, 27, 0, 35, 28, 0, 35, 29, 0, 35, 30, 0, 35, 31, 0, 35, 32, 0, 35, 33, 0, 35, 34, 0, 35, 35, 0, 2, 65534, 0, 3, 65532, 0, 5, 65534, 0, 5, 65535, 0, 5, 0, 0, 5, 1, 0) +} +script = ExtResource("1_ws6nn") +enemy_pool = Array[Resource("res://Scripts/Resources/enemy.gd")]([ExtResource("3_l3ehn"), ExtResource("4_0gtw5"), ExtResource("5_hppyg"), ExtResource("6_oty0h"), ExtResource("7_07st7"), ExtResource("8_sf1ao")]) +player_spawns = [NodePath("PlayerSpawnLocations/PlayerSpawn1"), NodePath("PlayerSpawnLocations/PlayerSpawn2"), NodePath("PlayerSpawnLocations/PlayerSpawn3"), NodePath("PlayerSpawnLocations/PlayerSpawn4")] +enemy_spawns = [NodePath("GroundSpawn"), NodePath("AirSpawn")] +enemy_goals = [NodePath("EnemyGoal")] +a_star_graph_3d = NodePath("AStarGraph3D") +metadata/_editor_floor_ = Vector3(0, 0, 0) + +[node name="Sun" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.917074, 0.155176, 0.367281, -0.398717, 0.356914, 0.84477, 8.88179e-16, -0.921158, 0.389188, 0, 100, 0) + +[node name="CinematicCam" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.965103, 0.261869, 0, -0.261869, 0.965103, 0, 4.58117, 6.60758) +cull_mask = 1 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_l41d0") + +[node name="EnemyGoal" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 23, 0.5, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="EnemyGoal"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) + +[node name="VisualizedPath" type="Path3D" parent="."] +curve = SubResource("Curve3D_suxqu") +script = ExtResource("11_d7ofl") + +[node name="GroundSpawn" parent="." node_paths=PackedStringArray("path", "dest") instance=ExtResource("3_5imwp")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0.5, 0) +path = NodePath("../VisualizedPath") +type = 1 +dest = NodePath("../EnemyGoal") +air_enemy_scene = ExtResource("12_tqi5x") + +[node name="AirSpawn" parent="." node_paths=PackedStringArray("dest") instance=ExtResource("3_5imwp")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -47.0801, 22.5492, 0) +type = 2 +dest = NodePath("../EnemyGoal") +air_enemy_scene = ExtResource("12_tqi5x") + +[node name="CardPrinter" parent="." instance=ExtResource("9_r25gu")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 25.1496, 0.499996, 5.79039) + +[node name="Trees" type="Node3D" parent="."] + +[node name="Tree" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.9581, 0.5, -4.16029) + +[node name="Tree2" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.3403, 0.5, 3.00628) + +[node name="Tree3" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25.0176, 0.5, 10.5107) + +[node name="Tree4" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.6608, 0.5, 8.54912) + +[node name="Tree5" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25.8033, 0.5, 5.85091) + +[node name="Tree6" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7746, 0.499998, 1.14891) + +[node name="Tree7" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.2258, 0.499998, -2.92603) + +[node name="Tree8" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -35.1576, 0.499998, -2.93234) + +[node name="Tree9" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -35.4654, 0.499998, -1.21667) + +[node name="Tree10" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -35.1971, 0.499998, 1.76769) + +[node name="Tree11" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -34.0165, 0.499998, 4.2918) + +[node name="Tree12" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -36.1443, 0.499998, 6.60157) + +[node name="Tree13" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -35.4516, 0.5, 9.1856) + +[node name="Tree14" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -37.002, 0.5, 11.8086) + +[node name="Tree15" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0605, 0.5, -9.98104) + +[node name="Tree16" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.1546, 0.499998, -16.4042) + +[node name="Tree17" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.3462, 0.499998, -21.2664) + +[node name="Tree18" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.34623, 0.499998, -22.2664) + +[node name="Tree19" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.36527, 0.5, -21.7372) + +[node name="Tree20" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.51903, 0.500002, -21.2514) + +[node name="Tree21" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.51903, 0.500002, -21.2514) + +[node name="Tree22" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.79995, 0.500006, -23.396) + +[node name="Tree23" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.0938, 0.500006, -23.5359) + +[node name="Tree24" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.7496, 0.500006, -23.5671) + +[node name="Tree25" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.9642, 0.500006, -21.0381) + +[node name="Tree26" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25.9642, 0.500006, -17.0381) + +[node name="Tree27" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27.5112, 0.500006, -11.2182) + +[node name="Tree28" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.8624, 0.500006, -6.18511) + +[node name="Tree29" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 31.2855, 0.500006, -0.657061) + +[node name="Tree30" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.825, 0.500006, 4.91539) + +[node name="Tree31" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 28.0303, 0.500006, 11.771) + +[node name="Tree32" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.0303, 0.500006, 17.771) + +[node name="Tree33" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.0073, 0.500006, 21.2305) + +[node name="Tree34" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.3299, 0.500006, 26.4282) + +[node name="Tree35" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.96343, 0.500006, 29.3049) + +[node name="Tree36" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.21287, 0.500006, 30.7198) + +[node name="Tree37" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.48288, 0.500006, 32.0162) + +[node name="Tree38" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.94951, 0.500006, 31.6698) + +[node name="Tree39" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.3671, 0.500002, 30.2392) + +[node name="Tree40" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.4585, 0.499998, 28.571) + +[node name="Tree41" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.4585, 0.499998, 25.571) + +[node name="Tree42" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.8191, 0.500002, 20.3102) + +[node name="Tree43" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.3912, 0.500002, 15.0072) + +[node name="Tree44" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, 20) + +[node name="Tree45" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 18) + +[node name="Tree46" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, 16) + +[node name="Tree47" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 21) + +[node name="Tree48" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.833413, 1.90735e-06, 16.4959) + +[node name="Tree49" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.43833, 0, 15.6604) + +[node name="Tree50" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.79685, 0, 19.1783) + +[node name="Tree51" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.07514, 0, 21.0477) + +[node name="Tree52" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.06338, 0, 13.4936) + +[node name="Tree53" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.64328, 0, 12.7039) + +[node name="Tree54" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.8463, 0, 11.6802) + +[node name="Tree55" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.8631, 0, 15.6216) + +[node name="Tree56" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.3153, 0, 13.4882) + +[node name="Tree57" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.9242, 0, 21.5176) + +[node name="Tree58" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.1782, 0, 12.0249) + +[node name="Tree59" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.1783, 0, 8.53849) + +[node name="Tree60" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.3879, 0, 1.70052) + +[node name="Tree61" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.0971, 0, -2.90985) + +[node name="Tree62" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.10667, 1.90735e-06, 23.6948) + +[node name="Tree63" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.34759, 0, 25.3535) + +[node name="Tree64" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.08945, 0, 25.0002) + +[node name="Tree65" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.99801, 1.90735e-06, 17.4631) + +[node name="Tree66" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.1297, 0, 11.2177) + +[node name="Tree67" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.3564, 1.90735e-06, 16.4775) + +[node name="Tree68" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.55839, 1.90735e-06, 18.9551) + +[node name="Tree69" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.1857, 1.90735e-06, 25.0545) + +[node name="Tree70" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.5608, 0, 23.1718) + +[node name="Tree71" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.3715, 0, 21.0323) + +[node name="Tree72" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.121, 1.90735e-06, 22.4372) + +[node name="Tree73" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.7273, 0, 15.004) + +[node name="Tree74" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.3204, 0, 17.9194) + +[node name="Tree75" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.7465, 0, 11.8229) + +[node name="Tree76" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.1312, -1.90735e-06, 13.1821) + +[node name="Tree77" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.577, 0, 17.4094) + +[node name="Tree78" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25.0632, 0, 18.5666) + +[node name="Tree79" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.2817, 0, 12.5708) + +[node name="Tree80" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.5906, 0, 17.0615) + +[node name="Tree81" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -31.0431, 0, 13.0007) + +[node name="Tree82" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.0381, 0, -5.96004) + +[node name="Tree83" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -31.3643, 0, -1.82155) + +[node name="Tree84" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -31.4774, 0, 2.90493) + +[node name="Tree85" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30.2843, 0, 6.28406) + +[node name="Tree86" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -31.5584, 0, 10.5879) + +[node name="Tree87" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -33.459, 0, 20.2242) + +[node name="Tree88" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.95871, 0, -20.2879) + +[node name="Tree89" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.78131, 0, -13.0664) + +[node name="Tree90" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.54611, 0, -15.3617) + +[node name="Tree91" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.42729, 0, -12.4254) + +[node name="Tree92" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.669, 0, -15.7835) + +[node name="Tree93" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.04824, 0, -18.2501) + +[node name="Tree94" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.8105, 0, -18.7671) + +[node name="Tree95" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.52684, 0, -17.5411) + +[node name="Tree96" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.1092, 0, -10.764) + +[node name="Tree97" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.243, 0, -13.5111) + +[node name="Tree98" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.1907, 0, -16.3335) + +[node name="Tree99" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.8111, 0, -13.5834) + +[node name="Tree100" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5141, 0, -8.21202) + +[node name="Tree101" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.9397, 0, -8.70021) + +[node name="Tree102" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.6153, 0, -13.0484) + +[node name="Tree103" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.627348, 0, -17.0534) + +[node name="Tree104" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.03485, 0, -14.2176) + +[node name="Tree105" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.82444, 0, -18.4438) + +[node name="Tree106" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.19373, 0, -20.2347) + +[node name="Tree107" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.3896, 0, -16.5323) + +[node name="Tree108" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.352, 0, -14.523) + +[node name="Tree109" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.2171, 0, -19.789) + +[node name="Tree110" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.4117, 0, -17.251) + +[node name="Tree111" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.0888, 0, -16.1715) + +[node name="Tree112" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19.4365, 0, -19.5705) + +[node name="Tree113" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.0866, 0, -13.4566) + +[node name="Tree114" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.2342, 0, -11.617) + +[node name="Tree115" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.0725, 0, -9.5091) + +[node name="Tree116" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.43, 0, -5.85608) + +[node name="Tree117" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.6886, 0, -12.2153) + +[node name="Tree118" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.6013, 0, -14.5943) + +[node name="Tree119" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5365, 0, -7.52541) + +[node name="Tree120" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.3932, 0, -10.2968) + +[node name="Tree121" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.7408, 0, -10.5807) + +[node name="Tree122" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25.7564, 0, 10.602) + +[node name="Tree123" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.193557, 0, -11.8531) + +[node name="Tree124" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.94883, 0, 11.8645) + +[node name="Tree125" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.3106, 0, 11.6716) + +[node name="Tree126" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.28633, 0, 10.0277) + +[node name="Tree127" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.43489, 0, 11.2421) + +[node name="Tree128" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.81471, 0, 8.71751) + +[node name="Tree129" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.0541, 0, 9.42008) + +[node name="Tree130" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13.7939, 0, 9.04683) + +[node name="Tree131" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.14442, 0, 9.73803) + +[node name="Tree132" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.7484, 0, 23.8066) + +[node name="Tree133" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.4983, 0, -11.4034) + +[node name="Tree134" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.2138, 0, -6.79625) + +[node name="Tree135" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -32.7927, 0, -7.05431) + +[node name="Tree136" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.9384, 0, -9.08715) + +[node name="Tree137" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -32.6106, 0, -13.041) + +[node name="Tree138" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.7699, 0, -14.4419) + +[node name="Tree139" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.6869, 0, -19.7922) + +[node name="Tree140" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.9105, 0, -21.0025) + +[node name="Tree141" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.9706, 0, -19.5254) + +[node name="Tree142" parent="Trees" instance=ExtResource("10_7v1co")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30.5192, 0, -17.6837) + +[node name="PlayerSpawnLocations" type="Node3D" parent="."] + +[node name="PlayerSpawn1" type="Node3D" parent="PlayerSpawnLocations"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 1, -1) + +[node name="PlayerSpawn2" type="Node3D" parent="PlayerSpawnLocations"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, -1) + +[node name="PlayerSpawn3" type="Node3D" parent="PlayerSpawnLocations"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 1, 1) + +[node name="PlayerSpawn4" type="Node3D" parent="PlayerSpawnLocations"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1) + +[node name="AStarGraph3D" type="Node3D" parent="." node_paths=PackedStringArray("start", "end", "spawner", "visualized_path")] +script = ExtResource("11_07ukk") +grid_size = Vector2(19, 9) +point_gap = 1.5 +start = NodePath("../GroundSpawn") +end = NodePath("../EnemyGoal") +spawner = NodePath("../GroundSpawn") +visualized_path = NodePath("../VisualizedPath") + +[node name="InvisibleWalls" type="Node3D" parent="."] + +[node name="StaticBody3D" type="StaticBody3D" parent="InvisibleWalls"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 18.6848) +collision_layer = 32 +collision_mask = 0 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls/StaticBody3D"] +shape = SubResource("BoxShape3D_kkwvm") + +[node name="StaticBody3D2" type="StaticBody3D" parent="InvisibleWalls"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16.9482) +collision_layer = 32 +collision_mask = 0 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls/StaticBody3D2"] +shape = SubResource("BoxShape3D_kkwvm") + +[node name="StaticBody3D3" type="StaticBody3D" parent="InvisibleWalls"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -27.2323, 0, 1.33472) +collision_layer = 32 +collision_mask = 0 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls/StaticBody3D3"] +shape = SubResource("BoxShape3D_kkwvm") + +[node name="StaticBody3D4" type="StaticBody3D" parent="InvisibleWalls"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 29.0754, 0, -3.96028) +collision_layer = 32 +collision_mask = 0 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls/StaticBody3D4"] +shape = SubResource("BoxShape3D_kkwvm") diff --git a/Worlds/GreenPlanet/tilemap.tres b/Worlds/GreenPlanet/tilemap.tres new file mode 100644 index 0000000..50ba5c3 --- /dev/null +++ b/Worlds/GreenPlanet/tilemap.tres @@ -0,0 +1,63 @@ +[gd_resource type="MeshLibrary" load_steps=13 format=3 uid="uid://jfr8j8kycfa5"] + +[ext_resource type="Texture2D" uid="uid://blnfsojw4ukq4" path="res://Assets/Textures/grass.png" id="1_ghpvv"] +[ext_resource type="Texture2D" uid="uid://r8cr41blojpm" path="res://Assets/Textures/stone wall 7.png" id="1_sntky"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ulcfh"] +albedo_texture = ExtResource("1_ghpvv") +texture_filter = 0 + +[sub_resource type="QuadMesh" id="QuadMesh_p0vo4"] +material = SubResource("StandardMaterial3D_ulcfh") +orientation = 1 + +[sub_resource type="Image" id="Image_eu4n8"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 61, 129, 57, 255, 74, 149, 70, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 129, 57, 255, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 128, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 74, 148, 70, 255, 74, 148, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 70, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 74, 148, 70, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 74, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 60, 128, 56, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 127, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 127, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 56, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 127, 56, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 68, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 59, 127, 55, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 146, 68, 255, 72, 146, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id="ImageTexture_p1rdv"] +image = SubResource("Image_eu4n8") + +[sub_resource type="BoxShape3D" id="BoxShape3D_mtfk2"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jnpkd"] +albedo_texture = ExtResource("1_sntky") + +[sub_resource type="QuadMesh" id="QuadMesh_4ay7f"] +material = SubResource("StandardMaterial3D_jnpkd") +orientation = 1 + +[sub_resource type="Image" id="Image_ktpj2"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 100, 92, 255, 103, 106, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 104, 97, 255, 110, 113, 108, 255, 117, 120, 115, 255, 112, 115, 110, 255, 106, 109, 103, 255, 101, 105, 97, 255, 105, 107, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 112, 107, 255, 106, 109, 103, 255, 101, 105, 98, 255, 98, 103, 96, 255, 106, 109, 103, 255, 105, 109, 102, 255, 104, 107, 100, 255, 105, 105, 98, 255, 102, 102, 94, 255, 103, 103, 96, 255, 107, 107, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 92, 255, 107, 106, 100, 255, 106, 106, 99, 255, 105, 107, 101, 255, 108, 110, 104, 255, 114, 116, 111, 255, 114, 117, 112, 255, 109, 111, 105, 255, 109, 109, 102, 255, 108, 107, 100, 255, 103, 104, 96, 255, 103, 103, 95, 255, 106, 105, 98, 255, 108, 108, 101, 255, 109, 109, 103, 255, 106, 108, 103, 255, 103, 105, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 108, 101, 255, 104, 104, 98, 255, 93, 94, 88, 255, 91, 92, 86, 255, 94, 95, 89, 255, 99, 100, 94, 255, 108, 107, 101, 255, 101, 102, 94, 255, 94, 96, 87, 255, 94, 96, 87, 255, 96, 97, 88, 255, 102, 102, 94, 255, 104, 104, 97, 255, 107, 107, 100, 255, 108, 109, 103, 255, 110, 111, 107, 255, 110, 112, 108, 255, 107, 109, 104, 255, 94, 97, 91, 255, 83, 87, 78, 255, 84, 88, 79, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 93, 255, 99, 100, 94, 255, 92, 94, 88, 255, 92, 93, 87, 255, 93, 95, 88, 255, 96, 97, 91, 255, 95, 96, 90, 255, 88, 90, 82, 255, 80, 83, 75, 255, 74, 78, 69, 255, 77, 81, 72, 255, 83, 86, 77, 255, 86, 89, 80, 255, 88, 91, 81, 255, 92, 94, 85, 255, 100, 102, 95, 255, 105, 107, 102, 255, 108, 110, 105, 255, 104, 106, 101, 255, 95, 98, 92, 255, 86, 89, 81, 255, 83, 87, 78, 255, 81, 86, 76, 255, 89, 93, 83, 255, 98, 102, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 97, 255, 101, 101, 97, 255, 103, 104, 99, 255, 98, 99, 94, 255, 93, 93, 87, 255, 90, 90, 84, 255, 81, 83, 78, 255, 84, 87, 80, 255, 85, 88, 79, 255, 83, 87, 77, 255, 78, 81, 73, 255, 72, 76, 68, 255, 66, 71, 63, 255, 69, 73, 66, 255, 68, 71, 66, 255, 67, 69, 66, 255, 74, 76, 72, 255, 83, 86, 80, 255, 93, 96, 90, 255, 95, 98, 91, 255, 97, 100, 94, 255, 102, 105, 97, 255, 100, 103, 93, 255, 103, 106, 96, 255, 106, 108, 99, 255, 109, 111, 102, 255, 105, 107, 98, 255, 98, 101, 91, 255, 101, 105, 94, 255, 113, 115, 107, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 94, 255, 101, 101, 97, 255, 99, 100, 95, 255, 99, 100, 96, 255, 102, 103, 99, 255, 92, 92, 86, 255, 88, 87, 81, 255, 91, 92, 86, 255, 91, 94, 87, 255, 84, 88, 81, 255, 73, 77, 70, 255, 70, 74, 66, 255, 71, 75, 67, 255, 71, 76, 69, 255, 72, 75, 71, 255, 72, 74, 71, 255, 73, 75, 73, 255, 69, 71, 69, 255, 66, 69, 66, 255, 72, 74, 72, 255, 77, 79, 75, 255, 89, 92, 85, 255, 98, 102, 93, 255, 102, 105, 95, 255, 109, 111, 101, 255, 114, 116, 106, 255, 111, 113, 104, 255, 105, 108, 98, 255, 110, 113, 104, 255, 124, 127, 122, 255, 125, 128, 123, 255, 127, 130, 125, 255, 123, 126, 120, 255, 118, 121, 113, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 107, 101, 255, 106, 104, 97, 255, 99, 99, 92, 255, 99, 100, 94, 255, 99, 100, 95, 255, 102, 102, 98, 255, 98, 99, 95, 255, 88, 88, 82, 255, 85, 84, 78, 255, 85, 84, 78, 255, 88, 89, 83, 255, 87, 87, 81, 255, 83, 83, 76, 255, 78, 80, 73, 255, 82, 84, 79, 255, 81, 83, 80, 255, 76, 78, 75, 255, 80, 83, 80, 255, 84, 86, 84, 255, 86, 88, 85, 255, 89, 92, 89, 255, 89, 92, 87, 255, 91, 95, 89, 255, 92, 96, 90, 255, 93, 97, 91, 255, 98, 101, 94, 255, 107, 109, 102, 255, 112, 114, 105, 255, 111, 114, 106, 255, 106, 111, 101, 255, 101, 106, 94, 255, 105, 110, 98, 255, 114, 119, 110, 255, 123, 127, 120, 255, 125, 128, 123, 255, 112, 116, 107, 255, 101, 104, 91, 255, 104, 109, 96, 255, 106, 110, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 105, 255, 113, 111, 104, 255, 111, 108, 102, 255, 116, 114, 106, 255, 122, 120, 111, 255, 126, 124, 114, 255, 120, 119, 109, 255, 105, 105, 98, 255, 95, 97, 91, 255, 89, 90, 84, 255, 90, 91, 85, 255, 92, 95, 88, 255, 90, 91, 85, 255, 85, 85, 79, 255, 84, 85, 77, 255, 84, 87, 77, 255, 85, 89, 78, 255, 89, 93, 82, 255, 83, 87, 78, 255, 79, 83, 76, 255, 79, 81, 77, 255, 82, 85, 81, 255, 90, 94, 89, 255, 97, 101, 96, 255, 102, 105, 100, 255, 97, 100, 95, 255, 89, 94, 87, 255, 93, 97, 91, 255, 100, 103, 98, 255, 97, 101, 94, 255, 98, 102, 95, 255, 104, 108, 100, 255, 110, 114, 106, 255, 122, 125, 119, 255, 121, 125, 118, 255, 120, 124, 117, 255, 107, 111, 101, 255, 96, 100, 86, 255, 96, 99, 85, 255, 96, 99, 85, 255, 105, 109, 95, 255, 112, 117, 104, 255, 114, 119, 106, 255, 106, 110, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 101, 96, 255, 109, 107, 101, 255, 118, 116, 108, 255, 122, 120, 111, 255, 117, 116, 108, 255, 120, 119, 110, 255, 125, 123, 113, 255, 119, 118, 110, 255, 107, 108, 102, 255, 94, 97, 90, 255, 85, 88, 82, 255, 88, 90, 84, 255, 93, 95, 89, 255, 95, 98, 92, 255, 96, 97, 90, 255, 92, 95, 85, 255, 95, 98, 88, 255, 96, 99, 89, 255, 91, 95, 84, 255, 86, 90, 79, 255, 89, 93, 82, 255, 95, 98, 89, 255, 92, 95, 88, 255, 91, 94, 87, 255, 90, 94, 87, 255, 90, 94, 88, 255, 94, 98, 93, 255, 99, 102, 97, 255, 101, 103, 99, 255, 89, 91, 84, 255, 84, 87, 78, 255, 86, 89, 80, 255, 93, 96, 88, 255, 100, 104, 96, 255, 104, 109, 100, 255, 106, 109, 102, 255, 109, 112, 103, 255, 108, 113, 101, 255, 104, 108, 96, 255, 101, 104, 91, 255, 99, 103, 89, 255, 105, 109, 96, 255, 110, 115, 102, 255, 111, 115, 103, 255, 111, 116, 104, 255, 97, 100, 90, 255, 88, 90, 81, 255, 83, 84, 77, 255, 81, 83, 75, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 104, 95, 255, 105, 106, 97, 255, 118, 117, 110, 255, 121, 120, 112, 255, 125, 123, 114, 255, 125, 123, 114, 255, 121, 119, 111, 255, 114, 114, 107, 255, 110, 111, 104, 255, 102, 104, 98, 255, 93, 96, 89, 255, 92, 94, 88, 255, 87, 90, 83, 255, 84, 88, 81, 255, 90, 92, 85, 255, 101, 101, 94, 255, 109, 110, 102, 255, 114, 115, 106, 255, 115, 115, 107, 255, 115, 116, 108, 255, 114, 115, 107, 255, 102, 104, 96, 255, 94, 97, 90, 255, 99, 100, 94, 255, 104, 104, 98, 255, 99, 100, 94, 255, 93, 96, 89, 255, 100, 101, 95, 255, 99, 100, 94, 255, 96, 99, 92, 255, 92, 95, 87, 255, 89, 92, 84, 255, 90, 93, 85, 255, 94, 97, 89, 255, 95, 99, 91, 255, 91, 94, 85, 255, 85, 86, 79, 255, 83, 83, 76, 255, 86, 85, 79, 255, 89, 88, 81, 255, 86, 87, 78, 255, 87, 89, 77, 255, 92, 95, 82, 255, 104, 108, 96, 255, 111, 115, 104, 255, 113, 117, 106, 255, 104, 107, 97, 255, 94, 96, 87, 255, 87, 89, 81, 255, 84, 86, 78, 255, 89, 91, 84, 255, 95, 99, 90, 255, 95, 99, 88, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 108, 255, 110, 111, 103, 255, 105, 106, 97, 255, 107, 109, 100, 255, 117, 118, 110, 255, 124, 124, 116, 255, 126, 126, 119, 255, 120, 122, 114, 255, 113, 114, 108, 255, 110, 111, 104, 255, 110, 110, 104, 255, 104, 105, 99, 255, 91, 94, 88, 255, 86, 90, 84, 255, 90, 92, 85, 255, 93, 93, 87, 255, 94, 95, 89, 255, 98, 99, 94, 255, 102, 102, 98, 255, 107, 108, 103, 255, 109, 110, 103, 255, 108, 109, 101, 255, 107, 106, 100, 255, 100, 101, 95, 255, 96, 98, 91, 255, 97, 98, 92, 255, 101, 102, 96, 255, 103, 103, 96, 255, 100, 101, 94, 255, 101, 103, 94, 255, 97, 100, 90, 255, 90, 94, 83, 255, 90, 93, 83, 255, 87, 90, 80, 255, 87, 90, 81, 255, 95, 97, 90, 255, 94, 96, 88, 255, 88, 89, 81, 255, 87, 86, 80, 255, 76, 76, 69, 255, 70, 69, 63, 255, 70, 69, 64, 255, 69, 69, 63, 255, 67, 70, 64, 255, 78, 81, 74, 255, 91, 94, 85, 255, 96, 99, 90, 255, 95, 97, 88, 255, 97, 100, 91, 255, 100, 103, 93, 255, 99, 102, 93, 255, 101, 105, 97, 255, 104, 108, 101, 255, 103, 106, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 100, 255, 108, 109, 100, 255, 113, 114, 106, 255, 118, 119, 111, 255, 119, 119, 112, 255, 120, 120, 112, 255, 117, 118, 110, 255, 118, 122, 114, 255, 114, 118, 111, 255, 102, 105, 97, 255, 97, 100, 91, 255, 99, 100, 92, 255, 107, 107, 101, 255, 114, 114, 108, 255, 107, 108, 103, 255, 103, 103, 99, 255, 105, 106, 102, 255, 103, 104, 100, 255, 99, 100, 96, 255, 99, 100, 95, 255, 102, 103, 98, 255, 109, 109, 104, 255, 110, 109, 104, 255, 113, 112, 107, 255, 112, 111, 105, 255, 106, 106, 100, 255, 97, 99, 92, 255, 95, 97, 90, 255, 98, 99, 92, 255, 97, 99, 90, 255, 97, 100, 90, 255, 101, 103, 93, 255, 99, 101, 92, 255, 94, 97, 87, 255, 92, 95, 85, 255, 90, 94, 84, 255, 95, 97, 90, 255, 101, 102, 95, 255, 104, 104, 97, 255, 92, 92, 85, 255, 76, 75, 69, 255, 74, 74, 68, 255, 75, 75, 69, 255, 71, 74, 67, 255, 69, 73, 67, 255, 64, 69, 63, 255, 73, 77, 70, 255, 79, 83, 75, 255, 90, 93, 85, 255, 99, 102, 93, 255, 101, 104, 96, 255, 106, 109, 103, 255, 109, 112, 106, 255, 107, 110, 104, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 106, 96, 255, 110, 112, 103, 255, 124, 124, 116, 255, 117, 118, 109, 255, 114, 115, 106, 255, 112, 113, 104, 255, 115, 117, 108, 255, 119, 122, 115, 255, 117, 121, 114, 255, 110, 113, 105, 255, 103, 106, 97, 255, 96, 98, 90, 255, 95, 98, 90, 255, 101, 103, 96, 255, 108, 107, 103, 255, 112, 110, 107, 255, 113, 112, 109, 255, 103, 104, 99, 255, 93, 94, 88, 255, 87, 88, 82, 255, 83, 84, 77, 255, 84, 85, 79, 255, 96, 97, 92, 255, 100, 101, 95, 255, 102, 102, 97, 255, 118, 116, 111, 255, 120, 118, 112, 255, 120, 118, 112, 255, 113, 113, 105, 255, 105, 107, 96, 255, 98, 101, 90, 255, 98, 101, 91, 255, 100, 103, 93, 255, 106, 108, 99, 255, 108, 110, 101, 255, 103, 106, 98, 255, 96, 100, 93, 255, 98, 101, 95, 255, 98, 102, 96, 255, 91, 95, 88, 255, 84, 87, 80, 255, 81, 83, 77, 255, 79, 81, 74, 255, 74, 77, 70, 255, 76, 80, 73, 255, 89, 92, 83, 255, 96, 98, 89, 255, 94, 97, 88, 255, 96, 99, 90, 255, 97, 100, 91, 255, 90, 94, 87, 255, 86, 90, 85, 255, 92, 96, 90, 255, 103, 106, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 99, 88, 255, 97, 100, 89, 255, 96, 100, 89, 255, 101, 104, 94, 255, 108, 110, 101, 255, 117, 118, 109, 255, 122, 124, 116, 255, 121, 125, 118, 255, 113, 117, 109, 255, 101, 104, 95, 255, 102, 104, 96, 255, 108, 111, 103, 255, 114, 118, 111, 255, 118, 120, 115, 255, 117, 115, 112, 255, 119, 116, 114, 255, 118, 115, 113, 255, 113, 111, 108, 255, 100, 99, 94, 255, 90, 90, 83, 255, 87, 88, 81, 255, 84, 86, 79, 255, 85, 88, 82, 255, 97, 98, 92, 255, 100, 101, 95, 255, 103, 103, 97, 255, 112, 111, 105, 255, 113, 113, 107, 255, 109, 110, 102, 255, 111, 112, 102, 255, 118, 118, 108, 255, 124, 123, 112, 255, 127, 126, 114, 255, 119, 119, 108, 255, 111, 113, 103, 255, 109, 112, 104, 255, 110, 114, 108, 255, 107, 111, 104, 255, 102, 106, 100, 255, 103, 107, 100, 255, 101, 105, 99, 255, 95, 98, 92, 255, 87, 91, 85, 255, 86, 90, 84, 255, 87, 92, 86, 255, 84, 89, 82, 255, 81, 85, 79, 255, 79, 83, 76, 255, 89, 92, 84, 255, 95, 98, 89, 255, 98, 102, 95, 255, 96, 100, 94, 255, 91, 95, 89, 255, 92, 94, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 103, 94, 255, 103, 105, 95, 255, 109, 111, 101, 255, 107, 109, 100, 255, 95, 98, 87, 255, 91, 95, 84, 255, 93, 97, 86, 255, 99, 101, 91, 255, 106, 109, 99, 255, 107, 111, 100, 255, 105, 108, 97, 255, 100, 102, 91, 255, 94, 96, 84, 255, 100, 103, 93, 255, 105, 107, 100, 255, 109, 107, 103, 255, 110, 108, 105, 255, 111, 109, 106, 255, 106, 104, 100, 255, 100, 99, 94, 255, 101, 99, 94, 255, 103, 102, 97, 255, 101, 103, 95, 255, 98, 102, 92, 255, 102, 105, 96, 255, 103, 106, 97, 255, 100, 102, 95, 255, 97, 98, 93, 255, 100, 101, 95, 255, 112, 113, 104, 255, 116, 118, 107, 255, 116, 117, 107, 255, 117, 118, 108, 255, 121, 122, 111, 255, 122, 123, 112, 255, 119, 120, 109, 255, 115, 117, 106, 255, 105, 108, 98, 255, 99, 102, 94, 255, 99, 102, 95, 255, 105, 109, 103, 255, 105, 108, 102, 255, 98, 102, 96, 255, 94, 97, 92, 255, 93, 97, 92, 255, 94, 97, 93, 255, 88, 92, 86, 255, 85, 89, 83, 255, 87, 91, 85, 255, 90, 94, 88, 255, 90, 95, 88, 255, 88, 92, 85, 255, 87, 91, 85, 255, 91, 94, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 93, 255, 103, 105, 94, 255, 103, 105, 94, 255, 103, 104, 94, 255, 103, 104, 94, 255, 96, 98, 88, 255, 91, 94, 84, 255, 94, 97, 87, 255, 95, 98, 86, 255, 96, 98, 87, 255, 102, 105, 95, 255, 109, 113, 105, 255, 103, 106, 97, 255, 92, 94, 82, 255, 91, 93, 84, 255, 91, 94, 88, 255, 91, 94, 89, 255, 92, 95, 90, 255, 91, 92, 86, 255, 91, 92, 85, 255, 89, 90, 83, 255, 91, 93, 85, 255, 96, 99, 90, 255, 101, 104, 95, 255, 104, 108, 99, 255, 109, 111, 104, 255, 112, 114, 107, 255, 107, 110, 102, 255, 108, 111, 103, 255, 121, 123, 114, 255, 123, 125, 115, 255, 124, 126, 115, 255, 124, 125, 113, 255, 121, 122, 111, 255, 114, 115, 105, 255, 113, 114, 104, 255, 111, 114, 103, 255, 110, 113, 102, 255, 102, 104, 95, 255, 94, 96, 87, 255, 90, 92, 83, 255, 89, 91, 82, 255, 95, 97, 89, 255, 102, 105, 98, 255, 109, 111, 108, 255, 112, 114, 112, 255, 112, 114, 112, 255, 110, 112, 110, 255, 104, 107, 104, 255, 92, 96, 91, 255, 92, 95, 89, 255, 102, 102, 96, 255, 97, 99, 92, 255, 92, 95, 88, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 120, 111, 255, 111, 112, 101, 255, 99, 101, 91, 255, 101, 103, 93, 255, 105, 106, 96, 255, 110, 111, 100, 255, 112, 113, 102, 255, 106, 106, 98, 255, 99, 99, 92, 255, 96, 97, 89, 255, 100, 101, 92, 255, 101, 103, 93, 255, 99, 101, 90, 255, 96, 98, 86, 255, 97, 100, 92, 255, 98, 100, 96, 255, 89, 93, 87, 255, 85, 89, 83, 255, 88, 92, 86, 255, 86, 90, 84, 255, 82, 86, 80, 255, 83, 86, 80, 255, 91, 94, 87, 255, 93, 96, 88, 255, 93, 97, 88, 255, 104, 107, 99, 255, 111, 113, 106, 255, 113, 115, 108, 255, 114, 116, 108, 255, 113, 114, 106, 255, 107, 107, 100, 255, 110, 111, 103, 255, 118, 120, 112, 255, 125, 127, 118, 255, 124, 127, 118, 255, 115, 117, 107, 255, 107, 110, 99, 255, 109, 112, 101, 255, 110, 114, 103, 255, 103, 106, 96, 255, 89, 91, 82, 255, 87, 88, 80, 255, 85, 87, 79, 255, 91, 94, 85, 255, 94, 97, 87, 255, 94, 97, 88, 255, 100, 103, 95, 255, 106, 109, 102, 255, 105, 109, 103, 255, 104, 106, 103, 255, 101, 103, 99, 255, 95, 99, 92, 255, 94, 98, 91, 255, 100, 101, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 97, 255, 110, 111, 101, 255, 119, 119, 108, 255, 127, 127, 115, 255, 128, 128, 116, 255, 120, 120, 109, 255, 107, 108, 99, 255, 106, 106, 98, 255, 112, 112, 105, 255, 112, 112, 105, 255, 108, 109, 101, 255, 107, 107, 100, 255, 111, 111, 104, 255, 110, 110, 103, 255, 101, 102, 95, 255, 97, 99, 93, 255, 98, 100, 96, 255, 94, 96, 92, 255, 85, 89, 83, 255, 79, 84, 77, 255, 82, 86, 79, 255, 86, 89, 83, 255, 88, 90, 85, 255, 89, 91, 85, 255, 92, 93, 88, 255, 98, 98, 94, 255, 102, 103, 98, 255, 104, 106, 99, 255, 104, 106, 98, 255, 107, 108, 101, 255, 113, 114, 106, 255, 116, 117, 109, 255, 118, 120, 112, 255, 118, 120, 112, 255, 119, 122, 114, 255, 114, 116, 107, 255, 103, 104, 93, 255, 97, 97, 85, 255, 96, 96, 84, 255, 101, 103, 91, 255, 106, 108, 97, 255, 109, 113, 102, 255, 103, 107, 97, 255, 99, 102, 93, 255, 99, 102, 93, 255, 100, 103, 94, 255, 96, 99, 90, 255, 102, 106, 97, 255, 108, 112, 103, 255, 109, 113, 104, 255, 109, 111, 104, 255, 111, 111, 106, 255, 109, 110, 105, 255, 102, 103, 97, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 110, 102, 255, 114, 114, 107, 255, 113, 113, 105, 255, 114, 114, 106, 255, 119, 119, 111, 255, 122, 122, 114, 255, 120, 120, 112, 255, 121, 120, 113, 255, 118, 118, 111, 255, 109, 109, 102, 255, 99, 99, 91, 255, 103, 103, 96, 255, 107, 107, 100, 255, 104, 104, 97, 255, 102, 103, 95, 255, 107, 107, 100, 255, 106, 106, 99, 255, 99, 99, 92, 255, 95, 97, 91, 255, 97, 99, 94, 255, 95, 97, 92, 255, 91, 93, 88, 255, 87, 90, 85, 255, 87, 89, 85, 255, 95, 96, 91, 255, 103, 103, 97, 255, 106, 106, 100, 255, 105, 106, 100, 255, 109, 111, 105, 255, 120, 122, 117, 255, 119, 121, 116, 255, 116, 117, 112, 255, 113, 115, 108, 255, 117, 119, 111, 255, 117, 120, 111, 255, 111, 114, 103, 255, 106, 109, 97, 255, 103, 105, 93, 255, 100, 101, 89, 255, 101, 102, 90, 255, 105, 108, 95, 255, 108, 111, 100, 255, 109, 112, 103, 255, 104, 107, 98, 255, 92, 95, 87, 255, 89, 91, 83, 255, 82, 83, 75, 255, 81, 82, 75, 255, 90, 92, 85, 255, 96, 98, 92, 255, 100, 101, 96, 255, 109, 109, 104, 255, 114, 113, 108, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 109, 100, 255, 109, 110, 102, 255, 110, 111, 104, 255, 112, 112, 106, 255, 117, 116, 110, 255, 108, 108, 102, 255, 99, 100, 93, 255, 97, 97, 90, 255, 98, 98, 90, 255, 100, 100, 93, 255, 102, 103, 95, 255, 108, 108, 101, 255, 111, 111, 104, 255, 115, 115, 108, 255, 116, 116, 109, 255, 106, 106, 99, 255, 93, 95, 89, 255, 93, 96, 91, 255, 100, 102, 98, 255, 98, 100, 95, 255, 92, 94, 89, 255, 96, 97, 91, 255, 100, 101, 95, 255, 96, 97, 90, 255, 93, 96, 86, 255, 97, 100, 91, 255, 103, 106, 98, 255, 110, 113, 107, 255, 119, 123, 118, 255, 125, 128, 124, 255, 118, 120, 114, 255, 108, 109, 100, 255, 101, 103, 92, 255, 102, 104, 93, 255, 111, 115, 104, 255, 113, 118, 106, 255, 113, 117, 106, 255, 114, 117, 107, 255, 119, 120, 112, 255, 118, 119, 111, 255, 104, 107, 99, 255, 94, 98, 91, 255, 85, 90, 82, 255, 83, 86, 79, 255, 85, 87, 80, 255, 96, 96, 90, 255, 100, 100, 94, 255, 104, 104, 99, 255, 111, 110, 104, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 100, 255, 102, 103, 97, 255, 89, 92, 86, 255, 86, 88, 82, 255, 87, 89, 80, 255, 93, 95, 87, 255, 98, 99, 92, 255, 105, 105, 97, 255, 110, 110, 103, 255, 111, 110, 103, 255, 109, 109, 102, 255, 102, 104, 98, 255, 95, 98, 92, 255, 92, 95, 89, 255, 97, 99, 94, 255, 99, 102, 97, 255, 99, 102, 97, 255, 100, 102, 96, 255, 102, 104, 97, 255, 106, 108, 101, 255, 96, 98, 89, 255, 91, 93, 82, 255, 91, 93, 83, 255, 94, 96, 87, 255, 103, 105, 97, 255, 107, 108, 102, 255, 104, 105, 97, 255, 100, 100, 92, 255, 96, 96, 88, 255, 96, 97, 88, 255, 101, 103, 93, 255, 101, 103, 92, 255, 100, 103, 93, 255, 103, 106, 98, 255, 103, 106, 98, 255, 97, 101, 93, 255, 96, 99, 92, 255, 99, 101, 94, 255, 99, 101, 94, 255, 97, 100, 92, 255, 102, 104, 95, 255, 107, 108, 100, 255, 109, 109, 102, 255, 103, 103, 96, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 93, 255, 96, 99, 93, 255, 98, 100, 95, 255, 95, 97, 91, 255, 93, 95, 88, 255, 100, 102, 96, 255, 105, 106, 100, 255, 103, 105, 99, 255, 107, 109, 104, 255, 110, 112, 108, 255, 105, 107, 102, 255, 101, 103, 98, 255, 99, 101, 96, 255, 99, 102, 96, 255, 101, 103, 94, 255, 98, 99, 90, 255, 100, 101, 91, 255, 98, 99, 89, 255, 92, 94, 84, 255, 93, 94, 84, 255, 92, 93, 83, 255, 99, 99, 91, 255, 105, 106, 99, 255, 113, 113, 106, 255, 107, 107, 100, 255, 97, 96, 88, 255, 94, 93, 84, 255, 93, 92, 84, 255, 91, 92, 85, 255, 90, 92, 87, 255, 88, 91, 85, 255, 89, 92, 85, 255, 87, 90, 84, 255, 85, 89, 82, 255, 92, 95, 88, 255, 98, 100, 92, 255, 103, 103, 95, 255, 110, 111, 102, 255, 111, 111, 103, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 89, 80, 255, 86, 90, 80, 255, 93, 97, 87, 255, 96, 99, 89, 255, 96, 99, 89, 255, 109, 111, 104, 255, 116, 117, 112, 255, 118, 120, 116, 255, 114, 115, 109, 255, 108, 109, 100, 255, 100, 101, 92, 255, 105, 105, 96, 255, 107, 107, 98, 255, 116, 116, 105, 255, 112, 113, 102, 255, 108, 108, 98, 255, 97, 98, 89, 255, 98, 99, 91, 255, 103, 103, 96, 255, 98, 98, 91, 255, 96, 96, 88, 255, 94, 93, 84, 255, 93, 92, 84, 255, 85, 86, 78, 255, 82, 84, 79, 255, 86, 88, 84, 255, 89, 91, 87, 255, 89, 91, 86, 255, 86, 88, 83, 255, 88, 91, 86, 255, 92, 94, 88, 255, 97, 98, 91, 255, 106, 106, 98, 255, 113, 113, 105, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 99, 88, 255, 102, 105, 95, 255, 108, 110, 101, 255, 109, 111, 102, 255, 108, 110, 101, 255, 110, 113, 104, 255, 119, 119, 110, 255, 119, 119, 109, 255, 122, 121, 111, 255, 115, 115, 105, 255, 107, 107, 98, 255, 107, 107, 98, 255, 108, 108, 100, 255, 105, 105, 98, 255, 100, 100, 93, 255, 106, 105, 98, 255, 107, 106, 99, 255, 101, 101, 93, 255, 97, 97, 90, 255, 99, 99, 94, 255, 96, 97, 94, 255, 87, 89, 84, 255, 83, 85, 80, 255, 75, 78, 72, 255, 82, 85, 80, 255, 86, 89, 84, 255, 89, 92, 86, 255, 89, 92, 85, 255, 96, 97, 91, 255, 100, 102, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 111, 255, 116, 117, 110, 255, 115, 115, 109, 255, 118, 117, 112, 255, 121, 119, 113, 255, 118, 118, 110, 255, 112, 112, 103, 255, 106, 106, 98, 255, 99, 100, 92, 255, 95, 96, 88, 255, 94, 95, 87, 255, 98, 99, 91, 255, 101, 101, 94, 255, 100, 101, 94, 255, 105, 106, 100, 255, 106, 108, 102, 255, 100, 102, 95, 255, 94, 96, 89, 255, 94, 96, 90, 255, 96, 97, 93, 255, 94, 96, 92, 255, 90, 92, 86, 255, 87, 90, 83, 255, 92, 94, 87, 255, 98, 100, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 111, 255, 109, 112, 104, 255, 103, 106, 99, 255, 93, 94, 88, 255, 86, 88, 80, 255, 88, 90, 82, 255, 87, 89, 81, 255, 89, 91, 81, 255, 91, 93, 84, 255, 96, 97, 89, 255, 99, 101, 93, 255, 106, 107, 102, 255, 112, 113, 109, 255, 110, 112, 108, 255, 107, 109, 104, 255, 94, 96, 88, 255, 90, 92, 83, 255, 96, 97, 90, 255, 97, 98, 92, 255, 91, 94, 87, 255, 92, 96, 87, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 103, 94, 255, 96, 98, 91, 255, 87, 89, 81, 255, 83, 86, 77, 255, 86, 89, 81, 255, 90, 92, 84, 255, 94, 96, 88, 255, 98, 99, 91, 255, 100, 102, 94, 255, 106, 107, 102, 255, 101, 103, 96, 255, 97, 100, 91, 255, 96, 97, 89, 255, 95, 96, 89, 255, 95, 95, 88, 255, 96, 97, 90, 255, 100, 101, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, 92, 255, 100, 101, 93, 255, 97, 98, 90, 255, 95, 96, 88, 255, 98, 99, 91, 255, 104, 105, 98, 255, 103, 104, 98, 255, 105, 106, 100, 255, 112, 113, 109, 255, 111, 111, 107, 255, 107, 107, 102, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 87, 78, 255, 82, 85, 76, 255, 88, 90, 82, 255, 96, 98, 89, 255, 96, 98, 89, 255, 103, 105, 97, 255, 112, 114, 107, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 90, 255, 102, 104, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id="ImageTexture_35hew"] +image = SubResource("Image_ktpj2") + +[sub_resource type="BoxShape3D" id="BoxShape3D_d3j6k"] + +[resource] +item/0/name = "MeshInstance3D" +item/0/mesh = SubResource("QuadMesh_p0vo4") +item/0/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/0/shapes = [SubResource("BoxShape3D_mtfk2"), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)] +item/0/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/0/navigation_layers = 1 +item/0/preview = SubResource("ImageTexture_p1rdv") +item/1/name = "MeshInstance3D2" +item/1/mesh = SubResource("QuadMesh_4ay7f") +item/1/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/1/shapes = [SubResource("BoxShape3D_d3j6k"), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)] +item/1/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/1/navigation_layers = 1 +item/1/preview = SubResource("ImageTexture_35hew") diff --git a/Worlds/GreenPlanet/tiles.tscn b/Worlds/GreenPlanet/tiles.tscn new file mode 100644 index 0000000..35dd1c7 --- /dev/null +++ b/Worlds/GreenPlanet/tiles.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=9 format=3 uid="uid://b7s8i67yqvwbw"] + +[ext_resource type="Texture2D" uid="uid://r8cr41blojpm" path="res://Assets/Textures/stone wall 7.png" id="1_ftah0"] +[ext_resource type="Texture2D" uid="uid://blnfsojw4ukq4" path="res://Assets/Textures/grass.png" id="1_nc7wu"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ulcfh"] +albedo_texture = ExtResource("1_nc7wu") +texture_filter = 0 + +[sub_resource type="QuadMesh" id="QuadMesh_yxhjj"] +material = SubResource("StandardMaterial3D_ulcfh") +orientation = 1 + +[sub_resource type="BoxShape3D" id="BoxShape3D_mtfk2"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jnpkd"] +albedo_texture = ExtResource("1_ftah0") + +[sub_resource type="QuadMesh" id="QuadMesh_twahx"] +material = SubResource("StandardMaterial3D_jnpkd") +orientation = 1 + +[sub_resource type="BoxShape3D" id="BoxShape3D_d3j6k"] + +[node name="Library" type="Node3D"] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("QuadMesh_yxhjj") + +[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"] +shape = SubResource("BoxShape3D_mtfk2") + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.07427, 0, 0) +mesh = SubResource("QuadMesh_twahx") + +[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D2/StaticBody3D"] +shape = SubResource("BoxShape3D_d3j6k") diff --git a/Worlds/TestingRange/Enemies/dummy.tres b/Worlds/TestingRange/Enemies/dummy.tres new file mode 100644 index 0000000..3a09017 --- /dev/null +++ b/Worlds/TestingRange/Enemies/dummy.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="Enemy" load_steps=3 format=3 uid="uid://bdkcwve6d35gl"] + +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="1_o7yng"] +[ext_resource type="Texture2D" uid="uid://brjk5pu0up85s" path="res://Assets/TextureAtlases/dummy.tres" id="2_bbk0y"] + +[resource] +script = ExtResource("1_o7yng") +title = "dummy" +target_type = 1 +sprite = ExtResource("2_bbk0y") +health = 100 +penalty = 10 +movement_speed = 1.0 +spawn_cooldown = 1.0 diff --git a/Worlds/TestingRange/Enemies/target_dummy.tscn b/Worlds/TestingRange/Enemies/target_dummy.tscn new file mode 100644 index 0000000..a248fa8 --- /dev/null +++ b/Worlds/TestingRange/Enemies/target_dummy.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=12 format=3 uid="uid://cgcslt0rsg6e3"] + +[ext_resource type="Script" path="res://Scripts/target_dummy.gd" id="1_f72ee"] +[ext_resource type="Resource" uid="uid://bdkcwve6d35gl" path="res://Worlds/TestingRange/Enemies/dummy.tres" id="2_7pldl"] +[ext_resource type="Script" path="res://Scripts/health.gd" id="3_8hqew"] +[ext_resource type="PackedScene" uid="uid://cqtew0t8sttpm" path="res://Scenes/damage_particle.tscn" id="4_0ruff"] +[ext_resource type="Script" path="res://Scripts/hitbox.gd" id="4_yinjs"] +[ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="5_t0dpu"] +[ext_resource type="Texture2D" uid="uid://brjk5pu0up85s" path="res://Assets/TextureAtlases/dummy.tres" id="6_agkvc"] +[ext_resource type="Texture2D" uid="uid://r202vo47jw1q" path="res://Assets/Textures/enemyhealth.png" id="8_m8sgd"] +[ext_resource type="Script" path="res://Scripts/StatusEffector.gd" id="8_melp1"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_21dgw"] +radius = 0.7173 + +[sub_resource type="ViewportTexture" id="ViewportTexture_ieafj"] +viewport_path = NodePath("Dog/SubViewport") + +[node name="PathFollow3D" type="PathFollow3D" node_paths=PackedStringArray("status_manager") groups=["Enemies"]] +loop = false +script = ExtResource("1_f72ee") +stats = ExtResource("2_7pldl") +status_manager = NodePath("Dog/StatusEffector") + +[node name="Dog" type="CharacterBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.204674, 0) +collision_layer = 4 +collision_mask = 3 + +[node name="Health" type="Node" parent="Dog"] +script = ExtResource("3_8hqew") +damage_particle_scene = ExtResource("4_0ruff") + +[node name="Hitbox" type="CollisionShape3D" parent="Dog"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.527022, 0) +shape = SubResource("SphereShape3D_21dgw") +script = ExtResource("4_yinjs") + +[node name="DirectionSprite" parent="Dog" instance=ExtResource("5_t0dpu")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.642479, 0) +pixel_size = 0.04 +texture = ExtResource("6_agkvc") + +[node name="Sprite3D" type="Sprite3D" parent="Dog"] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 1.47182, 0) +pixel_size = 0.02 +billboard = 1 +texture_filter = 0 +texture = SubResource("ViewportTexture_ieafj") + +[node name="StatusEffector" type="Node3D" parent="Dog" node_paths=PackedStringArray("hbox")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.18114, 0) +script = ExtResource("8_melp1") +hbox = NodePath("../SubViewport/HBoxContainer") + +[node name="SubViewport" type="SubViewport" parent="Dog"] +transparent_bg = true +size = Vector2i(200, 55) +render_target_update_mode = 4 + +[node name="HBoxContainer" type="HBoxContainer" parent="Dog/SubViewport"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 32.0 +grow_horizontal = 2 +alignment = 1 + +[node name="ProgressBar" type="TextureProgressBar" parent="Dog/SubViewport"] +visible = false +offset_top = 36.0 +offset_right = 200.0 +offset_bottom = 236.0 +grow_horizontal = 2 +grow_vertical = 2 +step = 0.0 +value = 100.0 +fill_mode = 6 +texture_progress = ExtResource("8_m8sgd") +tint_progress = Color(0, 1, 0, 1) + +[connection signal="health_changed" from="Dog/Health" to="." method="_on_health_health_changed"] +[connection signal="health_depleted" from="Dog/Health" to="." method="_on_health_health_depleted"] +[connection signal="took_damage" from="Dog/Hitbox" to="Dog/Health" method="take_damage"] diff --git a/Worlds/TestingRange/Levels/training_arena.tscn b/Worlds/TestingRange/Levels/training_arena.tscn new file mode 100644 index 0000000..64be873 --- /dev/null +++ b/Worlds/TestingRange/Levels/training_arena.tscn @@ -0,0 +1,139 @@ +[gd_scene load_steps=24 format=3 uid="uid://uv7hjsgisy31"] + +[ext_resource type="Texture2D" uid="uid://r8cr41blojpm" path="res://Assets/Textures/stone wall 7.png" id="1_45ikc"] +[ext_resource type="PackedScene" uid="uid://dxgxbtf68lcv5" path="res://PCs/hero.tscn" id="2_w387b"] +[ext_resource type="PackedScene" uid="uid://b0nady5xm88bo" path="res://Worlds/GreenPlanet/Enemies/land_enemy.tscn" id="3_y4upj"] +[ext_resource type="PackedScene" uid="uid://dsasunnk47n8o" path="res://Scenes/item_card.tscn" id="4_i7krx"] +[ext_resource type="Script" path="res://Scripts/Resources/enemy.gd" id="4_ucmnf"] +[ext_resource type="Texture2D" uid="uid://dj13g1w14mekw" path="res://Assets/Textures/eye_dog.png" id="5_15cd7"] +[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="5_806m0"] +[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="6_evvng"] +[ext_resource type="Resource" uid="uid://q23ludhji5p4" path="res://PCs/Universal/ClassCards/Gatling/card_gatling.tres" id="8_k80ff"] +[ext_resource type="PackedScene" uid="uid://ddbbwx0yy16lh" path="res://Scenes/tower_base.tscn" id="9_imodf"] +[ext_resource type="Resource" uid="uid://bvpkvmda845o5" path="res://PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres" id="10_g0syk"] +[ext_resource type="Resource" uid="uid://1xke2uy2vfuf" path="res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres" id="11_d3sci"] +[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="11_jk0fe"] +[ext_resource type="Resource" uid="uid://bhmbk26whdsys" path="res://PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres" id="12_7lpov"] +[ext_resource type="PackedScene" uid="uid://cgcslt0rsg6e3" path="res://Worlds/TestingRange/Enemies/target_dummy.tscn" id="14_rvk27"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_mqtlc"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_75uqo"] +albedo_texture = ExtResource("1_45ikc") +uv1_scale = Vector3(30, 15, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_3mcyj"] +size = Vector3(15, 1, 30) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jx270"] +resource_local_to_scene = true +atlas = ExtResource("5_15cd7") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="Resource" id="Resource_dn3eg"] +resource_local_to_scene = true +script = ExtResource("4_ucmnf") +title = "dog" +target_type = 0 +sprite = SubResource("AtlasTexture_jx270") +spawn_power = 10 +health = 100 +penalty = 10 +movement_speed = 1.0 +spawn_cooldown = 1.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_qwrm2"] +resource_local_to_scene = true +atlas = ExtResource("5_15cd7") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="Resource" id="Resource_bb3cf"] +resource_local_to_scene = true +script = ExtResource("4_ucmnf") +title = "dog" +target_type = 0 +sprite = SubResource("AtlasTexture_qwrm2") +spawn_power = 10 +health = 100 +penalty = 10 +movement_speed = 1.0 +spawn_cooldown = 1.0 + +[sub_resource type="Curve3D" id="Curve3D_3hq0c"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -3, 0, 0, -3.045, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, -3, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, -3, 0, 0), +"tilts": PackedFloat32Array(0, 0, 0, 0, 0) +} +point_count = 5 + +[node name="Node3D" type="Node3D"] + +[node name="StaticBody3D" type="StaticBody3D" parent="."] +physics_material_override = SubResource("PhysicsMaterial_mqtlc") + +[node name="CSGBox3D" type="CSGBox3D" parent="StaticBody3D"] +transform = Transform3D(-1, -8.74228e-08, 0, 8.74228e-08, -1, 0, 0, 0, 1, 0, 0, 0) +size = Vector3(15, 1, 30) +material = SubResource("StandardMaterial3D_75uqo") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] +shape = SubResource("BoxShape3D_3mcyj") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.503804, 0.863818, 0, -0.863818, 0.503804, 0.00649166, 26.8242, 4.02927e-05) + +[node name="Character" parent="." instance=ExtResource("2_w387b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.805513, 0.5, 2.30163) + +[node name="Enemy" parent="." instance=ExtResource("3_y4upj")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.28337, 0.601179, -1.23188) +stats = SubResource("Resource_dn3eg") + +[node name="Enemy2" parent="." instance=ExtResource("3_y4upj")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.26298, 0.601179, -3.22988) +stats = SubResource("Resource_bb3cf") + +[node name="assaultcard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.7802, 0.5, 3.16356) +card = ExtResource("5_806m0") + +[node name="acceleratorcard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.11938, 0.5, 4.73946) +card = ExtResource("8_k80ff") + +[node name="snipercard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1017, 0.5, 5.17215) +card = ExtResource("6_evvng") + +[node name="grenadecard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.385228, 0.5, 6.25718) +card = ExtResource("10_g0syk") + +[node name="grenadecard2" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.51176, 0.499999, -5.26455) +card = ExtResource("11_d3sci") + +[node name="rocketcard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.13185, 0.5, 6.25718) +card = ExtResource("11_jk0fe") + +[node name="gluecard" parent="." instance=ExtResource("4_i7krx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.12773, 0.5, 6.25718) +card = ExtResource("12_7lpov") + +[node name="towerbase" parent="." instance=ExtResource("9_imodf")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.77234, 0.5, 2.6958) + +[node name="towerbase2" parent="." node_paths=PackedStringArray("inventory", "block", "collider", "minimap_icon") instance=ExtResource("9_imodf")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0766634, 0.5, -9.7488) +inventory = NodePath("../towerbase/Inventory") +block = NodePath("../towerbase/CSGBox3D") +collider = NodePath("../towerbase/CollisionShape3D") +minimap_icon = NodePath("../towerbase/Sprite3D") + +[node name="Path3D" type="Path3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -9.72541) +curve = SubResource("Curve3D_3hq0c") + +[node name="PathFollow3D" parent="Path3D" instance=ExtResource("14_rvk27")] +transform = Transform3D(0.707107, 0, -0.707107, 0, 1, 0, 0.707107, 0, 0.707107, -3, 0, 0) diff --git a/button_stylebox.tres b/button_stylebox.tres new file mode 100644 index 0000000..a727835 --- /dev/null +++ b/button_stylebox.tres @@ -0,0 +1,12 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://de3eok2g4r2k"] + +[resource] +content_margin_left = 5.0 +content_margin_top = 2.0 +content_margin_right = 5.0 +content_margin_bottom = 2.0 +bg_color = Color(0.505882, 0.678431, 0.901961, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..3e46e4b --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,101 @@ +[preset.0] + +name="Linux/X11" +platform="Linux/X11" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../tower_defense/Linux/output.x86_64" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=true +texture_format/bptc=true +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +binary_format/architecture="x86_64" +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="#!/usr/bin/env bash +export DISPLAY=:0 +unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\" +\"{temp_dir}/{exe_name}\" {cmd_args}" +ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash +kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\") +rm -rf \"{temp_dir}\"" + +[preset.1] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../tower_defense/Windows/output.exe" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=true +texture_format/bptc=true +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=false +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" diff --git a/new_theme.tres b/new_theme.tres new file mode 100644 index 0000000..cfb721c --- /dev/null +++ b/new_theme.tres @@ -0,0 +1,43 @@ +[gd_resource type="Theme" load_steps=4 format=3 uid="uid://b6a0ip4p72tgx"] + +[ext_resource type="StyleBox" uid="uid://de3eok2g4r2k" path="res://button_stylebox.tres" id="1_jlhwk"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c2xpa"] +content_margin_left = 10.0 +bg_color = Color(0.505882, 0.678431, 0.901961, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_06uvd"] +content_margin_left = 20.0 +content_margin_top = 20.0 +content_margin_right = 20.0 +content_margin_bottom = 20.0 +bg_color = Color(0.14902, 0.380392, 0.635294, 1) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.505882, 0.678431, 0.901961, 1) +corner_radius_top_left = 20 +corner_radius_top_right = 20 +corner_radius_bottom_right = 20 +corner_radius_bottom_left = 20 +shadow_size = 5 +shadow_offset = Vector2(7, 7) + +[resource] +Button/colors/font_color = Color(1, 1, 1, 1) +Button/colors/font_focus_color = Color(0.113725, 0.113725, 0.113725, 1) +Button/font_sizes/font_size = 24 +Button/styles/normal = ExtResource("1_jlhwk") +HBoxContainer/constants/separation = 10 +Label/colors/font_color = Color(0.890196, 0.890196, 0.890196, 1) +Label/colors/font_outline_color = Color(1, 1, 1, 1) +Label/font_sizes/font_size = 32 +LineEdit/colors/font_color = Color(0.113725, 0.113725, 0.113725, 1) +LineEdit/colors/font_placeholder_color = Color(0.243137, 0.243137, 0.243137, 0.6) +LineEdit/styles/normal = SubResource("StyleBoxFlat_c2xpa") +PanelContainer/styles/panel = SubResource("StyleBoxFlat_06uvd") diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..e2bbeb9 --- /dev/null +++ b/project.godot @@ -0,0 +1,130 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Multiplayer Tower Defense" +run/main_scene="res://Scenes/Menus/main_menu.tscn" +config/features=PackedStringArray("4.1", "Forward Plus") +config/icon="res://Assets/Textures/icon.svg" + +[autoload] + +Data="*res://Scripts/data.gd" +Game="*res://Scripts/game.gd" +WaveManager="*res://Scripts/wave_manager.gd" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 + +[filesystem] + +import/blender/enabled=false + +[input] + +"Move Forward"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"echo":false,"script":null) +] +} +"Move Left"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null) +] +} +"Move Right"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":84,"key_label":0,"unicode":116,"echo":false,"script":null) +] +} +"Move Backward"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) +] +} +Jump={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +Sprint={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":122,"echo":false,"script":null) +] +} +Interact={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"echo":false,"script":null) +] +} +"Open Text Chat"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +"Primary Fire"={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +"Secondary Fire"={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +Ready={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"echo":false,"script":null) +] +} +Pause={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +"Equip In Gauntlet"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +] +} +"Select Next Card"={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +"Select Previous Card"={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +"View Map"={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} + +[layer_names] + +3d_render/layer_1="World" +3d_render/layer_2="FPSView" +3d_render/layer_3="Minimap" +3d_physics/layer_1="Environment" +3d_physics/layer_2="Players" +3d_physics/layer_3="Enemies" +3d_physics/layer_4="Items" +3d_physics/layer_5="Interactables" +3d_physics/layer_6="PlayerBlocker" + +[rendering] + +textures/canvas_textures/default_texture_filter=0